blob: 7ab68c78c3159f092ddd47e4d91eb5b58f7d9484 [file] [log] [blame]
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001/*
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002 * This is a curses module for Python.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004 * Based on prior work by Lance Ellinghaus and Oliver Andrich
5 * Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
6 * Cathedral City, California Republic, United States of America.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00007 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00008 * Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
9 * Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
10 *
Andrew M. Kuchling3adefcc2002-10-30 21:08:34 +000011 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000012 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this source file to use, copy, modify, merge, or publish it
15 * subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or in any new file that contains a substantial portion of
19 * this file.
20 *
21 * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF
22 * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
23 * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES
24 * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
25 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
27 * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL,
28 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
29 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR
30 * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR
31 * PERFORMANCE OF THIS SOFTWARE.
32 */
Guido van Rossumf6971e21994-08-30 12:25:20 +000033
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000034/*
35
Victor Stinner26486ea2010-05-15 22:23:53 +000036 A number of SysV or ncurses functions don't have wrappers yet; if you
37 need a given function, add it and send a patch. See
38 http://www.python.org/dev/patches/ for instructions on how to submit
39 patches to Python.
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000040
Victor Stinner26486ea2010-05-15 22:23:53 +000041 Here's a list of currently unsupported functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +000042
Victor Stinner26486ea2010-05-15 22:23:53 +000043 addchnstr addchstr color_set define_key
44 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
45 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
46 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
47 mvwinchnstr mvwinchstr mvwinnstr newterm
48 restartterm ripoffline scr_dump
49 scr_init scr_restore scr_set scrl set_curterm set_term setterm
50 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
51 vidattr vidputs waddchnstr waddchstr
52 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000053
Victor Stinner26486ea2010-05-15 22:23:53 +000054 Low-priority:
55 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
56 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
57 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000058
Victor Stinner26486ea2010-05-15 22:23:53 +000059 Menu extension (ncurses and probably SYSV):
60 current_item free_item free_menu item_count item_description
61 item_index item_init item_name item_opts item_opts_off
62 item_opts_on item_term item_userptr item_value item_visible
63 menu_back menu_driver menu_fore menu_format menu_grey
64 menu_init menu_items menu_mark menu_opts menu_opts_off
65 menu_opts_on menu_pad menu_pattern menu_request_by_name
66 menu_request_name menu_spacing menu_sub menu_term menu_userptr
67 menu_win new_item new_menu pos_menu_cursor post_menu
68 scale_menu set_current_item set_item_init set_item_opts
69 set_item_term set_item_userptr set_item_value set_menu_back
70 set_menu_fore set_menu_format set_menu_grey set_menu_init
71 set_menu_items set_menu_mark set_menu_opts set_menu_pad
72 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
73 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000074
Victor Stinner26486ea2010-05-15 22:23:53 +000075 Form extension (ncurses and probably SYSV):
76 current_field data_ahead data_behind dup_field
77 dynamic_fieldinfo field_arg field_back field_buffer
78 field_count field_fore field_index field_info field_init
79 field_just field_opts field_opts_off field_opts_on field_pad
80 field_status field_term field_type field_userptr form_driver
81 form_fields form_init form_opts form_opts_off form_opts_on
82 form_page form_request_by_name form_request_name form_sub
83 form_term form_userptr form_win free_field free_form
84 link_field link_fieldtype move_field new_field new_form
85 new_page pos_form_cursor post_form scale_form
86 set_current_field set_field_back set_field_buffer
87 set_field_fore set_field_init set_field_just set_field_opts
88 set_field_pad set_field_status set_field_term set_field_type
89 set_field_userptr set_fieldtype_arg set_fieldtype_choice
90 set_form_fields set_form_init set_form_opts set_form_page
91 set_form_sub set_form_term set_form_userptr set_form_win
92 set_max_field set_new_page unpost_form
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000093
94
Victor Stinner26486ea2010-05-15 22:23:53 +000095*/
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000098
Serhiy Storchakae2f92de2017-11-11 13:06:26 +020099static const char PyCursesVersion[] = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000101/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Mark Dickinsone047cfa2010-05-11 17:57:09 +0000103#define PY_SSIZE_T_CLEAN
104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Victor Stinner37834132020-10-27 17:12:53 +0100106#include "pycore_long.h" // _PyLong_GetZero()
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000107
Benjamin Petersonb173f782009-05-05 22:31:58 +0000108
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000110#define STRICT_SYSV_CURSES
111#endif
112
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000113#define CURSES_MODULE
114#include "py_curses.h"
115
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200116#if defined(HAVE_TERM_H) || defined(__sgi)
117/* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
118 which are not declared in SysV curses and for setupterm. */
Fred Drake0368bc42001-07-19 20:48:32 +0000119#include <term.h>
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200120/* Including <term.h> #defines many common symbols. */
121#undef lines
122#undef columns
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000123#endif
124
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100125#ifdef HAVE_LANGINFO_H
126#include <langinfo.h>
127#endif
128
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000129#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000130#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000131typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000132#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000133
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000134#if defined(_AIX)
135#define STRICT_SYSV_CURSES
136#endif
137
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +0200138#if NCURSES_EXT_COLORS+0 && NCURSES_EXT_FUNCS+0
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500139#define _NCURSES_EXTENDED_COLOR_FUNCS 1
140#else
141#define _NCURSES_EXTENDED_COLOR_FUNCS 0
142#endif /* defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS) */
143
144#if _NCURSES_EXTENDED_COLOR_FUNCS
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +0200145#define _CURSES_COLOR_VAL_TYPE int
146#define _CURSES_COLOR_NUM_TYPE int
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500147#define _CURSES_INIT_COLOR_FUNC init_extended_color
148#define _CURSES_INIT_PAIR_FUNC init_extended_pair
149#define _COLOR_CONTENT_FUNC extended_color_content
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +0200150#define _CURSES_PAIR_CONTENT_FUNC extended_pair_content
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500151#else
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +0200152#define _CURSES_COLOR_VAL_TYPE short
153#define _CURSES_COLOR_NUM_TYPE short
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500154#define _CURSES_INIT_COLOR_FUNC init_color
155#define _CURSES_INIT_PAIR_FUNC init_pair
156#define _COLOR_CONTENT_FUNC color_content
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +0200157#define _CURSES_PAIR_CONTENT_FUNC pair_content
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500158#endif /* _NCURSES_EXTENDED_COLOR_FUNCS */
159
Larry Hastings61272b72014-01-07 12:41:53 -0800160/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300161module _curses
162class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800163[clinic start generated code]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300164/*[clinic end generated code: output=da39a3ee5e6b4b0d input=43265c372c2887d6]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300165
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000166/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000167
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000168static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000169
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000170/* Tells whether setupterm() has been called to initialise terminfo. */
171static int initialised_setupterm = FALSE;
172
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000173/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000174static int initialised = FALSE;
175
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000176/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000177static int initialisedcolors = FALSE;
178
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100179static char *screen_encoding = NULL;
180
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000181/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000182#define PyCursesSetupTermCalled \
183 if (initialised_setupterm != TRUE) { \
184 PyErr_SetString(PyCursesError, \
185 "must call (at least) setupterm() first"); \
186 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000187
Victor Stinner26486ea2010-05-15 22:23:53 +0000188#define PyCursesInitialised \
189 if (initialised != TRUE) { \
190 PyErr_SetString(PyCursesError, \
191 "must call initscr() first"); \
192 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000193
Victor Stinner26486ea2010-05-15 22:23:53 +0000194#define PyCursesInitialisedColor \
195 if (initialisedcolors != TRUE) { \
196 PyErr_SetString(PyCursesError, \
197 "must call start_color() first"); \
198 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000199
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000200/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000201
Guido van Rossum85738471995-02-17 13:50:17 +0000202/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000203 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000204 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000205 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000206 */
207
208static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100209PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000210{
Victor Stinner26486ea2010-05-15 22:23:53 +0000211 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200212 Py_RETURN_NONE;
Guido van Rossum85738471995-02-17 13:50:17 +0000213 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000214 if (fname == NULL) {
215 PyErr_SetString(PyCursesError, catchall_ERR);
216 } else {
217 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
218 }
219 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000220 }
Guido van Rossum85738471995-02-17 13:50:17 +0000221}
222
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100223/* Convert an object to a byte (an integer of type chtype):
224
225 - int
226 - bytes of length 1
227 - str of length 1
228
229 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000230static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100231PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000232{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100233 long value;
234 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
235 value = (unsigned char)PyBytes_AsString(obj)[0];
236 }
237 else if (PyUnicode_Check(obj)) {
238 if (PyUnicode_GetLength(obj) != 1) {
239 PyErr_Format(PyExc_TypeError,
240 "expect bytes or str of length 1, or int, "
241 "got a str of length %zi",
242 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000243 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100244 }
245 value = PyUnicode_READ_CHAR(obj, 0);
246 if (128 < value) {
247 PyObject *bytes;
248 const char *encoding;
249 if (win)
250 encoding = win->encoding;
251 else
252 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300253 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100254 if (bytes == NULL)
255 return 0;
256 if (PyBytes_GET_SIZE(bytes) == 1)
257 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
258 else
259 value = -1;
260 Py_DECREF(bytes);
261 if (value < 0)
262 goto overflow;
263 }
264 }
265 else if (PyLong_CheckExact(obj)) {
266 int long_overflow;
267 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
268 if (long_overflow)
269 goto overflow;
270 }
271 else {
272 PyErr_Format(PyExc_TypeError,
273 "expect bytes or str of length 1, or int, got %s",
274 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000275 return 0;
276 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100277 *ch = (chtype)value;
278 if ((long)*ch != value)
279 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000280 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100281
282overflow:
283 PyErr_SetString(PyExc_OverflowError,
284 "byte doesn't fit in chtype");
285 return 0;
286}
287
288/* Convert an object to a byte (chtype) or a character (cchar_t):
289
290 - int
291 - bytes of length 1
292 - str of length 1
293
294 Return:
295
296 - 2 if obj is a character (written into *wch)
297 - 1 if obj is a byte (written into *ch)
298 - 0 on error: raise an exception */
299static int
300PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
301 chtype *ch
302#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200303 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100304#endif
305 )
306{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100307 long value;
308#ifdef HAVE_NCURSESW
309 wchar_t buffer[2];
310#endif
311
312 if (PyUnicode_Check(obj)) {
313#ifdef HAVE_NCURSESW
314 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
315 PyErr_Format(PyExc_TypeError,
316 "expect bytes or str of length 1, or int, "
317 "got a str of length %zi",
318 PyUnicode_GET_LENGTH(obj));
319 return 0;
320 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200321 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100322 return 2;
323#else
324 return PyCurses_ConvertToChtype(win, obj, ch);
325#endif
326 }
327 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
328 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100329 }
330 else if (PyLong_CheckExact(obj)) {
331 int overflow;
332 value = PyLong_AsLongAndOverflow(obj, &overflow);
333 if (overflow) {
334 PyErr_SetString(PyExc_OverflowError,
335 "int doesn't fit in long");
336 return 0;
337 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100338 }
339 else {
340 PyErr_Format(PyExc_TypeError,
341 "expect bytes or str of length 1, or int, got %s",
342 Py_TYPE(obj)->tp_name);
343 return 0;
344 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200345
346 *ch = (chtype)value;
347 if ((long)*ch != value) {
348 PyErr_Format(PyExc_OverflowError,
349 "byte doesn't fit in chtype");
350 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100351 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200352 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100353}
354
355/* Convert an object to a byte string (char*) or a wide character string
356 (wchar_t*). Return:
357
358 - 2 if obj is a character string (written into *wch)
359 - 1 if obj is a byte string (written into *bytes)
360 - 0 on error: raise an exception */
361static int
362PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
363 PyObject **bytes, wchar_t **wstr)
364{
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300365 char *str;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100366 if (PyUnicode_Check(obj)) {
367#ifdef HAVE_NCURSESW
368 assert (wstr != NULL);
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300369
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100370 *wstr = PyUnicode_AsWideCharString(obj, NULL);
371 if (*wstr == NULL)
372 return 0;
373 return 2;
374#else
375 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300376 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100377 if (*bytes == NULL)
378 return 0;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300379 /* check for embedded null bytes */
380 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
381 return 0;
382 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100383 return 1;
384#endif
385 }
386 else if (PyBytes_Check(obj)) {
387 Py_INCREF(obj);
388 *bytes = obj;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300389 /* check for embedded null bytes */
390 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
391 return 0;
392 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100393 return 1;
394 }
395
396 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
397 Py_TYPE(obj)->tp_name);
398 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000399}
400
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500401static int
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200402color_allow_default_converter(PyObject *arg, void *ptr)
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500403{
404 long color_number;
405 int overflow;
406
407 color_number = PyLong_AsLongAndOverflow(arg, &overflow);
408 if (color_number == -1 && PyErr_Occurred())
409 return 0;
410
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200411 if (overflow > 0 || color_number >= COLORS) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500412 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200413 "Color number is greater than COLORS-1 (%d).",
414 COLORS - 1);
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500415 return 0;
416 }
417 else if (overflow < 0 || color_number < 0) {
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200418 color_number = -1;
419 }
420
421 *(int *)ptr = (int)color_number;
422 return 1;
423}
424
425static int
426color_converter(PyObject *arg, void *ptr)
427{
428 if (!color_allow_default_converter(arg, ptr)) {
429 return 0;
430 }
431 if (*(int *)ptr < 0) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500432 PyErr_SetString(PyExc_ValueError,
433 "Color number is less than 0.");
434 return 0;
435 }
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500436 return 1;
437}
438
439/*[python input]
440class color_converter(CConverter):
441 type = 'int'
442 converter = 'color_converter'
443[python start generated code]*/
444/*[python end generated code: output=da39a3ee5e6b4b0d input=4260d2b6e66b3709]*/
445
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200446/*[python input]
447class color_allow_default_converter(CConverter):
448 type = 'int'
449 converter = 'color_allow_default_converter'
450[python start generated code]*/
451/*[python end generated code: output=da39a3ee5e6b4b0d input=975602bc058a872d]*/
452
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500453static int
454pair_converter(PyObject *arg, void *ptr)
455{
456 long pair_number;
457 int overflow;
458
459 pair_number = PyLong_AsLongAndOverflow(arg, &overflow);
460 if (pair_number == -1 && PyErr_Occurred())
461 return 0;
462
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200463#if _NCURSES_EXTENDED_COLOR_FUNCS
464 if (overflow > 0 || pair_number > INT_MAX) {
465 PyErr_Format(PyExc_ValueError,
466 "Color pair is greater than maximum (%d).",
467 INT_MAX);
468 return 0;
469 }
470#else
471 if (overflow > 0 || pair_number >= COLOR_PAIRS) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500472 PyErr_Format(PyExc_ValueError,
473 "Color pair is greater than COLOR_PAIRS-1 (%d).",
474 COLOR_PAIRS - 1);
475 return 0;
476 }
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200477#endif
478 else if (overflow < 0 || pair_number < 0) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500479 PyErr_SetString(PyExc_ValueError,
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200480 "Color pair is less than 0.");
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500481 return 0;
482 }
483
484 *(int *)ptr = (int)pair_number;
485 return 1;
486}
487
488/*[python input]
489class pair_converter(CConverter):
490 type = 'int'
491 converter = 'pair_converter'
492[python start generated code]*/
493/*[python end generated code: output=da39a3ee5e6b4b0d input=1a918ae6a1b32af7]*/
494
495static int
496component_converter(PyObject *arg, void *ptr)
497{
498 long component;
499 int overflow;
500
501 component = PyLong_AsLongAndOverflow(arg, &overflow);
502 if (component == -1 && PyErr_Occurred())
503 return 0;
504
505 if (overflow > 0 || component > 1000) {
506 PyErr_SetString(PyExc_ValueError,
507 "Color component is greater than 1000");
508 return 0;
509 }
510 else if (overflow < 0 || component < 0) {
511 PyErr_SetString(PyExc_ValueError,
512 "Color component is less than 0");
513 return 0;
514 }
515
516 *(short *)ptr = (short)component;
517 return 1;
518}
519
520/*[python input]
521class component_converter(CConverter):
522 type = 'short'
523 converter = 'component_converter'
524[python start generated code]*/
525/*[python end generated code: output=da39a3ee5e6b4b0d input=38e9be01d33927fb]*/
526
Benjamin Peterson21896a32010-03-21 22:03:03 +0000527/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000528 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000529
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000530static int func_PyCursesSetupTermCalled(void)
531{
532 PyCursesSetupTermCalled;
533 return 1;
534}
535
536static int func_PyCursesInitialised(void)
537{
538 PyCursesInitialised;
539 return 1;
540}
541
542static int func_PyCursesInitialisedColor(void)
543{
544 PyCursesInitialisedColor;
545 return 1;
546}
547
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000548/*****************************************************************************
549 The Window Object
550******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000551
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000552/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000553
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000554PyTypeObject PyCursesWindow_Type;
555
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000556/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000557
558 X - function name
559 TYPE - parameter Type
560 ERGSTR - format string for construction of the return value
561 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000562*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000563
Serhiy Storchaka81524022018-11-27 13:05:02 +0200564#define Window_NoArgNoReturnFunction(X) \
565 static PyObject *PyCursesWindow_ ## X \
566 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000567 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000568
Victor Stinner26486ea2010-05-15 22:23:53 +0000569#define Window_NoArgTrueFalseFunction(X) \
570 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200571 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000572 { \
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300573 return PyBool_FromLong(X(self->win)); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000574
Victor Stinner26486ea2010-05-15 22:23:53 +0000575#define Window_NoArgNoReturnVoidFunction(X) \
576 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200577 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000578 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200579 X(self->win); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000580
Victor Stinner26486ea2010-05-15 22:23:53 +0000581#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
582 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200583 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000584 { \
585 TYPE arg1, arg2; \
586 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000587
Victor Stinner26486ea2010-05-15 22:23:53 +0000588#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
589 static PyObject * PyCursesWindow_ ## X \
590 (PyCursesWindowObject *self, PyObject *args) \
591 { \
592 TYPE arg1; \
593 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200594 X(self->win,arg1); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000595
Victor Stinner26486ea2010-05-15 22:23:53 +0000596#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
597 static PyObject * PyCursesWindow_ ## X \
598 (PyCursesWindowObject *self, PyObject *args) \
599 { \
600 TYPE arg1; \
601 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
602 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000603
Victor Stinner26486ea2010-05-15 22:23:53 +0000604#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
605 static PyObject * PyCursesWindow_ ## X \
606 (PyCursesWindowObject *self, PyObject *args) \
607 { \
608 TYPE arg1, arg2; \
609 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
610 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000611
Guido van Rossumf6971e21994-08-30 12:25:20 +0000612/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000613
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000614Window_NoArgNoReturnFunction(untouchwin)
615Window_NoArgNoReturnFunction(touchwin)
616Window_NoArgNoReturnFunction(redrawwin)
617Window_NoArgNoReturnFunction(winsertln)
618Window_NoArgNoReturnFunction(werase)
619Window_NoArgNoReturnFunction(wdeleteln)
620
621Window_NoArgTrueFalseFunction(is_wintouched)
622
623Window_NoArgNoReturnVoidFunction(wsyncup)
624Window_NoArgNoReturnVoidFunction(wsyncdown)
625Window_NoArgNoReturnVoidFunction(wstandend)
626Window_NoArgNoReturnVoidFunction(wstandout)
627Window_NoArgNoReturnVoidFunction(wcursyncup)
628Window_NoArgNoReturnVoidFunction(wclrtoeol)
629Window_NoArgNoReturnVoidFunction(wclrtobot)
630Window_NoArgNoReturnVoidFunction(wclear)
631
632Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200633#ifdef HAVE_CURSES_IMMEDOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000634Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200635#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000636Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000637
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000638Window_NoArg2TupleReturnFunction(getyx, int, "ii")
639Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
640Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
641Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000642
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000643Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
644Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
645Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
646Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
647Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
648Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
649Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000650Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200651#ifdef HAVE_CURSES_SYNCOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000652Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200653#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000654
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000655Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
656Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
657Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000658#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000659Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000660#endif
661
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000662/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000663
Guido van Rossumf6971e21994-08-30 12:25:20 +0000664static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100665PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000666{
Victor Stinner26486ea2010-05-15 22:23:53 +0000667 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000668
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669 if (encoding == NULL) {
670#if defined(MS_WINDOWS)
671 char *buffer[100];
672 UINT cp;
673 cp = GetConsoleOutputCP();
674 if (cp != 0) {
675 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
676 encoding = buffer;
677 }
678#elif defined(CODESET)
679 const char *codeset = nl_langinfo(CODESET);
680 if (codeset != NULL && codeset[0] != 0)
681 encoding = codeset;
682#endif
683 if (encoding == NULL)
684 encoding = "utf-8";
685 }
686
Victor Stinner92055202020-04-08 00:38:15 +0200687 wo = PyObject_New(PyCursesWindowObject, &PyCursesWindow_Type);
Victor Stinner26486ea2010-05-15 22:23:53 +0000688 if (wo == NULL) return NULL;
689 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200690 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100691 if (wo->encoding == NULL) {
692 Py_DECREF(wo);
693 PyErr_NoMemory();
694 return NULL;
695 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000696 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000697}
698
699static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000700PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000701{
Victor Stinner26486ea2010-05-15 22:23:53 +0000702 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100703 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200704 PyMem_Free(wo->encoding);
Victor Stinner32bd68c2020-12-01 10:37:39 +0100705 PyObject_Free(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000706}
707
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000708/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000709
Larry Hastings61272b72014-01-07 12:41:53 -0800710/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300711_curses.window.addch
Larry Hastings31826802013-10-19 00:09:25 -0700712
713 [
Larry Hastings31826802013-10-19 00:09:25 -0700714 y: int
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300715 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700716 x: int
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300717 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700718 ]
719
720 ch: object
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300721 Character to add.
Larry Hastings31826802013-10-19 00:09:25 -0700722
723 [
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300724 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
725 Attributes for the character.
Larry Hastings31826802013-10-19 00:09:25 -0700726 ]
727 /
728
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300729Paint the character.
Larry Hastings31826802013-10-19 00:09:25 -0700730
731Paint character ch at (y, x) with attributes attr,
732overwriting any character previously painted at that location.
733By default, the character position and attributes are the
734current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800735[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700736
Larry Hastings31826802013-10-19 00:09:25 -0700737static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300738_curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1,
739 int y, int x, PyObject *ch, int group_right_1,
740 long attr)
741/*[clinic end generated code: output=00f4c37af3378f45 input=95ce131578458196]*/
Larry Hastings31826802013-10-19 00:09:25 -0700742{
Larry Hastings31826802013-10-19 00:09:25 -0700743 int coordinates_group = group_left_1;
Larry Hastings31826802013-10-19 00:09:25 -0700744 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100745 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100746 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100747#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200748 wchar_t wstr[2];
749 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100750#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100751 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000752
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100753#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300754 type = PyCurses_ConvertToCchar_t(self, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100755 if (type == 2) {
756 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200757 wstr[1] = L'\0';
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200758 setcchar(&wcval, wstr, attr, PAIR_NUMBER(attr), NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700759 if (coordinates_group)
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300760 rtn = mvwadd_wch(self->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100761 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300762 rtn = wadd_wch(self->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100763 }
764 }
765 else
766#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300767 type = PyCurses_ConvertToCchar_t(self, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100768#endif
769 if (type == 1) {
770 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700771 if (coordinates_group)
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300772 rtn = mvwaddch(self->win,y,x, cch | (attr_t) attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100773 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300774 rtn = waddch(self->win, cch | (attr_t) attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775 }
776 }
777 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000778 return NULL;
779 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100780 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000781}
782
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300783/*[clinic input]
784_curses.window.addstr
785
786 [
787 y: int
788 Y-coordinate.
789 x: int
790 X-coordinate.
791 ]
792
793 str: object
794 String to add.
795
796 [
797 attr: long
798 Attributes for characters.
799 ]
800 /
801
802Paint the string.
803
804Paint the string str at (y, x) with attributes attr,
805overwriting anything previously on the display.
806By default, the character position and attributes are the
807current settings for the window object.
808[clinic start generated code]*/
809
Guido van Rossumf6971e21994-08-30 12:25:20 +0000810static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300811_curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
812 int y, int x, PyObject *str, int group_right_1,
813 long attr)
814/*[clinic end generated code: output=65a928ea85ff3115 input=ff6cbb91448a22a3]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +0000815{
Victor Stinner26486ea2010-05-15 22:23:53 +0000816 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100817 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300818 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100819#ifdef HAVE_NCURSESW
820 wchar_t *wstr = NULL;
821#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300822 attr_t attr_old = A_NORMAL;
823 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100824 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000825
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100826#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300827 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100828#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300829 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100830#endif
831 if (strtype == 0)
832 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300833 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +0000834 attr_old = getattrs(self->win);
835 (void)wattrset(self->win,attr);
836 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100837#ifdef HAVE_NCURSESW
838 if (strtype == 2) {
839 funcname = "addwstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300840 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100841 rtn = mvwaddwstr(self->win,y,x,wstr);
842 else
843 rtn = waddwstr(self->win,wstr);
844 PyMem_Free(wstr);
845 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000846 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100847#endif
848 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +0300849 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100850 funcname = "addstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300851 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100852 rtn = mvwaddstr(self->win,y,x,str);
853 else
854 rtn = waddstr(self->win,str);
855 Py_DECREF(bytesobj);
856 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300857 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +0000858 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100859 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000860}
Guido van Rossum85738471995-02-17 13:50:17 +0000861
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300862/*[clinic input]
863_curses.window.addnstr
864
865 [
866 y: int
867 Y-coordinate.
868 x: int
869 X-coordinate.
870 ]
871
872 str: object
873 String to add.
874
875 n: int
876 Maximal number of characters.
877
878 [
879 attr: long
880 Attributes for characters.
881 ]
882 /
883
884Paint at most n characters of the string.
885
886Paint at most n characters of the string str at (y, x) with
887attributes attr, overwriting anything previously on the display.
888By default, the character position and attributes are the
889current settings for the window object.
890[clinic start generated code]*/
891
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000892static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300893_curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1,
894 int y, int x, PyObject *str, int n,
895 int group_right_1, long attr)
896/*[clinic end generated code: output=6d21cee2ce6876d9 input=72718415c2744a2a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000897{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300898 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100899 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300900 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100901#ifdef HAVE_NCURSESW
902 wchar_t *wstr = NULL;
903#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300904 attr_t attr_old = A_NORMAL;
905 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100906 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100908#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300909 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100910#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300911 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100912#endif
913 if (strtype == 0)
914 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000915
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300916 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +0000917 attr_old = getattrs(self->win);
918 (void)wattrset(self->win,attr);
919 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100920#ifdef HAVE_NCURSESW
921 if (strtype == 2) {
922 funcname = "addnwstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300923 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100924 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
925 else
926 rtn = waddnwstr(self->win,wstr,n);
927 PyMem_Free(wstr);
928 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000929 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100930#endif
931 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +0300932 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100933 funcname = "addnstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300934 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100935 rtn = mvwaddnstr(self->win,y,x,str,n);
936 else
937 rtn = waddnstr(self->win,str,n);
938 Py_DECREF(bytesobj);
939 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300940 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +0000941 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100942 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000943}
944
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300945/*[clinic input]
946_curses.window.bkgd
947
948 ch: object
949 Background character.
950 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
951 Background attributes.
952 /
953
954Set the background property of the window.
955[clinic start generated code]*/
956
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000957static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300958_curses_window_bkgd_impl(PyCursesWindowObject *self, PyObject *ch, long attr)
959/*[clinic end generated code: output=058290afb2cf4034 input=634015bcb339283d]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000960{
Victor Stinner26486ea2010-05-15 22:23:53 +0000961 chtype bkgd;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000962
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300963 if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000964 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000965
Victor Stinner26486ea2010-05-15 22:23:53 +0000966 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000967}
968
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300969/*[clinic input]
970_curses.window.attroff
971
972 attr: long
973 /
974
975Remove attribute attr from the "background" set.
976[clinic start generated code]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000977
978static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300979_curses_window_attroff_impl(PyCursesWindowObject *self, long attr)
980/*[clinic end generated code: output=8a2fcd4df682fc64 input=786beedf06a7befe]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000981{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300982 return PyCursesCheckERR(wattroff(self->win, (attr_t)attr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000983}
984
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300985/*[clinic input]
986_curses.window.attron
987
988 attr: long
989 /
990
991Add attribute attr from the "background" set.
992[clinic start generated code]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000993
994static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300995_curses_window_attron_impl(PyCursesWindowObject *self, long attr)
996/*[clinic end generated code: output=7afea43b237fa870 input=5a88fba7b1524f32]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000997{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300998 return PyCursesCheckERR(wattron(self->win, (attr_t)attr), "attron");
999}
1000
1001/*[clinic input]
1002_curses.window.attrset
1003
1004 attr: long
1005 /
1006
1007Set the "background" set of attributes.
1008[clinic start generated code]*/
1009
1010static PyObject *
1011_curses_window_attrset_impl(PyCursesWindowObject *self, long attr)
1012/*[clinic end generated code: output=84e379bff20c0433 input=42e400c0d0154ab5]*/
1013{
1014 return PyCursesCheckERR(wattrset(self->win, (attr_t)attr), "attrset");
1015}
1016
1017/*[clinic input]
1018_curses.window.bkgdset
1019
1020 ch: object
1021 Background character.
1022 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1023 Background attributes.
1024 /
1025
1026Set the window's background.
1027[clinic start generated code]*/
1028
1029static PyObject *
1030_curses_window_bkgdset_impl(PyCursesWindowObject *self, PyObject *ch,
1031 long attr)
1032/*[clinic end generated code: output=8cb994fc4d7e2496 input=e09c682425c9e45b]*/
1033{
Victor Stinner26486ea2010-05-15 22:23:53 +00001034 chtype bkgd;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001035
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001036 if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +00001037 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001038
Victor Stinner26486ea2010-05-15 22:23:53 +00001039 wbkgdset(self->win, bkgd | attr);
1040 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001041}
1042
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001043/*[clinic input]
1044_curses.window.border
1045
1046 ls: object(c_default="NULL") = _curses.ACS_VLINE
1047 Left side.
1048 rs: object(c_default="NULL") = _curses.ACS_VLINE
1049 Right side.
1050 ts: object(c_default="NULL") = _curses.ACS_HLINE
1051 Top side.
1052 bs: object(c_default="NULL") = _curses.ACS_HLINE
1053 Bottom side.
1054 tl: object(c_default="NULL") = _curses.ACS_ULCORNER
1055 Upper-left corner.
1056 tr: object(c_default="NULL") = _curses.ACS_URCORNER
1057 Upper-right corner.
1058 bl: object(c_default="NULL") = _curses.ACS_LLCORNER
1059 Bottom-left corner.
1060 br: object(c_default="NULL") = _curses.ACS_LRCORNER
1061 Bottom-right corner.
1062 /
1063
1064Draw a border around the edges of the window.
1065
1066Each parameter specifies the character to use for a specific part of the
1067border. The characters can be specified as integers or as one-character
1068strings. A 0 value for any parameter will cause the default character to be
1069used for that parameter.
1070[clinic start generated code]*/
1071
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001072static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001073_curses_window_border_impl(PyCursesWindowObject *self, PyObject *ls,
1074 PyObject *rs, PyObject *ts, PyObject *bs,
1075 PyObject *tl, PyObject *tr, PyObject *bl,
1076 PyObject *br)
1077/*[clinic end generated code: output=670ef38d3d7c2aa3 input=e015f735d67a240b]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001078{
Victor Stinner26486ea2010-05-15 22:23:53 +00001079 chtype ch[8];
1080 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001081
Victor Stinner26486ea2010-05-15 22:23:53 +00001082 /* Clear the array of parameters */
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001083 for(i=0; i<8; i++)
Victor Stinner26486ea2010-05-15 22:23:53 +00001084 ch[i] = 0;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001085
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001086#define CONVERTTOCHTYPE(obj, i) \
1087 if ((obj) != NULL && !PyCurses_ConvertToChtype(self, (obj), &ch[(i)])) \
Victor Stinner26486ea2010-05-15 22:23:53 +00001088 return NULL;
1089
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001090 CONVERTTOCHTYPE(ls, 0);
1091 CONVERTTOCHTYPE(rs, 1);
1092 CONVERTTOCHTYPE(ts, 2);
1093 CONVERTTOCHTYPE(bs, 3);
1094 CONVERTTOCHTYPE(tl, 4);
1095 CONVERTTOCHTYPE(tr, 5);
1096 CONVERTTOCHTYPE(bl, 6);
1097 CONVERTTOCHTYPE(br, 7);
1098
1099#undef CONVERTTOCHTYPE
Victor Stinner26486ea2010-05-15 22:23:53 +00001100
1101 wborder(self->win,
1102 ch[0], ch[1], ch[2], ch[3],
1103 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001104 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001105}
1106
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001107/*[clinic input]
1108_curses.window.box
1109
1110 [
Victor Stinner37834132020-10-27 17:12:53 +01001111 verch: object(c_default="_PyLong_GetZero()") = 0
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001112 Left and right side.
Victor Stinner37834132020-10-27 17:12:53 +01001113 horch: object(c_default="_PyLong_GetZero()") = 0
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001114 Top and bottom side.
1115 ]
1116 /
1117
1118Draw a border around the edges of the window.
1119
1120Similar to border(), but both ls and rs are verch and both ts and bs are
1121horch. The default corner characters are always used by this function.
1122[clinic start generated code]*/
1123
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001124static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001125_curses_window_box_impl(PyCursesWindowObject *self, int group_right_1,
1126 PyObject *verch, PyObject *horch)
Victor Stinner37834132020-10-27 17:12:53 +01001127/*[clinic end generated code: output=f3fcb038bb287192 input=f00435f9c8c98f60]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001128{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001129 chtype ch1 = 0, ch2 = 0;
1130 if (group_right_1) {
1131 if (!PyCurses_ConvertToChtype(self, verch, &ch1)) {
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02001132 return NULL;
1133 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001134 if (!PyCurses_ConvertToChtype(self, horch, &ch2)) {
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02001135 return NULL;
1136 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001137 }
1138 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001139 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001140}
1141
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001142#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
1143#define py_mvwdelch mvwdelch
1144#else
1145int py_mvwdelch(WINDOW *w, int y, int x)
1146{
Victor Stinner26486ea2010-05-15 22:23:53 +00001147 mvwdelch(w,y,x);
1148 /* On HP/UX, mvwdelch already returns. On other systems,
1149 we may well run into this return statement. */
1150 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001151}
1152#endif
1153
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001154#if defined(HAVE_CURSES_IS_PAD)
1155#define py_is_pad(win) is_pad(win)
1156#elif defined(WINDOW_HAS_FLAGS)
1157#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
1158#endif
1159
Guido van Rossumd8faa362007-04-27 19:54:29 +00001160/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001161#ifdef HAVE_CURSES_WCHGAT
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001162/*[-clinic input]
1163_curses.window.chgat
1164
1165 [
1166 y: int
1167 Y-coordinate.
1168 x: int
1169 X-coordinate.
1170 ]
1171
1172 n: int = -1
1173 Number of characters.
1174
1175 attr: long
1176 Attributes for characters.
1177 /
1178
1179Set the attributes of characters.
1180
1181Set the attributes of num characters at the current cursor position, or at
1182position (y, x) if supplied. If no value of num is given or num = -1, the
1183attribute will be set on all the characters to the end of the line. This
1184function does not move the cursor. The changed line will be touched using
1185the touchline() method so that the contents will be redisplayed by the next
1186window refresh.
1187[-clinic start generated code]*/
Guido van Rossumd8faa362007-04-27 19:54:29 +00001188static PyObject *
1189PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
1190{
Victor Stinner26486ea2010-05-15 22:23:53 +00001191 int rtn;
1192 int x, y;
1193 int num = -1;
1194 short color;
1195 attr_t attr = A_NORMAL;
1196 long lattr;
1197 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001198
Victor Stinner26486ea2010-05-15 22:23:53 +00001199 switch (PyTuple_Size(args)) {
1200 case 1:
1201 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1202 return NULL;
1203 attr = lattr;
1204 break;
1205 case 2:
1206 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1207 return NULL;
1208 attr = lattr;
1209 break;
1210 case 3:
1211 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1212 return NULL;
1213 attr = lattr;
1214 use_xy = TRUE;
1215 break;
1216 case 4:
1217 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1218 return NULL;
1219 attr = lattr;
1220 use_xy = TRUE;
1221 break;
1222 default:
1223 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1224 return NULL;
1225 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001226
Victor Stinner26486ea2010-05-15 22:23:53 +00001227 color = (short)((attr >> 8) & 0xff);
1228 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001229
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001230 if (use_xy) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001231 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1232 touchline(self->win,y,1);
1233 } else {
1234 getyx(self->win,y,x);
1235 rtn = wchgat(self->win,num,attr,color,NULL);
1236 touchline(self->win,y,1);
1237 }
1238 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001239}
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001240#endif
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001241
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001242/*[clinic input]
1243_curses.window.delch
Guido van Rossum85738471995-02-17 13:50:17 +00001244
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001245 [
1246 y: int
1247 Y-coordinate.
1248 x: int
1249 X-coordinate.
1250 ]
1251 /
1252
1253Delete any character at (y, x).
1254[clinic start generated code]*/
1255
1256static PyObject *
1257_curses_window_delch_impl(PyCursesWindowObject *self, int group_right_1,
1258 int y, int x)
1259/*[clinic end generated code: output=22e77bb9fa11b461 input=d2f79e630a4fc6d0]*/
1260{
1261 if (!group_right_1) {
1262 return PyCursesCheckERR(wdelch(self->win), "wdelch");
Victor Stinner26486ea2010-05-15 22:23:53 +00001263 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001264 else {
1265 return PyCursesCheckERR(py_mvwdelch(self->win, y, x), "mvwdelch");
1266 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001267}
1268
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001269/*[clinic input]
1270_curses.window.derwin
1271
1272 [
1273 nlines: int = 0
1274 Height.
1275 ncols: int = 0
1276 Width.
1277 ]
1278 begin_y: int
1279 Top side y-coordinate.
1280 begin_x: int
1281 Left side x-coordinate.
1282 /
1283
1284Create a sub-window (window-relative coordinates).
1285
1286derwin() is the same as calling subwin(), except that begin_y and begin_x
1287are relative to the origin of the window, rather than relative to the entire
1288screen.
1289[clinic start generated code]*/
1290
Guido van Rossumf6971e21994-08-30 12:25:20 +00001291static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001292_curses_window_derwin_impl(PyCursesWindowObject *self, int group_left_1,
1293 int nlines, int ncols, int begin_y, int begin_x)
1294/*[clinic end generated code: output=7924b112d9f70d6e input=966d9481f7f5022e]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001295{
Victor Stinner26486ea2010-05-15 22:23:53 +00001296 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001297
Victor Stinner26486ea2010-05-15 22:23:53 +00001298 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001299
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 if (win == NULL) {
1301 PyErr_SetString(PyCursesError, catchall_NULL);
1302 return NULL;
1303 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001304
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001305 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001306}
1307
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001308/*[clinic input]
1309_curses.window.echochar
1310
1311 ch: object
1312 Character to add.
1313
1314 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1315 Attributes for the character.
1316 /
1317
1318Add character ch with attribute attr, and refresh.
1319[clinic start generated code]*/
1320
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001321static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001322_curses_window_echochar_impl(PyCursesWindowObject *self, PyObject *ch,
1323 long attr)
1324/*[clinic end generated code: output=13e7dd875d4b9642 input=e7f34b964e92b156]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001325{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001326 chtype ch_;
Guido van Rossum85738471995-02-17 13:50:17 +00001327
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001328 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001329 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001330
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001331#ifdef py_is_pad
1332 if (py_is_pad(self->win)) {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001333 return PyCursesCheckERR(pechochar(self->win, ch_ | (attr_t)attr),
Victor Stinner26486ea2010-05-15 22:23:53 +00001334 "echochar");
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001335 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001336 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001337#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001338 return PyCursesCheckERR(wechochar(self->win, ch_ | (attr_t)attr),
Victor Stinner26486ea2010-05-15 22:23:53 +00001339 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001340}
1341
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001342#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001343/*[clinic input]
1344_curses.window.enclose -> long
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001345
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001346 y: int
1347 Y-coordinate.
1348 x: int
1349 X-coordinate.
1350 /
1351
1352Return True if the screen-relative coordinates are enclosed by the window.
1353[clinic start generated code]*/
1354
1355static long
1356_curses_window_enclose_impl(PyCursesWindowObject *self, int y, int x)
1357/*[clinic end generated code: output=5251c961cbe3df63 input=dfe1d9d4d05d8642]*/
1358{
1359 return wenclose(self->win, y, x);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001360}
1361#endif
1362
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001363/*[clinic input]
1364_curses.window.getbkgd -> long
1365
1366Return the window's current background character/attribute pair.
1367[clinic start generated code]*/
1368
1369static long
1370_curses_window_getbkgd_impl(PyCursesWindowObject *self)
1371/*[clinic end generated code: output=c52b25dc16b215c3 input=a69db882fa35426c]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001372{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001373 return (long) getbkgd(self->win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001374}
1375
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001376/*[clinic input]
1377_curses.window.getch -> int
1378
1379 [
1380 y: int
1381 Y-coordinate.
1382 x: int
1383 X-coordinate.
1384 ]
1385 /
1386
1387Get a character code from terminal keyboard.
1388
1389The integer returned does not have to be in ASCII range: function keys,
1390keypad keys and so on return numbers higher than 256. In no-delay mode, -1
1391is returned if there is no input, else getch() waits until a key is pressed.
1392[clinic start generated code]*/
1393
1394static int
1395_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
1396 int y, int x)
1397/*[clinic end generated code: output=980aa6af0c0ca387 input=bb24ebfb379f991f]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001398{
Victor Stinner26486ea2010-05-15 22:23:53 +00001399 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001400
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001401 Py_BEGIN_ALLOW_THREADS
1402 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001403 rtn = wgetch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001404 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001405 else {
1406 rtn = mvwgetch(self->win, y, x);
1407 }
1408 Py_END_ALLOW_THREADS
1409
1410 return rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001411}
Guido van Rossum85738471995-02-17 13:50:17 +00001412
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001413/*[clinic input]
1414_curses.window.getkey
1415
1416 [
1417 y: int
1418 Y-coordinate.
1419 x: int
1420 X-coordinate.
1421 ]
1422 /
1423
1424Get a character (string) from terminal keyboard.
1425
1426Returning a string instead of an integer, as getch() does. Function keys,
1427keypad keys and other special keys return a multibyte string containing the
1428key name. In no-delay mode, an exception is raised if there is no input.
1429[clinic start generated code]*/
1430
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001431static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001432_curses_window_getkey_impl(PyCursesWindowObject *self, int group_right_1,
1433 int y, int x)
1434/*[clinic end generated code: output=8490a182db46b10f input=be2dee34f5cf57f8]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001435{
Victor Stinner26486ea2010-05-15 22:23:53 +00001436 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001437
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001438 Py_BEGIN_ALLOW_THREADS
1439 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001440 rtn = wgetch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001442 else {
1443 rtn = mvwgetch(self->win, y, x);
1444 }
1445 Py_END_ALLOW_THREADS
1446
Victor Stinner26486ea2010-05-15 22:23:53 +00001447 if (rtn == ERR) {
1448 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001449 PyErr_CheckSignals();
1450 if (!PyErr_Occurred())
1451 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001452 return NULL;
Serhiy Storchaka7e687902017-11-01 16:03:40 +02001453 } else if (rtn <= 255) {
1454#ifdef NCURSES_VERSION_MAJOR
1455#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507
1456 /* Work around a bug in ncurses 5.7 and earlier */
1457 if (rtn < 0) {
1458 rtn += 256;
1459 }
1460#endif
1461#endif
1462 return PyUnicode_FromOrdinal(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001463 } else {
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02001464 const char *knp = keyname(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001465 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1466 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001467}
1468
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001469#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001470/*[clinic input]
1471_curses.window.get_wch
1472
1473 [
1474 y: int
1475 Y-coordinate.
1476 x: int
1477 X-coordinate.
1478 ]
1479 /
1480
1481Get a wide character from terminal keyboard.
1482
1483Return a character for most keys, or an integer for function keys,
1484keypad keys, and other special keys.
1485[clinic start generated code]*/
1486
Guido van Rossumf6971e21994-08-30 12:25:20 +00001487static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001488_curses_window_get_wch_impl(PyCursesWindowObject *self, int group_right_1,
1489 int y, int x)
1490/*[clinic end generated code: output=9f4f86e91fe50ef3 input=dd7e5367fb49dc48]*/
Victor Stinnera7878b72011-07-14 23:07:44 +02001491{
Victor Stinnera7878b72011-07-14 23:07:44 +02001492 int ct;
1493 wint_t rtn;
1494
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001495 Py_BEGIN_ALLOW_THREADS
1496 if (!group_right_1) {
1497 ct = wget_wch(self->win ,&rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001498 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001499 else {
1500 ct = mvwget_wch(self->win, y, x, &rtn);
1501 }
1502 Py_END_ALLOW_THREADS
1503
Victor Stinnera7878b72011-07-14 23:07:44 +02001504 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001505 if (PyErr_CheckSignals())
1506 return NULL;
1507
Victor Stinnera7878b72011-07-14 23:07:44 +02001508 /* get_wch() returns ERR in nodelay mode */
1509 PyErr_SetString(PyCursesError, "no input");
1510 return NULL;
1511 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001512 if (ct == KEY_CODE_YES)
1513 return PyLong_FromLong(rtn);
1514 else
1515 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001516}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001517#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001518
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001519/*[-clinic input]
1520_curses.window.getstr
1521
1522 [
1523 y: int
1524 Y-coordinate.
1525 x: int
1526 X-coordinate.
1527 ]
1528 n: int = 1023
1529 Maximal number of characters.
1530 /
1531
1532Read a string from the user, with primitive line editing capacity.
1533[-clinic start generated code]*/
1534
Victor Stinnera7878b72011-07-14 23:07:44 +02001535static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001536PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001537{
Victor Stinner26486ea2010-05-15 22:23:53 +00001538 int x, y, n;
1539 char rtn[1024]; /* This should be big enough.. I hope */
1540 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001541
Victor Stinner26486ea2010-05-15 22:23:53 +00001542 switch (PyTuple_Size(args)) {
1543 case 0:
1544 Py_BEGIN_ALLOW_THREADS
1545 rtn2 = wgetnstr(self->win,rtn, 1023);
1546 Py_END_ALLOW_THREADS
1547 break;
1548 case 1:
1549 if (!PyArg_ParseTuple(args,"i;n", &n))
1550 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001551 if (n < 0) {
1552 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1553 return NULL;
1554 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001555 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001556 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001557 Py_END_ALLOW_THREADS
1558 break;
1559 case 2:
1560 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1561 return NULL;
1562 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001563#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001564 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001565#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001566 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001567#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001568 Py_END_ALLOW_THREADS
1569 break;
1570 case 3:
1571 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1572 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001573 if (n < 0) {
1574 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1575 return NULL;
1576 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001577#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001578 Py_BEGIN_ALLOW_THREADS
1579 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001580 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001581 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001582#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001583 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001584 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001585 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001586#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001587 break;
1588 default:
1589 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1590 return NULL;
1591 }
1592 if (rtn2 == ERR)
1593 rtn[0] = 0;
1594 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001595}
1596
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001597/*[clinic input]
1598_curses.window.hline
1599
1600 [
1601 y: int
1602 Starting Y-coordinate.
1603 x: int
1604 Starting X-coordinate.
1605 ]
1606
1607 ch: object
1608 Character to draw.
1609 n: int
1610 Line length.
1611
1612 [
1613 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1614 Attributes for the characters.
1615 ]
1616 /
1617
1618Display a horizontal line.
1619[clinic start generated code]*/
1620
Guido van Rossumf6971e21994-08-30 12:25:20 +00001621static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001622_curses_window_hline_impl(PyCursesWindowObject *self, int group_left_1,
1623 int y, int x, PyObject *ch, int n,
1624 int group_right_1, long attr)
1625/*[clinic end generated code: output=c00d489d61fc9eef input=81a4dea47268163e]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001626{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001627 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001628
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001629 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001630 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001631 if (group_left_1) {
1632 if (wmove(self->win, y, x) == ERR) {
1633 return PyCursesCheckERR(ERR, "wmove");
1634 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001635 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001636 return PyCursesCheckERR(whline(self->win, ch_ | (attr_t)attr, n), "hline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001637}
1638
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001639/*[clinic input]
1640_curses.window.insch
1641
1642 [
1643 y: int
1644 Y-coordinate.
1645 x: int
1646 X-coordinate.
1647 ]
1648
1649 ch: object
1650 Character to insert.
1651
1652 [
1653 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1654 Attributes for the character.
1655 ]
1656 /
1657
1658Insert a character before the current or specified position.
1659
1660All characters to the right of the cursor are shifted one position right, with
1661the rightmost characters on the line being lost.
1662[clinic start generated code]*/
1663
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001664static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001665_curses_window_insch_impl(PyCursesWindowObject *self, int group_left_1,
1666 int y, int x, PyObject *ch, int group_right_1,
1667 long attr)
1668/*[clinic end generated code: output=ade8cfe3a3bf3e34 input=336342756ee19812]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001669{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001670 int rtn;
1671 chtype ch_ = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001672
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001673 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001674 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001675
1676 if (!group_left_1) {
1677 rtn = winsch(self->win, ch_ | (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001678 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001679 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001680 rtn = mvwinsch(self->win, y, x, ch_ | (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001681 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001682
Victor Stinner26486ea2010-05-15 22:23:53 +00001683 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001684}
1685
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001686/*[clinic input]
1687_curses.window.inch -> unsigned_long
1688
1689 [
1690 y: int
1691 Y-coordinate.
1692 x: int
1693 X-coordinate.
1694 ]
1695 /
1696
1697Return the character at the given position in the window.
1698
1699The bottom 8 bits are the character proper, and upper bits are the attributes.
1700[clinic start generated code]*/
1701
1702static unsigned long
1703_curses_window_inch_impl(PyCursesWindowObject *self, int group_right_1,
1704 int y, int x)
1705/*[clinic end generated code: output=6c4719fe978fe86a input=fac23ee11e3b3a66]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001706{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001707 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001708
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001709 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001710 rtn = winch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001711 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001712 else {
1713 rtn = mvwinch(self->win, y, x);
1714 }
1715
1716 return rtn;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001717}
1718
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001719/*[-clinic input]
1720_curses.window.instr
1721
1722 [
1723 y: int
1724 Y-coordinate.
1725 x: int
1726 X-coordinate.
1727 ]
1728 n: int = 1023
1729 Maximal number of characters.
1730 /
1731
1732Return a string of characters, extracted from the window.
1733
1734Return a string of characters, extracted from the window starting at the
1735current cursor position, or at y, x if specified. Attributes are stripped
1736from the characters. If n is specified, instr() returns a string at most
1737n characters long (exclusive of the trailing NUL).
1738[-clinic start generated code]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001739static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001740PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001741{
Victor Stinner26486ea2010-05-15 22:23:53 +00001742 int x, y, n;
1743 char rtn[1024]; /* This should be big enough.. I hope */
1744 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001745
Victor Stinner26486ea2010-05-15 22:23:53 +00001746 switch (PyTuple_Size(args)) {
1747 case 0:
1748 rtn2 = winnstr(self->win,rtn, 1023);
1749 break;
1750 case 1:
1751 if (!PyArg_ParseTuple(args,"i;n", &n))
1752 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001753 if (n < 0) {
1754 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1755 return NULL;
1756 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001757 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001758 break;
1759 case 2:
1760 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1761 return NULL;
1762 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1763 break;
1764 case 3:
1765 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1766 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001767 if (n < 0) {
1768 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1769 return NULL;
1770 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001771 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001772 break;
1773 default:
1774 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1775 return NULL;
1776 }
1777 if (rtn2 == ERR)
1778 rtn[0] = 0;
1779 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001780}
1781
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001782/*[clinic input]
1783_curses.window.insstr
1784
1785 [
1786 y: int
1787 Y-coordinate.
1788 x: int
1789 X-coordinate.
1790 ]
1791
1792 str: object
1793 String to insert.
1794
1795 [
1796 attr: long
1797 Attributes for characters.
1798 ]
1799 /
1800
1801Insert the string before the current or specified position.
1802
1803Insert a character string (as many characters as will fit on the line)
1804before the character under the cursor. All characters to the right of
1805the cursor are shifted right, with the rightmost characters on the line
1806being lost. The cursor position does not change (after moving to y, x,
1807if specified).
1808[clinic start generated code]*/
1809
Guido van Rossumf6971e21994-08-30 12:25:20 +00001810static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001811_curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1,
1812 int y, int x, PyObject *str, int group_right_1,
1813 long attr)
1814/*[clinic end generated code: output=c259a5265ad0b777 input=6827cddc6340a7f3]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001815{
Victor Stinner26486ea2010-05-15 22:23:53 +00001816 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001817 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001818 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001819#ifdef HAVE_NCURSESW
1820 wchar_t *wstr = NULL;
1821#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001822 attr_t attr_old = A_NORMAL;
1823 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001824 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001825
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001826#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001827 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001828#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001829 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001830#endif
1831 if (strtype == 0)
1832 return NULL;
1833
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001834 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001835 attr_old = getattrs(self->win);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001836 (void)wattrset(self->win, (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001837 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001838#ifdef HAVE_NCURSESW
1839 if (strtype == 2) {
1840 funcname = "inswstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001841 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001842 rtn = mvwins_wstr(self->win,y,x,wstr);
1843 else
1844 rtn = wins_wstr(self->win,wstr);
1845 PyMem_Free(wstr);
1846 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001847 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001848#endif
1849 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03001850 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001851 funcname = "insstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001852 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001853 rtn = mvwinsstr(self->win,y,x,str);
1854 else
1855 rtn = winsstr(self->win,str);
1856 Py_DECREF(bytesobj);
1857 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001858 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +00001859 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001860 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001861}
1862
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001863/*[clinic input]
1864_curses.window.insnstr
1865
1866 [
1867 y: int
1868 Y-coordinate.
1869 x: int
1870 X-coordinate.
1871 ]
1872
1873 str: object
1874 String to insert.
1875
1876 n: int
1877 Maximal number of characters.
1878
1879 [
1880 attr: long
1881 Attributes for characters.
1882 ]
1883 /
1884
1885Insert at most n characters of the string.
1886
1887Insert a character string (as many characters as will fit on the line)
1888before the character under the cursor, up to n characters. If n is zero
1889or negative, the entire string is inserted. All characters to the right
1890of the cursor are shifted right, with the rightmost characters on the line
1891being lost. The cursor position does not change (after moving to y, x, if
1892specified).
1893[clinic start generated code]*/
1894
Guido van Rossumf6971e21994-08-30 12:25:20 +00001895static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001896_curses_window_insnstr_impl(PyCursesWindowObject *self, int group_left_1,
1897 int y, int x, PyObject *str, int n,
1898 int group_right_1, long attr)
1899/*[clinic end generated code: output=971a32ea6328ec8b input=70fa0cd543901a4c]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001900{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001901 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001902 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001903 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001904#ifdef HAVE_NCURSESW
1905 wchar_t *wstr = NULL;
1906#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001907 attr_t attr_old = A_NORMAL;
1908 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001909 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001910
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001911#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001912 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001913#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001914 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001915#endif
1916 if (strtype == 0)
1917 return NULL;
1918
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001919 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001920 attr_old = getattrs(self->win);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001921 (void)wattrset(self->win, (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001922 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001923#ifdef HAVE_NCURSESW
1924 if (strtype == 2) {
1925 funcname = "insn_wstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001926 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001927 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1928 else
1929 rtn = wins_nwstr(self->win,wstr,n);
1930 PyMem_Free(wstr);
1931 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001932 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001933#endif
1934 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03001935 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001936 funcname = "insnstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001937 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001938 rtn = mvwinsnstr(self->win,y,x,str,n);
1939 else
1940 rtn = winsnstr(self->win,str,n);
1941 Py_DECREF(bytesobj);
1942 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001943 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +00001944 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001945 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001946}
1947
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001948/*[clinic input]
1949_curses.window.is_linetouched
1950
1951 line: int
1952 Line number.
1953 /
1954
1955Return True if the specified line was modified, otherwise return False.
1956
1957Raise a curses.error exception if line is not valid for the given window.
1958[clinic start generated code]*/
1959
Guido van Rossumf6971e21994-08-30 12:25:20 +00001960static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001961_curses_window_is_linetouched_impl(PyCursesWindowObject *self, int line)
1962/*[clinic end generated code: output=ad4a4edfee2db08c input=a7be0c189f243914]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001963{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001964 int erg;
Victor Stinner26486ea2010-05-15 22:23:53 +00001965 erg = is_linetouched(self->win, line);
1966 if (erg == ERR) {
1967 PyErr_SetString(PyExc_TypeError,
1968 "is_linetouched: line number outside of boundaries");
1969 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001970 }
1971 return PyBool_FromLong(erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001972}
1973
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001974#ifdef py_is_pad
1975/*[clinic input]
1976_curses.window.noutrefresh
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001977
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001978 [
1979 pminrow: int
1980 pmincol: int
1981 sminrow: int
1982 smincol: int
1983 smaxrow: int
1984 smaxcol: int
1985 ]
1986 /
1987
1988Mark for refresh but wait.
1989
1990This function updates the data structure representing the desired state of the
1991window, but does not force an update of the physical screen. To accomplish
1992that, call doupdate().
1993[clinic start generated code]*/
1994
1995static PyObject *
1996_curses_window_noutrefresh_impl(PyCursesWindowObject *self,
1997 int group_right_1, int pminrow, int pmincol,
1998 int sminrow, int smincol, int smaxrow,
1999 int smaxcol)
2000/*[clinic end generated code: output=809a1f3c6a03e23e input=3e56898388cd739e]*/
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002001#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002002/*[clinic input]
2003_curses.window.noutrefresh
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00002004
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002005Mark for refresh but wait.
2006
2007This function updates the data structure representing the desired state of the
2008window, but does not force an update of the physical screen. To accomplish
2009that, call doupdate().
2010[clinic start generated code]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002011
2012static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002013_curses_window_noutrefresh_impl(PyCursesWindowObject *self)
2014/*[clinic end generated code: output=6ef6dec666643fee input=876902e3fa431dbd]*/
2015#endif
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002016{
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002017 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00002018
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002019#ifdef py_is_pad
2020 if (py_is_pad(self->win)) {
2021 if (!group_right_1) {
2022 PyErr_SetString(PyCursesError,
2023 "noutrefresh() called for a pad "
2024 "requires 6 arguments");
Victor Stinner26486ea2010-05-15 22:23:53 +00002025 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002026 }
2027 Py_BEGIN_ALLOW_THREADS
2028 rtn = pnoutrefresh(self->win, pminrow, pmincol,
2029 sminrow, smincol, smaxrow, smaxcol);
2030 Py_END_ALLOW_THREADS
2031 return PyCursesCheckERR(rtn, "pnoutrefresh");
2032 }
2033 if (group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002034 PyErr_SetString(PyExc_TypeError,
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002035 "noutrefresh() takes no arguments (6 given)");
Victor Stinner26486ea2010-05-15 22:23:53 +00002036 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002037 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002038#endif
2039 Py_BEGIN_ALLOW_THREADS
2040 rtn = wnoutrefresh(self->win);
2041 Py_END_ALLOW_THREADS
2042 return PyCursesCheckERR(rtn, "wnoutrefresh");
2043}
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002044
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002045/*[clinic input]
2046_curses.window.overlay
2047
2048 destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
2049
2050 [
2051 sminrow: int
2052 smincol: int
2053 dminrow: int
2054 dmincol: int
2055 dmaxrow: int
2056 dmaxcol: int
2057 ]
2058 /
2059
2060Overlay the window on top of destwin.
2061
2062The windows need not be the same size, only the overlapping region is copied.
2063This copy is non-destructive, which means that the current background
2064character does not overwrite the old contents of destwin.
2065
2066To get fine-grained control over the copied region, the second form of
2067overlay() can be used. sminrow and smincol are the upper-left coordinates
2068of the source window, and the other variables mark a rectangle in the
2069destination window.
2070[clinic start generated code]*/
2071
2072static PyObject *
2073_curses_window_overlay_impl(PyCursesWindowObject *self,
2074 PyCursesWindowObject *destwin, int group_right_1,
2075 int sminrow, int smincol, int dminrow,
2076 int dmincol, int dmaxrow, int dmaxcol)
2077/*[clinic end generated code: output=82bb2c4cb443ca58 input=7edd23ad22cc1984]*/
2078{
2079 int rtn;
2080
2081 if (group_right_1) {
2082 rtn = copywin(self->win, destwin->win, sminrow, smincol,
Victor Stinner26486ea2010-05-15 22:23:53 +00002083 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
2084 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002085 }
2086 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002087 rtn = overlay(self->win, destwin->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00002088 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002089 }
2090}
2091
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002092/*[clinic input]
2093_curses.window.overwrite
2094
2095 destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
2096
2097 [
2098 sminrow: int
2099 smincol: int
2100 dminrow: int
2101 dmincol: int
2102 dmaxrow: int
2103 dmaxcol: int
2104 ]
2105 /
2106
2107Overwrite the window on top of destwin.
2108
2109The windows need not be the same size, in which case only the overlapping
2110region is copied. This copy is destructive, which means that the current
2111background character overwrites the old contents of destwin.
2112
2113To get fine-grained control over the copied region, the second form of
2114overwrite() can be used. sminrow and smincol are the upper-left coordinates
2115of the source window, the other variables mark a rectangle in the destination
2116window.
2117[clinic start generated code]*/
2118
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002119static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002120_curses_window_overwrite_impl(PyCursesWindowObject *self,
2121 PyCursesWindowObject *destwin,
2122 int group_right_1, int sminrow, int smincol,
2123 int dminrow, int dmincol, int dmaxrow,
2124 int dmaxcol)
2125/*[clinic end generated code: output=12ae007d1681be28 input=ea5de1b35cd948e0]*/
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002126{
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002127 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00002128
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002129 if (group_right_1) {
2130 rtn = copywin(self->win, destwin->win, sminrow, smincol,
Victor Stinner26486ea2010-05-15 22:23:53 +00002131 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002132 return PyCursesCheckERR(rtn, "copywin");
2133 }
2134 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002135 rtn = overwrite(self->win, destwin->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00002136 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002137 }
2138}
2139
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002140/*[clinic input]
2141_curses.window.putwin
2142
2143 file: object
2144 /
2145
2146Write all data associated with the window into the provided file object.
2147
2148This information can be later retrieved using the getwin() function.
2149[clinic start generated code]*/
2150
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002151static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002152_curses_window_putwin(PyCursesWindowObject *self, PyObject *file)
2153/*[clinic end generated code: output=3a25e2a5e7a040ac input=0608648e09c8ea0a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002154{
Victor Stinner26486ea2010-05-15 22:23:53 +00002155 /* We have to simulate this by writing to a temporary FILE*,
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002156 then reading back, then writing to the argument file. */
Christian Heimes2b221b72017-03-02 11:09:01 +01002157 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002158 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002159
Christian Heimes2b221b72017-03-02 11:09:01 +01002160 fp = tmpfile();
2161 if (fp == NULL)
2162 return PyErr_SetFromErrno(PyExc_OSError);
2163 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002164 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00002165 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002166 if (res == NULL)
2167 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00002168 fseek(fp, 0, 0);
2169 while (1) {
2170 char buf[BUFSIZ];
2171 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002172 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002173
Victor Stinner26486ea2010-05-15 22:23:53 +00002174 if (n <= 0)
2175 break;
2176 Py_DECREF(res);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002177 res = _PyObject_CallMethodId(file, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00002178 if (res == NULL)
2179 break;
2180 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002181
2182exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01002183 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00002184 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185}
2186
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002187/*[clinic input]
2188_curses.window.redrawln
2189
2190 beg: int
2191 Starting line number.
2192 num: int
2193 The number of lines.
2194 /
2195
2196Mark the specified lines corrupted.
2197
2198They should be completely redrawn on the next refresh() call.
2199[clinic start generated code]*/
2200
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002202_curses_window_redrawln_impl(PyCursesWindowObject *self, int beg, int num)
2203/*[clinic end generated code: output=ea216e334f9ce1b4 input=152155e258a77a7a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002204{
Victor Stinner26486ea2010-05-15 22:23:53 +00002205 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002206}
2207
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002208/*[clinic input]
2209_curses.window.refresh
2210
2211 [
2212 pminrow: int
2213 pmincol: int
2214 sminrow: int
2215 smincol: int
2216 smaxrow: int
2217 smaxcol: int
2218 ]
2219 /
2220
2221Update the display immediately.
2222
2223Synchronize actual screen with previous drawing/deleting methods.
2224The 6 optional arguments can only be specified when the window is a pad
2225created with newpad(). The additional parameters are needed to indicate
2226what part of the pad and screen are involved. pminrow and pmincol specify
2227the upper left-hand corner of the rectangle to be displayed in the pad.
2228sminrow, smincol, smaxrow, and smaxcol specify the edges of the rectangle to
2229be displayed on the screen. The lower right-hand corner of the rectangle to
2230be displayed in the pad is calculated from the screen coordinates, since the
2231rectangles must be the same size. Both rectangles must be entirely contained
2232within their respective structures. Negative values of pminrow, pmincol,
2233sminrow, or smincol are treated as if they were zero.
2234[clinic start generated code]*/
2235
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002237_curses_window_refresh_impl(PyCursesWindowObject *self, int group_right_1,
2238 int pminrow, int pmincol, int sminrow,
2239 int smincol, int smaxrow, int smaxcol)
2240/*[clinic end generated code: output=42199543115e6e63 input=95e01cb5ffc635d0]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002241{
Victor Stinner26486ea2010-05-15 22:23:53 +00002242 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00002243
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002244#ifdef py_is_pad
2245 if (py_is_pad(self->win)) {
2246 if (!group_right_1) {
2247 PyErr_SetString(PyCursesError,
2248 "refresh() for a pad requires 6 arguments");
2249 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002250 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002251 Py_BEGIN_ALLOW_THREADS
2252 rtn = prefresh(self->win, pminrow, pmincol,
2253 sminrow, smincol, smaxrow, smaxcol);
2254 Py_END_ALLOW_THREADS
2255 return PyCursesCheckERR(rtn, "prefresh");
2256 }
2257#endif
2258 if (group_right_1) {
2259 PyErr_SetString(PyExc_TypeError,
2260 "refresh() takes no arguments (6 given)");
Victor Stinner26486ea2010-05-15 22:23:53 +00002261 return NULL;
2262 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002263 Py_BEGIN_ALLOW_THREADS
2264 rtn = wrefresh(self->win);
2265 Py_END_ALLOW_THREADS
2266 return PyCursesCheckERR(rtn, "prefresh");
2267}
2268
2269/*[clinic input]
2270_curses.window.setscrreg
2271
2272 top: int
2273 First line number.
2274 bottom: int
2275 Last line number.
2276 /
2277
2278Define a software scrolling region.
2279
2280All scrolling actions will take place in this region.
2281[clinic start generated code]*/
2282
2283static PyObject *
2284_curses_window_setscrreg_impl(PyCursesWindowObject *self, int top,
2285 int bottom)
2286/*[clinic end generated code: output=486ab5db218d2b1a input=1b517b986838bf0e]*/
2287{
2288 return PyCursesCheckERR(wsetscrreg(self->win, top, bottom), "wsetscrreg");
2289}
2290
2291/*[clinic input]
2292_curses.window.subwin
2293
2294 [
2295 nlines: int = 0
2296 Height.
2297 ncols: int = 0
2298 Width.
2299 ]
2300 begin_y: int
2301 Top side y-coordinate.
2302 begin_x: int
2303 Left side x-coordinate.
2304 /
2305
2306Create a sub-window (screen-relative coordinates).
2307
2308By default, the sub-window will extend from the specified position to the
2309lower right corner of the window.
2310[clinic start generated code]*/
2311
2312static PyObject *
2313_curses_window_subwin_impl(PyCursesWindowObject *self, int group_left_1,
2314 int nlines, int ncols, int begin_y, int begin_x)
2315/*[clinic end generated code: output=93e898afc348f59a input=2129fa47fd57721c]*/
2316{
2317 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002318
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09002320#ifdef py_is_pad
2321 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002322 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09002323 }
Victor Stinner26486ea2010-05-15 22:23:53 +00002324 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002325#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002326 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002327
Victor Stinner26486ea2010-05-15 22:23:53 +00002328 if (win == NULL) {
2329 PyErr_SetString(PyCursesError, catchall_NULL);
2330 return NULL;
2331 }
2332
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002333 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002334}
2335
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002336/*[clinic input]
2337_curses.window.scroll
2338
2339 [
2340 lines: int = 1
2341 Number of lines to scroll.
2342 ]
2343 /
2344
2345Scroll the screen or scrolling region.
2346
2347Scroll upward if the argument is positive and downward if it is negative.
2348[clinic start generated code]*/
2349
Guido van Rossumf6971e21994-08-30 12:25:20 +00002350static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002351_curses_window_scroll_impl(PyCursesWindowObject *self, int group_right_1,
2352 int lines)
2353/*[clinic end generated code: output=4541a8a11852d360 input=c969ca0cfabbdbec]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002354{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002355 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002356 return PyCursesCheckERR(scroll(self->win), "scroll");
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002357 }
2358 else {
2359 return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002361}
2362
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002363/*[clinic input]
2364_curses.window.touchline
2365
2366 start: int
2367 count: int
2368 [
2369 changed: bool(accept={int}) = True
2370 ]
2371 /
2372
2373Pretend count lines have been changed, starting with line start.
2374
2375If changed is supplied, it specifies whether the affected lines are marked
2376as having been changed (changed=True) or unchanged (changed=False).
2377[clinic start generated code]*/
2378
Guido van Rossumf6971e21994-08-30 12:25:20 +00002379static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002380_curses_window_touchline_impl(PyCursesWindowObject *self, int start,
2381 int count, int group_right_1, int changed)
2382/*[clinic end generated code: output=65d05b3f7438c61d input=918ad1cbdadf93ea]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002383{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002384 if (!group_right_1) {
2385 return PyCursesCheckERR(touchline(self->win, start, count), "touchline");
2386 }
2387 else {
2388 return PyCursesCheckERR(wtouchln(self->win, start, count, changed), "touchline");
Victor Stinner26486ea2010-05-15 22:23:53 +00002389 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390}
2391
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002392/*[clinic input]
2393_curses.window.vline
2394
2395 [
2396 y: int
2397 Starting Y-coordinate.
2398 x: int
2399 Starting X-coordinate.
2400 ]
2401
2402 ch: object
2403 Character to draw.
2404 n: int
2405 Line length.
2406
2407 [
2408 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
2409 Attributes for the character.
2410 ]
2411 /
2412
2413Display a vertical line.
2414[clinic start generated code]*/
2415
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002416static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002417_curses_window_vline_impl(PyCursesWindowObject *self, int group_left_1,
2418 int y, int x, PyObject *ch, int n,
2419 int group_right_1, long attr)
2420/*[clinic end generated code: output=287ad1cc8982217f input=a6f2dc86a4648b32]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002422 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002423
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002424 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002426 if (group_left_1) {
2427 if (wmove(self->win, y, x) == ERR)
2428 return PyCursesCheckERR(ERR, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002429 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002430 return PyCursesCheckERR(wvline(self->win, ch_ | (attr_t)attr, n), "vline");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002431}
2432
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002433static PyObject *
2434PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
2435{
2436 return PyUnicode_FromString(self->encoding);
2437}
2438
2439static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02002440PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value, void *Py_UNUSED(ignored))
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002441{
2442 PyObject *ascii;
2443 char *encoding;
2444
2445 /* It is illegal to del win.encoding */
2446 if (value == NULL) {
2447 PyErr_SetString(PyExc_TypeError,
2448 "encoding may not be deleted");
2449 return -1;
2450 }
2451
2452 if (!PyUnicode_Check(value)) {
2453 PyErr_SetString(PyExc_TypeError,
2454 "setting encoding to a non-string");
2455 return -1;
2456 }
2457 ascii = PyUnicode_AsASCIIString(value);
2458 if (ascii == NULL)
2459 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002460 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002461 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002462 if (encoding == NULL) {
2463 PyErr_NoMemory();
2464 return -1;
2465 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002466 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002467 self->encoding = encoding;
2468 return 0;
2469}
2470
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002471#include "clinic/_cursesmodule.c.h"
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002472
Guido van Rossumf6971e21994-08-30 12:25:20 +00002473static PyMethodDef PyCursesWindow_Methods[] = {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002474 _CURSES_WINDOW_ADDCH_METHODDEF
2475 _CURSES_WINDOW_ADDNSTR_METHODDEF
2476 _CURSES_WINDOW_ADDSTR_METHODDEF
2477 _CURSES_WINDOW_ATTROFF_METHODDEF
2478 _CURSES_WINDOW_ATTRON_METHODDEF
2479 _CURSES_WINDOW_ATTRSET_METHODDEF
2480 _CURSES_WINDOW_BKGD_METHODDEF
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002481#ifdef HAVE_CURSES_WCHGAT
Victor Stinner26486ea2010-05-15 22:23:53 +00002482 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002483#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002484 _CURSES_WINDOW_BKGDSET_METHODDEF
2485 _CURSES_WINDOW_BORDER_METHODDEF
2486 _CURSES_WINDOW_BOX_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2488 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2489 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2490 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2491 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002492 _CURSES_WINDOW_DELCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002494 _CURSES_WINDOW_DERWIN_METHODDEF
2495 _CURSES_WINDOW_ECHOCHAR_METHODDEF
2496 _CURSES_WINDOW_ENCLOSE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002497 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2498 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002499 _CURSES_WINDOW_GETBKGD_METHODDEF
2500 _CURSES_WINDOW_GETCH_METHODDEF
2501 _CURSES_WINDOW_GETKEY_METHODDEF
2502 _CURSES_WINDOW_GET_WCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002503 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2504 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2505 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2506 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002507 _CURSES_WINDOW_HLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002508 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2509 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002510#ifdef HAVE_CURSES_IMMEDOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002511 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002512#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002513 _CURSES_WINDOW_INCH_METHODDEF
2514 _CURSES_WINDOW_INSCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002515 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2516 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002517 _CURSES_WINDOW_INSNSTR_METHODDEF
2518 _CURSES_WINDOW_INSSTR_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002519 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002520 _CURSES_WINDOW_IS_LINETOUCHED_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002521 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2522 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2523 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2524 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2525 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2526 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2527 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2528 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002529 _CURSES_WINDOW_NOUTREFRESH_METHODDEF
2530 _CURSES_WINDOW_OVERLAY_METHODDEF
2531 _CURSES_WINDOW_OVERWRITE_METHODDEF
2532 _CURSES_WINDOW_PUTWIN_METHODDEF
2533 _CURSES_WINDOW_REDRAWLN_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002534 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002535 _CURSES_WINDOW_REFRESH_METHODDEF
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002536#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002538#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002539 _CURSES_WINDOW_SCROLL_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002541 _CURSES_WINDOW_SETSCRREG_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002542 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2543 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002544 {"subpad", (PyCFunction)_curses_window_subwin, METH_VARARGS, _curses_window_subwin__doc__},
2545 _CURSES_WINDOW_SUBWIN_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002546 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002547#ifdef HAVE_CURSES_SYNCOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002548 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002549#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002550 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2551 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002552 _CURSES_WINDOW_TOUCHLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002553 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2554 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002555 _CURSES_WINDOW_VLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002557};
2558
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002559static PyGetSetDef PyCursesWindow_getsets[] = {
2560 {"encoding",
2561 (getter)PyCursesWindow_get_encoding,
2562 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002563 "the typecode character used to create the array"},
2564 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002565};
2566
Guido van Rossumf6971e21994-08-30 12:25:20 +00002567/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002568
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002569PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002570 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002571 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002572 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2573 0, /*tp_itemsize*/
2574 /* methods */
2575 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002576 0, /*tp_vectorcall_offset*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002577 (getattrfunc)0, /*tp_getattr*/
2578 (setattrfunc)0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002579 0, /*tp_as_async*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002580 0, /*tp_repr*/
2581 0, /*tp_as_number*/
2582 0, /*tp_as_sequence*/
2583 0, /*tp_as_mapping*/
2584 0, /*tp_hash*/
2585 0, /*tp_call*/
2586 0, /*tp_str*/
2587 0, /*tp_getattro*/
2588 0, /*tp_setattro*/
2589 0, /*tp_as_buffer*/
2590 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2591 0, /*tp_doc*/
2592 0, /*tp_traverse*/
2593 0, /*tp_clear*/
2594 0, /*tp_richcompare*/
2595 0, /*tp_weaklistoffset*/
2596 0, /*tp_iter*/
2597 0, /*tp_iternext*/
2598 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002599 0, /* tp_members */
2600 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002601};
2602
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002603/* Function Prototype Macros - They are ugly but very, very useful. ;-)
2604
2605 X - function name
2606 TYPE - parameter Type
2607 ERGSTR - format string for construction of the return value
2608 PARSESTR - format string for argument parsing
2609 */
2610
2611#define NoArgNoReturnFunctionBody(X) \
2612{ \
2613 PyCursesInitialised \
2614 return PyCursesCheckERR(X(), # X); }
2615
2616#define NoArgOrFlagNoReturnFunctionBody(X, flag) \
2617{ \
2618 PyCursesInitialised \
2619 if (flag) \
2620 return PyCursesCheckERR(X(), # X); \
2621 else \
2622 return PyCursesCheckERR(no ## X(), # X); \
2623}
2624
2625#define NoArgReturnIntFunctionBody(X) \
2626{ \
2627 PyCursesInitialised \
2628 return PyLong_FromLong((long) X()); }
2629
2630
2631#define NoArgReturnStringFunctionBody(X) \
2632{ \
2633 PyCursesInitialised \
2634 return PyBytes_FromString(X()); }
2635
2636#define NoArgTrueFalseFunctionBody(X) \
2637{ \
2638 PyCursesInitialised \
2639 return PyBool_FromLong(X()); }
2640
2641#define NoArgNoReturnVoidFunctionBody(X) \
2642{ \
2643 PyCursesInitialised \
2644 X(); \
2645 Py_RETURN_NONE; }
2646
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002647/*********************************************************************
2648 Global Functions
2649**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002650
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002651#ifdef HAVE_CURSES_FILTER
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002652/*[clinic input]
2653_curses.filter
2654
2655[clinic start generated code]*/
2656
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002657static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002658_curses_filter_impl(PyObject *module)
2659/*[clinic end generated code: output=fb5b8a3642eb70b5 input=668c75a6992d3624]*/
Christian Heimesaf98da12008-01-27 15:18:18 +00002660{
Victor Stinner26486ea2010-05-15 22:23:53 +00002661 /* not checking for PyCursesInitialised here since filter() must
2662 be called before initscr() */
2663 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002664 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002665}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002666#endif
Christian Heimesaf98da12008-01-27 15:18:18 +00002667
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002668/*[clinic input]
2669_curses.baudrate
2670
2671Return the output speed of the terminal in bits per second.
2672[clinic start generated code]*/
2673
Christian Heimesaf98da12008-01-27 15:18:18 +00002674static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002675_curses_baudrate_impl(PyObject *module)
2676/*[clinic end generated code: output=3c63c6c401d7d9c0 input=921f022ed04a0fd9]*/
2677NoArgReturnIntFunctionBody(baudrate)
2678
2679/*[clinic input]
2680_curses.beep
2681
2682Emit a short attention sound.
2683[clinic start generated code]*/
2684
2685static PyObject *
2686_curses_beep_impl(PyObject *module)
2687/*[clinic end generated code: output=425274962abe49a2 input=a35698ca7d0162bc]*/
2688NoArgNoReturnFunctionBody(beep)
2689
2690/*[clinic input]
2691_curses.can_change_color
2692
2693Return True if the programmer can change the colors displayed by the terminal.
2694[clinic start generated code]*/
2695
2696static PyObject *
2697_curses_can_change_color_impl(PyObject *module)
2698/*[clinic end generated code: output=359df8c3c77d8bf1 input=d7718884de0092f2]*/
2699NoArgTrueFalseFunctionBody(can_change_color)
2700
2701/*[clinic input]
2702_curses.cbreak
2703
2704 flag: bool(accept={int}) = True
2705 If false, the effect is the same as calling nocbreak().
2706 /
2707
2708Enter cbreak mode.
2709
2710In cbreak mode (sometimes called "rare" mode) normal tty line buffering is
2711turned off and characters are available to be read one by one. However,
2712unlike raw mode, special characters (interrupt, quit, suspend, and flow
2713control) retain their effects on the tty driver and calling program.
2714Calling first raw() then cbreak() leaves the terminal in cbreak mode.
2715[clinic start generated code]*/
2716
2717static PyObject *
2718_curses_cbreak_impl(PyObject *module, int flag)
2719/*[clinic end generated code: output=9f9dee9664769751 input=150be619eb1f1458]*/
2720NoArgOrFlagNoReturnFunctionBody(cbreak, flag)
2721
2722/*[clinic input]
2723_curses.color_content
2724
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002725 color_number: color
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002726 The number of the color (0 - (COLORS-1)).
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002727 /
2728
2729Return the red, green, and blue (RGB) components of the specified color.
2730
2731A 3-tuple is returned, containing the R, G, B values for the given color,
2732which will be between 0 (no component) and 1000 (maximum amount of component).
2733[clinic start generated code]*/
2734
2735static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002736_curses_color_content_impl(PyObject *module, int color_number)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002737/*[clinic end generated code: output=17b466df7054e0de input=03b5ed0472662aea]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002738{
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02002739 _CURSES_COLOR_VAL_TYPE r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002740
Victor Stinner26486ea2010-05-15 22:23:53 +00002741 PyCursesInitialised;
2742 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002743
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02002744 if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) == ERR) {
2745 PyErr_Format(PyCursesError, "%s() returned ERR",
2746 Py_STRINGIFY(_COLOR_CONTENT_FUNC));
Victor Stinner26486ea2010-05-15 22:23:53 +00002747 return NULL;
2748 }
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02002749
2750 return Py_BuildValue("(iii)", r, g, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751}
2752
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002753/*[clinic input]
2754_curses.color_pair
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002755
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002756 pair_number: int
2757 The number of the color pair.
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002758 /
2759
2760Return the attribute value for displaying text in the specified color.
2761
2762This attribute value can be combined with A_STANDOUT, A_REVERSE, and the
2763other A_* attributes. pair_number() is the counterpart to this function.
2764[clinic start generated code]*/
2765
2766static PyObject *
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002767_curses_color_pair_impl(PyObject *module, int pair_number)
2768/*[clinic end generated code: output=60718abb10ce9feb input=6034e9146f343802]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002769{
Victor Stinner26486ea2010-05-15 22:23:53 +00002770 PyCursesInitialised;
2771 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002773 return PyLong_FromLong(COLOR_PAIR(pair_number));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002774}
2775
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002776/*[clinic input]
2777_curses.curs_set
2778
2779 visibility: int
2780 0 for invisible, 1 for normal visible, or 2 for very visible.
2781 /
2782
2783Set the cursor state.
2784
2785If the terminal supports the visibility requested, the previous cursor
2786state is returned; otherwise, an exception is raised. On many terminals,
2787the "visible" mode is an underline cursor and the "very visible" mode is
2788a block cursor.
2789[clinic start generated code]*/
2790
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002791static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002792_curses_curs_set_impl(PyObject *module, int visibility)
2793/*[clinic end generated code: output=ee8e62483b1d6cd4 input=81a7924a65d29504]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002794{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002795 int erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002796
Victor Stinner26486ea2010-05-15 22:23:53 +00002797 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002798
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002799 erg = curs_set(visibility);
Victor Stinner26486ea2010-05-15 22:23:53 +00002800 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002801
Victor Stinner26486ea2010-05-15 22:23:53 +00002802 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002803}
2804
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002805/*[clinic input]
2806_curses.def_prog_mode
2807
2808Save the current terminal mode as the "program" mode.
2809
2810The "program" mode is the mode when the running program is using curses.
2811
2812Subsequent calls to reset_prog_mode() will restore this mode.
2813[clinic start generated code]*/
2814
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002815static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002816_curses_def_prog_mode_impl(PyObject *module)
2817/*[clinic end generated code: output=05d5a351fff874aa input=768b9cace620dda5]*/
2818NoArgNoReturnFunctionBody(def_prog_mode)
2819
2820/*[clinic input]
2821_curses.def_shell_mode
2822
2823Save the current terminal mode as the "shell" mode.
2824
2825The "shell" mode is the mode when the running program is not using curses.
2826
2827Subsequent calls to reset_shell_mode() will restore this mode.
2828[clinic start generated code]*/
2829
2830static PyObject *
2831_curses_def_shell_mode_impl(PyObject *module)
2832/*[clinic end generated code: output=d6e42f5c768f860f input=5ead21f6f0baa894]*/
2833NoArgNoReturnFunctionBody(def_shell_mode)
2834
2835/*[clinic input]
2836_curses.delay_output
2837
2838 ms: int
2839 Duration in milliseconds.
2840 /
2841
2842Insert a pause in output.
2843[clinic start generated code]*/
2844
2845static PyObject *
2846_curses_delay_output_impl(PyObject *module, int ms)
2847/*[clinic end generated code: output=b6613a67f17fa4f4 input=5316457f5f59196c]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002848{
Victor Stinner26486ea2010-05-15 22:23:53 +00002849 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002850
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002852}
2853
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002854/*[clinic input]
2855_curses.doupdate
2856
2857Update the physical screen to match the virtual screen.
2858[clinic start generated code]*/
2859
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002861_curses_doupdate_impl(PyObject *module)
2862/*[clinic end generated code: output=f34536975a75680c input=8da80914432a6489]*/
2863NoArgNoReturnFunctionBody(doupdate)
2864
2865/*[clinic input]
2866_curses.echo
2867
2868 flag: bool(accept={int}) = True
2869 If false, the effect is the same as calling noecho().
2870 /
2871
2872Enter echo mode.
2873
2874In echo mode, each character input is echoed to the screen as it is entered.
2875[clinic start generated code]*/
2876
2877static PyObject *
2878_curses_echo_impl(PyObject *module, int flag)
2879/*[clinic end generated code: output=03acb2ddfa6c8729 input=2e9e891d637eac5d]*/
2880NoArgOrFlagNoReturnFunctionBody(echo, flag)
2881
2882/*[clinic input]
2883_curses.endwin
2884
2885De-initialize the library, and return terminal to normal status.
2886[clinic start generated code]*/
2887
2888static PyObject *
2889_curses_endwin_impl(PyObject *module)
2890/*[clinic end generated code: output=c0150cd96d2f4128 input=e172cfa43062f3fa]*/
2891NoArgNoReturnFunctionBody(endwin)
2892
2893/*[clinic input]
2894_curses.erasechar
2895
2896Return the user's current erase character.
2897[clinic start generated code]*/
2898
2899static PyObject *
2900_curses_erasechar_impl(PyObject *module)
2901/*[clinic end generated code: output=3df305dc6b926b3f input=628c136c3c5758d3]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002902{
Victor Stinner26486ea2010-05-15 22:23:53 +00002903 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002904
Victor Stinner26486ea2010-05-15 22:23:53 +00002905 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002906
Victor Stinner26486ea2010-05-15 22:23:53 +00002907 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002908
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002910}
2911
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002912/*[clinic input]
2913_curses.flash
2914
2915Flash the screen.
2916
2917That is, change it to reverse-video and then change it back in a short interval.
2918[clinic start generated code]*/
2919
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002920static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002921_curses_flash_impl(PyObject *module)
2922/*[clinic end generated code: output=488b8a0ebd9ea9b8 input=02fdfb06c8fc3171]*/
2923NoArgNoReturnFunctionBody(flash)
2924
2925/*[clinic input]
2926_curses.flushinp
2927
2928Flush all input buffers.
2929
2930This throws away any typeahead that has been typed by the user and has not
2931yet been processed by the program.
2932[clinic start generated code]*/
2933
2934static PyObject *
2935_curses_flushinp_impl(PyObject *module)
2936/*[clinic end generated code: output=7e7a1fc1473960f5 input=59d042e705cef5ec]*/
2937NoArgNoReturnVoidFunctionBody(flushinp)
2938
2939#ifdef getsyx
2940/*[clinic input]
2941_curses.getsyx
2942
2943Return the current coordinates of the virtual screen cursor.
2944
2945Return a (y, x) tuple. If leaveok is currently true, return (-1, -1).
2946[clinic start generated code]*/
2947
2948static PyObject *
2949_curses_getsyx_impl(PyObject *module)
2950/*[clinic end generated code: output=c8e6c3f42349a038 input=9e1f862f3b4f7cba]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002951{
Victor Stinner26486ea2010-05-15 22:23:53 +00002952 int x = 0;
2953 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002954
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002956
Victor Stinner26486ea2010-05-15 22:23:53 +00002957 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002958
Victor Stinner26486ea2010-05-15 22:23:53 +00002959 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002960}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002961#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002962
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002963#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002964/*[clinic input]
2965_curses.getmouse
2966
2967Retrieve the queued mouse event.
2968
2969After getch() returns KEY_MOUSE to signal a mouse event, this function
2970returns a 5-tuple (id, x, y, z, bstate).
2971[clinic start generated code]*/
2972
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002973static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002974_curses_getmouse_impl(PyObject *module)
2975/*[clinic end generated code: output=ccf4242546b9cfa8 input=5b756ee6f5b481b1]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002976{
Victor Stinner26486ea2010-05-15 22:23:53 +00002977 int rtn;
2978 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002979
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002981
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 rtn = getmouse( &event );
2983 if (rtn == ERR) {
2984 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2985 return NULL;
2986 }
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002987 return Py_BuildValue("(hiiik)",
Victor Stinner26486ea2010-05-15 22:23:53 +00002988 (short)event.id,
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002989 (int)event.x, (int)event.y, (int)event.z,
2990 (unsigned long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002991}
2992
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002993/*[clinic input]
2994_curses.ungetmouse
2995
2996 id: short
2997 x: int
2998 y: int
2999 z: int
3000 bstate: unsigned_long(bitwise=True)
3001 /
3002
3003Push a KEY_MOUSE event onto the input queue.
3004
3005The following getmouse() will return the given state data.
3006[clinic start generated code]*/
3007
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003008static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003009_curses_ungetmouse_impl(PyObject *module, short id, int x, int y, int z,
3010 unsigned long bstate)
3011/*[clinic end generated code: output=3430c9b0fc5c4341 input=fd650b2ca5a01e8f]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003012{
Victor Stinner26486ea2010-05-15 22:23:53 +00003013 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003014
Victor Stinner26486ea2010-05-15 22:23:53 +00003015 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003016
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02003017 event.id = id;
3018 event.x = x;
3019 event.y = y;
3020 event.z = z;
3021 event.bstate = bstate;
Victor Stinner26486ea2010-05-15 22:23:53 +00003022 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003023}
3024#endif
3025
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003026/*[clinic input]
3027_curses.getwin
3028
3029 file: object
3030 /
3031
3032Read window related data stored in the file by an earlier putwin() call.
3033
3034The routine then creates and initializes a new window using that data,
3035returning the new window object.
3036[clinic start generated code]*/
3037
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003038static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003039_curses_getwin(PyObject *module, PyObject *file)
3040/*[clinic end generated code: output=a79e0df3379af756 input=f713d2bba0e4c929]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003041{
Christian Heimes2b221b72017-03-02 11:09:01 +01003042 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00003043 PyObject *data;
3044 size_t datalen;
3045 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05003046 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003047 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003050
Christian Heimes2b221b72017-03-02 11:09:01 +01003051 fp = tmpfile();
3052 if (fp == NULL)
3053 return PyErr_SetFromErrno(PyExc_OSError);
3054
3055 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02003056 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01003057
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02003058 data = _PyObject_CallMethodIdNoArgs(file, &PyId_read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003059 if (data == NULL)
3060 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 if (!PyBytes_Check(data)) {
3062 PyErr_Format(PyExc_TypeError,
3063 "f.read() returned %.100s instead of bytes",
Victor Stinnerdaa97562020-02-07 03:37:06 +01003064 Py_TYPE(data)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003066 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 }
3068 datalen = PyBytes_GET_SIZE(data);
3069 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
3070 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01003071 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003072 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003073 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00003074 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 fseek(fp, 0, 0);
3077 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 if (win == NULL) {
3079 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003080 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003081 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02003082 res = PyCursesWindow_New(win, NULL);
3083
3084error:
Christian Heimes2b221b72017-03-02 11:09:01 +01003085 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003086 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003087}
3088
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003089/*[clinic input]
3090_curses.halfdelay
3091
3092 tenths: byte
3093 Maximal blocking delay in tenths of seconds (1 - 255).
3094 /
3095
3096Enter half-delay mode.
3097
3098Use nocbreak() to leave half-delay mode.
3099[clinic start generated code]*/
3100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003101static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003102_curses_halfdelay_impl(PyObject *module, unsigned char tenths)
3103/*[clinic end generated code: output=e92cdf0ef33c0663 input=e42dce7259c15100]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003104{
Victor Stinner26486ea2010-05-15 22:23:53 +00003105 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003106
Victor Stinner26486ea2010-05-15 22:23:53 +00003107 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003108}
3109
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003110/*[clinic input]
3111_curses.has_colors
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003112
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003113Return True if the terminal can display colors; otherwise, return False.
3114[clinic start generated code]*/
3115
3116static PyObject *
3117_curses_has_colors_impl(PyObject *module)
3118/*[clinic end generated code: output=db5667483139e3e2 input=b2ec41b739d896c6]*/
3119NoArgTrueFalseFunctionBody(has_colors)
3120
3121/*[clinic input]
3122_curses.has_ic
3123
3124Return True if the terminal has insert- and delete-character capabilities.
3125[clinic start generated code]*/
3126
3127static PyObject *
3128_curses_has_ic_impl(PyObject *module)
3129/*[clinic end generated code: output=6be24da9cb1268fe input=9bc2d3a797cc7324]*/
3130NoArgTrueFalseFunctionBody(has_ic)
3131
3132/*[clinic input]
3133_curses.has_il
3134
3135Return True if the terminal has insert- and delete-line capabilities.
3136[clinic start generated code]*/
3137
3138static PyObject *
3139_curses_has_il_impl(PyObject *module)
3140/*[clinic end generated code: output=d45bd7788ff9f5f4 input=cd939d5607ee5427]*/
3141NoArgTrueFalseFunctionBody(has_il)
3142
3143#ifdef HAVE_CURSES_HAS_KEY
3144/*[clinic input]
3145_curses.has_key
3146
3147 key: int
3148 Key number.
3149 /
3150
3151Return True if the current terminal type recognizes a key with that value.
3152[clinic start generated code]*/
3153
3154static PyObject *
3155_curses_has_key_impl(PyObject *module, int key)
3156/*[clinic end generated code: output=19ad48319414d0b1 input=78bd44acf1a4997c]*/
3157{
Victor Stinner26486ea2010-05-15 22:23:53 +00003158 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003159
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003160 return PyBool_FromLong(has_key(key));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003161}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003162#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003163
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003164/*[clinic input]
3165_curses.init_color
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003166
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003167 color_number: color
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003168 The number of the color to be changed (0 - (COLORS-1)).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003169 r: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003170 Red component (0 - 1000).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003171 g: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003172 Green component (0 - 1000).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003173 b: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003174 Blue component (0 - 1000).
3175 /
3176
3177Change the definition of a color.
3178
3179When init_color() is used, all occurrences of that color on the screen
3180immediately change to the new definition. This function is a no-op on
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003181most terminals; it is active only if can_change_color() returns true.
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003182[clinic start generated code]*/
3183
3184static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003185_curses_init_color_impl(PyObject *module, int color_number, short r, short g,
3186 short b)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003187/*[clinic end generated code: output=d7ed71b2d818cdf2 input=ae2b8bea0f152c80]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003188{
Victor Stinner26486ea2010-05-15 22:23:53 +00003189 PyCursesInitialised;
3190 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003191
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02003192 return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b),
3193 Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003194}
3195
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003196/*[clinic input]
3197_curses.init_pair
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003198
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003199 pair_number: pair
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003200 The number of the color-pair to be changed (1 - (COLOR_PAIRS-1)).
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003201 fg: color_allow_default
3202 Foreground color number (-1 - (COLORS-1)).
3203 bg: color_allow_default
3204 Background color number (-1 - (COLORS-1)).
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003205 /
3206
3207Change the definition of a color-pair.
3208
3209If the color-pair was previously initialized, the screen is refreshed and
3210all occurrences of that color-pair are changed to the new definition.
3211[clinic start generated code]*/
3212
3213static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003214_curses_init_pair_impl(PyObject *module, int pair_number, int fg, int bg)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003215/*[clinic end generated code: output=a0bba03d2bbc3ee6 input=54b421b44c12c389]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003216{
Victor Stinner26486ea2010-05-15 22:23:53 +00003217 PyCursesInitialised;
3218 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003219
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02003220 if (_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg) == ERR) {
3221 if (pair_number >= COLOR_PAIRS) {
3222 PyErr_Format(PyExc_ValueError,
3223 "Color pair is greater than COLOR_PAIRS-1 (%d).",
3224 COLOR_PAIRS - 1);
3225 }
3226 else {
3227 PyErr_Format(PyCursesError, "%s() returned ERR",
3228 Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC));
3229 }
3230 return NULL;
3231 }
3232
3233 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003234}
3235
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003236static PyObject *ModDict;
3237
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003238/*[clinic input]
3239_curses.initscr
3240
3241Initialize the library.
3242
3243Return a WindowObject which represents the whole screen.
3244[clinic start generated code]*/
3245
Victor Stinner26486ea2010-05-15 22:23:53 +00003246static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003247_curses_initscr_impl(PyObject *module)
3248/*[clinic end generated code: output=619fb68443810b7b input=514f4bce1821f6b5]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003249{
Victor Stinner26486ea2010-05-15 22:23:53 +00003250 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003251 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003252
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003253 if (initialised) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003254 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003255 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00003256 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00003257
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003259
Victor Stinner26486ea2010-05-15 22:23:53 +00003260 if (win == NULL) {
3261 PyErr_SetString(PyCursesError, catchall_NULL);
3262 return NULL;
3263 }
Guido van Rossum85738471995-02-17 13:50:17 +00003264
Victor Stinner26486ea2010-05-15 22:23:53 +00003265 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00003266
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003267/* This was moved from initcurses() because it core dumped on SGI,
3268 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00003269#define SetDictInt(string,ch) \
3270 do { \
3271 PyObject *o = PyLong_FromLong((long) (ch)); \
3272 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
3273 Py_DECREF(o); \
3274 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003275 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003276
Victor Stinner26486ea2010-05-15 22:23:53 +00003277 /* Here are some graphic symbols you can use */
3278 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
3279 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
3280 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
3281 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
3282 SetDictInt("ACS_LTEE", (ACS_LTEE));
3283 SetDictInt("ACS_RTEE", (ACS_RTEE));
3284 SetDictInt("ACS_BTEE", (ACS_BTEE));
3285 SetDictInt("ACS_TTEE", (ACS_TTEE));
3286 SetDictInt("ACS_HLINE", (ACS_HLINE));
3287 SetDictInt("ACS_VLINE", (ACS_VLINE));
3288 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00003289#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 /* On HP/UX 11, these are of type cchar_t, which is not an
3291 integral type. If this is a problem on more platforms, a
3292 configure test should be added to determine whether ACS_S1
3293 is of integral type. */
3294 SetDictInt("ACS_S1", (ACS_S1));
3295 SetDictInt("ACS_S9", (ACS_S9));
3296 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
3297 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
3298 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
3299 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
3300 SetDictInt("ACS_BULLET", (ACS_BULLET));
3301 SetDictInt("ACS_LARROW", (ACS_LARROW));
3302 SetDictInt("ACS_RARROW", (ACS_RARROW));
3303 SetDictInt("ACS_DARROW", (ACS_DARROW));
3304 SetDictInt("ACS_UARROW", (ACS_UARROW));
3305 SetDictInt("ACS_BOARD", (ACS_BOARD));
3306 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
3307 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00003308#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003309 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
3310 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
3311 SetDictInt("ACS_BBSS", (ACS_URCORNER));
3312 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
3313 SetDictInt("ACS_SBSS", (ACS_RTEE));
3314 SetDictInt("ACS_SSSB", (ACS_LTEE));
3315 SetDictInt("ACS_SSBS", (ACS_BTEE));
3316 SetDictInt("ACS_BSSS", (ACS_TTEE));
3317 SetDictInt("ACS_BSBS", (ACS_HLINE));
3318 SetDictInt("ACS_SBSB", (ACS_VLINE));
3319 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003320
Victor Stinner26486ea2010-05-15 22:23:53 +00003321 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003322#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00003323 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003324#endif
3325#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00003326 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003327#endif
3328#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003329 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003330#endif
3331#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003332 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003333#endif
3334#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00003335 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003336#endif
3337#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003339#endif
3340#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00003341 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003342#endif
3343
Victor Stinner26486ea2010-05-15 22:23:53 +00003344 SetDictInt("LINES", LINES);
3345 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00003346
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003347 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
3348 screen_encoding = winobj->encoding;
3349 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003350}
3351
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003352/*[clinic input]
3353_curses.setupterm
3354
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003355 term: str(accept={str, NoneType}) = None
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003356 Terminal name.
3357 If omitted, the value of the TERM environment variable will be used.
3358 fd: int = -1
3359 File descriptor to which any initialization sequences will be sent.
3360 If not supplied, the file descriptor for sys.stdout will be used.
3361
3362Initialize the terminal.
3363[clinic start generated code]*/
3364
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003365static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003366_curses_setupterm_impl(PyObject *module, const char *term, int fd)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003367/*[clinic end generated code: output=4584e587350f2848 input=4511472766af0c12]*/
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003368{
Victor Stinner26486ea2010-05-15 22:23:53 +00003369 int err;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003370
Victor Stinner26486ea2010-05-15 22:23:53 +00003371 if (fd == -1) {
3372 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003373
Victor Stinnerbd303c12013-11-07 23:07:29 +01003374 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003375
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 if (sys_stdout == NULL || sys_stdout == Py_None) {
3377 PyErr_SetString(
3378 PyCursesError,
3379 "lost sys.stdout");
3380 return NULL;
3381 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003382
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003384
Victor Stinner26486ea2010-05-15 22:23:53 +00003385 if (fd == -1) {
3386 return NULL;
3387 }
3388 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003389
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003390 if (!initialised_setupterm && setupterm((char *)term, fd, &err) == ERR) {
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003391 const char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003392
Victor Stinner26486ea2010-05-15 22:23:53 +00003393 if (err == 0) {
3394 s = "setupterm: could not find terminal";
3395 } else if (err == -1) {
3396 s = "setupterm: could not find terminfo database";
3397 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003398
Victor Stinner26486ea2010-05-15 22:23:53 +00003399 PyErr_SetString(PyCursesError,s);
3400 return NULL;
3401 }
3402
3403 initialised_setupterm = TRUE;
3404
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003405 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003406}
Guido van Rossumf6971e21994-08-30 12:25:20 +00003407
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03003408#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
3409// https://invisible-island.net/ncurses/NEWS.html#index-t20080119
3410
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003411/*[clinic input]
Anthony Sottileb32cb972019-10-31 02:13:48 -07003412_curses.get_escdelay
3413
3414Gets the curses ESCDELAY setting.
3415
3416Gets the number of milliseconds to wait after reading an escape character,
3417to distinguish between an individual escape character entered on the
3418keyboard from escape sequences sent by cursor and function keys.
3419[clinic start generated code]*/
3420
3421static PyObject *
3422_curses_get_escdelay_impl(PyObject *module)
3423/*[clinic end generated code: output=222fa1a822555d60 input=be2d5b3dd974d0a4]*/
3424{
3425 return PyLong_FromLong(ESCDELAY);
3426}
3427/*[clinic input]
3428_curses.set_escdelay
3429 ms: int
3430 length of the delay in milliseconds.
3431 /
3432
3433Sets the curses ESCDELAY setting.
3434
3435Sets the number of milliseconds to wait after reading an escape character,
3436to distinguish between an individual escape character entered on the
3437keyboard from escape sequences sent by cursor and function keys.
3438[clinic start generated code]*/
3439
3440static PyObject *
3441_curses_set_escdelay_impl(PyObject *module, int ms)
3442/*[clinic end generated code: output=43818efbf7980ac4 input=7796fe19f111e250]*/
3443{
3444 if (ms <= 0) {
3445 PyErr_SetString(PyExc_ValueError, "ms must be > 0");
3446 return NULL;
3447 }
3448
3449 return PyCursesCheckERR(set_escdelay(ms), "set_escdelay");
3450}
3451
3452/*[clinic input]
3453_curses.get_tabsize
3454
3455Gets the curses TABSIZE setting.
3456
3457Gets the number of columns used by the curses library when converting a tab
3458character to spaces as it adds the tab to a window.
3459[clinic start generated code]*/
3460
3461static PyObject *
3462_curses_get_tabsize_impl(PyObject *module)
3463/*[clinic end generated code: output=7e9e51fb6126fbdf input=74af86bf6c9f5d7e]*/
3464{
3465 return PyLong_FromLong(TABSIZE);
3466}
3467/*[clinic input]
3468_curses.set_tabsize
3469 size: int
3470 rendered cell width of a tab character.
3471 /
3472
3473Sets the curses TABSIZE setting.
3474
3475Sets the number of columns used by the curses library when converting a tab
3476character to spaces as it adds the tab to a window.
3477[clinic start generated code]*/
3478
3479static PyObject *
3480_curses_set_tabsize_impl(PyObject *module, int size)
3481/*[clinic end generated code: output=c1de5a76c0daab1e input=78cba6a3021ad061]*/
3482{
3483 if (size <= 0) {
3484 PyErr_SetString(PyExc_ValueError, "size must be > 0");
3485 return NULL;
3486 }
3487
3488 return PyCursesCheckERR(set_tabsize(size), "set_tabsize");
3489}
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03003490#endif
Anthony Sottileb32cb972019-10-31 02:13:48 -07003491
3492/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003493_curses.intrflush
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003494
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003495 flag: bool(accept={int})
3496 /
3497
3498[clinic start generated code]*/
3499
3500static PyObject *
3501_curses_intrflush_impl(PyObject *module, int flag)
3502/*[clinic end generated code: output=c1986df35e999a0f input=fcba57bb28dfd795]*/
3503{
Victor Stinner26486ea2010-05-15 22:23:53 +00003504 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003505
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003506 return PyCursesCheckERR(intrflush(NULL, flag), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003507}
3508
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003509/*[clinic input]
3510_curses.isendwin
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003511
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003512Return True if endwin() has been called.
3513[clinic start generated code]*/
3514
3515static PyObject *
3516_curses_isendwin_impl(PyObject *module)
3517/*[clinic end generated code: output=d73179e4a7e1eb8c input=6cdb01a7ebf71397]*/
3518NoArgTrueFalseFunctionBody(isendwin)
3519
3520#ifdef HAVE_CURSES_IS_TERM_RESIZED
3521/*[clinic input]
3522_curses.is_term_resized
3523
3524 nlines: int
3525 Height.
3526 ncols: int
3527 Width.
3528 /
3529
3530Return True if resize_term() would modify the window structure, False otherwise.
3531[clinic start generated code]*/
3532
3533static PyObject *
3534_curses_is_term_resized_impl(PyObject *module, int nlines, int ncols)
3535/*[clinic end generated code: output=aafe04afe50f1288 input=ca9c0bd0fb8ab444]*/
3536{
Victor Stinner26486ea2010-05-15 22:23:53 +00003537 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003538
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003539 return PyBool_FromLong(is_term_resized(nlines, ncols));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003540}
3541#endif /* HAVE_CURSES_IS_TERM_RESIZED */
3542
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003543/*[clinic input]
3544_curses.keyname
3545
3546 key: int
3547 Key number.
3548 /
3549
3550Return the name of specified key.
3551[clinic start generated code]*/
3552
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003553static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003554_curses_keyname_impl(PyObject *module, int key)
3555/*[clinic end generated code: output=fa2675ab3f4e056b input=ee4b1d0f243a2a2b]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003556{
Victor Stinner26486ea2010-05-15 22:23:53 +00003557 const char *knp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003558
Victor Stinner26486ea2010-05-15 22:23:53 +00003559 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003560
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003561 if (key < 0) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003562 PyErr_SetString(PyExc_ValueError, "invalid key number");
3563 return NULL;
3564 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003565 knp = keyname(key);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003566
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03003567 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003568}
3569
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003570/*[clinic input]
3571_curses.killchar
3572
3573Return the user's current line kill character.
3574[clinic start generated code]*/
3575
Victor Stinner26486ea2010-05-15 22:23:53 +00003576static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003577_curses_killchar_impl(PyObject *module)
3578/*[clinic end generated code: output=31c3a45b2c528269 input=1ff171c38df5ccad]*/
Victor Stinner26486ea2010-05-15 22:23:53 +00003579{
3580 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003581
Victor Stinner26486ea2010-05-15 22:23:53 +00003582 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003583
Victor Stinner26486ea2010-05-15 22:23:53 +00003584 return PyBytes_FromStringAndSize(&ch, 1);
3585}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003586
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003587/*[clinic input]
3588_curses.longname
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003589
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003590Return the terminfo long name field describing the current terminal.
3591
3592The maximum length of a verbose description is 128 characters. It is defined
3593only after the call to initscr().
3594[clinic start generated code]*/
3595
3596static PyObject *
3597_curses_longname_impl(PyObject *module)
3598/*[clinic end generated code: output=fdf30433727ef568 input=84c3f20201b1098e]*/
3599NoArgReturnStringFunctionBody(longname)
3600
3601/*[clinic input]
3602_curses.meta
3603
3604 yes: bool(accept={int})
3605 /
3606
3607Enable/disable meta keys.
3608
3609If yes is True, allow 8-bit characters to be input. If yes is False,
3610allow only 7-bit characters.
3611[clinic start generated code]*/
3612
3613static PyObject *
3614_curses_meta_impl(PyObject *module, int yes)
3615/*[clinic end generated code: output=22f5abda46a605d8 input=af9892e3a74f35db]*/
3616{
Victor Stinner26486ea2010-05-15 22:23:53 +00003617 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003618
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003619 return PyCursesCheckERR(meta(stdscr, yes), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003620}
3621
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003622#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003623/*[clinic input]
3624_curses.mouseinterval
3625
3626 interval: int
3627 Time in milliseconds.
3628 /
3629
3630Set and retrieve the maximum time between press and release in a click.
3631
3632Set the maximum time that can elapse between press and release events in
3633order for them to be recognized as a click, and return the previous interval
3634value.
3635[clinic start generated code]*/
3636
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003637static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003638_curses_mouseinterval_impl(PyObject *module, int interval)
3639/*[clinic end generated code: output=c4f5ff04354634c5 input=75aaa3f0db10ac4e]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003640{
Victor Stinner26486ea2010-05-15 22:23:53 +00003641 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003642
Victor Stinner26486ea2010-05-15 22:23:53 +00003643 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003644}
3645
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003646/*[clinic input]
3647_curses.mousemask
3648
3649 newmask: unsigned_long(bitwise=True)
3650 /
3651
3652Set the mouse events to be reported, and return a tuple (availmask, oldmask).
3653
3654Return a tuple (availmask, oldmask). availmask indicates which of the
3655specified mouse events can be reported; on complete failure it returns 0.
3656oldmask is the previous value of the given window's mouse event mask.
3657If this function is never called, no mouse events are ever reported.
3658[clinic start generated code]*/
3659
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003660static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003661_curses_mousemask_impl(PyObject *module, unsigned long newmask)
3662/*[clinic end generated code: output=9406cf1b8a36e485 input=bdf76b7568a3c541]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003663{
Victor Stinner26486ea2010-05-15 22:23:53 +00003664 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003665
Victor Stinner26486ea2010-05-15 22:23:53 +00003666 PyCursesInitialised;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02003667 availmask = mousemask((mmask_t)newmask, &oldmask);
3668 return Py_BuildValue("(kk)",
3669 (unsigned long)availmask, (unsigned long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003670}
3671#endif
3672
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003673/*[clinic input]
3674_curses.napms
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003675
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003676 ms: int
3677 Duration in milliseconds.
3678 /
3679
3680Sleep for specified time.
3681[clinic start generated code]*/
3682
3683static PyObject *
3684_curses_napms_impl(PyObject *module, int ms)
3685/*[clinic end generated code: output=a40a1da2e39ea438 input=20cd3af2b6900f56]*/
3686{
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00003687 PyCursesInitialised;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003688
3689 return Py_BuildValue("i", napms(ms));
3690}
3691
3692
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003693/*[clinic input]
3694_curses.newpad
3695
3696 nlines: int
3697 Height.
3698 ncols: int
3699 Width.
3700 /
3701
3702Create and return a pointer to a new pad data structure.
3703[clinic start generated code]*/
3704
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003705static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003706_curses_newpad_impl(PyObject *module, int nlines, int ncols)
3707/*[clinic end generated code: output=de52a56eb1098ec9 input=93f1272f240d8894]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003708{
Victor Stinner26486ea2010-05-15 22:23:53 +00003709 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003710
Victor Stinner26486ea2010-05-15 22:23:53 +00003711 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003712
Victor Stinner26486ea2010-05-15 22:23:53 +00003713 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003714
Victor Stinner26486ea2010-05-15 22:23:53 +00003715 if (win == NULL) {
3716 PyErr_SetString(PyCursesError, catchall_NULL);
3717 return NULL;
3718 }
3719
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003720 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003721}
3722
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003723/*[clinic input]
3724_curses.newwin
3725
3726 nlines: int
3727 Height.
3728 ncols: int
3729 Width.
3730 [
3731 begin_y: int = 0
3732 Top side y-coordinate.
3733 begin_x: int = 0
3734 Left side x-coordinate.
3735 ]
3736 /
3737
3738Return a new window.
3739
3740By default, the window will extend from the specified position to the lower
3741right corner of the screen.
3742[clinic start generated code]*/
3743
Guido van Rossumf6971e21994-08-30 12:25:20 +00003744static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003745_curses_newwin_impl(PyObject *module, int nlines, int ncols,
3746 int group_right_1, int begin_y, int begin_x)
3747/*[clinic end generated code: output=c1e0a8dc8ac2826c input=29312c15a72a003d]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003748{
Victor Stinner26486ea2010-05-15 22:23:53 +00003749 WINDOW *win;
Guido van Rossum85738471995-02-17 13:50:17 +00003750
Victor Stinner26486ea2010-05-15 22:23:53 +00003751 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003752
Victor Stinner26486ea2010-05-15 22:23:53 +00003753 win = newwin(nlines,ncols,begin_y,begin_x);
3754 if (win == NULL) {
3755 PyErr_SetString(PyCursesError, catchall_NULL);
3756 return NULL;
3757 }
Guido van Rossum85738471995-02-17 13:50:17 +00003758
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003759 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003760}
3761
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003762/*[clinic input]
3763_curses.nl
3764
3765 flag: bool(accept={int}) = True
3766 If false, the effect is the same as calling nonl().
3767 /
3768
3769Enter newline mode.
3770
3771This mode translates the return key into newline on input, and translates
3772newline into return and line-feed on output. Newline mode is initially on.
3773[clinic start generated code]*/
3774
Guido van Rossumf6971e21994-08-30 12:25:20 +00003775static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003776_curses_nl_impl(PyObject *module, int flag)
3777/*[clinic end generated code: output=b39cc0ffc9015003 input=cf36a63f7b86e28a]*/
3778NoArgOrFlagNoReturnFunctionBody(nl, flag)
3779
3780/*[clinic input]
3781_curses.nocbreak
3782
3783Leave cbreak mode.
3784
3785Return to normal "cooked" mode with line buffering.
3786[clinic start generated code]*/
3787
3788static PyObject *
3789_curses_nocbreak_impl(PyObject *module)
3790/*[clinic end generated code: output=eabf3833a4fbf620 input=e4b65f7d734af400]*/
3791NoArgNoReturnFunctionBody(nocbreak)
3792
3793/*[clinic input]
3794_curses.noecho
3795
3796Leave echo mode.
3797
3798Echoing of input characters is turned off.
3799[clinic start generated code]*/
3800
3801static PyObject *
3802_curses_noecho_impl(PyObject *module)
3803/*[clinic end generated code: output=cc95ab45bc98f41b input=76714df529e614c3]*/
3804NoArgNoReturnFunctionBody(noecho)
3805
3806/*[clinic input]
3807_curses.nonl
3808
3809Leave newline mode.
3810
3811Disable translation of return into newline on input, and disable low-level
3812translation of newline into newline/return on output.
3813[clinic start generated code]*/
3814
3815static PyObject *
3816_curses_nonl_impl(PyObject *module)
3817/*[clinic end generated code: output=99e917e9715770c6 input=9d37dd122d3022fc]*/
3818NoArgNoReturnFunctionBody(nonl)
3819
3820/*[clinic input]
3821_curses.noqiflush
3822
3823Disable queue flushing.
3824
3825When queue flushing is disabled, normal flush of input and output queues
3826associated with the INTR, QUIT and SUSP characters will not be done.
3827[clinic start generated code]*/
3828
3829static PyObject *
3830_curses_noqiflush_impl(PyObject *module)
3831/*[clinic end generated code: output=8b95a4229bbf0877 input=ba3e6b2e3e54c4df]*/
3832NoArgNoReturnVoidFunctionBody(noqiflush)
3833
3834/*[clinic input]
3835_curses.noraw
3836
3837Leave raw mode.
3838
3839Return to normal "cooked" mode with line buffering.
3840[clinic start generated code]*/
3841
3842static PyObject *
3843_curses_noraw_impl(PyObject *module)
3844/*[clinic end generated code: output=39894e5524c430cc input=6ec86692096dffb5]*/
3845NoArgNoReturnFunctionBody(noraw)
3846
3847/*[clinic input]
3848_curses.pair_content
3849
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003850 pair_number: pair
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003851 The number of the color pair (0 - (COLOR_PAIRS-1)).
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003852 /
3853
3854Return a tuple (fg, bg) containing the colors for the requested color pair.
3855[clinic start generated code]*/
3856
3857static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003858_curses_pair_content_impl(PyObject *module, int pair_number)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003859/*[clinic end generated code: output=4a726dd0e6885f3f input=03970f840fc7b739]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003860{
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02003861 _CURSES_COLOR_NUM_TYPE f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003862
Victor Stinner26486ea2010-05-15 22:23:53 +00003863 PyCursesInitialised;
3864 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003865
Serhiy Storchaka59f9b4e2021-01-05 09:13:15 +02003866 if (_CURSES_PAIR_CONTENT_FUNC(pair_number, &f, &b) == ERR) {
3867 if (pair_number >= COLOR_PAIRS) {
3868 PyErr_Format(PyExc_ValueError,
3869 "Color pair is greater than COLOR_PAIRS-1 (%d).",
3870 COLOR_PAIRS - 1);
3871 }
3872 else {
3873 PyErr_Format(PyCursesError, "%s() returned ERR",
3874 Py_STRINGIFY(_CURSES_PAIR_CONTENT_FUNC));
3875 }
Victor Stinner26486ea2010-05-15 22:23:53 +00003876 return NULL;
3877 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003878
Victor Stinner26486ea2010-05-15 22:23:53 +00003879 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003880}
3881
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003882/*[clinic input]
3883_curses.pair_number
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003884
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003885 attr: int
3886 /
3887
3888Return the number of the color-pair set by the specified attribute value.
3889
3890color_pair() is the counterpart to this function.
3891[clinic start generated code]*/
3892
3893static PyObject *
3894_curses_pair_number_impl(PyObject *module, int attr)
3895/*[clinic end generated code: output=85bce7d65c0aa3f4 input=d478548e33f5e61a]*/
3896{
Victor Stinner26486ea2010-05-15 22:23:53 +00003897 PyCursesInitialised;
3898 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003899
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003900 return PyLong_FromLong(PAIR_NUMBER(attr));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003901}
3902
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003903/*[clinic input]
3904_curses.putp
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003905
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003906 string: str(accept={robuffer})
3907 /
3908
3909Emit the value of a specified terminfo capability for the current terminal.
3910
3911Note that the output of putp() always goes to standard output.
3912[clinic start generated code]*/
3913
3914static PyObject *
3915_curses_putp_impl(PyObject *module, const char *string)
3916/*[clinic end generated code: output=e98081d1b8eb5816 input=1601faa828b44cb3]*/
3917{
3918 return PyCursesCheckERR(putp(string), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003919}
3920
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003921/*[clinic input]
3922_curses.qiflush
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003923
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003924 flag: bool(accept={int}) = True
3925 If false, the effect is the same as calling noqiflush().
3926 /
3927
3928Enable queue flushing.
3929
3930If queue flushing is enabled, all output in the display driver queue
3931will be flushed when the INTR, QUIT and SUSP characters are read.
3932[clinic start generated code]*/
3933
3934static PyObject *
3935_curses_qiflush_impl(PyObject *module, int flag)
3936/*[clinic end generated code: output=9167e862f760ea30 input=e9e4a389946a0dbc]*/
3937{
Victor Stinner26486ea2010-05-15 22:23:53 +00003938 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003939
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003940 if (flag) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003941 qiflush();
Victor Stinner26486ea2010-05-15 22:23:53 +00003942 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003943 else {
3944 noqiflush();
3945 }
3946 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003947}
3948
Guido van Rossumd8faa362007-04-27 19:54:29 +00003949/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
3950 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00003951#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003952static int
3953update_lines_cols(void)
3954{
Victor Stinner26486ea2010-05-15 22:23:53 +00003955 PyObject *o;
3956 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003957 _Py_IDENTIFIER(LINES);
3958 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003959
Victor Stinner26486ea2010-05-15 22:23:53 +00003960 if (!m)
3961 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003962
Victor Stinner26486ea2010-05-15 22:23:53 +00003963 o = PyLong_FromLong(LINES);
3964 if (!o) {
3965 Py_DECREF(m);
3966 return 0;
3967 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003968 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003969 Py_DECREF(m);
3970 Py_DECREF(o);
3971 return 0;
3972 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003973 /* PyId_LINES.object will be initialized here. */
Victor Stinner4804b5b2020-05-12 01:43:38 +02003974 if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_LINES), o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003975 Py_DECREF(m);
3976 Py_DECREF(o);
3977 return 0;
3978 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003979 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00003980 o = PyLong_FromLong(COLS);
3981 if (!o) {
3982 Py_DECREF(m);
3983 return 0;
3984 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003985 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003986 Py_DECREF(m);
3987 Py_DECREF(o);
3988 return 0;
3989 }
Victor Stinner4804b5b2020-05-12 01:43:38 +02003990 if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_COLS), o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003991 Py_DECREF(m);
3992 Py_DECREF(o);
3993 return 0;
3994 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003995 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003996 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00003997 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003998}
Steve Dowerd2bc3892015-04-15 18:06:05 -04003999
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004000/*[clinic input]
Zackery Spytz2bc34342019-11-17 10:10:13 -07004001_curses.update_lines_cols
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004002
4003[clinic start generated code]*/
4004
Zackery Spytz2bc34342019-11-17 10:10:13 -07004005static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004006_curses_update_lines_cols_impl(PyObject *module)
Zackery Spytz2bc34342019-11-17 10:10:13 -07004007/*[clinic end generated code: output=423f2b1e63ed0f75 input=5f065ab7a28a5d90]*/
Steve Dowerd2bc3892015-04-15 18:06:05 -04004008{
Zackery Spytz2bc34342019-11-17 10:10:13 -07004009 if (!update_lines_cols()) {
4010 return NULL;
4011 }
4012 Py_RETURN_NONE;
Steve Dowerd2bc3892015-04-15 18:06:05 -04004013}
4014
Benjamin Petersonfea6a942008-07-02 16:11:42 +00004015#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00004016
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004017/*[clinic input]
4018_curses.raw
4019
4020 flag: bool(accept={int}) = True
4021 If false, the effect is the same as calling noraw().
4022 /
4023
4024Enter raw mode.
4025
4026In raw mode, normal line buffering and processing of interrupt, quit,
4027suspend, and flow control keys are turned off; characters are presented to
4028curses input functions one by one.
4029[clinic start generated code]*/
4030
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004031static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004032_curses_raw_impl(PyObject *module, int flag)
4033/*[clinic end generated code: output=a750e4b342be015b input=e36d8db27832b848]*/
4034NoArgOrFlagNoReturnFunctionBody(raw, flag)
4035
4036/*[clinic input]
4037_curses.reset_prog_mode
4038
4039Restore the terminal to "program" mode, as previously saved by def_prog_mode().
4040[clinic start generated code]*/
4041
4042static PyObject *
4043_curses_reset_prog_mode_impl(PyObject *module)
4044/*[clinic end generated code: output=15eb765abf0b6575 input=3d82bea2b3243471]*/
4045NoArgNoReturnFunctionBody(reset_prog_mode)
4046
4047/*[clinic input]
4048_curses.reset_shell_mode
4049
4050Restore the terminal to "shell" mode, as previously saved by def_shell_mode().
4051[clinic start generated code]*/
4052
4053static PyObject *
4054_curses_reset_shell_mode_impl(PyObject *module)
4055/*[clinic end generated code: output=0238de2962090d33 input=1c738fa64bd1a24f]*/
4056NoArgNoReturnFunctionBody(reset_shell_mode)
4057
4058/*[clinic input]
4059_curses.resetty
4060
4061Restore terminal mode.
4062[clinic start generated code]*/
4063
4064static PyObject *
4065_curses_resetty_impl(PyObject *module)
4066/*[clinic end generated code: output=ff4b448e80a7cd63 input=940493de03624bb0]*/
4067NoArgNoReturnFunctionBody(resetty)
4068
4069#ifdef HAVE_CURSES_RESIZETERM
4070/*[clinic input]
4071_curses.resizeterm
4072
4073 nlines: int
4074 Height.
4075 ncols: int
4076 Width.
4077 /
4078
4079Resize the standard and current windows to the specified dimensions.
4080
4081Adjusts other bookkeeping data used by the curses library that record the
4082window dimensions (in particular the SIGWINCH handler).
4083[clinic start generated code]*/
4084
4085static PyObject *
4086_curses_resizeterm_impl(PyObject *module, int nlines, int ncols)
4087/*[clinic end generated code: output=56d6bcc5194ad055 input=0fca02ebad5ffa82]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004088{
Victor Stinner26486ea2010-05-15 22:23:53 +00004089 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004090
Victor Stinner26486ea2010-05-15 22:23:53 +00004091 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004092
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004093 result = PyCursesCheckERR(resizeterm(nlines, ncols), "resizeterm");
Victor Stinner26486ea2010-05-15 22:23:53 +00004094 if (!result)
4095 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004096 if (!update_lines_cols()) {
4097 Py_DECREF(result);
Victor Stinner26486ea2010-05-15 22:23:53 +00004098 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004099 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004100 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004101}
4102
4103#endif
4104
4105#ifdef HAVE_CURSES_RESIZE_TERM
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004106/*[clinic input]
4107_curses.resize_term
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004108
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004109 nlines: int
4110 Height.
4111 ncols: int
4112 Width.
4113 /
4114
4115Backend function used by resizeterm(), performing most of the work.
4116
4117When resizing the windows, resize_term() blank-fills the areas that are
4118extended. The calling application should fill in these areas with appropriate
4119data. The resize_term() function attempts to resize all windows. However,
4120due to the calling convention of pads, it is not possible to resize these
4121without additional interaction with the application.
4122[clinic start generated code]*/
4123
4124static PyObject *
4125_curses_resize_term_impl(PyObject *module, int nlines, int ncols)
4126/*[clinic end generated code: output=9e26d8b9ea311ed2 input=2197edd05b049ed4]*/
4127{
Victor Stinner26486ea2010-05-15 22:23:53 +00004128 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004129
Victor Stinner26486ea2010-05-15 22:23:53 +00004130 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004131
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004132 result = PyCursesCheckERR(resize_term(nlines, ncols), "resize_term");
Victor Stinner26486ea2010-05-15 22:23:53 +00004133 if (!result)
4134 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004135 if (!update_lines_cols()) {
4136 Py_DECREF(result);
Victor Stinner26486ea2010-05-15 22:23:53 +00004137 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004138 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004139 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004140}
4141#endif /* HAVE_CURSES_RESIZE_TERM */
4142
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004143/*[clinic input]
4144_curses.savetty
4145
4146Save terminal mode.
4147[clinic start generated code]*/
4148
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004149static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004150_curses_savetty_impl(PyObject *module)
4151/*[clinic end generated code: output=6babc49f12b42199 input=fce6b2b7d2200102]*/
4152NoArgNoReturnFunctionBody(savetty)
4153
4154#ifdef getsyx
4155/*[clinic input]
4156_curses.setsyx
4157
4158 y: int
4159 Y-coordinate.
4160 x: int
4161 X-coordinate.
4162 /
4163
4164Set the virtual screen cursor.
4165
4166If y and x are both -1, then leaveok is set.
4167[clinic start generated code]*/
4168
4169static PyObject *
4170_curses_setsyx_impl(PyObject *module, int y, int x)
4171/*[clinic end generated code: output=23dcf753511a2464 input=fa7f2b208e10a557]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004172{
Victor Stinner26486ea2010-05-15 22:23:53 +00004173 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004174
Victor Stinner26486ea2010-05-15 22:23:53 +00004175 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004176
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004177 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004178}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004179#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00004180
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004181/*[clinic input]
4182_curses.start_color
4183
4184Initializes eight basic colors and global variables COLORS and COLOR_PAIRS.
4185
4186Must be called if the programmer wants to use colors, and before any other
4187color manipulation routine is called. It is good practice to call this
4188routine right after initscr().
4189
4190It also restores the colors on the terminal to the values they had when the
4191terminal was just turned on.
4192[clinic start generated code]*/
4193
Guido van Rossumf6971e21994-08-30 12:25:20 +00004194static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004195_curses_start_color_impl(PyObject *module)
4196/*[clinic end generated code: output=8b772b41d8090ede input=0ca0ecb2b77e1a12]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00004197{
Victor Stinner26486ea2010-05-15 22:23:53 +00004198 int code;
4199 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004200
Victor Stinner26486ea2010-05-15 22:23:53 +00004201 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004202
Victor Stinner26486ea2010-05-15 22:23:53 +00004203 code = start_color();
4204 if (code != ERR) {
4205 initialisedcolors = TRUE;
4206 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02004207 if (c == NULL)
4208 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004209 if (PyDict_SetItemString(ModDict, "COLORS", c) < 0) {
4210 Py_DECREF(c);
4211 return NULL;
4212 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004213 Py_DECREF(c);
4214 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02004215 if (cp == NULL)
4216 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004217 if (PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp) < 0) {
4218 Py_DECREF(cp);
4219 return NULL;
4220 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004221 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004222 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004223 } else {
4224 PyErr_SetString(PyCursesError, "start_color() returned ERR");
4225 return NULL;
4226 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004227}
4228
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004229/*[clinic input]
4230_curses.termattrs
4231
4232Return a logical OR of all video attributes supported by the terminal.
4233[clinic start generated code]*/
4234
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004235static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004236_curses_termattrs_impl(PyObject *module)
4237/*[clinic end generated code: output=b06f437fce1b6fc4 input=0559882a04f84d1d]*/
4238NoArgReturnIntFunctionBody(termattrs)
4239
4240/*[clinic input]
4241_curses.termname
4242
4243Return the value of the environment variable TERM, truncated to 14 characters.
4244[clinic start generated code]*/
4245
4246static PyObject *
4247_curses_termname_impl(PyObject *module)
4248/*[clinic end generated code: output=96375577ebbd67fd input=33c08d000944f33f]*/
4249NoArgReturnStringFunctionBody(termname)
4250
4251/*[clinic input]
4252_curses.tigetflag
4253
4254 capname: str
4255 The terminfo capability name.
4256 /
4257
4258Return the value of the Boolean capability.
4259
4260The value -1 is returned if capname is not a Boolean capability, or 0 if
4261it is canceled or absent from the terminal description.
4262[clinic start generated code]*/
4263
4264static PyObject *
4265_curses_tigetflag_impl(PyObject *module, const char *capname)
4266/*[clinic end generated code: output=8853c0e55542195b input=b0787af9e3e9a6ce]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004267{
Victor Stinner26486ea2010-05-15 22:23:53 +00004268 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004269
Xiang Zhang44742e92018-06-23 12:29:30 +08004270 return PyLong_FromLong( (long) tigetflag( (char *)capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004271}
4272
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004273/*[clinic input]
4274_curses.tigetnum
4275
4276 capname: str
4277 The terminfo capability name.
4278 /
4279
4280Return the value of the numeric capability.
4281
4282The value -2 is returned if capname is not a numeric capability, or -1 if
4283it is canceled or absent from the terminal description.
4284[clinic start generated code]*/
4285
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004286static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004287_curses_tigetnum_impl(PyObject *module, const char *capname)
4288/*[clinic end generated code: output=46f8b0a1b5dff42f input=5cdf2f410b109720]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004289{
Victor Stinner26486ea2010-05-15 22:23:53 +00004290 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004291
Xiang Zhang44742e92018-06-23 12:29:30 +08004292 return PyLong_FromLong( (long) tigetnum( (char *)capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004293}
4294
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004295/*[clinic input]
4296_curses.tigetstr
4297
4298 capname: str
4299 The terminfo capability name.
4300 /
4301
4302Return the value of the string capability.
4303
4304None is returned if capname is not a string capability, or is canceled or
4305absent from the terminal description.
4306[clinic start generated code]*/
4307
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004308static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004309_curses_tigetstr_impl(PyObject *module, const char *capname)
4310/*[clinic end generated code: output=f22b576ad60248f3 input=36644df25c73c0a7]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004311{
Victor Stinner26486ea2010-05-15 22:23:53 +00004312 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004313
Xiang Zhang44742e92018-06-23 12:29:30 +08004314 capname = tigetstr( (char *)capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02004315 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004316 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004317 }
4318 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004319}
4320
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004321/*[clinic input]
4322_curses.tparm
4323
4324 str: str(accept={robuffer})
4325 Parameterized byte string obtained from the terminfo database.
4326 i1: int = 0
4327 i2: int = 0
4328 i3: int = 0
4329 i4: int = 0
4330 i5: int = 0
4331 i6: int = 0
4332 i7: int = 0
4333 i8: int = 0
4334 i9: int = 0
4335 /
4336
4337Instantiate the specified byte string with the supplied parameters.
4338[clinic start generated code]*/
4339
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004340static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004341_curses_tparm_impl(PyObject *module, const char *str, int i1, int i2, int i3,
4342 int i4, int i5, int i6, int i7, int i8, int i9)
4343/*[clinic end generated code: output=599f62b615c667ff input=5e30b15786f032aa]*/
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004344{
Victor Stinner26486ea2010-05-15 22:23:53 +00004345 char* result = NULL;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004346
Victor Stinner26486ea2010-05-15 22:23:53 +00004347 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004348
Xiang Zhang44742e92018-06-23 12:29:30 +08004349 result = tparm((char *)str,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Victor Stinner26486ea2010-05-15 22:23:53 +00004350 if (!result) {
4351 PyErr_SetString(PyCursesError, "tparm() returned NULL");
4352 return NULL;
4353 }
Michael W. Hudson21007982002-11-21 14:17:51 +00004354
Victor Stinner26486ea2010-05-15 22:23:53 +00004355 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004356}
4357
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004358#ifdef HAVE_CURSES_TYPEAHEAD
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004359/*[clinic input]
4360_curses.typeahead
4361
4362 fd: int
4363 File descriptor.
4364 /
4365
4366Specify that the file descriptor fd be used for typeahead checking.
4367
4368If fd is -1, then no typeahead checking is done.
4369[clinic start generated code]*/
4370
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004371static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004372_curses_typeahead_impl(PyObject *module, int fd)
4373/*[clinic end generated code: output=084bb649d7066583 input=f2968d8e1805051b]*/
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004374{
Victor Stinner26486ea2010-05-15 22:23:53 +00004375 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004376
Victor Stinner26486ea2010-05-15 22:23:53 +00004377 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004378}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004379#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004380
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004381/*[clinic input]
4382_curses.unctrl
4383
4384 ch: object
4385 /
4386
4387Return a string which is a printable representation of the character ch.
4388
4389Control characters are displayed as a caret followed by the character,
4390for example as ^C. Printing characters are left as they are.
4391[clinic start generated code]*/
4392
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004393static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004394_curses_unctrl(PyObject *module, PyObject *ch)
4395/*[clinic end generated code: output=8e07fafc430c9434 input=cd1e35e16cd1ace4]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004396{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004397 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004398
Victor Stinner26486ea2010-05-15 22:23:53 +00004399 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004400
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004401 if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00004402 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004403
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004404 return PyBytes_FromString(unctrl(ch_));
Guido van Rossumf6971e21994-08-30 12:25:20 +00004405}
4406
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004407/*[clinic input]
4408_curses.ungetch
4409
4410 ch: object
4411 /
4412
4413Push ch so the next getch() will return it.
4414[clinic start generated code]*/
4415
Guido van Rossumf6971e21994-08-30 12:25:20 +00004416static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004417_curses_ungetch(PyObject *module, PyObject *ch)
4418/*[clinic end generated code: output=9b19d8268376d887 input=6681e6ae4c42e5eb]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00004419{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004420 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004421
Victor Stinner26486ea2010-05-15 22:23:53 +00004422 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004423
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004424 if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00004425 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01004426
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004427 return PyCursesCheckERR(ungetch(ch_), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00004428}
4429
Victor Stinner71e44cb2011-09-06 01:53:03 +02004430#ifdef HAVE_NCURSESW
4431/* Convert an object to a character (wchar_t):
4432
4433 - int
4434 - str of length 1
4435
4436 Return 1 on success, 0 on error. */
4437static int
4438PyCurses_ConvertToWchar_t(PyObject *obj,
4439 wchar_t *wch)
4440{
4441 if (PyUnicode_Check(obj)) {
4442 wchar_t buffer[2];
4443 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
4444 PyErr_Format(PyExc_TypeError,
Anthony Sottilec9345e32019-07-31 05:11:24 -07004445 "expect str of length 1 or int, "
Victor Stinner71e44cb2011-09-06 01:53:03 +02004446 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02004447 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02004448 return 0;
4449 }
4450 *wch = buffer[0];
4451 return 2;
4452 }
4453 else if (PyLong_CheckExact(obj)) {
4454 long value;
4455 int overflow;
4456 value = PyLong_AsLongAndOverflow(obj, &overflow);
4457 if (overflow) {
4458 PyErr_SetString(PyExc_OverflowError,
4459 "int doesn't fit in long");
4460 return 0;
4461 }
4462 *wch = (wchar_t)value;
4463 if ((long)*wch != value) {
4464 PyErr_Format(PyExc_OverflowError,
4465 "character doesn't fit in wchar_t");
4466 return 0;
4467 }
4468 return 1;
4469 }
4470 else {
4471 PyErr_Format(PyExc_TypeError,
Anthony Sottilec9345e32019-07-31 05:11:24 -07004472 "expect str of length 1 or int, got %s",
Victor Stinner71e44cb2011-09-06 01:53:03 +02004473 Py_TYPE(obj)->tp_name);
4474 return 0;
4475 }
4476}
4477
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004478/*[clinic input]
4479_curses.unget_wch
4480
4481 ch: object
4482 /
4483
4484Push ch so the next get_wch() will return it.
4485[clinic start generated code]*/
4486
Victor Stinner71e44cb2011-09-06 01:53:03 +02004487static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004488_curses_unget_wch(PyObject *module, PyObject *ch)
4489/*[clinic end generated code: output=1974c9fb01d37863 input=0d56dc65a46feebb]*/
Victor Stinner71e44cb2011-09-06 01:53:03 +02004490{
Victor Stinner71e44cb2011-09-06 01:53:03 +02004491 wchar_t wch;
4492
4493 PyCursesInitialised;
4494
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004495 if (!PyCurses_ConvertToWchar_t(ch, &wch))
Victor Stinner71e44cb2011-09-06 01:53:03 +02004496 return NULL;
4497 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
4498}
4499#endif
4500
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004501#ifdef HAVE_CURSES_USE_ENV
4502/*[clinic input]
4503_curses.use_env
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004504
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004505 flag: bool(accept={int})
4506 /
4507
4508Use environment variables LINES and COLUMNS.
4509
4510If used, this function should be called before initscr() or newterm() are
4511called.
4512
4513When flag is False, the values of lines and columns specified in the terminfo
4514database will be used, even if environment variables LINES and COLUMNS (used
4515by default) are set, or if curses is running in a window (in which case
4516default behavior would be to use the window size if LINES and COLUMNS are
4517not set).
4518[clinic start generated code]*/
4519
4520static PyObject *
4521_curses_use_env_impl(PyObject *module, int flag)
4522/*[clinic end generated code: output=b2c445e435c0b164 input=1778eb1e9151ea37]*/
4523{
Victor Stinner26486ea2010-05-15 22:23:53 +00004524 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004525 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004526}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004527#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00004528
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004529#ifndef STRICT_SYSV_CURSES
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004530/*[clinic input]
4531_curses.use_default_colors
4532
4533Allow use of default values for colors on terminals supporting this feature.
4534
4535Use this to support transparency in your application. The default color
4536is assigned to the color number -1.
4537[clinic start generated code]*/
4538
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004539static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004540_curses_use_default_colors_impl(PyObject *module)
4541/*[clinic end generated code: output=a3b81ff71dd901be input=656844367470e8fc]*/
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004542{
Victor Stinner26486ea2010-05-15 22:23:53 +00004543 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004544
Victor Stinner26486ea2010-05-15 22:23:53 +00004545 PyCursesInitialised;
4546 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004547
Victor Stinner26486ea2010-05-15 22:23:53 +00004548 code = use_default_colors();
4549 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004550 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004551 } else {
4552 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
4553 return NULL;
4554 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004555}
4556#endif /* STRICT_SYSV_CURSES */
4557
Serhiy Storchakab232df92018-10-30 13:22:42 +02004558
4559#ifdef NCURSES_VERSION
4560
4561PyDoc_STRVAR(ncurses_version__doc__,
4562"curses.ncurses_version\n\
4563\n\
4564Ncurses version information as a named tuple.");
4565
4566static PyTypeObject NcursesVersionType;
4567
4568static PyStructSequence_Field ncurses_version_fields[] = {
4569 {"major", "Major release number"},
4570 {"minor", "Minor release number"},
4571 {"patch", "Patch release number"},
4572 {0}
4573};
4574
4575static PyStructSequence_Desc ncurses_version_desc = {
4576 "curses.ncurses_version", /* name */
4577 ncurses_version__doc__, /* doc */
4578 ncurses_version_fields, /* fields */
4579 3
4580};
4581
4582static PyObject *
4583make_ncurses_version(void)
4584{
4585 PyObject *ncurses_version;
4586 int pos = 0;
4587
4588 ncurses_version = PyStructSequence_New(&NcursesVersionType);
4589 if (ncurses_version == NULL) {
4590 return NULL;
4591 }
4592
4593#define SetIntItem(flag) \
4594 PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \
4595 if (PyErr_Occurred()) { \
4596 Py_CLEAR(ncurses_version); \
4597 return NULL; \
4598 }
4599
4600 SetIntItem(NCURSES_VERSION_MAJOR)
4601 SetIntItem(NCURSES_VERSION_MINOR)
4602 SetIntItem(NCURSES_VERSION_PATCH)
4603#undef SetIntItem
4604
4605 return ncurses_version;
4606}
4607
4608#endif /* NCURSES_VERSION */
4609
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05004610/*[clinic input]
4611_curses.has_extended_color_support
4612
4613Return True if the module supports extended colors; otherwise, return False.
4614
4615Extended color support allows more than 256 color-pairs for terminals
4616that support more than 16 colors (e.g. xterm-256color).
4617[clinic start generated code]*/
4618
4619static PyObject *
4620_curses_has_extended_color_support_impl(PyObject *module)
4621/*[clinic end generated code: output=68f1be2b57d92e22 input=4b905f046e35ee9f]*/
4622{
4623 return PyBool_FromLong(_NCURSES_EXTENDED_COLOR_FUNCS);
4624}
Serhiy Storchakab232df92018-10-30 13:22:42 +02004625
Guido van Rossumf6971e21994-08-30 12:25:20 +00004626/* List of functions defined in the module */
4627
4628static PyMethodDef PyCurses_methods[] = {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004629 _CURSES_BAUDRATE_METHODDEF
4630 _CURSES_BEEP_METHODDEF
4631 _CURSES_CAN_CHANGE_COLOR_METHODDEF
4632 _CURSES_CBREAK_METHODDEF
4633 _CURSES_COLOR_CONTENT_METHODDEF
4634 _CURSES_COLOR_PAIR_METHODDEF
4635 _CURSES_CURS_SET_METHODDEF
4636 _CURSES_DEF_PROG_MODE_METHODDEF
4637 _CURSES_DEF_SHELL_MODE_METHODDEF
4638 _CURSES_DELAY_OUTPUT_METHODDEF
4639 _CURSES_DOUPDATE_METHODDEF
4640 _CURSES_ECHO_METHODDEF
4641 _CURSES_ENDWIN_METHODDEF
4642 _CURSES_ERASECHAR_METHODDEF
4643 _CURSES_FILTER_METHODDEF
4644 _CURSES_FLASH_METHODDEF
4645 _CURSES_FLUSHINP_METHODDEF
4646 _CURSES_GETMOUSE_METHODDEF
4647 _CURSES_UNGETMOUSE_METHODDEF
4648 _CURSES_GETSYX_METHODDEF
4649 _CURSES_GETWIN_METHODDEF
4650 _CURSES_HAS_COLORS_METHODDEF
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05004651 _CURSES_HAS_EXTENDED_COLOR_SUPPORT_METHODDEF
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004652 _CURSES_HAS_IC_METHODDEF
4653 _CURSES_HAS_IL_METHODDEF
4654 _CURSES_HAS_KEY_METHODDEF
4655 _CURSES_HALFDELAY_METHODDEF
4656 _CURSES_INIT_COLOR_METHODDEF
4657 _CURSES_INIT_PAIR_METHODDEF
4658 _CURSES_INITSCR_METHODDEF
4659 _CURSES_INTRFLUSH_METHODDEF
4660 _CURSES_ISENDWIN_METHODDEF
4661 _CURSES_IS_TERM_RESIZED_METHODDEF
4662 _CURSES_KEYNAME_METHODDEF
4663 _CURSES_KILLCHAR_METHODDEF
4664 _CURSES_LONGNAME_METHODDEF
4665 _CURSES_META_METHODDEF
4666 _CURSES_MOUSEINTERVAL_METHODDEF
4667 _CURSES_MOUSEMASK_METHODDEF
4668 _CURSES_NAPMS_METHODDEF
4669 _CURSES_NEWPAD_METHODDEF
4670 _CURSES_NEWWIN_METHODDEF
4671 _CURSES_NL_METHODDEF
4672 _CURSES_NOCBREAK_METHODDEF
4673 _CURSES_NOECHO_METHODDEF
4674 _CURSES_NONL_METHODDEF
4675 _CURSES_NOQIFLUSH_METHODDEF
4676 _CURSES_NORAW_METHODDEF
4677 _CURSES_PAIR_CONTENT_METHODDEF
4678 _CURSES_PAIR_NUMBER_METHODDEF
4679 _CURSES_PUTP_METHODDEF
4680 _CURSES_QIFLUSH_METHODDEF
4681 _CURSES_RAW_METHODDEF
4682 _CURSES_RESET_PROG_MODE_METHODDEF
4683 _CURSES_RESET_SHELL_MODE_METHODDEF
4684 _CURSES_RESETTY_METHODDEF
4685 _CURSES_RESIZETERM_METHODDEF
4686 _CURSES_RESIZE_TERM_METHODDEF
4687 _CURSES_SAVETTY_METHODDEF
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03004688#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
Anthony Sottileb32cb972019-10-31 02:13:48 -07004689 _CURSES_GET_ESCDELAY_METHODDEF
4690 _CURSES_SET_ESCDELAY_METHODDEF
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03004691#endif
Anthony Sottileb32cb972019-10-31 02:13:48 -07004692 _CURSES_GET_TABSIZE_METHODDEF
4693 _CURSES_SET_TABSIZE_METHODDEF
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004694 _CURSES_SETSYX_METHODDEF
4695 _CURSES_SETUPTERM_METHODDEF
4696 _CURSES_START_COLOR_METHODDEF
4697 _CURSES_TERMATTRS_METHODDEF
4698 _CURSES_TERMNAME_METHODDEF
4699 _CURSES_TIGETFLAG_METHODDEF
4700 _CURSES_TIGETNUM_METHODDEF
4701 _CURSES_TIGETSTR_METHODDEF
4702 _CURSES_TPARM_METHODDEF
4703 _CURSES_TYPEAHEAD_METHODDEF
4704 _CURSES_UNCTRL_METHODDEF
4705 _CURSES_UNGETCH_METHODDEF
4706 _CURSES_UPDATE_LINES_COLS_METHODDEF
4707 _CURSES_UNGET_WCH_METHODDEF
4708 _CURSES_USE_ENV_METHODDEF
4709 _CURSES_USE_DEFAULT_COLORS_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00004710 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00004711};
4712
4713/* Initialization function for the module */
4714
Martin v. Löwis1a214512008-06-11 05:26:20 +00004715
4716static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00004717 PyModuleDef_HEAD_INIT,
4718 "_curses",
4719 NULL,
4720 -1,
4721 PyCurses_methods,
4722 NULL,
4723 NULL,
4724 NULL,
4725 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004726};
4727
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004728PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004729PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00004730{
Victor Stinner26486ea2010-05-15 22:23:53 +00004731 PyObject *m, *d, *v, *c_api_object;
4732 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00004733
Victor Stinner26486ea2010-05-15 22:23:53 +00004734 /* Initialize object type */
4735 if (PyType_Ready(&PyCursesWindow_Type) < 0)
4736 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00004737
Victor Stinner26486ea2010-05-15 22:23:53 +00004738 /* Initialize the C API pointer array */
4739 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
4740 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
4741 PyCurses_API[2] = (void *)func_PyCursesInitialised;
4742 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004743
Victor Stinner26486ea2010-05-15 22:23:53 +00004744 /* Create the module and add the functions */
4745 m = PyModule_Create(&_cursesmodule);
4746 if (m == NULL)
4747 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004748
Victor Stinner26486ea2010-05-15 22:23:53 +00004749 /* Add some symbolic constants to the module */
4750 d = PyModule_GetDict(m);
4751 if (d == NULL)
4752 return NULL;
4753 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00004754
Victor Stinner26486ea2010-05-15 22:23:53 +00004755 /* Add a capsule for the C API */
4756 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
4757 PyDict_SetItemString(d, "_C_API", c_api_object);
4758 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00004759
Victor Stinner26486ea2010-05-15 22:23:53 +00004760 /* For exception curses.error */
4761 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
4762 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00004763
Victor Stinner26486ea2010-05-15 22:23:53 +00004764 /* Make the version available */
4765 v = PyBytes_FromString(PyCursesVersion);
4766 PyDict_SetItemString(d, "version", v);
4767 PyDict_SetItemString(d, "__version__", v);
4768 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00004769
Serhiy Storchakab232df92018-10-30 13:22:42 +02004770#ifdef NCURSES_VERSION
4771 /* ncurses_version */
4772 if (NcursesVersionType.tp_name == NULL) {
4773 if (PyStructSequence_InitType2(&NcursesVersionType,
4774 &ncurses_version_desc) < 0)
4775 return NULL;
4776 }
4777 v = make_ncurses_version();
4778 if (v == NULL) {
4779 return NULL;
4780 }
4781 PyDict_SetItemString(d, "ncurses_version", v);
4782 Py_DECREF(v);
4783
4784 /* prevent user from creating new instances */
4785 NcursesVersionType.tp_init = NULL;
4786 NcursesVersionType.tp_new = NULL;
4787 if (PyDict_DelItemString(NcursesVersionType.tp_dict, "__new__") < 0 &&
4788 PyErr_ExceptionMatches(PyExc_KeyError))
4789 {
4790 PyErr_Clear();
4791 }
4792#endif /* NCURSES_VERSION */
4793
Victor Stinner26486ea2010-05-15 22:23:53 +00004794 SetDictInt("ERR", ERR);
4795 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00004796
Victor Stinner26486ea2010-05-15 22:23:53 +00004797 /* Here are some attributes you can add to chars to print */
4798
4799 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
4800 SetDictInt("A_NORMAL", A_NORMAL);
4801 SetDictInt("A_STANDOUT", A_STANDOUT);
4802 SetDictInt("A_UNDERLINE", A_UNDERLINE);
4803 SetDictInt("A_REVERSE", A_REVERSE);
4804 SetDictInt("A_BLINK", A_BLINK);
4805 SetDictInt("A_DIM", A_DIM);
4806 SetDictInt("A_BOLD", A_BOLD);
4807 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinner26486ea2010-05-15 22:23:53 +00004808 SetDictInt("A_INVIS", A_INVIS);
Victor Stinner26486ea2010-05-15 22:23:53 +00004809 SetDictInt("A_PROTECT", A_PROTECT);
4810 SetDictInt("A_CHARTEXT", A_CHARTEXT);
4811 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004812
Victor Stinner26486ea2010-05-15 22:23:53 +00004813 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004814#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00004815 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004816#endif
4817#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00004818 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004819#endif
4820#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00004821 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004822#endif
4823#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00004824 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004825#endif
4826#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00004827 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004828#endif
4829#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00004830 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004831#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004832
Xiang Zhang116dd5e2017-06-16 11:20:07 +08004833 /* ncurses extension */
4834#ifdef A_ITALIC
4835 SetDictInt("A_ITALIC", A_ITALIC);
4836#endif
4837
Victor Stinner26486ea2010-05-15 22:23:53 +00004838 SetDictInt("COLOR_BLACK", COLOR_BLACK);
4839 SetDictInt("COLOR_RED", COLOR_RED);
4840 SetDictInt("COLOR_GREEN", COLOR_GREEN);
4841 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
4842 SetDictInt("COLOR_BLUE", COLOR_BLUE);
4843 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
4844 SetDictInt("COLOR_CYAN", COLOR_CYAN);
4845 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00004846
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004847#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00004848 /* Mouse-related constants */
4849 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
4850 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
4851 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
4852 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
4853 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004854
Victor Stinner26486ea2010-05-15 22:23:53 +00004855 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
4856 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
4857 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
4858 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
4859 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004860
Victor Stinner26486ea2010-05-15 22:23:53 +00004861 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
4862 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
4863 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
4864 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
4865 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004866
Victor Stinner26486ea2010-05-15 22:23:53 +00004867 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
4868 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
4869 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
4870 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
4871 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004872
Zackery Spytz14cfa322021-01-14 02:40:09 -07004873#if NCURSES_MOUSE_VERSION > 1
4874 SetDictInt("BUTTON5_PRESSED", BUTTON5_PRESSED);
4875 SetDictInt("BUTTON5_RELEASED", BUTTON5_RELEASED);
4876 SetDictInt("BUTTON5_CLICKED", BUTTON5_CLICKED);
4877 SetDictInt("BUTTON5_DOUBLE_CLICKED", BUTTON5_DOUBLE_CLICKED);
4878 SetDictInt("BUTTON5_TRIPLE_CLICKED", BUTTON5_TRIPLE_CLICKED);
4879#endif
4880
Victor Stinner26486ea2010-05-15 22:23:53 +00004881 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
4882 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
4883 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004884
Victor Stinner26486ea2010-05-15 22:23:53 +00004885 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
4886 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004887#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00004888 /* Now set everything up for KEY_ variables */
4889 {
4890 int key;
4891 char *key_n;
4892 char *key_n2;
Victor Stinner26486ea2010-05-15 22:23:53 +00004893 for (key=KEY_MIN;key < KEY_MAX; key++) {
4894 key_n = (char *)keyname(key);
4895 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
4896 continue;
4897 if (strncmp(key_n,"KEY_F(",6)==0) {
4898 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02004899 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00004900 if (!key_n2) {
4901 PyErr_NoMemory();
4902 break;
4903 }
4904 p1 = key_n;
4905 p2 = key_n2;
4906 while (*p1) {
4907 if (*p1 != '(' && *p1 != ')') {
4908 *p2 = *p1;
4909 p2++;
4910 }
4911 p1++;
4912 }
4913 *p2 = (char)0;
4914 } else
4915 key_n2 = key_n;
4916 SetDictInt(key_n2,key);
4917 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02004918 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00004919 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004920 SetDictInt("KEY_MIN", KEY_MIN);
4921 SetDictInt("KEY_MAX", KEY_MAX);
4922 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004923
Dong-hee Na37fcbb62020-03-25 07:08:51 +09004924 if (PyModule_AddType(m, &PyCursesWindow_Type) < 0) {
4925 return NULL;
4926 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004927 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004928}