blob: 23f6d96f5144e20ee1eb55d8855113be76f8473f [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
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500138#if defined(NCURSES_EXT_COLORS) && defined(NCURSES_EXT_FUNCS)
139#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
145#define _NCURSES_COLOR_VAL_TYPE int
146#define _CURSES_INIT_COLOR_FUNC init_extended_color
147#define _CURSES_INIT_PAIR_FUNC init_extended_pair
148#define _COLOR_CONTENT_FUNC extended_color_content
149#define _CURSES_PAIR_NUMBER_FUNC extended_pair_content
150#else
151#define _NCURSES_COLOR_VAL_TYPE short
152#define _CURSES_INIT_COLOR_FUNC init_color
153#define _CURSES_INIT_PAIR_FUNC init_pair
154#define _COLOR_CONTENT_FUNC color_content
155#define _CURSES_PAIR_NUMBER_FUNC pair_content
156#endif /* _NCURSES_EXTENDED_COLOR_FUNCS */
157
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200158#define _CURSES_INIT_COLOR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_COLOR_FUNC)
159#define _CURSES_INIT_PAIR_FUNC_NAME Py_STRINGIFY(_CURSES_INIT_PAIR_FUNC)
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500160
Larry Hastings61272b72014-01-07 12:41:53 -0800161/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300162module _curses
163class _curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800164[clinic start generated code]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300165/*[clinic end generated code: output=da39a3ee5e6b4b0d input=43265c372c2887d6]*/
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300166
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000167/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000168
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000169static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000170
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000171/* Tells whether setupterm() has been called to initialise terminfo. */
172static int initialised_setupterm = FALSE;
173
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000174/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000175static int initialised = FALSE;
176
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000177/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000178static int initialisedcolors = FALSE;
179
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100180static char *screen_encoding = NULL;
181
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000182/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000183#define PyCursesSetupTermCalled \
184 if (initialised_setupterm != TRUE) { \
185 PyErr_SetString(PyCursesError, \
186 "must call (at least) setupterm() first"); \
187 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000188
Victor Stinner26486ea2010-05-15 22:23:53 +0000189#define PyCursesInitialised \
190 if (initialised != TRUE) { \
191 PyErr_SetString(PyCursesError, \
192 "must call initscr() first"); \
193 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000194
Victor Stinner26486ea2010-05-15 22:23:53 +0000195#define PyCursesInitialisedColor \
196 if (initialisedcolors != TRUE) { \
197 PyErr_SetString(PyCursesError, \
198 "must call start_color() first"); \
199 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000200
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000201/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000202
Guido van Rossum85738471995-02-17 13:50:17 +0000203/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000204 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000205 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000206 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000207 */
208
209static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100210PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000211{
Victor Stinner26486ea2010-05-15 22:23:53 +0000212 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200213 Py_RETURN_NONE;
Guido van Rossum85738471995-02-17 13:50:17 +0000214 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000215 if (fname == NULL) {
216 PyErr_SetString(PyCursesError, catchall_ERR);
217 } else {
218 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
219 }
220 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000221 }
Guido van Rossum85738471995-02-17 13:50:17 +0000222}
223
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100224/* Convert an object to a byte (an integer of type chtype):
225
226 - int
227 - bytes of length 1
228 - str of length 1
229
230 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000231static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100232PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000233{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100234 long value;
235 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
236 value = (unsigned char)PyBytes_AsString(obj)[0];
237 }
238 else if (PyUnicode_Check(obj)) {
239 if (PyUnicode_GetLength(obj) != 1) {
240 PyErr_Format(PyExc_TypeError,
241 "expect bytes or str of length 1, or int, "
242 "got a str of length %zi",
243 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000244 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100245 }
246 value = PyUnicode_READ_CHAR(obj, 0);
247 if (128 < value) {
248 PyObject *bytes;
249 const char *encoding;
250 if (win)
251 encoding = win->encoding;
252 else
253 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300254 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100255 if (bytes == NULL)
256 return 0;
257 if (PyBytes_GET_SIZE(bytes) == 1)
258 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
259 else
260 value = -1;
261 Py_DECREF(bytes);
262 if (value < 0)
263 goto overflow;
264 }
265 }
266 else if (PyLong_CheckExact(obj)) {
267 int long_overflow;
268 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
269 if (long_overflow)
270 goto overflow;
271 }
272 else {
273 PyErr_Format(PyExc_TypeError,
274 "expect bytes or str of length 1, or int, got %s",
275 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000276 return 0;
277 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100278 *ch = (chtype)value;
279 if ((long)*ch != value)
280 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000281 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100282
283overflow:
284 PyErr_SetString(PyExc_OverflowError,
285 "byte doesn't fit in chtype");
286 return 0;
287}
288
289/* Convert an object to a byte (chtype) or a character (cchar_t):
290
291 - int
292 - bytes of length 1
293 - str of length 1
294
295 Return:
296
297 - 2 if obj is a character (written into *wch)
298 - 1 if obj is a byte (written into *ch)
299 - 0 on error: raise an exception */
300static int
301PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
302 chtype *ch
303#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200304 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100305#endif
306 )
307{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100308 long value;
309#ifdef HAVE_NCURSESW
310 wchar_t buffer[2];
311#endif
312
313 if (PyUnicode_Check(obj)) {
314#ifdef HAVE_NCURSESW
315 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
316 PyErr_Format(PyExc_TypeError,
317 "expect bytes or str of length 1, or int, "
318 "got a str of length %zi",
319 PyUnicode_GET_LENGTH(obj));
320 return 0;
321 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200322 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100323 return 2;
324#else
325 return PyCurses_ConvertToChtype(win, obj, ch);
326#endif
327 }
328 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
329 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100330 }
331 else if (PyLong_CheckExact(obj)) {
332 int overflow;
333 value = PyLong_AsLongAndOverflow(obj, &overflow);
334 if (overflow) {
335 PyErr_SetString(PyExc_OverflowError,
336 "int doesn't fit in long");
337 return 0;
338 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100339 }
340 else {
341 PyErr_Format(PyExc_TypeError,
342 "expect bytes or str of length 1, or int, got %s",
343 Py_TYPE(obj)->tp_name);
344 return 0;
345 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200346
347 *ch = (chtype)value;
348 if ((long)*ch != value) {
349 PyErr_Format(PyExc_OverflowError,
350 "byte doesn't fit in chtype");
351 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100352 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200353 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100354}
355
356/* Convert an object to a byte string (char*) or a wide character string
357 (wchar_t*). Return:
358
359 - 2 if obj is a character string (written into *wch)
360 - 1 if obj is a byte string (written into *bytes)
361 - 0 on error: raise an exception */
362static int
363PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
364 PyObject **bytes, wchar_t **wstr)
365{
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300366 char *str;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100367 if (PyUnicode_Check(obj)) {
368#ifdef HAVE_NCURSESW
369 assert (wstr != NULL);
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300370
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100371 *wstr = PyUnicode_AsWideCharString(obj, NULL);
372 if (*wstr == NULL)
373 return 0;
374 return 2;
375#else
376 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300377 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100378 if (*bytes == NULL)
379 return 0;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300380 /* check for embedded null bytes */
381 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
382 return 0;
383 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100384 return 1;
385#endif
386 }
387 else if (PyBytes_Check(obj)) {
388 Py_INCREF(obj);
389 *bytes = obj;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300390 /* check for embedded null bytes */
391 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
392 return 0;
393 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100394 return 1;
395 }
396
397 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
398 Py_TYPE(obj)->tp_name);
399 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000400}
401
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500402static int
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200403color_allow_default_converter(PyObject *arg, void *ptr)
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500404{
405 long color_number;
406 int overflow;
407
408 color_number = PyLong_AsLongAndOverflow(arg, &overflow);
409 if (color_number == -1 && PyErr_Occurred())
410 return 0;
411
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200412 if (overflow > 0 || color_number >= COLORS) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500413 PyErr_Format(PyExc_ValueError,
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200414 "Color number is greater than COLORS-1 (%d).",
415 COLORS - 1);
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500416 return 0;
417 }
418 else if (overflow < 0 || color_number < 0) {
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200419 color_number = -1;
420 }
421
422 *(int *)ptr = (int)color_number;
423 return 1;
424}
425
426static int
427color_converter(PyObject *arg, void *ptr)
428{
429 if (!color_allow_default_converter(arg, ptr)) {
430 return 0;
431 }
432 if (*(int *)ptr < 0) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500433 PyErr_SetString(PyExc_ValueError,
434 "Color number is less than 0.");
435 return 0;
436 }
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500437 return 1;
438}
439
440/*[python input]
441class color_converter(CConverter):
442 type = 'int'
443 converter = 'color_converter'
444[python start generated code]*/
445/*[python end generated code: output=da39a3ee5e6b4b0d input=4260d2b6e66b3709]*/
446
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200447/*[python input]
448class color_allow_default_converter(CConverter):
449 type = 'int'
450 converter = 'color_allow_default_converter'
451[python start generated code]*/
452/*[python end generated code: output=da39a3ee5e6b4b0d input=975602bc058a872d]*/
453
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500454static int
455pair_converter(PyObject *arg, void *ptr)
456{
457 long pair_number;
458 int overflow;
459
460 pair_number = PyLong_AsLongAndOverflow(arg, &overflow);
461 if (pair_number == -1 && PyErr_Occurred())
462 return 0;
463
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200464#if _NCURSES_EXTENDED_COLOR_FUNCS
465 if (overflow > 0 || pair_number > INT_MAX) {
466 PyErr_Format(PyExc_ValueError,
467 "Color pair is greater than maximum (%d).",
468 INT_MAX);
469 return 0;
470 }
471#else
472 if (overflow > 0 || pair_number >= COLOR_PAIRS) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500473 PyErr_Format(PyExc_ValueError,
474 "Color pair is greater than COLOR_PAIRS-1 (%d).",
475 COLOR_PAIRS - 1);
476 return 0;
477 }
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200478#endif
479 else if (overflow < 0 || pair_number < 0) {
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500480 PyErr_SetString(PyExc_ValueError,
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200481 "Color pair is less than 0.");
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -0500482 return 0;
483 }
484
485 *(int *)ptr = (int)pair_number;
486 return 1;
487}
488
489/*[python input]
490class pair_converter(CConverter):
491 type = 'int'
492 converter = 'pair_converter'
493[python start generated code]*/
494/*[python end generated code: output=da39a3ee5e6b4b0d input=1a918ae6a1b32af7]*/
495
496static int
497component_converter(PyObject *arg, void *ptr)
498{
499 long component;
500 int overflow;
501
502 component = PyLong_AsLongAndOverflow(arg, &overflow);
503 if (component == -1 && PyErr_Occurred())
504 return 0;
505
506 if (overflow > 0 || component > 1000) {
507 PyErr_SetString(PyExc_ValueError,
508 "Color component is greater than 1000");
509 return 0;
510 }
511 else if (overflow < 0 || component < 0) {
512 PyErr_SetString(PyExc_ValueError,
513 "Color component is less than 0");
514 return 0;
515 }
516
517 *(short *)ptr = (short)component;
518 return 1;
519}
520
521/*[python input]
522class component_converter(CConverter):
523 type = 'short'
524 converter = 'component_converter'
525[python start generated code]*/
526/*[python end generated code: output=da39a3ee5e6b4b0d input=38e9be01d33927fb]*/
527
Benjamin Peterson21896a32010-03-21 22:03:03 +0000528/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000529 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000530
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000531static int func_PyCursesSetupTermCalled(void)
532{
533 PyCursesSetupTermCalled;
534 return 1;
535}
536
537static int func_PyCursesInitialised(void)
538{
539 PyCursesInitialised;
540 return 1;
541}
542
543static int func_PyCursesInitialisedColor(void)
544{
545 PyCursesInitialisedColor;
546 return 1;
547}
548
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000549/*****************************************************************************
550 The Window Object
551******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000552
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000553/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000554
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000555PyTypeObject PyCursesWindow_Type;
556
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000557/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000558
559 X - function name
560 TYPE - parameter Type
561 ERGSTR - format string for construction of the return value
562 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000563*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000564
Serhiy Storchaka81524022018-11-27 13:05:02 +0200565#define Window_NoArgNoReturnFunction(X) \
566 static PyObject *PyCursesWindow_ ## X \
567 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000568 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000569
Victor Stinner26486ea2010-05-15 22:23:53 +0000570#define Window_NoArgTrueFalseFunction(X) \
571 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200572 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000573 { \
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300574 return PyBool_FromLong(X(self->win)); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000575
Victor Stinner26486ea2010-05-15 22:23:53 +0000576#define Window_NoArgNoReturnVoidFunction(X) \
577 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200578 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000579 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200580 X(self->win); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000581
Victor Stinner26486ea2010-05-15 22:23:53 +0000582#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
583 static PyObject * PyCursesWindow_ ## X \
Serhiy Storchaka81524022018-11-27 13:05:02 +0200584 (PyCursesWindowObject *self, PyObject *Py_UNUSED(ignored)) \
Victor Stinner26486ea2010-05-15 22:23:53 +0000585 { \
586 TYPE arg1, arg2; \
587 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000588
Victor Stinner26486ea2010-05-15 22:23:53 +0000589#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
590 static PyObject * PyCursesWindow_ ## X \
591 (PyCursesWindowObject *self, PyObject *args) \
592 { \
593 TYPE arg1; \
594 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200595 X(self->win,arg1); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000596
Victor Stinner26486ea2010-05-15 22:23:53 +0000597#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
598 static PyObject * PyCursesWindow_ ## X \
599 (PyCursesWindowObject *self, PyObject *args) \
600 { \
601 TYPE arg1; \
602 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
603 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000604
Victor Stinner26486ea2010-05-15 22:23:53 +0000605#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
606 static PyObject * PyCursesWindow_ ## X \
607 (PyCursesWindowObject *self, PyObject *args) \
608 { \
609 TYPE arg1, arg2; \
610 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
611 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000612
Guido van Rossumf6971e21994-08-30 12:25:20 +0000613/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000614
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000615Window_NoArgNoReturnFunction(untouchwin)
616Window_NoArgNoReturnFunction(touchwin)
617Window_NoArgNoReturnFunction(redrawwin)
618Window_NoArgNoReturnFunction(winsertln)
619Window_NoArgNoReturnFunction(werase)
620Window_NoArgNoReturnFunction(wdeleteln)
621
622Window_NoArgTrueFalseFunction(is_wintouched)
623
624Window_NoArgNoReturnVoidFunction(wsyncup)
625Window_NoArgNoReturnVoidFunction(wsyncdown)
626Window_NoArgNoReturnVoidFunction(wstandend)
627Window_NoArgNoReturnVoidFunction(wstandout)
628Window_NoArgNoReturnVoidFunction(wcursyncup)
629Window_NoArgNoReturnVoidFunction(wclrtoeol)
630Window_NoArgNoReturnVoidFunction(wclrtobot)
631Window_NoArgNoReturnVoidFunction(wclear)
632
633Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200634#ifdef HAVE_CURSES_IMMEDOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000635Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200636#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000637Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000638
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000639Window_NoArg2TupleReturnFunction(getyx, int, "ii")
640Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
641Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
642Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000643
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000644Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
645Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
646Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
647Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
648Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
649Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
650Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000651Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200652#ifdef HAVE_CURSES_SYNCOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000653Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200654#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000655
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000656Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
657Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
658Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000659#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000660Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000661#endif
662
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000663/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000664
Guido van Rossumf6971e21994-08-30 12:25:20 +0000665static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100666PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000667{
Victor Stinner26486ea2010-05-15 22:23:53 +0000668 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000669
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100670 if (encoding == NULL) {
671#if defined(MS_WINDOWS)
672 char *buffer[100];
673 UINT cp;
674 cp = GetConsoleOutputCP();
675 if (cp != 0) {
676 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
677 encoding = buffer;
678 }
679#elif defined(CODESET)
680 const char *codeset = nl_langinfo(CODESET);
681 if (codeset != NULL && codeset[0] != 0)
682 encoding = codeset;
683#endif
684 if (encoding == NULL)
685 encoding = "utf-8";
686 }
687
Victor Stinner92055202020-04-08 00:38:15 +0200688 wo = PyObject_New(PyCursesWindowObject, &PyCursesWindow_Type);
Victor Stinner26486ea2010-05-15 22:23:53 +0000689 if (wo == NULL) return NULL;
690 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200691 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100692 if (wo->encoding == NULL) {
693 Py_DECREF(wo);
694 PyErr_NoMemory();
695 return NULL;
696 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000697 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000698}
699
700static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000701PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000702{
Victor Stinner26486ea2010-05-15 22:23:53 +0000703 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100704 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200705 PyMem_Free(wo->encoding);
Victor Stinner32bd68c2020-12-01 10:37:39 +0100706 PyObject_Free(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000707}
708
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000709/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000710
Larry Hastings61272b72014-01-07 12:41:53 -0800711/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300712_curses.window.addch
Larry Hastings31826802013-10-19 00:09:25 -0700713
714 [
Larry Hastings31826802013-10-19 00:09:25 -0700715 y: int
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300716 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700717 x: int
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300718 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700719 ]
720
721 ch: object
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300722 Character to add.
Larry Hastings31826802013-10-19 00:09:25 -0700723
724 [
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300725 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
726 Attributes for the character.
Larry Hastings31826802013-10-19 00:09:25 -0700727 ]
728 /
729
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300730Paint the character.
Larry Hastings31826802013-10-19 00:09:25 -0700731
732Paint character ch at (y, x) with attributes attr,
733overwriting any character previously painted at that location.
734By default, the character position and attributes are the
735current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800736[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700737
Larry Hastings31826802013-10-19 00:09:25 -0700738static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300739_curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1,
740 int y, int x, PyObject *ch, int group_right_1,
741 long attr)
742/*[clinic end generated code: output=00f4c37af3378f45 input=95ce131578458196]*/
Larry Hastings31826802013-10-19 00:09:25 -0700743{
Larry Hastings31826802013-10-19 00:09:25 -0700744 int coordinates_group = group_left_1;
Larry Hastings31826802013-10-19 00:09:25 -0700745 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100746 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100747 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100748#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200749 wchar_t wstr[2];
750 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100751#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100752 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000753
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100754#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300755 type = PyCurses_ConvertToCchar_t(self, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100756 if (type == 2) {
757 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200758 wstr[1] = L'\0';
Serhiy Storchaka1470edd2021-01-03 22:51:11 +0200759 setcchar(&wcval, wstr, attr, PAIR_NUMBER(attr), NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700760 if (coordinates_group)
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300761 rtn = mvwadd_wch(self->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100762 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300763 rtn = wadd_wch(self->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100764 }
765 }
766 else
767#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300768 type = PyCurses_ConvertToCchar_t(self, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100769#endif
770 if (type == 1) {
771 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700772 if (coordinates_group)
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300773 rtn = mvwaddch(self->win,y,x, cch | (attr_t) attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100774 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300775 rtn = waddch(self->win, cch | (attr_t) attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100776 }
777 }
778 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000779 return NULL;
780 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100781 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000782}
783
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300784/*[clinic input]
785_curses.window.addstr
786
787 [
788 y: int
789 Y-coordinate.
790 x: int
791 X-coordinate.
792 ]
793
794 str: object
795 String to add.
796
797 [
798 attr: long
799 Attributes for characters.
800 ]
801 /
802
803Paint the string.
804
805Paint the string str at (y, x) with attributes attr,
806overwriting anything previously on the display.
807By default, the character position and attributes are the
808current settings for the window object.
809[clinic start generated code]*/
810
Guido van Rossumf6971e21994-08-30 12:25:20 +0000811static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300812_curses_window_addstr_impl(PyCursesWindowObject *self, int group_left_1,
813 int y, int x, PyObject *str, int group_right_1,
814 long attr)
815/*[clinic end generated code: output=65a928ea85ff3115 input=ff6cbb91448a22a3]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +0000816{
Victor Stinner26486ea2010-05-15 22:23:53 +0000817 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100818 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300819 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100820#ifdef HAVE_NCURSESW
821 wchar_t *wstr = NULL;
822#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300823 attr_t attr_old = A_NORMAL;
824 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100825 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000826
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100827#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300828 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100829#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300830 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100831#endif
832 if (strtype == 0)
833 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300834 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +0000835 attr_old = getattrs(self->win);
836 (void)wattrset(self->win,attr);
837 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100838#ifdef HAVE_NCURSESW
839 if (strtype == 2) {
840 funcname = "addwstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300841 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100842 rtn = mvwaddwstr(self->win,y,x,wstr);
843 else
844 rtn = waddwstr(self->win,wstr);
845 PyMem_Free(wstr);
846 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000847 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100848#endif
849 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +0300850 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100851 funcname = "addstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300852 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100853 rtn = mvwaddstr(self->win,y,x,str);
854 else
855 rtn = waddstr(self->win,str);
856 Py_DECREF(bytesobj);
857 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300858 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +0000859 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100860 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861}
Guido van Rossum85738471995-02-17 13:50:17 +0000862
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300863/*[clinic input]
864_curses.window.addnstr
865
866 [
867 y: int
868 Y-coordinate.
869 x: int
870 X-coordinate.
871 ]
872
873 str: object
874 String to add.
875
876 n: int
877 Maximal number of characters.
878
879 [
880 attr: long
881 Attributes for characters.
882 ]
883 /
884
885Paint at most n characters of the string.
886
887Paint at most n characters of the string str at (y, x) with
888attributes attr, overwriting anything previously on the display.
889By default, the character position and attributes are the
890current settings for the window object.
891[clinic start generated code]*/
892
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000893static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300894_curses_window_addnstr_impl(PyCursesWindowObject *self, int group_left_1,
895 int y, int x, PyObject *str, int n,
896 int group_right_1, long attr)
897/*[clinic end generated code: output=6d21cee2ce6876d9 input=72718415c2744a2a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000898{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300899 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100900 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300901 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100902#ifdef HAVE_NCURSESW
903 wchar_t *wstr = NULL;
904#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300905 attr_t attr_old = A_NORMAL;
906 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100907 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000908
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100909#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300910 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100911#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300912 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100913#endif
914 if (strtype == 0)
915 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000916
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300917 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +0000918 attr_old = getattrs(self->win);
919 (void)wattrset(self->win,attr);
920 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100921#ifdef HAVE_NCURSESW
922 if (strtype == 2) {
923 funcname = "addnwstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300924 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100925 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
926 else
927 rtn = waddnwstr(self->win,wstr,n);
928 PyMem_Free(wstr);
929 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000930 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100931#endif
932 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +0300933 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100934 funcname = "addnstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300935 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100936 rtn = mvwaddnstr(self->win,y,x,str,n);
937 else
938 rtn = waddnstr(self->win,str,n);
939 Py_DECREF(bytesobj);
940 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300941 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +0000942 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100943 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000944}
945
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300946/*[clinic input]
947_curses.window.bkgd
948
949 ch: object
950 Background character.
951 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
952 Background attributes.
953 /
954
955Set the background property of the window.
956[clinic start generated code]*/
957
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000958static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300959_curses_window_bkgd_impl(PyCursesWindowObject *self, PyObject *ch, long attr)
960/*[clinic end generated code: output=058290afb2cf4034 input=634015bcb339283d]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000961{
Victor Stinner26486ea2010-05-15 22:23:53 +0000962 chtype bkgd;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000963
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300964 if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000965 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966
Victor Stinner26486ea2010-05-15 22:23:53 +0000967 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000968}
969
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300970/*[clinic input]
971_curses.window.attroff
972
973 attr: long
974 /
975
976Remove attribute attr from the "background" set.
977[clinic start generated code]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000978
979static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300980_curses_window_attroff_impl(PyCursesWindowObject *self, long attr)
981/*[clinic end generated code: output=8a2fcd4df682fc64 input=786beedf06a7befe]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000982{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300983 return PyCursesCheckERR(wattroff(self->win, (attr_t)attr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000984}
985
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300986/*[clinic input]
987_curses.window.attron
988
989 attr: long
990 /
991
992Add attribute attr from the "background" set.
993[clinic start generated code]*/
Christian Heimes2380ac72008-01-09 00:17:24 +0000994
995static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300996_curses_window_attron_impl(PyCursesWindowObject *self, long attr)
997/*[clinic end generated code: output=7afea43b237fa870 input=5a88fba7b1524f32]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000998{
Serhiy Storchakab00854c2018-05-10 11:27:23 +0300999 return PyCursesCheckERR(wattron(self->win, (attr_t)attr), "attron");
1000}
1001
1002/*[clinic input]
1003_curses.window.attrset
1004
1005 attr: long
1006 /
1007
1008Set the "background" set of attributes.
1009[clinic start generated code]*/
1010
1011static PyObject *
1012_curses_window_attrset_impl(PyCursesWindowObject *self, long attr)
1013/*[clinic end generated code: output=84e379bff20c0433 input=42e400c0d0154ab5]*/
1014{
1015 return PyCursesCheckERR(wattrset(self->win, (attr_t)attr), "attrset");
1016}
1017
1018/*[clinic input]
1019_curses.window.bkgdset
1020
1021 ch: object
1022 Background character.
1023 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1024 Background attributes.
1025 /
1026
1027Set the window's background.
1028[clinic start generated code]*/
1029
1030static PyObject *
1031_curses_window_bkgdset_impl(PyCursesWindowObject *self, PyObject *ch,
1032 long attr)
1033/*[clinic end generated code: output=8cb994fc4d7e2496 input=e09c682425c9e45b]*/
1034{
Victor Stinner26486ea2010-05-15 22:23:53 +00001035 chtype bkgd;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001036
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001037 if (!PyCurses_ConvertToChtype(self, ch, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +00001038 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001039
Victor Stinner26486ea2010-05-15 22:23:53 +00001040 wbkgdset(self->win, bkgd | attr);
1041 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001042}
1043
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001044/*[clinic input]
1045_curses.window.border
1046
1047 ls: object(c_default="NULL") = _curses.ACS_VLINE
1048 Left side.
1049 rs: object(c_default="NULL") = _curses.ACS_VLINE
1050 Right side.
1051 ts: object(c_default="NULL") = _curses.ACS_HLINE
1052 Top side.
1053 bs: object(c_default="NULL") = _curses.ACS_HLINE
1054 Bottom side.
1055 tl: object(c_default="NULL") = _curses.ACS_ULCORNER
1056 Upper-left corner.
1057 tr: object(c_default="NULL") = _curses.ACS_URCORNER
1058 Upper-right corner.
1059 bl: object(c_default="NULL") = _curses.ACS_LLCORNER
1060 Bottom-left corner.
1061 br: object(c_default="NULL") = _curses.ACS_LRCORNER
1062 Bottom-right corner.
1063 /
1064
1065Draw a border around the edges of the window.
1066
1067Each parameter specifies the character to use for a specific part of the
1068border. The characters can be specified as integers or as one-character
1069strings. A 0 value for any parameter will cause the default character to be
1070used for that parameter.
1071[clinic start generated code]*/
1072
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001073static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001074_curses_window_border_impl(PyCursesWindowObject *self, PyObject *ls,
1075 PyObject *rs, PyObject *ts, PyObject *bs,
1076 PyObject *tl, PyObject *tr, PyObject *bl,
1077 PyObject *br)
1078/*[clinic end generated code: output=670ef38d3d7c2aa3 input=e015f735d67a240b]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001079{
Victor Stinner26486ea2010-05-15 22:23:53 +00001080 chtype ch[8];
1081 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001082
Victor Stinner26486ea2010-05-15 22:23:53 +00001083 /* Clear the array of parameters */
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001084 for(i=0; i<8; i++)
Victor Stinner26486ea2010-05-15 22:23:53 +00001085 ch[i] = 0;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001086
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001087#define CONVERTTOCHTYPE(obj, i) \
1088 if ((obj) != NULL && !PyCurses_ConvertToChtype(self, (obj), &ch[(i)])) \
Victor Stinner26486ea2010-05-15 22:23:53 +00001089 return NULL;
1090
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001091 CONVERTTOCHTYPE(ls, 0);
1092 CONVERTTOCHTYPE(rs, 1);
1093 CONVERTTOCHTYPE(ts, 2);
1094 CONVERTTOCHTYPE(bs, 3);
1095 CONVERTTOCHTYPE(tl, 4);
1096 CONVERTTOCHTYPE(tr, 5);
1097 CONVERTTOCHTYPE(bl, 6);
1098 CONVERTTOCHTYPE(br, 7);
1099
1100#undef CONVERTTOCHTYPE
Victor Stinner26486ea2010-05-15 22:23:53 +00001101
1102 wborder(self->win,
1103 ch[0], ch[1], ch[2], ch[3],
1104 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001105 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001106}
1107
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001108/*[clinic input]
1109_curses.window.box
1110
1111 [
Victor Stinner37834132020-10-27 17:12:53 +01001112 verch: object(c_default="_PyLong_GetZero()") = 0
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001113 Left and right side.
Victor Stinner37834132020-10-27 17:12:53 +01001114 horch: object(c_default="_PyLong_GetZero()") = 0
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001115 Top and bottom side.
1116 ]
1117 /
1118
1119Draw a border around the edges of the window.
1120
1121Similar to border(), but both ls and rs are verch and both ts and bs are
1122horch. The default corner characters are always used by this function.
1123[clinic start generated code]*/
1124
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001125static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001126_curses_window_box_impl(PyCursesWindowObject *self, int group_right_1,
1127 PyObject *verch, PyObject *horch)
Victor Stinner37834132020-10-27 17:12:53 +01001128/*[clinic end generated code: output=f3fcb038bb287192 input=f00435f9c8c98f60]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001129{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001130 chtype ch1 = 0, ch2 = 0;
1131 if (group_right_1) {
1132 if (!PyCurses_ConvertToChtype(self, verch, &ch1)) {
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02001133 return NULL;
1134 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001135 if (!PyCurses_ConvertToChtype(self, horch, &ch2)) {
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02001136 return NULL;
1137 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001138 }
1139 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001140 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001141}
1142
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001143#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
1144#define py_mvwdelch mvwdelch
1145#else
1146int py_mvwdelch(WINDOW *w, int y, int x)
1147{
Victor Stinner26486ea2010-05-15 22:23:53 +00001148 mvwdelch(w,y,x);
1149 /* On HP/UX, mvwdelch already returns. On other systems,
1150 we may well run into this return statement. */
1151 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001152}
1153#endif
1154
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001155#if defined(HAVE_CURSES_IS_PAD)
1156#define py_is_pad(win) is_pad(win)
1157#elif defined(WINDOW_HAS_FLAGS)
1158#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
1159#endif
1160
Guido van Rossumd8faa362007-04-27 19:54:29 +00001161/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001162#ifdef HAVE_CURSES_WCHGAT
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001163/*[-clinic input]
1164_curses.window.chgat
1165
1166 [
1167 y: int
1168 Y-coordinate.
1169 x: int
1170 X-coordinate.
1171 ]
1172
1173 n: int = -1
1174 Number of characters.
1175
1176 attr: long
1177 Attributes for characters.
1178 /
1179
1180Set the attributes of characters.
1181
1182Set the attributes of num characters at the current cursor position, or at
1183position (y, x) if supplied. If no value of num is given or num = -1, the
1184attribute will be set on all the characters to the end of the line. This
1185function does not move the cursor. The changed line will be touched using
1186the touchline() method so that the contents will be redisplayed by the next
1187window refresh.
1188[-clinic start generated code]*/
Guido van Rossumd8faa362007-04-27 19:54:29 +00001189static PyObject *
1190PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
1191{
Victor Stinner26486ea2010-05-15 22:23:53 +00001192 int rtn;
1193 int x, y;
1194 int num = -1;
1195 short color;
1196 attr_t attr = A_NORMAL;
1197 long lattr;
1198 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001199
Victor Stinner26486ea2010-05-15 22:23:53 +00001200 switch (PyTuple_Size(args)) {
1201 case 1:
1202 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1203 return NULL;
1204 attr = lattr;
1205 break;
1206 case 2:
1207 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1208 return NULL;
1209 attr = lattr;
1210 break;
1211 case 3:
1212 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1213 return NULL;
1214 attr = lattr;
1215 use_xy = TRUE;
1216 break;
1217 case 4:
1218 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1219 return NULL;
1220 attr = lattr;
1221 use_xy = TRUE;
1222 break;
1223 default:
1224 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1225 return NULL;
1226 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001227
Victor Stinner26486ea2010-05-15 22:23:53 +00001228 color = (short)((attr >> 8) & 0xff);
1229 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001230
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001231 if (use_xy) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001232 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1233 touchline(self->win,y,1);
1234 } else {
1235 getyx(self->win,y,x);
1236 rtn = wchgat(self->win,num,attr,color,NULL);
1237 touchline(self->win,y,1);
1238 }
1239 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001240}
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02001241#endif
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001242
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001243/*[clinic input]
1244_curses.window.delch
Guido van Rossum85738471995-02-17 13:50:17 +00001245
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001246 [
1247 y: int
1248 Y-coordinate.
1249 x: int
1250 X-coordinate.
1251 ]
1252 /
1253
1254Delete any character at (y, x).
1255[clinic start generated code]*/
1256
1257static PyObject *
1258_curses_window_delch_impl(PyCursesWindowObject *self, int group_right_1,
1259 int y, int x)
1260/*[clinic end generated code: output=22e77bb9fa11b461 input=d2f79e630a4fc6d0]*/
1261{
1262 if (!group_right_1) {
1263 return PyCursesCheckERR(wdelch(self->win), "wdelch");
Victor Stinner26486ea2010-05-15 22:23:53 +00001264 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001265 else {
1266 return PyCursesCheckERR(py_mvwdelch(self->win, y, x), "mvwdelch");
1267 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001268}
1269
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001270/*[clinic input]
1271_curses.window.derwin
1272
1273 [
1274 nlines: int = 0
1275 Height.
1276 ncols: int = 0
1277 Width.
1278 ]
1279 begin_y: int
1280 Top side y-coordinate.
1281 begin_x: int
1282 Left side x-coordinate.
1283 /
1284
1285Create a sub-window (window-relative coordinates).
1286
1287derwin() is the same as calling subwin(), except that begin_y and begin_x
1288are relative to the origin of the window, rather than relative to the entire
1289screen.
1290[clinic start generated code]*/
1291
Guido van Rossumf6971e21994-08-30 12:25:20 +00001292static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001293_curses_window_derwin_impl(PyCursesWindowObject *self, int group_left_1,
1294 int nlines, int ncols, int begin_y, int begin_x)
1295/*[clinic end generated code: output=7924b112d9f70d6e input=966d9481f7f5022e]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001296{
Victor Stinner26486ea2010-05-15 22:23:53 +00001297 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001298
Victor Stinner26486ea2010-05-15 22:23:53 +00001299 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001300
Victor Stinner26486ea2010-05-15 22:23:53 +00001301 if (win == NULL) {
1302 PyErr_SetString(PyCursesError, catchall_NULL);
1303 return NULL;
1304 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001305
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001306 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001307}
1308
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001309/*[clinic input]
1310_curses.window.echochar
1311
1312 ch: object
1313 Character to add.
1314
1315 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1316 Attributes for the character.
1317 /
1318
1319Add character ch with attribute attr, and refresh.
1320[clinic start generated code]*/
1321
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001323_curses_window_echochar_impl(PyCursesWindowObject *self, PyObject *ch,
1324 long attr)
1325/*[clinic end generated code: output=13e7dd875d4b9642 input=e7f34b964e92b156]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001326{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001327 chtype ch_;
Guido van Rossum85738471995-02-17 13:50:17 +00001328
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001329 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001330 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001331
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001332#ifdef py_is_pad
1333 if (py_is_pad(self->win)) {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001334 return PyCursesCheckERR(pechochar(self->win, ch_ | (attr_t)attr),
Victor Stinner26486ea2010-05-15 22:23:53 +00001335 "echochar");
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09001336 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001337 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001338#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001339 return PyCursesCheckERR(wechochar(self->win, ch_ | (attr_t)attr),
Victor Stinner26486ea2010-05-15 22:23:53 +00001340 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001341}
1342
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001343#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001344/*[clinic input]
1345_curses.window.enclose -> long
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001346
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001347 y: int
1348 Y-coordinate.
1349 x: int
1350 X-coordinate.
1351 /
1352
1353Return True if the screen-relative coordinates are enclosed by the window.
1354[clinic start generated code]*/
1355
1356static long
1357_curses_window_enclose_impl(PyCursesWindowObject *self, int y, int x)
1358/*[clinic end generated code: output=5251c961cbe3df63 input=dfe1d9d4d05d8642]*/
1359{
1360 return wenclose(self->win, y, x);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001361}
1362#endif
1363
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001364/*[clinic input]
1365_curses.window.getbkgd -> long
1366
1367Return the window's current background character/attribute pair.
1368[clinic start generated code]*/
1369
1370static long
1371_curses_window_getbkgd_impl(PyCursesWindowObject *self)
1372/*[clinic end generated code: output=c52b25dc16b215c3 input=a69db882fa35426c]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001373{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001374 return (long) getbkgd(self->win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001375}
1376
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001377/*[clinic input]
1378_curses.window.getch -> int
1379
1380 [
1381 y: int
1382 Y-coordinate.
1383 x: int
1384 X-coordinate.
1385 ]
1386 /
1387
1388Get a character code from terminal keyboard.
1389
1390The integer returned does not have to be in ASCII range: function keys,
1391keypad keys and so on return numbers higher than 256. In no-delay mode, -1
1392is returned if there is no input, else getch() waits until a key is pressed.
1393[clinic start generated code]*/
1394
1395static int
1396_curses_window_getch_impl(PyCursesWindowObject *self, int group_right_1,
1397 int y, int x)
1398/*[clinic end generated code: output=980aa6af0c0ca387 input=bb24ebfb379f991f]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001399{
Victor Stinner26486ea2010-05-15 22:23:53 +00001400 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001401
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001402 Py_BEGIN_ALLOW_THREADS
1403 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001404 rtn = wgetch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001405 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001406 else {
1407 rtn = mvwgetch(self->win, y, x);
1408 }
1409 Py_END_ALLOW_THREADS
1410
1411 return rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001412}
Guido van Rossum85738471995-02-17 13:50:17 +00001413
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001414/*[clinic input]
1415_curses.window.getkey
1416
1417 [
1418 y: int
1419 Y-coordinate.
1420 x: int
1421 X-coordinate.
1422 ]
1423 /
1424
1425Get a character (string) from terminal keyboard.
1426
1427Returning a string instead of an integer, as getch() does. Function keys,
1428keypad keys and other special keys return a multibyte string containing the
1429key name. In no-delay mode, an exception is raised if there is no input.
1430[clinic start generated code]*/
1431
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001432static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001433_curses_window_getkey_impl(PyCursesWindowObject *self, int group_right_1,
1434 int y, int x)
1435/*[clinic end generated code: output=8490a182db46b10f input=be2dee34f5cf57f8]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001436{
Victor Stinner26486ea2010-05-15 22:23:53 +00001437 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001438
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001439 Py_BEGIN_ALLOW_THREADS
1440 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 rtn = wgetch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001442 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001443 else {
1444 rtn = mvwgetch(self->win, y, x);
1445 }
1446 Py_END_ALLOW_THREADS
1447
Victor Stinner26486ea2010-05-15 22:23:53 +00001448 if (rtn == ERR) {
1449 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001450 PyErr_CheckSignals();
1451 if (!PyErr_Occurred())
1452 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001453 return NULL;
Serhiy Storchaka7e687902017-11-01 16:03:40 +02001454 } else if (rtn <= 255) {
1455#ifdef NCURSES_VERSION_MAJOR
1456#if NCURSES_VERSION_MAJOR*100+NCURSES_VERSION_MINOR <= 507
1457 /* Work around a bug in ncurses 5.7 and earlier */
1458 if (rtn < 0) {
1459 rtn += 256;
1460 }
1461#endif
1462#endif
1463 return PyUnicode_FromOrdinal(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001464 } else {
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02001465 const char *knp = keyname(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001466 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1467 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001468}
1469
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001470#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001471/*[clinic input]
1472_curses.window.get_wch
1473
1474 [
1475 y: int
1476 Y-coordinate.
1477 x: int
1478 X-coordinate.
1479 ]
1480 /
1481
1482Get a wide character from terminal keyboard.
1483
1484Return a character for most keys, or an integer for function keys,
1485keypad keys, and other special keys.
1486[clinic start generated code]*/
1487
Guido van Rossumf6971e21994-08-30 12:25:20 +00001488static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001489_curses_window_get_wch_impl(PyCursesWindowObject *self, int group_right_1,
1490 int y, int x)
1491/*[clinic end generated code: output=9f4f86e91fe50ef3 input=dd7e5367fb49dc48]*/
Victor Stinnera7878b72011-07-14 23:07:44 +02001492{
Victor Stinnera7878b72011-07-14 23:07:44 +02001493 int ct;
1494 wint_t rtn;
1495
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001496 Py_BEGIN_ALLOW_THREADS
1497 if (!group_right_1) {
1498 ct = wget_wch(self->win ,&rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001499 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001500 else {
1501 ct = mvwget_wch(self->win, y, x, &rtn);
1502 }
1503 Py_END_ALLOW_THREADS
1504
Victor Stinnera7878b72011-07-14 23:07:44 +02001505 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001506 if (PyErr_CheckSignals())
1507 return NULL;
1508
Victor Stinnera7878b72011-07-14 23:07:44 +02001509 /* get_wch() returns ERR in nodelay mode */
1510 PyErr_SetString(PyCursesError, "no input");
1511 return NULL;
1512 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001513 if (ct == KEY_CODE_YES)
1514 return PyLong_FromLong(rtn);
1515 else
1516 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001517}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001518#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001519
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001520/*[-clinic input]
1521_curses.window.getstr
1522
1523 [
1524 y: int
1525 Y-coordinate.
1526 x: int
1527 X-coordinate.
1528 ]
1529 n: int = 1023
1530 Maximal number of characters.
1531 /
1532
1533Read a string from the user, with primitive line editing capacity.
1534[-clinic start generated code]*/
1535
Victor Stinnera7878b72011-07-14 23:07:44 +02001536static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001537PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001538{
Victor Stinner26486ea2010-05-15 22:23:53 +00001539 int x, y, n;
1540 char rtn[1024]; /* This should be big enough.. I hope */
1541 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001542
Victor Stinner26486ea2010-05-15 22:23:53 +00001543 switch (PyTuple_Size(args)) {
1544 case 0:
1545 Py_BEGIN_ALLOW_THREADS
1546 rtn2 = wgetnstr(self->win,rtn, 1023);
1547 Py_END_ALLOW_THREADS
1548 break;
1549 case 1:
1550 if (!PyArg_ParseTuple(args,"i;n", &n))
1551 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001552 if (n < 0) {
1553 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1554 return NULL;
1555 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001556 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001557 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001558 Py_END_ALLOW_THREADS
1559 break;
1560 case 2:
1561 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1562 return NULL;
1563 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001564#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001565 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001566#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001567 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001568#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001569 Py_END_ALLOW_THREADS
1570 break;
1571 case 3:
1572 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1573 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001574 if (n < 0) {
1575 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1576 return NULL;
1577 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001578#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001579 Py_BEGIN_ALLOW_THREADS
1580 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001581 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001582 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001583#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001584 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001585 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001586 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001587#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001588 break;
1589 default:
1590 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1591 return NULL;
1592 }
1593 if (rtn2 == ERR)
1594 rtn[0] = 0;
1595 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001596}
1597
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001598/*[clinic input]
1599_curses.window.hline
1600
1601 [
1602 y: int
1603 Starting Y-coordinate.
1604 x: int
1605 Starting X-coordinate.
1606 ]
1607
1608 ch: object
1609 Character to draw.
1610 n: int
1611 Line length.
1612
1613 [
1614 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1615 Attributes for the characters.
1616 ]
1617 /
1618
1619Display a horizontal line.
1620[clinic start generated code]*/
1621
Guido van Rossumf6971e21994-08-30 12:25:20 +00001622static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001623_curses_window_hline_impl(PyCursesWindowObject *self, int group_left_1,
1624 int y, int x, PyObject *ch, int n,
1625 int group_right_1, long attr)
1626/*[clinic end generated code: output=c00d489d61fc9eef input=81a4dea47268163e]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001627{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001628 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001629
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001630 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001631 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001632 if (group_left_1) {
1633 if (wmove(self->win, y, x) == ERR) {
1634 return PyCursesCheckERR(ERR, "wmove");
1635 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001636 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001637 return PyCursesCheckERR(whline(self->win, ch_ | (attr_t)attr, n), "hline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001638}
1639
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001640/*[clinic input]
1641_curses.window.insch
1642
1643 [
1644 y: int
1645 Y-coordinate.
1646 x: int
1647 X-coordinate.
1648 ]
1649
1650 ch: object
1651 Character to insert.
1652
1653 [
1654 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
1655 Attributes for the character.
1656 ]
1657 /
1658
1659Insert a character before the current or specified position.
1660
1661All characters to the right of the cursor are shifted one position right, with
1662the rightmost characters on the line being lost.
1663[clinic start generated code]*/
1664
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001665static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001666_curses_window_insch_impl(PyCursesWindowObject *self, int group_left_1,
1667 int y, int x, PyObject *ch, int group_right_1,
1668 long attr)
1669/*[clinic end generated code: output=ade8cfe3a3bf3e34 input=336342756ee19812]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001670{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001671 int rtn;
1672 chtype ch_ = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001673
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001674 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00001675 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001676
1677 if (!group_left_1) {
1678 rtn = winsch(self->win, ch_ | (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001679 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001680 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001681 rtn = mvwinsch(self->win, y, x, ch_ | (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001682 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001683
Victor Stinner26486ea2010-05-15 22:23:53 +00001684 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001685}
1686
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001687/*[clinic input]
1688_curses.window.inch -> unsigned_long
1689
1690 [
1691 y: int
1692 Y-coordinate.
1693 x: int
1694 X-coordinate.
1695 ]
1696 /
1697
1698Return the character at the given position in the window.
1699
1700The bottom 8 bits are the character proper, and upper bits are the attributes.
1701[clinic start generated code]*/
1702
1703static unsigned long
1704_curses_window_inch_impl(PyCursesWindowObject *self, int group_right_1,
1705 int y, int x)
1706/*[clinic end generated code: output=6c4719fe978fe86a input=fac23ee11e3b3a66]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001707{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001708 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001709
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001710 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001711 rtn = winch(self->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00001712 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001713 else {
1714 rtn = mvwinch(self->win, y, x);
1715 }
1716
1717 return rtn;
Guido van Rossumf6971e21994-08-30 12:25:20 +00001718}
1719
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001720/*[-clinic input]
1721_curses.window.instr
1722
1723 [
1724 y: int
1725 Y-coordinate.
1726 x: int
1727 X-coordinate.
1728 ]
1729 n: int = 1023
1730 Maximal number of characters.
1731 /
1732
1733Return a string of characters, extracted from the window.
1734
1735Return a string of characters, extracted from the window starting at the
1736current cursor position, or at y, x if specified. Attributes are stripped
1737from the characters. If n is specified, instr() returns a string at most
1738n characters long (exclusive of the trailing NUL).
1739[-clinic start generated code]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001740static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001741PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001742{
Victor Stinner26486ea2010-05-15 22:23:53 +00001743 int x, y, n;
1744 char rtn[1024]; /* This should be big enough.. I hope */
1745 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001746
Victor Stinner26486ea2010-05-15 22:23:53 +00001747 switch (PyTuple_Size(args)) {
1748 case 0:
1749 rtn2 = winnstr(self->win,rtn, 1023);
1750 break;
1751 case 1:
1752 if (!PyArg_ParseTuple(args,"i;n", &n))
1753 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001754 if (n < 0) {
1755 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1756 return NULL;
1757 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001758 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001759 break;
1760 case 2:
1761 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1762 return NULL;
1763 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1764 break;
1765 case 3:
1766 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1767 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001768 if (n < 0) {
1769 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1770 return NULL;
1771 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001772 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001773 break;
1774 default:
1775 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1776 return NULL;
1777 }
1778 if (rtn2 == ERR)
1779 rtn[0] = 0;
1780 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001781}
1782
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001783/*[clinic input]
1784_curses.window.insstr
1785
1786 [
1787 y: int
1788 Y-coordinate.
1789 x: int
1790 X-coordinate.
1791 ]
1792
1793 str: object
1794 String to insert.
1795
1796 [
1797 attr: long
1798 Attributes for characters.
1799 ]
1800 /
1801
1802Insert the string before the current or specified position.
1803
1804Insert a character string (as many characters as will fit on the line)
1805before the character under the cursor. All characters to the right of
1806the cursor are shifted right, with the rightmost characters on the line
1807being lost. The cursor position does not change (after moving to y, x,
1808if specified).
1809[clinic start generated code]*/
1810
Guido van Rossumf6971e21994-08-30 12:25:20 +00001811static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001812_curses_window_insstr_impl(PyCursesWindowObject *self, int group_left_1,
1813 int y, int x, PyObject *str, int group_right_1,
1814 long attr)
1815/*[clinic end generated code: output=c259a5265ad0b777 input=6827cddc6340a7f3]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001816{
Victor Stinner26486ea2010-05-15 22:23:53 +00001817 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001818 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001819 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001820#ifdef HAVE_NCURSESW
1821 wchar_t *wstr = NULL;
1822#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001823 attr_t attr_old = A_NORMAL;
1824 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001825 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001826
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001827#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001828 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001829#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001830 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001831#endif
1832 if (strtype == 0)
1833 return NULL;
1834
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001835 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001836 attr_old = getattrs(self->win);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001837 (void)wattrset(self->win, (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001838 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001839#ifdef HAVE_NCURSESW
1840 if (strtype == 2) {
1841 funcname = "inswstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001842 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001843 rtn = mvwins_wstr(self->win,y,x,wstr);
1844 else
1845 rtn = wins_wstr(self->win,wstr);
1846 PyMem_Free(wstr);
1847 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001848 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001849#endif
1850 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03001851 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001852 funcname = "insstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001853 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001854 rtn = mvwinsstr(self->win,y,x,str);
1855 else
1856 rtn = winsstr(self->win,str);
1857 Py_DECREF(bytesobj);
1858 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001859 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +00001860 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001861 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001862}
1863
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001864/*[clinic input]
1865_curses.window.insnstr
1866
1867 [
1868 y: int
1869 Y-coordinate.
1870 x: int
1871 X-coordinate.
1872 ]
1873
1874 str: object
1875 String to insert.
1876
1877 n: int
1878 Maximal number of characters.
1879
1880 [
1881 attr: long
1882 Attributes for characters.
1883 ]
1884 /
1885
1886Insert at most n characters of the string.
1887
1888Insert a character string (as many characters as will fit on the line)
1889before the character under the cursor, up to n characters. If n is zero
1890or negative, the entire string is inserted. All characters to the right
1891of the cursor are shifted right, with the rightmost characters on the line
1892being lost. The cursor position does not change (after moving to y, x, if
1893specified).
1894[clinic start generated code]*/
1895
Guido van Rossumf6971e21994-08-30 12:25:20 +00001896static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001897_curses_window_insnstr_impl(PyCursesWindowObject *self, int group_left_1,
1898 int y, int x, PyObject *str, int n,
1899 int group_right_1, long attr)
1900/*[clinic end generated code: output=971a32ea6328ec8b input=70fa0cd543901a4c]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001901{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001902 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001903 int strtype;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001904 PyObject *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001905#ifdef HAVE_NCURSESW
1906 wchar_t *wstr = NULL;
1907#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001908 attr_t attr_old = A_NORMAL;
1909 int use_xy = group_left_1, use_attr = group_right_1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001910 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001911
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001912#ifdef HAVE_NCURSESW
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001913 strtype = PyCurses_ConvertToString(self, str, &bytesobj, &wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001914#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001915 strtype = PyCurses_ConvertToString(self, str, &bytesobj, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001916#endif
1917 if (strtype == 0)
1918 return NULL;
1919
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001920 if (use_attr) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001921 attr_old = getattrs(self->win);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001922 (void)wattrset(self->win, (attr_t)attr);
Victor Stinner26486ea2010-05-15 22:23:53 +00001923 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001924#ifdef HAVE_NCURSESW
1925 if (strtype == 2) {
1926 funcname = "insn_wstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001927 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001928 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1929 else
1930 rtn = wins_nwstr(self->win,wstr,n);
1931 PyMem_Free(wstr);
1932 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001933 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001934#endif
1935 {
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03001936 const char *str = PyBytes_AS_STRING(bytesobj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001937 funcname = "insnstr";
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001938 if (use_xy)
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001939 rtn = mvwinsnstr(self->win,y,x,str,n);
1940 else
1941 rtn = winsnstr(self->win,str,n);
1942 Py_DECREF(bytesobj);
1943 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001944 if (use_attr)
Victor Stinner26486ea2010-05-15 22:23:53 +00001945 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001946 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001947}
1948
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001949/*[clinic input]
1950_curses.window.is_linetouched
1951
1952 line: int
1953 Line number.
1954 /
1955
1956Return True if the specified line was modified, otherwise return False.
1957
1958Raise a curses.error exception if line is not valid for the given window.
1959[clinic start generated code]*/
1960
Guido van Rossumf6971e21994-08-30 12:25:20 +00001961static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001962_curses_window_is_linetouched_impl(PyCursesWindowObject *self, int line)
1963/*[clinic end generated code: output=ad4a4edfee2db08c input=a7be0c189f243914]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001964{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001965 int erg;
Victor Stinner26486ea2010-05-15 22:23:53 +00001966 erg = is_linetouched(self->win, line);
1967 if (erg == ERR) {
1968 PyErr_SetString(PyExc_TypeError,
1969 "is_linetouched: line number outside of boundaries");
1970 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001971 }
1972 return PyBool_FromLong(erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001973}
1974
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001975#ifdef py_is_pad
1976/*[clinic input]
1977_curses.window.noutrefresh
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001978
Serhiy Storchakab00854c2018-05-10 11:27:23 +03001979 [
1980 pminrow: int
1981 pmincol: int
1982 sminrow: int
1983 smincol: int
1984 smaxrow: int
1985 smaxcol: int
1986 ]
1987 /
1988
1989Mark for refresh but wait.
1990
1991This function updates the data structure representing the desired state of the
1992window, but does not force an update of the physical screen. To accomplish
1993that, call doupdate().
1994[clinic start generated code]*/
1995
1996static PyObject *
1997_curses_window_noutrefresh_impl(PyCursesWindowObject *self,
1998 int group_right_1, int pminrow, int pmincol,
1999 int sminrow, int smincol, int smaxrow,
2000 int smaxcol)
2001/*[clinic end generated code: output=809a1f3c6a03e23e input=3e56898388cd739e]*/
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002002#else
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002003/*[clinic input]
2004_curses.window.noutrefresh
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00002005
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002006Mark for refresh but wait.
2007
2008This function updates the data structure representing the desired state of the
2009window, but does not force an update of the physical screen. To accomplish
2010that, call doupdate().
2011[clinic start generated code]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002012
2013static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002014_curses_window_noutrefresh_impl(PyCursesWindowObject *self)
2015/*[clinic end generated code: output=6ef6dec666643fee input=876902e3fa431dbd]*/
2016#endif
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002017{
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002018 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00002019
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002020#ifdef py_is_pad
2021 if (py_is_pad(self->win)) {
2022 if (!group_right_1) {
2023 PyErr_SetString(PyCursesError,
2024 "noutrefresh() called for a pad "
2025 "requires 6 arguments");
Victor Stinner26486ea2010-05-15 22:23:53 +00002026 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002027 }
2028 Py_BEGIN_ALLOW_THREADS
2029 rtn = pnoutrefresh(self->win, pminrow, pmincol,
2030 sminrow, smincol, smaxrow, smaxcol);
2031 Py_END_ALLOW_THREADS
2032 return PyCursesCheckERR(rtn, "pnoutrefresh");
2033 }
2034 if (group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002035 PyErr_SetString(PyExc_TypeError,
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002036 "noutrefresh() takes no arguments (6 given)");
Victor Stinner26486ea2010-05-15 22:23:53 +00002037 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002038 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002039#endif
2040 Py_BEGIN_ALLOW_THREADS
2041 rtn = wnoutrefresh(self->win);
2042 Py_END_ALLOW_THREADS
2043 return PyCursesCheckERR(rtn, "wnoutrefresh");
2044}
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002045
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002046/*[clinic input]
2047_curses.window.overlay
2048
2049 destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
2050
2051 [
2052 sminrow: int
2053 smincol: int
2054 dminrow: int
2055 dmincol: int
2056 dmaxrow: int
2057 dmaxcol: int
2058 ]
2059 /
2060
2061Overlay the window on top of destwin.
2062
2063The windows need not be the same size, only the overlapping region is copied.
2064This copy is non-destructive, which means that the current background
2065character does not overwrite the old contents of destwin.
2066
2067To get fine-grained control over the copied region, the second form of
2068overlay() can be used. sminrow and smincol are the upper-left coordinates
2069of the source window, and the other variables mark a rectangle in the
2070destination window.
2071[clinic start generated code]*/
2072
2073static PyObject *
2074_curses_window_overlay_impl(PyCursesWindowObject *self,
2075 PyCursesWindowObject *destwin, int group_right_1,
2076 int sminrow, int smincol, int dminrow,
2077 int dmincol, int dmaxrow, int dmaxcol)
2078/*[clinic end generated code: output=82bb2c4cb443ca58 input=7edd23ad22cc1984]*/
2079{
2080 int rtn;
2081
2082 if (group_right_1) {
2083 rtn = copywin(self->win, destwin->win, sminrow, smincol,
Victor Stinner26486ea2010-05-15 22:23:53 +00002084 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
2085 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002086 }
2087 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002088 rtn = overlay(self->win, destwin->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00002089 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002090 }
2091}
2092
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002093/*[clinic input]
2094_curses.window.overwrite
2095
2096 destwin: object(type="PyCursesWindowObject *", subclass_of="&PyCursesWindow_Type")
2097
2098 [
2099 sminrow: int
2100 smincol: int
2101 dminrow: int
2102 dmincol: int
2103 dmaxrow: int
2104 dmaxcol: int
2105 ]
2106 /
2107
2108Overwrite the window on top of destwin.
2109
2110The windows need not be the same size, in which case only the overlapping
2111region is copied. This copy is destructive, which means that the current
2112background character overwrites the old contents of destwin.
2113
2114To get fine-grained control over the copied region, the second form of
2115overwrite() can be used. sminrow and smincol are the upper-left coordinates
2116of the source window, the other variables mark a rectangle in the destination
2117window.
2118[clinic start generated code]*/
2119
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002120static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002121_curses_window_overwrite_impl(PyCursesWindowObject *self,
2122 PyCursesWindowObject *destwin,
2123 int group_right_1, int sminrow, int smincol,
2124 int dminrow, int dmincol, int dmaxrow,
2125 int dmaxcol)
2126/*[clinic end generated code: output=12ae007d1681be28 input=ea5de1b35cd948e0]*/
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002127{
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002128 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00002129
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002130 if (group_right_1) {
2131 rtn = copywin(self->win, destwin->win, sminrow, smincol,
Victor Stinner26486ea2010-05-15 22:23:53 +00002132 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002133 return PyCursesCheckERR(rtn, "copywin");
2134 }
2135 else {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002136 rtn = overwrite(self->win, destwin->win);
Victor Stinner26486ea2010-05-15 22:23:53 +00002137 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002138 }
2139}
2140
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002141/*[clinic input]
2142_curses.window.putwin
2143
2144 file: object
2145 /
2146
2147Write all data associated with the window into the provided file object.
2148
2149This information can be later retrieved using the getwin() function.
2150[clinic start generated code]*/
2151
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00002152static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002153_curses_window_putwin(PyCursesWindowObject *self, PyObject *file)
2154/*[clinic end generated code: output=3a25e2a5e7a040ac input=0608648e09c8ea0a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002155{
Victor Stinner26486ea2010-05-15 22:23:53 +00002156 /* We have to simulate this by writing to a temporary FILE*,
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002157 then reading back, then writing to the argument file. */
Christian Heimes2b221b72017-03-02 11:09:01 +01002158 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002159 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00002160
Christian Heimes2b221b72017-03-02 11:09:01 +01002161 fp = tmpfile();
2162 if (fp == NULL)
2163 return PyErr_SetFromErrno(PyExc_OSError);
2164 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002165 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00002166 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002167 if (res == NULL)
2168 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00002169 fseek(fp, 0, 0);
2170 while (1) {
2171 char buf[BUFSIZ];
2172 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002173 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002174
Victor Stinner26486ea2010-05-15 22:23:53 +00002175 if (n <= 0)
2176 break;
2177 Py_DECREF(res);
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002178 res = _PyObject_CallMethodId(file, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00002179 if (res == NULL)
2180 break;
2181 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002182
2183exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01002184 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00002185 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186}
2187
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002188/*[clinic input]
2189_curses.window.redrawln
2190
2191 beg: int
2192 Starting line number.
2193 num: int
2194 The number of lines.
2195 /
2196
2197Mark the specified lines corrupted.
2198
2199They should be completely redrawn on the next refresh() call.
2200[clinic start generated code]*/
2201
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002203_curses_window_redrawln_impl(PyCursesWindowObject *self, int beg, int num)
2204/*[clinic end generated code: output=ea216e334f9ce1b4 input=152155e258a77a7a]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002205{
Victor Stinner26486ea2010-05-15 22:23:53 +00002206 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207}
2208
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002209/*[clinic input]
2210_curses.window.refresh
2211
2212 [
2213 pminrow: int
2214 pmincol: int
2215 sminrow: int
2216 smincol: int
2217 smaxrow: int
2218 smaxcol: int
2219 ]
2220 /
2221
2222Update the display immediately.
2223
2224Synchronize actual screen with previous drawing/deleting methods.
2225The 6 optional arguments can only be specified when the window is a pad
2226created with newpad(). The additional parameters are needed to indicate
2227what part of the pad and screen are involved. pminrow and pmincol specify
2228the upper left-hand corner of the rectangle to be displayed in the pad.
2229sminrow, smincol, smaxrow, and smaxcol specify the edges of the rectangle to
2230be displayed on the screen. The lower right-hand corner of the rectangle to
2231be displayed in the pad is calculated from the screen coordinates, since the
2232rectangles must be the same size. Both rectangles must be entirely contained
2233within their respective structures. Negative values of pminrow, pmincol,
2234sminrow, or smincol are treated as if they were zero.
2235[clinic start generated code]*/
2236
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002238_curses_window_refresh_impl(PyCursesWindowObject *self, int group_right_1,
2239 int pminrow, int pmincol, int sminrow,
2240 int smincol, int smaxrow, int smaxcol)
2241/*[clinic end generated code: output=42199543115e6e63 input=95e01cb5ffc635d0]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242{
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00002244
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002245#ifdef py_is_pad
2246 if (py_is_pad(self->win)) {
2247 if (!group_right_1) {
2248 PyErr_SetString(PyCursesError,
2249 "refresh() for a pad requires 6 arguments");
2250 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002252 Py_BEGIN_ALLOW_THREADS
2253 rtn = prefresh(self->win, pminrow, pmincol,
2254 sminrow, smincol, smaxrow, smaxcol);
2255 Py_END_ALLOW_THREADS
2256 return PyCursesCheckERR(rtn, "prefresh");
2257 }
2258#endif
2259 if (group_right_1) {
2260 PyErr_SetString(PyExc_TypeError,
2261 "refresh() takes no arguments (6 given)");
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 return NULL;
2263 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002264 Py_BEGIN_ALLOW_THREADS
2265 rtn = wrefresh(self->win);
2266 Py_END_ALLOW_THREADS
2267 return PyCursesCheckERR(rtn, "prefresh");
2268}
2269
2270/*[clinic input]
2271_curses.window.setscrreg
2272
2273 top: int
2274 First line number.
2275 bottom: int
2276 Last line number.
2277 /
2278
2279Define a software scrolling region.
2280
2281All scrolling actions will take place in this region.
2282[clinic start generated code]*/
2283
2284static PyObject *
2285_curses_window_setscrreg_impl(PyCursesWindowObject *self, int top,
2286 int bottom)
2287/*[clinic end generated code: output=486ab5db218d2b1a input=1b517b986838bf0e]*/
2288{
2289 return PyCursesCheckERR(wsetscrreg(self->win, top, bottom), "wsetscrreg");
2290}
2291
2292/*[clinic input]
2293_curses.window.subwin
2294
2295 [
2296 nlines: int = 0
2297 Height.
2298 ncols: int = 0
2299 Width.
2300 ]
2301 begin_y: int
2302 Top side y-coordinate.
2303 begin_x: int
2304 Left side x-coordinate.
2305 /
2306
2307Create a sub-window (screen-relative coordinates).
2308
2309By default, the sub-window will extend from the specified position to the
2310lower right corner of the window.
2311[clinic start generated code]*/
2312
2313static PyObject *
2314_curses_window_subwin_impl(PyCursesWindowObject *self, int group_left_1,
2315 int nlines, int ncols, int begin_y, int begin_x)
2316/*[clinic end generated code: output=93e898afc348f59a input=2129fa47fd57721c]*/
2317{
2318 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002319
Victor Stinner26486ea2010-05-15 22:23:53 +00002320 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09002321#ifdef py_is_pad
2322 if (py_is_pad(self->win)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002323 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
Masayuki Yamamoto8bc7d632017-11-01 21:05:26 +09002324 }
Victor Stinner26486ea2010-05-15 22:23:53 +00002325 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002326#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002327 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002328
Victor Stinner26486ea2010-05-15 22:23:53 +00002329 if (win == NULL) {
2330 PyErr_SetString(PyCursesError, catchall_NULL);
2331 return NULL;
2332 }
2333
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002334 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002335}
2336
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002337/*[clinic input]
2338_curses.window.scroll
2339
2340 [
2341 lines: int = 1
2342 Number of lines to scroll.
2343 ]
2344 /
2345
2346Scroll the screen or scrolling region.
2347
2348Scroll upward if the argument is positive and downward if it is negative.
2349[clinic start generated code]*/
2350
Guido van Rossumf6971e21994-08-30 12:25:20 +00002351static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002352_curses_window_scroll_impl(PyCursesWindowObject *self, int group_right_1,
2353 int lines)
2354/*[clinic end generated code: output=4541a8a11852d360 input=c969ca0cfabbdbec]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002355{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002356 if (!group_right_1) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002357 return PyCursesCheckERR(scroll(self->win), "scroll");
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002358 }
2359 else {
2360 return PyCursesCheckERR(wscrl(self->win, lines), "scroll");
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002362}
2363
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002364/*[clinic input]
2365_curses.window.touchline
2366
2367 start: int
2368 count: int
2369 [
2370 changed: bool(accept={int}) = True
2371 ]
2372 /
2373
2374Pretend count lines have been changed, starting with line start.
2375
2376If changed is supplied, it specifies whether the affected lines are marked
2377as having been changed (changed=True) or unchanged (changed=False).
2378[clinic start generated code]*/
2379
Guido van Rossumf6971e21994-08-30 12:25:20 +00002380static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002381_curses_window_touchline_impl(PyCursesWindowObject *self, int start,
2382 int count, int group_right_1, int changed)
2383/*[clinic end generated code: output=65d05b3f7438c61d input=918ad1cbdadf93ea]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002384{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002385 if (!group_right_1) {
2386 return PyCursesCheckERR(touchline(self->win, start, count), "touchline");
2387 }
2388 else {
2389 return PyCursesCheckERR(wtouchln(self->win, start, count, changed), "touchline");
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002391}
2392
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002393/*[clinic input]
2394_curses.window.vline
2395
2396 [
2397 y: int
2398 Starting Y-coordinate.
2399 x: int
2400 Starting X-coordinate.
2401 ]
2402
2403 ch: object
2404 Character to draw.
2405 n: int
2406 Line length.
2407
2408 [
2409 attr: long(c_default="A_NORMAL") = _curses.A_NORMAL
2410 Attributes for the character.
2411 ]
2412 /
2413
2414Display a vertical line.
2415[clinic start generated code]*/
2416
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002417static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002418_curses_window_vline_impl(PyCursesWindowObject *self, int group_left_1,
2419 int y, int x, PyObject *ch, int n,
2420 int group_right_1, long attr)
2421/*[clinic end generated code: output=287ad1cc8982217f input=a6f2dc86a4648b32]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002423 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002424
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002425 if (!PyCurses_ConvertToChtype(self, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00002426 return NULL;
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002427 if (group_left_1) {
2428 if (wmove(self->win, y, x) == ERR)
2429 return PyCursesCheckERR(ERR, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002430 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002431 return PyCursesCheckERR(wvline(self->win, ch_ | (attr_t)attr, n), "vline");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002432}
2433
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002434static PyObject *
2435PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
2436{
2437 return PyUnicode_FromString(self->encoding);
2438}
2439
2440static int
Serhiy Storchakad4f9cf52018-11-27 19:34:35 +02002441PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value, void *Py_UNUSED(ignored))
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002442{
2443 PyObject *ascii;
2444 char *encoding;
2445
2446 /* It is illegal to del win.encoding */
2447 if (value == NULL) {
2448 PyErr_SetString(PyExc_TypeError,
2449 "encoding may not be deleted");
2450 return -1;
2451 }
2452
2453 if (!PyUnicode_Check(value)) {
2454 PyErr_SetString(PyExc_TypeError,
2455 "setting encoding to a non-string");
2456 return -1;
2457 }
2458 ascii = PyUnicode_AsASCIIString(value);
2459 if (ascii == NULL)
2460 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002461 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002462 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002463 if (encoding == NULL) {
2464 PyErr_NoMemory();
2465 return -1;
2466 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002467 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002468 self->encoding = encoding;
2469 return 0;
2470}
2471
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002472#include "clinic/_cursesmodule.c.h"
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002473
Guido van Rossumf6971e21994-08-30 12:25:20 +00002474static PyMethodDef PyCursesWindow_Methods[] = {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002475 _CURSES_WINDOW_ADDCH_METHODDEF
2476 _CURSES_WINDOW_ADDNSTR_METHODDEF
2477 _CURSES_WINDOW_ADDSTR_METHODDEF
2478 _CURSES_WINDOW_ATTROFF_METHODDEF
2479 _CURSES_WINDOW_ATTRON_METHODDEF
2480 _CURSES_WINDOW_ATTRSET_METHODDEF
2481 _CURSES_WINDOW_BKGD_METHODDEF
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002482#ifdef HAVE_CURSES_WCHGAT
Victor Stinner26486ea2010-05-15 22:23:53 +00002483 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
Serhiy Storchaka894ebd02017-11-01 14:34:20 +02002484#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002485 _CURSES_WINDOW_BKGDSET_METHODDEF
2486 _CURSES_WINDOW_BORDER_METHODDEF
2487 _CURSES_WINDOW_BOX_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002488 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2489 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2490 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2491 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2492 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002493 _CURSES_WINDOW_DELCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002494 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002495 _CURSES_WINDOW_DERWIN_METHODDEF
2496 _CURSES_WINDOW_ECHOCHAR_METHODDEF
2497 _CURSES_WINDOW_ENCLOSE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002498 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2499 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002500 _CURSES_WINDOW_GETBKGD_METHODDEF
2501 _CURSES_WINDOW_GETCH_METHODDEF
2502 _CURSES_WINDOW_GETKEY_METHODDEF
2503 _CURSES_WINDOW_GET_WCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002504 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2505 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2506 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2507 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002508 _CURSES_WINDOW_HLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002509 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2510 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002511#ifdef HAVE_CURSES_IMMEDOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002512 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002513#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002514 _CURSES_WINDOW_INCH_METHODDEF
2515 _CURSES_WINDOW_INSCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002516 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2517 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002518 _CURSES_WINDOW_INSNSTR_METHODDEF
2519 _CURSES_WINDOW_INSSTR_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002520 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002521 _CURSES_WINDOW_IS_LINETOUCHED_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002522 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2523 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2524 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2525 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2526 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2527 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2528 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2529 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002530 _CURSES_WINDOW_NOUTREFRESH_METHODDEF
2531 _CURSES_WINDOW_OVERLAY_METHODDEF
2532 _CURSES_WINDOW_OVERWRITE_METHODDEF
2533 _CURSES_WINDOW_PUTWIN_METHODDEF
2534 _CURSES_WINDOW_REDRAWLN_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002535 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002536 _CURSES_WINDOW_REFRESH_METHODDEF
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002537#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002539#endif
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002540 _CURSES_WINDOW_SCROLL_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002541 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002542 _CURSES_WINDOW_SETSCRREG_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002543 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2544 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002545 {"subpad", (PyCFunction)_curses_window_subwin, METH_VARARGS, _curses_window_subwin__doc__},
2546 _CURSES_WINDOW_SUBWIN_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002548#ifdef HAVE_CURSES_SYNCOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002550#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002551 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2552 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002553 _CURSES_WINDOW_TOUCHLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002554 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2555 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002556 _CURSES_WINDOW_VLINE_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002558};
2559
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002560static PyGetSetDef PyCursesWindow_getsets[] = {
2561 {"encoding",
2562 (getter)PyCursesWindow_get_encoding,
2563 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002564 "the typecode character used to create the array"},
2565 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002566};
2567
Guido van Rossumf6971e21994-08-30 12:25:20 +00002568/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002569
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002570PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002572 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002573 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2574 0, /*tp_itemsize*/
2575 /* methods */
2576 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002577 0, /*tp_vectorcall_offset*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 (getattrfunc)0, /*tp_getattr*/
2579 (setattrfunc)0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02002580 0, /*tp_as_async*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002581 0, /*tp_repr*/
2582 0, /*tp_as_number*/
2583 0, /*tp_as_sequence*/
2584 0, /*tp_as_mapping*/
2585 0, /*tp_hash*/
2586 0, /*tp_call*/
2587 0, /*tp_str*/
2588 0, /*tp_getattro*/
2589 0, /*tp_setattro*/
2590 0, /*tp_as_buffer*/
2591 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2592 0, /*tp_doc*/
2593 0, /*tp_traverse*/
2594 0, /*tp_clear*/
2595 0, /*tp_richcompare*/
2596 0, /*tp_weaklistoffset*/
2597 0, /*tp_iter*/
2598 0, /*tp_iternext*/
2599 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002600 0, /* tp_members */
2601 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002602};
2603
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002604/* Function Prototype Macros - They are ugly but very, very useful. ;-)
2605
2606 X - function name
2607 TYPE - parameter Type
2608 ERGSTR - format string for construction of the return value
2609 PARSESTR - format string for argument parsing
2610 */
2611
2612#define NoArgNoReturnFunctionBody(X) \
2613{ \
2614 PyCursesInitialised \
2615 return PyCursesCheckERR(X(), # X); }
2616
2617#define NoArgOrFlagNoReturnFunctionBody(X, flag) \
2618{ \
2619 PyCursesInitialised \
2620 if (flag) \
2621 return PyCursesCheckERR(X(), # X); \
2622 else \
2623 return PyCursesCheckERR(no ## X(), # X); \
2624}
2625
2626#define NoArgReturnIntFunctionBody(X) \
2627{ \
2628 PyCursesInitialised \
2629 return PyLong_FromLong((long) X()); }
2630
2631
2632#define NoArgReturnStringFunctionBody(X) \
2633{ \
2634 PyCursesInitialised \
2635 return PyBytes_FromString(X()); }
2636
2637#define NoArgTrueFalseFunctionBody(X) \
2638{ \
2639 PyCursesInitialised \
2640 return PyBool_FromLong(X()); }
2641
2642#define NoArgNoReturnVoidFunctionBody(X) \
2643{ \
2644 PyCursesInitialised \
2645 X(); \
2646 Py_RETURN_NONE; }
2647
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002648/*********************************************************************
2649 Global Functions
2650**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002651
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002652#ifdef HAVE_CURSES_FILTER
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002653/*[clinic input]
2654_curses.filter
2655
2656[clinic start generated code]*/
2657
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002658static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002659_curses_filter_impl(PyObject *module)
2660/*[clinic end generated code: output=fb5b8a3642eb70b5 input=668c75a6992d3624]*/
Christian Heimesaf98da12008-01-27 15:18:18 +00002661{
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 /* not checking for PyCursesInitialised here since filter() must
2663 be called before initscr() */
2664 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002665 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002666}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002667#endif
Christian Heimesaf98da12008-01-27 15:18:18 +00002668
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002669/*[clinic input]
2670_curses.baudrate
2671
2672Return the output speed of the terminal in bits per second.
2673[clinic start generated code]*/
2674
Christian Heimesaf98da12008-01-27 15:18:18 +00002675static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002676_curses_baudrate_impl(PyObject *module)
2677/*[clinic end generated code: output=3c63c6c401d7d9c0 input=921f022ed04a0fd9]*/
2678NoArgReturnIntFunctionBody(baudrate)
2679
2680/*[clinic input]
2681_curses.beep
2682
2683Emit a short attention sound.
2684[clinic start generated code]*/
2685
2686static PyObject *
2687_curses_beep_impl(PyObject *module)
2688/*[clinic end generated code: output=425274962abe49a2 input=a35698ca7d0162bc]*/
2689NoArgNoReturnFunctionBody(beep)
2690
2691/*[clinic input]
2692_curses.can_change_color
2693
2694Return True if the programmer can change the colors displayed by the terminal.
2695[clinic start generated code]*/
2696
2697static PyObject *
2698_curses_can_change_color_impl(PyObject *module)
2699/*[clinic end generated code: output=359df8c3c77d8bf1 input=d7718884de0092f2]*/
2700NoArgTrueFalseFunctionBody(can_change_color)
2701
2702/*[clinic input]
2703_curses.cbreak
2704
2705 flag: bool(accept={int}) = True
2706 If false, the effect is the same as calling nocbreak().
2707 /
2708
2709Enter cbreak mode.
2710
2711In cbreak mode (sometimes called "rare" mode) normal tty line buffering is
2712turned off and characters are available to be read one by one. However,
2713unlike raw mode, special characters (interrupt, quit, suspend, and flow
2714control) retain their effects on the tty driver and calling program.
2715Calling first raw() then cbreak() leaves the terminal in cbreak mode.
2716[clinic start generated code]*/
2717
2718static PyObject *
2719_curses_cbreak_impl(PyObject *module, int flag)
2720/*[clinic end generated code: output=9f9dee9664769751 input=150be619eb1f1458]*/
2721NoArgOrFlagNoReturnFunctionBody(cbreak, flag)
2722
2723/*[clinic input]
2724_curses.color_content
2725
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002726 color_number: color
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002727 The number of the color (0 - (COLORS-1)).
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002728 /
2729
2730Return the red, green, and blue (RGB) components of the specified color.
2731
2732A 3-tuple is returned, containing the R, G, B values for the given color,
2733which will be between 0 (no component) and 1000 (maximum amount of component).
2734[clinic start generated code]*/
2735
2736static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002737_curses_color_content_impl(PyObject *module, int color_number)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002738/*[clinic end generated code: output=17b466df7054e0de input=03b5ed0472662aea]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002739{
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002740 _NCURSES_COLOR_VAL_TYPE r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002741
Victor Stinner26486ea2010-05-15 22:23:53 +00002742 PyCursesInitialised;
2743 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002744
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05002745 if (_COLOR_CONTENT_FUNC(color_number, &r, &g, &b) != ERR)
Victor Stinner26486ea2010-05-15 22:23:53 +00002746 return Py_BuildValue("(iii)", r, g, b);
2747 else {
2748 PyErr_SetString(PyCursesError,
2749 "Argument 1 was out of range. Check value of COLORS.");
2750 return NULL;
2751 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002752}
2753
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002754/*[clinic input]
2755_curses.color_pair
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002757 pair_number: int
2758 The number of the color pair.
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002759 /
2760
2761Return the attribute value for displaying text in the specified color.
2762
2763This attribute value can be combined with A_STANDOUT, A_REVERSE, and the
2764other A_* attributes. pair_number() is the counterpart to this function.
2765[clinic start generated code]*/
2766
2767static PyObject *
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002768_curses_color_pair_impl(PyObject *module, int pair_number)
2769/*[clinic end generated code: output=60718abb10ce9feb input=6034e9146f343802]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002770{
Victor Stinner26486ea2010-05-15 22:23:53 +00002771 PyCursesInitialised;
2772 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002773
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02002774 return PyLong_FromLong(COLOR_PAIR(pair_number));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002775}
2776
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002777/*[clinic input]
2778_curses.curs_set
2779
2780 visibility: int
2781 0 for invisible, 1 for normal visible, or 2 for very visible.
2782 /
2783
2784Set the cursor state.
2785
2786If the terminal supports the visibility requested, the previous cursor
2787state is returned; otherwise, an exception is raised. On many terminals,
2788the "visible" mode is an underline cursor and the "very visible" mode is
2789a block cursor.
2790[clinic start generated code]*/
2791
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002792static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002793_curses_curs_set_impl(PyObject *module, int visibility)
2794/*[clinic end generated code: output=ee8e62483b1d6cd4 input=81a7924a65d29504]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002795{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002796 int erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002797
Victor Stinner26486ea2010-05-15 22:23:53 +00002798 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002799
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002800 erg = curs_set(visibility);
Victor Stinner26486ea2010-05-15 22:23:53 +00002801 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002802
Victor Stinner26486ea2010-05-15 22:23:53 +00002803 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002804}
2805
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002806/*[clinic input]
2807_curses.def_prog_mode
2808
2809Save the current terminal mode as the "program" mode.
2810
2811The "program" mode is the mode when the running program is using curses.
2812
2813Subsequent calls to reset_prog_mode() will restore this mode.
2814[clinic start generated code]*/
2815
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002817_curses_def_prog_mode_impl(PyObject *module)
2818/*[clinic end generated code: output=05d5a351fff874aa input=768b9cace620dda5]*/
2819NoArgNoReturnFunctionBody(def_prog_mode)
2820
2821/*[clinic input]
2822_curses.def_shell_mode
2823
2824Save the current terminal mode as the "shell" mode.
2825
2826The "shell" mode is the mode when the running program is not using curses.
2827
2828Subsequent calls to reset_shell_mode() will restore this mode.
2829[clinic start generated code]*/
2830
2831static PyObject *
2832_curses_def_shell_mode_impl(PyObject *module)
2833/*[clinic end generated code: output=d6e42f5c768f860f input=5ead21f6f0baa894]*/
2834NoArgNoReturnFunctionBody(def_shell_mode)
2835
2836/*[clinic input]
2837_curses.delay_output
2838
2839 ms: int
2840 Duration in milliseconds.
2841 /
2842
2843Insert a pause in output.
2844[clinic start generated code]*/
2845
2846static PyObject *
2847_curses_delay_output_impl(PyObject *module, int ms)
2848/*[clinic end generated code: output=b6613a67f17fa4f4 input=5316457f5f59196c]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002849{
Victor Stinner26486ea2010-05-15 22:23:53 +00002850 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002851
Victor Stinner26486ea2010-05-15 22:23:53 +00002852 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002853}
2854
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002855/*[clinic input]
2856_curses.doupdate
2857
2858Update the physical screen to match the virtual screen.
2859[clinic start generated code]*/
2860
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002861static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002862_curses_doupdate_impl(PyObject *module)
2863/*[clinic end generated code: output=f34536975a75680c input=8da80914432a6489]*/
2864NoArgNoReturnFunctionBody(doupdate)
2865
2866/*[clinic input]
2867_curses.echo
2868
2869 flag: bool(accept={int}) = True
2870 If false, the effect is the same as calling noecho().
2871 /
2872
2873Enter echo mode.
2874
2875In echo mode, each character input is echoed to the screen as it is entered.
2876[clinic start generated code]*/
2877
2878static PyObject *
2879_curses_echo_impl(PyObject *module, int flag)
2880/*[clinic end generated code: output=03acb2ddfa6c8729 input=2e9e891d637eac5d]*/
2881NoArgOrFlagNoReturnFunctionBody(echo, flag)
2882
2883/*[clinic input]
2884_curses.endwin
2885
2886De-initialize the library, and return terminal to normal status.
2887[clinic start generated code]*/
2888
2889static PyObject *
2890_curses_endwin_impl(PyObject *module)
2891/*[clinic end generated code: output=c0150cd96d2f4128 input=e172cfa43062f3fa]*/
2892NoArgNoReturnFunctionBody(endwin)
2893
2894/*[clinic input]
2895_curses.erasechar
2896
2897Return the user's current erase character.
2898[clinic start generated code]*/
2899
2900static PyObject *
2901_curses_erasechar_impl(PyObject *module)
2902/*[clinic end generated code: output=3df305dc6b926b3f input=628c136c3c5758d3]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002903{
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002905
Victor Stinner26486ea2010-05-15 22:23:53 +00002906 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002907
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002909
Victor Stinner26486ea2010-05-15 22:23:53 +00002910 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002911}
2912
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002913/*[clinic input]
2914_curses.flash
2915
2916Flash the screen.
2917
2918That is, change it to reverse-video and then change it back in a short interval.
2919[clinic start generated code]*/
2920
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002921static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002922_curses_flash_impl(PyObject *module)
2923/*[clinic end generated code: output=488b8a0ebd9ea9b8 input=02fdfb06c8fc3171]*/
2924NoArgNoReturnFunctionBody(flash)
2925
2926/*[clinic input]
2927_curses.flushinp
2928
2929Flush all input buffers.
2930
2931This throws away any typeahead that has been typed by the user and has not
2932yet been processed by the program.
2933[clinic start generated code]*/
2934
2935static PyObject *
2936_curses_flushinp_impl(PyObject *module)
2937/*[clinic end generated code: output=7e7a1fc1473960f5 input=59d042e705cef5ec]*/
2938NoArgNoReturnVoidFunctionBody(flushinp)
2939
2940#ifdef getsyx
2941/*[clinic input]
2942_curses.getsyx
2943
2944Return the current coordinates of the virtual screen cursor.
2945
2946Return a (y, x) tuple. If leaveok is currently true, return (-1, -1).
2947[clinic start generated code]*/
2948
2949static PyObject *
2950_curses_getsyx_impl(PyObject *module)
2951/*[clinic end generated code: output=c8e6c3f42349a038 input=9e1f862f3b4f7cba]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002952{
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 int x = 0;
2954 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002955
Victor Stinner26486ea2010-05-15 22:23:53 +00002956 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002957
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002959
Victor Stinner26486ea2010-05-15 22:23:53 +00002960 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002961}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002962#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002963
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002964#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002965/*[clinic input]
2966_curses.getmouse
2967
2968Retrieve the queued mouse event.
2969
2970After getch() returns KEY_MOUSE to signal a mouse event, this function
2971returns a 5-tuple (id, x, y, z, bstate).
2972[clinic start generated code]*/
2973
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002974static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002975_curses_getmouse_impl(PyObject *module)
2976/*[clinic end generated code: output=ccf4242546b9cfa8 input=5b756ee6f5b481b1]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002977{
Victor Stinner26486ea2010-05-15 22:23:53 +00002978 int rtn;
2979 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002980
Victor Stinner26486ea2010-05-15 22:23:53 +00002981 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002982
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 rtn = getmouse( &event );
2984 if (rtn == ERR) {
2985 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2986 return NULL;
2987 }
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002988 return Py_BuildValue("(hiiik)",
Victor Stinner26486ea2010-05-15 22:23:53 +00002989 (short)event.id,
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02002990 (int)event.x, (int)event.y, (int)event.z,
2991 (unsigned long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002992}
2993
Serhiy Storchakab00854c2018-05-10 11:27:23 +03002994/*[clinic input]
2995_curses.ungetmouse
2996
2997 id: short
2998 x: int
2999 y: int
3000 z: int
3001 bstate: unsigned_long(bitwise=True)
3002 /
3003
3004Push a KEY_MOUSE event onto the input queue.
3005
3006The following getmouse() will return the given state data.
3007[clinic start generated code]*/
3008
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003009static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003010_curses_ungetmouse_impl(PyObject *module, short id, int x, int y, int z,
3011 unsigned long bstate)
3012/*[clinic end generated code: output=3430c9b0fc5c4341 input=fd650b2ca5a01e8f]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003013{
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003015
Victor Stinner26486ea2010-05-15 22:23:53 +00003016 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003017
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02003018 event.id = id;
3019 event.x = x;
3020 event.y = y;
3021 event.z = z;
3022 event.bstate = bstate;
Victor Stinner26486ea2010-05-15 22:23:53 +00003023 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003024}
3025#endif
3026
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003027/*[clinic input]
3028_curses.getwin
3029
3030 file: object
3031 /
3032
3033Read window related data stored in the file by an earlier putwin() call.
3034
3035The routine then creates and initializes a new window using that data,
3036returning the new window object.
3037[clinic start generated code]*/
3038
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003039static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003040_curses_getwin(PyObject *module, PyObject *file)
3041/*[clinic end generated code: output=a79e0df3379af756 input=f713d2bba0e4c929]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003042{
Christian Heimes2b221b72017-03-02 11:09:01 +01003043 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 PyObject *data;
3045 size_t datalen;
3046 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05003047 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003048 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003051
Christian Heimes2b221b72017-03-02 11:09:01 +01003052 fp = tmpfile();
3053 if (fp == NULL)
3054 return PyErr_SetFromErrno(PyExc_OSError);
3055
3056 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02003057 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01003058
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02003059 data = _PyObject_CallMethodIdNoArgs(file, &PyId_read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003060 if (data == NULL)
3061 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 if (!PyBytes_Check(data)) {
3063 PyErr_Format(PyExc_TypeError,
3064 "f.read() returned %.100s instead of bytes",
Victor Stinnerdaa97562020-02-07 03:37:06 +01003065 Py_TYPE(data)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +00003066 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003067 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003068 }
3069 datalen = PyBytes_GET_SIZE(data);
3070 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
3071 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01003072 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003073 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003074 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00003075 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003076
Victor Stinner26486ea2010-05-15 22:23:53 +00003077 fseek(fp, 0, 0);
3078 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00003079 if (win == NULL) {
3080 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003081 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00003082 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02003083 res = PyCursesWindow_New(win, NULL);
3084
3085error:
Christian Heimes2b221b72017-03-02 11:09:01 +01003086 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02003087 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003088}
3089
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003090/*[clinic input]
3091_curses.halfdelay
3092
3093 tenths: byte
3094 Maximal blocking delay in tenths of seconds (1 - 255).
3095 /
3096
3097Enter half-delay mode.
3098
3099Use nocbreak() to leave half-delay mode.
3100[clinic start generated code]*/
3101
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003102static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003103_curses_halfdelay_impl(PyObject *module, unsigned char tenths)
3104/*[clinic end generated code: output=e92cdf0ef33c0663 input=e42dce7259c15100]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003105{
Victor Stinner26486ea2010-05-15 22:23:53 +00003106 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003107
Victor Stinner26486ea2010-05-15 22:23:53 +00003108 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003109}
3110
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003111/*[clinic input]
3112_curses.has_colors
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003113
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003114Return True if the terminal can display colors; otherwise, return False.
3115[clinic start generated code]*/
3116
3117static PyObject *
3118_curses_has_colors_impl(PyObject *module)
3119/*[clinic end generated code: output=db5667483139e3e2 input=b2ec41b739d896c6]*/
3120NoArgTrueFalseFunctionBody(has_colors)
3121
3122/*[clinic input]
3123_curses.has_ic
3124
3125Return True if the terminal has insert- and delete-character capabilities.
3126[clinic start generated code]*/
3127
3128static PyObject *
3129_curses_has_ic_impl(PyObject *module)
3130/*[clinic end generated code: output=6be24da9cb1268fe input=9bc2d3a797cc7324]*/
3131NoArgTrueFalseFunctionBody(has_ic)
3132
3133/*[clinic input]
3134_curses.has_il
3135
3136Return True if the terminal has insert- and delete-line capabilities.
3137[clinic start generated code]*/
3138
3139static PyObject *
3140_curses_has_il_impl(PyObject *module)
3141/*[clinic end generated code: output=d45bd7788ff9f5f4 input=cd939d5607ee5427]*/
3142NoArgTrueFalseFunctionBody(has_il)
3143
3144#ifdef HAVE_CURSES_HAS_KEY
3145/*[clinic input]
3146_curses.has_key
3147
3148 key: int
3149 Key number.
3150 /
3151
3152Return True if the current terminal type recognizes a key with that value.
3153[clinic start generated code]*/
3154
3155static PyObject *
3156_curses_has_key_impl(PyObject *module, int key)
3157/*[clinic end generated code: output=19ad48319414d0b1 input=78bd44acf1a4997c]*/
3158{
Victor Stinner26486ea2010-05-15 22:23:53 +00003159 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003160
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003161 return PyBool_FromLong(has_key(key));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003162}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003163#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003164
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003165/*[clinic input]
3166_curses.init_color
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003167
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003168 color_number: color
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003169 The number of the color to be changed (0 - (COLORS-1)).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003170 r: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003171 Red component (0 - 1000).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003172 g: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003173 Green component (0 - 1000).
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003174 b: component
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003175 Blue component (0 - 1000).
3176 /
3177
3178Change the definition of a color.
3179
3180When init_color() is used, all occurrences of that color on the screen
3181immediately change to the new definition. This function is a no-op on
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003182most terminals; it is active only if can_change_color() returns true.
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003183[clinic start generated code]*/
3184
3185static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003186_curses_init_color_impl(PyObject *module, int color_number, short r, short g,
3187 short b)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003188/*[clinic end generated code: output=d7ed71b2d818cdf2 input=ae2b8bea0f152c80]*/
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003189{
Victor Stinner26486ea2010-05-15 22:23:53 +00003190 PyCursesInitialised;
3191 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003192
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003193 return PyCursesCheckERR(_CURSES_INIT_COLOR_FUNC(color_number, r, g, b), _CURSES_INIT_COLOR_FUNC_NAME);
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
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003220 return PyCursesCheckERR(_CURSES_INIT_PAIR_FUNC(pair_number, fg, bg), _CURSES_INIT_PAIR_FUNC_NAME);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003221}
3222
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003223static PyObject *ModDict;
3224
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003225/*[clinic input]
3226_curses.initscr
3227
3228Initialize the library.
3229
3230Return a WindowObject which represents the whole screen.
3231[clinic start generated code]*/
3232
Victor Stinner26486ea2010-05-15 22:23:53 +00003233static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003234_curses_initscr_impl(PyObject *module)
3235/*[clinic end generated code: output=619fb68443810b7b input=514f4bce1821f6b5]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003236{
Victor Stinner26486ea2010-05-15 22:23:53 +00003237 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003238 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003239
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003240 if (initialised) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003241 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003242 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00003243 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00003244
Victor Stinner26486ea2010-05-15 22:23:53 +00003245 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003246
Victor Stinner26486ea2010-05-15 22:23:53 +00003247 if (win == NULL) {
3248 PyErr_SetString(PyCursesError, catchall_NULL);
3249 return NULL;
3250 }
Guido van Rossum85738471995-02-17 13:50:17 +00003251
Victor Stinner26486ea2010-05-15 22:23:53 +00003252 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00003253
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003254/* This was moved from initcurses() because it core dumped on SGI,
3255 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00003256#define SetDictInt(string,ch) \
3257 do { \
3258 PyObject *o = PyLong_FromLong((long) (ch)); \
3259 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
3260 Py_DECREF(o); \
3261 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00003262 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003263
Victor Stinner26486ea2010-05-15 22:23:53 +00003264 /* Here are some graphic symbols you can use */
3265 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
3266 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
3267 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
3268 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
3269 SetDictInt("ACS_LTEE", (ACS_LTEE));
3270 SetDictInt("ACS_RTEE", (ACS_RTEE));
3271 SetDictInt("ACS_BTEE", (ACS_BTEE));
3272 SetDictInt("ACS_TTEE", (ACS_TTEE));
3273 SetDictInt("ACS_HLINE", (ACS_HLINE));
3274 SetDictInt("ACS_VLINE", (ACS_VLINE));
3275 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00003276#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00003277 /* On HP/UX 11, these are of type cchar_t, which is not an
3278 integral type. If this is a problem on more platforms, a
3279 configure test should be added to determine whether ACS_S1
3280 is of integral type. */
3281 SetDictInt("ACS_S1", (ACS_S1));
3282 SetDictInt("ACS_S9", (ACS_S9));
3283 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
3284 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
3285 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
3286 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
3287 SetDictInt("ACS_BULLET", (ACS_BULLET));
3288 SetDictInt("ACS_LARROW", (ACS_LARROW));
3289 SetDictInt("ACS_RARROW", (ACS_RARROW));
3290 SetDictInt("ACS_DARROW", (ACS_DARROW));
3291 SetDictInt("ACS_UARROW", (ACS_UARROW));
3292 SetDictInt("ACS_BOARD", (ACS_BOARD));
3293 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
3294 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00003295#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003296 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
3297 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
3298 SetDictInt("ACS_BBSS", (ACS_URCORNER));
3299 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
3300 SetDictInt("ACS_SBSS", (ACS_RTEE));
3301 SetDictInt("ACS_SSSB", (ACS_LTEE));
3302 SetDictInt("ACS_SSBS", (ACS_BTEE));
3303 SetDictInt("ACS_BSSS", (ACS_TTEE));
3304 SetDictInt("ACS_BSBS", (ACS_HLINE));
3305 SetDictInt("ACS_SBSB", (ACS_VLINE));
3306 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003307
Victor Stinner26486ea2010-05-15 22:23:53 +00003308 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003309#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00003310 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003311#endif
3312#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00003313 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003314#endif
3315#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003317#endif
3318#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003319 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003320#endif
3321#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00003322 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003323#endif
3324#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003325 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003326#endif
3327#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00003328 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003329#endif
3330
Victor Stinner26486ea2010-05-15 22:23:53 +00003331 SetDictInt("LINES", LINES);
3332 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00003333
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003334 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
3335 screen_encoding = winobj->encoding;
3336 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003337}
3338
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003339/*[clinic input]
3340_curses.setupterm
3341
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003342 term: str(accept={str, NoneType}) = None
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003343 Terminal name.
3344 If omitted, the value of the TERM environment variable will be used.
3345 fd: int = -1
3346 File descriptor to which any initialization sequences will be sent.
3347 If not supplied, the file descriptor for sys.stdout will be used.
3348
3349Initialize the terminal.
3350[clinic start generated code]*/
3351
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003352static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003353_curses_setupterm_impl(PyObject *module, const char *term, int fd)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003354/*[clinic end generated code: output=4584e587350f2848 input=4511472766af0c12]*/
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003355{
Victor Stinner26486ea2010-05-15 22:23:53 +00003356 int err;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003357
Victor Stinner26486ea2010-05-15 22:23:53 +00003358 if (fd == -1) {
3359 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003360
Victor Stinnerbd303c12013-11-07 23:07:29 +01003361 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003362
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 if (sys_stdout == NULL || sys_stdout == Py_None) {
3364 PyErr_SetString(
3365 PyCursesError,
3366 "lost sys.stdout");
3367 return NULL;
3368 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003369
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003371
Victor Stinner26486ea2010-05-15 22:23:53 +00003372 if (fd == -1) {
3373 return NULL;
3374 }
3375 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003376
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003377 if (!initialised_setupterm && setupterm((char *)term, fd, &err) == ERR) {
Serhiy Storchakae2f92de2017-11-11 13:06:26 +02003378 const char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003379
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 if (err == 0) {
3381 s = "setupterm: could not find terminal";
3382 } else if (err == -1) {
3383 s = "setupterm: could not find terminfo database";
3384 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003385
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 PyErr_SetString(PyCursesError,s);
3387 return NULL;
3388 }
3389
3390 initialised_setupterm = TRUE;
3391
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003392 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00003393}
Guido van Rossumf6971e21994-08-30 12:25:20 +00003394
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03003395#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
3396// https://invisible-island.net/ncurses/NEWS.html#index-t20080119
3397
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003398/*[clinic input]
Anthony Sottileb32cb972019-10-31 02:13:48 -07003399_curses.get_escdelay
3400
3401Gets the curses ESCDELAY setting.
3402
3403Gets the number of milliseconds to wait after reading an escape character,
3404to distinguish between an individual escape character entered on the
3405keyboard from escape sequences sent by cursor and function keys.
3406[clinic start generated code]*/
3407
3408static PyObject *
3409_curses_get_escdelay_impl(PyObject *module)
3410/*[clinic end generated code: output=222fa1a822555d60 input=be2d5b3dd974d0a4]*/
3411{
3412 return PyLong_FromLong(ESCDELAY);
3413}
3414/*[clinic input]
3415_curses.set_escdelay
3416 ms: int
3417 length of the delay in milliseconds.
3418 /
3419
3420Sets the curses ESCDELAY setting.
3421
3422Sets the number of milliseconds to wait after reading an escape character,
3423to distinguish between an individual escape character entered on the
3424keyboard from escape sequences sent by cursor and function keys.
3425[clinic start generated code]*/
3426
3427static PyObject *
3428_curses_set_escdelay_impl(PyObject *module, int ms)
3429/*[clinic end generated code: output=43818efbf7980ac4 input=7796fe19f111e250]*/
3430{
3431 if (ms <= 0) {
3432 PyErr_SetString(PyExc_ValueError, "ms must be > 0");
3433 return NULL;
3434 }
3435
3436 return PyCursesCheckERR(set_escdelay(ms), "set_escdelay");
3437}
3438
3439/*[clinic input]
3440_curses.get_tabsize
3441
3442Gets the curses TABSIZE setting.
3443
3444Gets the number of columns used by the curses library when converting a tab
3445character to spaces as it adds the tab to a window.
3446[clinic start generated code]*/
3447
3448static PyObject *
3449_curses_get_tabsize_impl(PyObject *module)
3450/*[clinic end generated code: output=7e9e51fb6126fbdf input=74af86bf6c9f5d7e]*/
3451{
3452 return PyLong_FromLong(TABSIZE);
3453}
3454/*[clinic input]
3455_curses.set_tabsize
3456 size: int
3457 rendered cell width of a tab character.
3458 /
3459
3460Sets the curses TABSIZE setting.
3461
3462Sets the number of columns used by the curses library when converting a tab
3463character to spaces as it adds the tab to a window.
3464[clinic start generated code]*/
3465
3466static PyObject *
3467_curses_set_tabsize_impl(PyObject *module, int size)
3468/*[clinic end generated code: output=c1de5a76c0daab1e input=78cba6a3021ad061]*/
3469{
3470 if (size <= 0) {
3471 PyErr_SetString(PyExc_ValueError, "size must be > 0");
3472 return NULL;
3473 }
3474
3475 return PyCursesCheckERR(set_tabsize(size), "set_tabsize");
3476}
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03003477#endif
Anthony Sottileb32cb972019-10-31 02:13:48 -07003478
3479/*[clinic input]
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003480_curses.intrflush
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003481
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003482 flag: bool(accept={int})
3483 /
3484
3485[clinic start generated code]*/
3486
3487static PyObject *
3488_curses_intrflush_impl(PyObject *module, int flag)
3489/*[clinic end generated code: output=c1986df35e999a0f input=fcba57bb28dfd795]*/
3490{
Victor Stinner26486ea2010-05-15 22:23:53 +00003491 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003492
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003493 return PyCursesCheckERR(intrflush(NULL, flag), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003494}
3495
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003496/*[clinic input]
3497_curses.isendwin
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003498
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003499Return True if endwin() has been called.
3500[clinic start generated code]*/
3501
3502static PyObject *
3503_curses_isendwin_impl(PyObject *module)
3504/*[clinic end generated code: output=d73179e4a7e1eb8c input=6cdb01a7ebf71397]*/
3505NoArgTrueFalseFunctionBody(isendwin)
3506
3507#ifdef HAVE_CURSES_IS_TERM_RESIZED
3508/*[clinic input]
3509_curses.is_term_resized
3510
3511 nlines: int
3512 Height.
3513 ncols: int
3514 Width.
3515 /
3516
3517Return True if resize_term() would modify the window structure, False otherwise.
3518[clinic start generated code]*/
3519
3520static PyObject *
3521_curses_is_term_resized_impl(PyObject *module, int nlines, int ncols)
3522/*[clinic end generated code: output=aafe04afe50f1288 input=ca9c0bd0fb8ab444]*/
3523{
Victor Stinner26486ea2010-05-15 22:23:53 +00003524 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003525
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003526 return PyBool_FromLong(is_term_resized(nlines, ncols));
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003527}
3528#endif /* HAVE_CURSES_IS_TERM_RESIZED */
3529
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003530/*[clinic input]
3531_curses.keyname
3532
3533 key: int
3534 Key number.
3535 /
3536
3537Return the name of specified key.
3538[clinic start generated code]*/
3539
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003540static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003541_curses_keyname_impl(PyObject *module, int key)
3542/*[clinic end generated code: output=fa2675ab3f4e056b input=ee4b1d0f243a2a2b]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003543{
Victor Stinner26486ea2010-05-15 22:23:53 +00003544 const char *knp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003545
Victor Stinner26486ea2010-05-15 22:23:53 +00003546 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003547
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003548 if (key < 0) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003549 PyErr_SetString(PyExc_ValueError, "invalid key number");
3550 return NULL;
3551 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003552 knp = keyname(key);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003553
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03003554 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003555}
3556
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003557/*[clinic input]
3558_curses.killchar
3559
3560Return the user's current line kill character.
3561[clinic start generated code]*/
3562
Victor Stinner26486ea2010-05-15 22:23:53 +00003563static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003564_curses_killchar_impl(PyObject *module)
3565/*[clinic end generated code: output=31c3a45b2c528269 input=1ff171c38df5ccad]*/
Victor Stinner26486ea2010-05-15 22:23:53 +00003566{
3567 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003568
Victor Stinner26486ea2010-05-15 22:23:53 +00003569 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003570
Victor Stinner26486ea2010-05-15 22:23:53 +00003571 return PyBytes_FromStringAndSize(&ch, 1);
3572}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003573
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003574/*[clinic input]
3575_curses.longname
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003576
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003577Return the terminfo long name field describing the current terminal.
3578
3579The maximum length of a verbose description is 128 characters. It is defined
3580only after the call to initscr().
3581[clinic start generated code]*/
3582
3583static PyObject *
3584_curses_longname_impl(PyObject *module)
3585/*[clinic end generated code: output=fdf30433727ef568 input=84c3f20201b1098e]*/
3586NoArgReturnStringFunctionBody(longname)
3587
3588/*[clinic input]
3589_curses.meta
3590
3591 yes: bool(accept={int})
3592 /
3593
3594Enable/disable meta keys.
3595
3596If yes is True, allow 8-bit characters to be input. If yes is False,
3597allow only 7-bit characters.
3598[clinic start generated code]*/
3599
3600static PyObject *
3601_curses_meta_impl(PyObject *module, int yes)
3602/*[clinic end generated code: output=22f5abda46a605d8 input=af9892e3a74f35db]*/
3603{
Victor Stinner26486ea2010-05-15 22:23:53 +00003604 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003605
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003606 return PyCursesCheckERR(meta(stdscr, yes), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003607}
3608
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003609#ifdef NCURSES_MOUSE_VERSION
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003610/*[clinic input]
3611_curses.mouseinterval
3612
3613 interval: int
3614 Time in milliseconds.
3615 /
3616
3617Set and retrieve the maximum time between press and release in a click.
3618
3619Set the maximum time that can elapse between press and release events in
3620order for them to be recognized as a click, and return the previous interval
3621value.
3622[clinic start generated code]*/
3623
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003624static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003625_curses_mouseinterval_impl(PyObject *module, int interval)
3626/*[clinic end generated code: output=c4f5ff04354634c5 input=75aaa3f0db10ac4e]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003627{
Victor Stinner26486ea2010-05-15 22:23:53 +00003628 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003629
Victor Stinner26486ea2010-05-15 22:23:53 +00003630 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003631}
3632
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003633/*[clinic input]
3634_curses.mousemask
3635
3636 newmask: unsigned_long(bitwise=True)
3637 /
3638
3639Set the mouse events to be reported, and return a tuple (availmask, oldmask).
3640
3641Return a tuple (availmask, oldmask). availmask indicates which of the
3642specified mouse events can be reported; on complete failure it returns 0.
3643oldmask is the previous value of the given window's mouse event mask.
3644If this function is never called, no mouse events are ever reported.
3645[clinic start generated code]*/
3646
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003647static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003648_curses_mousemask_impl(PyObject *module, unsigned long newmask)
3649/*[clinic end generated code: output=9406cf1b8a36e485 input=bdf76b7568a3c541]*/
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003650{
Victor Stinner26486ea2010-05-15 22:23:53 +00003651 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003652
Victor Stinner26486ea2010-05-15 22:23:53 +00003653 PyCursesInitialised;
Serhiy Storchaka4f469c02017-11-01 20:48:49 +02003654 availmask = mousemask((mmask_t)newmask, &oldmask);
3655 return Py_BuildValue("(kk)",
3656 (unsigned long)availmask, (unsigned long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003657}
3658#endif
3659
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003660/*[clinic input]
3661_curses.napms
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003662
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003663 ms: int
3664 Duration in milliseconds.
3665 /
3666
3667Sleep for specified time.
3668[clinic start generated code]*/
3669
3670static PyObject *
3671_curses_napms_impl(PyObject *module, int ms)
3672/*[clinic end generated code: output=a40a1da2e39ea438 input=20cd3af2b6900f56]*/
3673{
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00003674 PyCursesInitialised;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003675
3676 return Py_BuildValue("i", napms(ms));
3677}
3678
3679
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003680/*[clinic input]
3681_curses.newpad
3682
3683 nlines: int
3684 Height.
3685 ncols: int
3686 Width.
3687 /
3688
3689Create and return a pointer to a new pad data structure.
3690[clinic start generated code]*/
3691
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00003692static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003693_curses_newpad_impl(PyObject *module, int nlines, int ncols)
3694/*[clinic end generated code: output=de52a56eb1098ec9 input=93f1272f240d8894]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003695{
Victor Stinner26486ea2010-05-15 22:23:53 +00003696 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003697
Victor Stinner26486ea2010-05-15 22:23:53 +00003698 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003699
Victor Stinner26486ea2010-05-15 22:23:53 +00003700 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003701
Victor Stinner26486ea2010-05-15 22:23:53 +00003702 if (win == NULL) {
3703 PyErr_SetString(PyCursesError, catchall_NULL);
3704 return NULL;
3705 }
3706
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003707 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003708}
3709
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003710/*[clinic input]
3711_curses.newwin
3712
3713 nlines: int
3714 Height.
3715 ncols: int
3716 Width.
3717 [
3718 begin_y: int = 0
3719 Top side y-coordinate.
3720 begin_x: int = 0
3721 Left side x-coordinate.
3722 ]
3723 /
3724
3725Return a new window.
3726
3727By default, the window will extend from the specified position to the lower
3728right corner of the screen.
3729[clinic start generated code]*/
3730
Guido van Rossumf6971e21994-08-30 12:25:20 +00003731static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003732_curses_newwin_impl(PyObject *module, int nlines, int ncols,
3733 int group_right_1, int begin_y, int begin_x)
3734/*[clinic end generated code: output=c1e0a8dc8ac2826c input=29312c15a72a003d]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003735{
Victor Stinner26486ea2010-05-15 22:23:53 +00003736 WINDOW *win;
Guido van Rossum85738471995-02-17 13:50:17 +00003737
Victor Stinner26486ea2010-05-15 22:23:53 +00003738 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003739
Victor Stinner26486ea2010-05-15 22:23:53 +00003740 win = newwin(nlines,ncols,begin_y,begin_x);
3741 if (win == NULL) {
3742 PyErr_SetString(PyCursesError, catchall_NULL);
3743 return NULL;
3744 }
Guido van Rossum85738471995-02-17 13:50:17 +00003745
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003746 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003747}
3748
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003749/*[clinic input]
3750_curses.nl
3751
3752 flag: bool(accept={int}) = True
3753 If false, the effect is the same as calling nonl().
3754 /
3755
3756Enter newline mode.
3757
3758This mode translates the return key into newline on input, and translates
3759newline into return and line-feed on output. Newline mode is initially on.
3760[clinic start generated code]*/
3761
Guido van Rossumf6971e21994-08-30 12:25:20 +00003762static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003763_curses_nl_impl(PyObject *module, int flag)
3764/*[clinic end generated code: output=b39cc0ffc9015003 input=cf36a63f7b86e28a]*/
3765NoArgOrFlagNoReturnFunctionBody(nl, flag)
3766
3767/*[clinic input]
3768_curses.nocbreak
3769
3770Leave cbreak mode.
3771
3772Return to normal "cooked" mode with line buffering.
3773[clinic start generated code]*/
3774
3775static PyObject *
3776_curses_nocbreak_impl(PyObject *module)
3777/*[clinic end generated code: output=eabf3833a4fbf620 input=e4b65f7d734af400]*/
3778NoArgNoReturnFunctionBody(nocbreak)
3779
3780/*[clinic input]
3781_curses.noecho
3782
3783Leave echo mode.
3784
3785Echoing of input characters is turned off.
3786[clinic start generated code]*/
3787
3788static PyObject *
3789_curses_noecho_impl(PyObject *module)
3790/*[clinic end generated code: output=cc95ab45bc98f41b input=76714df529e614c3]*/
3791NoArgNoReturnFunctionBody(noecho)
3792
3793/*[clinic input]
3794_curses.nonl
3795
3796Leave newline mode.
3797
3798Disable translation of return into newline on input, and disable low-level
3799translation of newline into newline/return on output.
3800[clinic start generated code]*/
3801
3802static PyObject *
3803_curses_nonl_impl(PyObject *module)
3804/*[clinic end generated code: output=99e917e9715770c6 input=9d37dd122d3022fc]*/
3805NoArgNoReturnFunctionBody(nonl)
3806
3807/*[clinic input]
3808_curses.noqiflush
3809
3810Disable queue flushing.
3811
3812When queue flushing is disabled, normal flush of input and output queues
3813associated with the INTR, QUIT and SUSP characters will not be done.
3814[clinic start generated code]*/
3815
3816static PyObject *
3817_curses_noqiflush_impl(PyObject *module)
3818/*[clinic end generated code: output=8b95a4229bbf0877 input=ba3e6b2e3e54c4df]*/
3819NoArgNoReturnVoidFunctionBody(noqiflush)
3820
3821/*[clinic input]
3822_curses.noraw
3823
3824Leave raw mode.
3825
3826Return to normal "cooked" mode with line buffering.
3827[clinic start generated code]*/
3828
3829static PyObject *
3830_curses_noraw_impl(PyObject *module)
3831/*[clinic end generated code: output=39894e5524c430cc input=6ec86692096dffb5]*/
3832NoArgNoReturnFunctionBody(noraw)
3833
3834/*[clinic input]
3835_curses.pair_content
3836
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003837 pair_number: pair
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003838 The number of the color pair (0 - (COLOR_PAIRS-1)).
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003839 /
3840
3841Return a tuple (fg, bg) containing the colors for the requested color pair.
3842[clinic start generated code]*/
3843
3844static PyObject *
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003845_curses_pair_content_impl(PyObject *module, int pair_number)
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003846/*[clinic end generated code: output=4a726dd0e6885f3f input=03970f840fc7b739]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00003847{
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003848 _NCURSES_COLOR_VAL_TYPE f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003849
Victor Stinner26486ea2010-05-15 22:23:53 +00003850 PyCursesInitialised;
3851 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003852
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05003853 if (_CURSES_PAIR_NUMBER_FUNC(pair_number, &f, &b)==ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003854 PyErr_SetString(PyCursesError,
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003855 "Argument 1 was out of range. (0..COLOR_PAIRS-1)");
Victor Stinner26486ea2010-05-15 22:23:53 +00003856 return NULL;
3857 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003858
Victor Stinner26486ea2010-05-15 22:23:53 +00003859 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003860}
3861
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003862/*[clinic input]
3863_curses.pair_number
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003864
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003865 attr: int
3866 /
3867
3868Return the number of the color-pair set by the specified attribute value.
3869
3870color_pair() is the counterpart to this function.
3871[clinic start generated code]*/
3872
3873static PyObject *
3874_curses_pair_number_impl(PyObject *module, int attr)
3875/*[clinic end generated code: output=85bce7d65c0aa3f4 input=d478548e33f5e61a]*/
3876{
Victor Stinner26486ea2010-05-15 22:23:53 +00003877 PyCursesInitialised;
3878 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003879
Serhiy Storchaka1470edd2021-01-03 22:51:11 +02003880 return PyLong_FromLong(PAIR_NUMBER(attr));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003881}
3882
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003883/*[clinic input]
3884_curses.putp
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003885
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003886 string: str(accept={robuffer})
3887 /
3888
3889Emit the value of a specified terminfo capability for the current terminal.
3890
3891Note that the output of putp() always goes to standard output.
3892[clinic start generated code]*/
3893
3894static PyObject *
3895_curses_putp_impl(PyObject *module, const char *string)
3896/*[clinic end generated code: output=e98081d1b8eb5816 input=1601faa828b44cb3]*/
3897{
3898 return PyCursesCheckERR(putp(string), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003899}
3900
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003901/*[clinic input]
3902_curses.qiflush
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003903
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003904 flag: bool(accept={int}) = True
3905 If false, the effect is the same as calling noqiflush().
3906 /
3907
3908Enable queue flushing.
3909
3910If queue flushing is enabled, all output in the display driver queue
3911will be flushed when the INTR, QUIT and SUSP characters are read.
3912[clinic start generated code]*/
3913
3914static PyObject *
3915_curses_qiflush_impl(PyObject *module, int flag)
3916/*[clinic end generated code: output=9167e862f760ea30 input=e9e4a389946a0dbc]*/
3917{
Victor Stinner26486ea2010-05-15 22:23:53 +00003918 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003919
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003920 if (flag) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003921 qiflush();
Victor Stinner26486ea2010-05-15 22:23:53 +00003922 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003923 else {
3924 noqiflush();
3925 }
3926 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003927}
3928
Guido van Rossumd8faa362007-04-27 19:54:29 +00003929/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
3930 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00003931#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003932static int
3933update_lines_cols(void)
3934{
Victor Stinner26486ea2010-05-15 22:23:53 +00003935 PyObject *o;
3936 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003937 _Py_IDENTIFIER(LINES);
3938 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003939
Victor Stinner26486ea2010-05-15 22:23:53 +00003940 if (!m)
3941 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003942
Victor Stinner26486ea2010-05-15 22:23:53 +00003943 o = PyLong_FromLong(LINES);
3944 if (!o) {
3945 Py_DECREF(m);
3946 return 0;
3947 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003948 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003949 Py_DECREF(m);
3950 Py_DECREF(o);
3951 return 0;
3952 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003953 /* PyId_LINES.object will be initialized here. */
Victor Stinner4804b5b2020-05-12 01:43:38 +02003954 if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_LINES), o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003955 Py_DECREF(m);
3956 Py_DECREF(o);
3957 return 0;
3958 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003959 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00003960 o = PyLong_FromLong(COLS);
3961 if (!o) {
3962 Py_DECREF(m);
3963 return 0;
3964 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02003965 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003966 Py_DECREF(m);
3967 Py_DECREF(o);
3968 return 0;
3969 }
Victor Stinner4804b5b2020-05-12 01:43:38 +02003970 if (PyDict_SetItem(ModDict, _PyUnicode_FromId(&PyId_COLS), o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00003971 Py_DECREF(m);
3972 Py_DECREF(o);
3973 return 0;
3974 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003975 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003976 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00003977 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003978}
Steve Dowerd2bc3892015-04-15 18:06:05 -04003979
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003980/*[clinic input]
Zackery Spytz2bc34342019-11-17 10:10:13 -07003981_curses.update_lines_cols
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003982
3983[clinic start generated code]*/
3984
Zackery Spytz2bc34342019-11-17 10:10:13 -07003985static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003986_curses_update_lines_cols_impl(PyObject *module)
Zackery Spytz2bc34342019-11-17 10:10:13 -07003987/*[clinic end generated code: output=423f2b1e63ed0f75 input=5f065ab7a28a5d90]*/
Steve Dowerd2bc3892015-04-15 18:06:05 -04003988{
Zackery Spytz2bc34342019-11-17 10:10:13 -07003989 if (!update_lines_cols()) {
3990 return NULL;
3991 }
3992 Py_RETURN_NONE;
Steve Dowerd2bc3892015-04-15 18:06:05 -04003993}
3994
Benjamin Petersonfea6a942008-07-02 16:11:42 +00003995#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00003996
Serhiy Storchakab00854c2018-05-10 11:27:23 +03003997/*[clinic input]
3998_curses.raw
3999
4000 flag: bool(accept={int}) = True
4001 If false, the effect is the same as calling noraw().
4002 /
4003
4004Enter raw mode.
4005
4006In raw mode, normal line buffering and processing of interrupt, quit,
4007suspend, and flow control keys are turned off; characters are presented to
4008curses input functions one by one.
4009[clinic start generated code]*/
4010
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004011static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004012_curses_raw_impl(PyObject *module, int flag)
4013/*[clinic end generated code: output=a750e4b342be015b input=e36d8db27832b848]*/
4014NoArgOrFlagNoReturnFunctionBody(raw, flag)
4015
4016/*[clinic input]
4017_curses.reset_prog_mode
4018
4019Restore the terminal to "program" mode, as previously saved by def_prog_mode().
4020[clinic start generated code]*/
4021
4022static PyObject *
4023_curses_reset_prog_mode_impl(PyObject *module)
4024/*[clinic end generated code: output=15eb765abf0b6575 input=3d82bea2b3243471]*/
4025NoArgNoReturnFunctionBody(reset_prog_mode)
4026
4027/*[clinic input]
4028_curses.reset_shell_mode
4029
4030Restore the terminal to "shell" mode, as previously saved by def_shell_mode().
4031[clinic start generated code]*/
4032
4033static PyObject *
4034_curses_reset_shell_mode_impl(PyObject *module)
4035/*[clinic end generated code: output=0238de2962090d33 input=1c738fa64bd1a24f]*/
4036NoArgNoReturnFunctionBody(reset_shell_mode)
4037
4038/*[clinic input]
4039_curses.resetty
4040
4041Restore terminal mode.
4042[clinic start generated code]*/
4043
4044static PyObject *
4045_curses_resetty_impl(PyObject *module)
4046/*[clinic end generated code: output=ff4b448e80a7cd63 input=940493de03624bb0]*/
4047NoArgNoReturnFunctionBody(resetty)
4048
4049#ifdef HAVE_CURSES_RESIZETERM
4050/*[clinic input]
4051_curses.resizeterm
4052
4053 nlines: int
4054 Height.
4055 ncols: int
4056 Width.
4057 /
4058
4059Resize the standard and current windows to the specified dimensions.
4060
4061Adjusts other bookkeeping data used by the curses library that record the
4062window dimensions (in particular the SIGWINCH handler).
4063[clinic start generated code]*/
4064
4065static PyObject *
4066_curses_resizeterm_impl(PyObject *module, int nlines, int ncols)
4067/*[clinic end generated code: output=56d6bcc5194ad055 input=0fca02ebad5ffa82]*/
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004068{
Victor Stinner26486ea2010-05-15 22:23:53 +00004069 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004070
Victor Stinner26486ea2010-05-15 22:23:53 +00004071 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004072
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004073 result = PyCursesCheckERR(resizeterm(nlines, ncols), "resizeterm");
Victor Stinner26486ea2010-05-15 22:23:53 +00004074 if (!result)
4075 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004076 if (!update_lines_cols()) {
4077 Py_DECREF(result);
Victor Stinner26486ea2010-05-15 22:23:53 +00004078 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004079 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004080 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004081}
4082
4083#endif
4084
4085#ifdef HAVE_CURSES_RESIZE_TERM
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004086/*[clinic input]
4087_curses.resize_term
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004088
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004089 nlines: int
4090 Height.
4091 ncols: int
4092 Width.
4093 /
4094
4095Backend function used by resizeterm(), performing most of the work.
4096
4097When resizing the windows, resize_term() blank-fills the areas that are
4098extended. The calling application should fill in these areas with appropriate
4099data. The resize_term() function attempts to resize all windows. However,
4100due to the calling convention of pads, it is not possible to resize these
4101without additional interaction with the application.
4102[clinic start generated code]*/
4103
4104static PyObject *
4105_curses_resize_term_impl(PyObject *module, int nlines, int ncols)
4106/*[clinic end generated code: output=9e26d8b9ea311ed2 input=2197edd05b049ed4]*/
4107{
Victor Stinner26486ea2010-05-15 22:23:53 +00004108 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109
Victor Stinner26486ea2010-05-15 22:23:53 +00004110 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004111
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004112 result = PyCursesCheckERR(resize_term(nlines, ncols), "resize_term");
Victor Stinner26486ea2010-05-15 22:23:53 +00004113 if (!result)
4114 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004115 if (!update_lines_cols()) {
4116 Py_DECREF(result);
Victor Stinner26486ea2010-05-15 22:23:53 +00004117 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004118 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004119 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004120}
4121#endif /* HAVE_CURSES_RESIZE_TERM */
4122
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004123/*[clinic input]
4124_curses.savetty
4125
4126Save terminal mode.
4127[clinic start generated code]*/
4128
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004129static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004130_curses_savetty_impl(PyObject *module)
4131/*[clinic end generated code: output=6babc49f12b42199 input=fce6b2b7d2200102]*/
4132NoArgNoReturnFunctionBody(savetty)
4133
4134#ifdef getsyx
4135/*[clinic input]
4136_curses.setsyx
4137
4138 y: int
4139 Y-coordinate.
4140 x: int
4141 X-coordinate.
4142 /
4143
4144Set the virtual screen cursor.
4145
4146If y and x are both -1, then leaveok is set.
4147[clinic start generated code]*/
4148
4149static PyObject *
4150_curses_setsyx_impl(PyObject *module, int y, int x)
4151/*[clinic end generated code: output=23dcf753511a2464 input=fa7f2b208e10a557]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004152{
Victor Stinner26486ea2010-05-15 22:23:53 +00004153 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004154
Victor Stinner26486ea2010-05-15 22:23:53 +00004155 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004156
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004157 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004158}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004159#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00004160
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004161/*[clinic input]
4162_curses.start_color
4163
4164Initializes eight basic colors and global variables COLORS and COLOR_PAIRS.
4165
4166Must be called if the programmer wants to use colors, and before any other
4167color manipulation routine is called. It is good practice to call this
4168routine right after initscr().
4169
4170It also restores the colors on the terminal to the values they had when the
4171terminal was just turned on.
4172[clinic start generated code]*/
4173
Guido van Rossumf6971e21994-08-30 12:25:20 +00004174static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004175_curses_start_color_impl(PyObject *module)
4176/*[clinic end generated code: output=8b772b41d8090ede input=0ca0ecb2b77e1a12]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00004177{
Victor Stinner26486ea2010-05-15 22:23:53 +00004178 int code;
4179 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004180
Victor Stinner26486ea2010-05-15 22:23:53 +00004181 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004182
Victor Stinner26486ea2010-05-15 22:23:53 +00004183 code = start_color();
4184 if (code != ERR) {
4185 initialisedcolors = TRUE;
4186 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02004187 if (c == NULL)
4188 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004189 if (PyDict_SetItemString(ModDict, "COLORS", c) < 0) {
4190 Py_DECREF(c);
4191 return NULL;
4192 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004193 Py_DECREF(c);
4194 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02004195 if (cp == NULL)
4196 return NULL;
Zackery Spytz2bc34342019-11-17 10:10:13 -07004197 if (PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp) < 0) {
4198 Py_DECREF(cp);
4199 return NULL;
4200 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004201 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004202 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004203 } else {
4204 PyErr_SetString(PyCursesError, "start_color() returned ERR");
4205 return NULL;
4206 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004207}
4208
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004209/*[clinic input]
4210_curses.termattrs
4211
4212Return a logical OR of all video attributes supported by the terminal.
4213[clinic start generated code]*/
4214
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004215static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004216_curses_termattrs_impl(PyObject *module)
4217/*[clinic end generated code: output=b06f437fce1b6fc4 input=0559882a04f84d1d]*/
4218NoArgReturnIntFunctionBody(termattrs)
4219
4220/*[clinic input]
4221_curses.termname
4222
4223Return the value of the environment variable TERM, truncated to 14 characters.
4224[clinic start generated code]*/
4225
4226static PyObject *
4227_curses_termname_impl(PyObject *module)
4228/*[clinic end generated code: output=96375577ebbd67fd input=33c08d000944f33f]*/
4229NoArgReturnStringFunctionBody(termname)
4230
4231/*[clinic input]
4232_curses.tigetflag
4233
4234 capname: str
4235 The terminfo capability name.
4236 /
4237
4238Return the value of the Boolean capability.
4239
4240The value -1 is returned if capname is not a Boolean capability, or 0 if
4241it is canceled or absent from the terminal description.
4242[clinic start generated code]*/
4243
4244static PyObject *
4245_curses_tigetflag_impl(PyObject *module, const char *capname)
4246/*[clinic end generated code: output=8853c0e55542195b input=b0787af9e3e9a6ce]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004247{
Victor Stinner26486ea2010-05-15 22:23:53 +00004248 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004249
Xiang Zhang44742e92018-06-23 12:29:30 +08004250 return PyLong_FromLong( (long) tigetflag( (char *)capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004251}
4252
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004253/*[clinic input]
4254_curses.tigetnum
4255
4256 capname: str
4257 The terminfo capability name.
4258 /
4259
4260Return the value of the numeric capability.
4261
4262The value -2 is returned if capname is not a numeric capability, or -1 if
4263it is canceled or absent from the terminal description.
4264[clinic start generated code]*/
4265
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004266static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004267_curses_tigetnum_impl(PyObject *module, const char *capname)
4268/*[clinic end generated code: output=46f8b0a1b5dff42f input=5cdf2f410b109720]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004269{
Victor Stinner26486ea2010-05-15 22:23:53 +00004270 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004271
Xiang Zhang44742e92018-06-23 12:29:30 +08004272 return PyLong_FromLong( (long) tigetnum( (char *)capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004273}
4274
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004275/*[clinic input]
4276_curses.tigetstr
4277
4278 capname: str
4279 The terminfo capability name.
4280 /
4281
4282Return the value of the string capability.
4283
4284None is returned if capname is not a string capability, or is canceled or
4285absent from the terminal description.
4286[clinic start generated code]*/
4287
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004288static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004289_curses_tigetstr_impl(PyObject *module, const char *capname)
4290/*[clinic end generated code: output=f22b576ad60248f3 input=36644df25c73c0a7]*/
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004291{
Victor Stinner26486ea2010-05-15 22:23:53 +00004292 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004293
Xiang Zhang44742e92018-06-23 12:29:30 +08004294 capname = tigetstr( (char *)capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02004295 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004296 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004297 }
4298 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004299}
4300
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004301/*[clinic input]
4302_curses.tparm
4303
4304 str: str(accept={robuffer})
4305 Parameterized byte string obtained from the terminfo database.
4306 i1: int = 0
4307 i2: int = 0
4308 i3: int = 0
4309 i4: int = 0
4310 i5: int = 0
4311 i6: int = 0
4312 i7: int = 0
4313 i8: int = 0
4314 i9: int = 0
4315 /
4316
4317Instantiate the specified byte string with the supplied parameters.
4318[clinic start generated code]*/
4319
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00004320static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004321_curses_tparm_impl(PyObject *module, const char *str, int i1, int i2, int i3,
4322 int i4, int i5, int i6, int i7, int i8, int i9)
4323/*[clinic end generated code: output=599f62b615c667ff input=5e30b15786f032aa]*/
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004324{
Victor Stinner26486ea2010-05-15 22:23:53 +00004325 char* result = NULL;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004326
Victor Stinner26486ea2010-05-15 22:23:53 +00004327 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004328
Xiang Zhang44742e92018-06-23 12:29:30 +08004329 result = tparm((char *)str,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Victor Stinner26486ea2010-05-15 22:23:53 +00004330 if (!result) {
4331 PyErr_SetString(PyCursesError, "tparm() returned NULL");
4332 return NULL;
4333 }
Michael W. Hudson21007982002-11-21 14:17:51 +00004334
Victor Stinner26486ea2010-05-15 22:23:53 +00004335 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004336}
4337
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004338#ifdef HAVE_CURSES_TYPEAHEAD
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004339/*[clinic input]
4340_curses.typeahead
4341
4342 fd: int
4343 File descriptor.
4344 /
4345
4346Specify that the file descriptor fd be used for typeahead checking.
4347
4348If fd is -1, then no typeahead checking is done.
4349[clinic start generated code]*/
4350
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00004351static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004352_curses_typeahead_impl(PyObject *module, int fd)
4353/*[clinic end generated code: output=084bb649d7066583 input=f2968d8e1805051b]*/
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004354{
Victor Stinner26486ea2010-05-15 22:23:53 +00004355 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004356
Victor Stinner26486ea2010-05-15 22:23:53 +00004357 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004358}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004359#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004360
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004361/*[clinic input]
4362_curses.unctrl
4363
4364 ch: object
4365 /
4366
4367Return a string which is a printable representation of the character ch.
4368
4369Control characters are displayed as a caret followed by the character,
4370for example as ^C. Printing characters are left as they are.
4371[clinic start generated code]*/
4372
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00004373static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004374_curses_unctrl(PyObject *module, PyObject *ch)
4375/*[clinic end generated code: output=8e07fafc430c9434 input=cd1e35e16cd1ace4]*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004376{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004377 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004378
Victor Stinner26486ea2010-05-15 22:23:53 +00004379 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004380
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004381 if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00004382 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004383
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004384 return PyBytes_FromString(unctrl(ch_));
Guido van Rossumf6971e21994-08-30 12:25:20 +00004385}
4386
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004387/*[clinic input]
4388_curses.ungetch
4389
4390 ch: object
4391 /
4392
4393Push ch so the next getch() will return it.
4394[clinic start generated code]*/
4395
Guido van Rossumf6971e21994-08-30 12:25:20 +00004396static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004397_curses_ungetch(PyObject *module, PyObject *ch)
4398/*[clinic end generated code: output=9b19d8268376d887 input=6681e6ae4c42e5eb]*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00004399{
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004400 chtype ch_;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004401
Victor Stinner26486ea2010-05-15 22:23:53 +00004402 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004403
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004404 if (!PyCurses_ConvertToChtype(NULL, ch, &ch_))
Victor Stinner26486ea2010-05-15 22:23:53 +00004405 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01004406
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004407 return PyCursesCheckERR(ungetch(ch_), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00004408}
4409
Victor Stinner71e44cb2011-09-06 01:53:03 +02004410#ifdef HAVE_NCURSESW
4411/* Convert an object to a character (wchar_t):
4412
4413 - int
4414 - str of length 1
4415
4416 Return 1 on success, 0 on error. */
4417static int
4418PyCurses_ConvertToWchar_t(PyObject *obj,
4419 wchar_t *wch)
4420{
4421 if (PyUnicode_Check(obj)) {
4422 wchar_t buffer[2];
4423 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
4424 PyErr_Format(PyExc_TypeError,
Anthony Sottilec9345e32019-07-31 05:11:24 -07004425 "expect str of length 1 or int, "
Victor Stinner71e44cb2011-09-06 01:53:03 +02004426 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02004427 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02004428 return 0;
4429 }
4430 *wch = buffer[0];
4431 return 2;
4432 }
4433 else if (PyLong_CheckExact(obj)) {
4434 long value;
4435 int overflow;
4436 value = PyLong_AsLongAndOverflow(obj, &overflow);
4437 if (overflow) {
4438 PyErr_SetString(PyExc_OverflowError,
4439 "int doesn't fit in long");
4440 return 0;
4441 }
4442 *wch = (wchar_t)value;
4443 if ((long)*wch != value) {
4444 PyErr_Format(PyExc_OverflowError,
4445 "character doesn't fit in wchar_t");
4446 return 0;
4447 }
4448 return 1;
4449 }
4450 else {
4451 PyErr_Format(PyExc_TypeError,
Anthony Sottilec9345e32019-07-31 05:11:24 -07004452 "expect str of length 1 or int, got %s",
Victor Stinner71e44cb2011-09-06 01:53:03 +02004453 Py_TYPE(obj)->tp_name);
4454 return 0;
4455 }
4456}
4457
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004458/*[clinic input]
4459_curses.unget_wch
4460
4461 ch: object
4462 /
4463
4464Push ch so the next get_wch() will return it.
4465[clinic start generated code]*/
4466
Victor Stinner71e44cb2011-09-06 01:53:03 +02004467static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004468_curses_unget_wch(PyObject *module, PyObject *ch)
4469/*[clinic end generated code: output=1974c9fb01d37863 input=0d56dc65a46feebb]*/
Victor Stinner71e44cb2011-09-06 01:53:03 +02004470{
Victor Stinner71e44cb2011-09-06 01:53:03 +02004471 wchar_t wch;
4472
4473 PyCursesInitialised;
4474
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004475 if (!PyCurses_ConvertToWchar_t(ch, &wch))
Victor Stinner71e44cb2011-09-06 01:53:03 +02004476 return NULL;
4477 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
4478}
4479#endif
4480
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004481#ifdef HAVE_CURSES_USE_ENV
4482/*[clinic input]
4483_curses.use_env
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004484
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004485 flag: bool(accept={int})
4486 /
4487
4488Use environment variables LINES and COLUMNS.
4489
4490If used, this function should be called before initscr() or newterm() are
4491called.
4492
4493When flag is False, the values of lines and columns specified in the terminfo
4494database will be used, even if environment variables LINES and COLUMNS (used
4495by default) are set, or if curses is running in a window (in which case
4496default behavior would be to use the window size if LINES and COLUMNS are
4497not set).
4498[clinic start generated code]*/
4499
4500static PyObject *
4501_curses_use_env_impl(PyObject *module, int flag)
4502/*[clinic end generated code: output=b2c445e435c0b164 input=1778eb1e9151ea37]*/
4503{
Victor Stinner26486ea2010-05-15 22:23:53 +00004504 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004505 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004506}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02004507#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00004508
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004509#ifndef STRICT_SYSV_CURSES
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004510/*[clinic input]
4511_curses.use_default_colors
4512
4513Allow use of default values for colors on terminals supporting this feature.
4514
4515Use this to support transparency in your application. The default color
4516is assigned to the color number -1.
4517[clinic start generated code]*/
4518
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004519static PyObject *
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004520_curses_use_default_colors_impl(PyObject *module)
4521/*[clinic end generated code: output=a3b81ff71dd901be input=656844367470e8fc]*/
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004522{
Victor Stinner26486ea2010-05-15 22:23:53 +00004523 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004524
Victor Stinner26486ea2010-05-15 22:23:53 +00004525 PyCursesInitialised;
4526 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004527
Victor Stinner26486ea2010-05-15 22:23:53 +00004528 code = use_default_colors();
4529 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004530 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00004531 } else {
4532 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
4533 return NULL;
4534 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00004535}
4536#endif /* STRICT_SYSV_CURSES */
4537
Serhiy Storchakab232df92018-10-30 13:22:42 +02004538
4539#ifdef NCURSES_VERSION
4540
4541PyDoc_STRVAR(ncurses_version__doc__,
4542"curses.ncurses_version\n\
4543\n\
4544Ncurses version information as a named tuple.");
4545
4546static PyTypeObject NcursesVersionType;
4547
4548static PyStructSequence_Field ncurses_version_fields[] = {
4549 {"major", "Major release number"},
4550 {"minor", "Minor release number"},
4551 {"patch", "Patch release number"},
4552 {0}
4553};
4554
4555static PyStructSequence_Desc ncurses_version_desc = {
4556 "curses.ncurses_version", /* name */
4557 ncurses_version__doc__, /* doc */
4558 ncurses_version_fields, /* fields */
4559 3
4560};
4561
4562static PyObject *
4563make_ncurses_version(void)
4564{
4565 PyObject *ncurses_version;
4566 int pos = 0;
4567
4568 ncurses_version = PyStructSequence_New(&NcursesVersionType);
4569 if (ncurses_version == NULL) {
4570 return NULL;
4571 }
4572
4573#define SetIntItem(flag) \
4574 PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \
4575 if (PyErr_Occurred()) { \
4576 Py_CLEAR(ncurses_version); \
4577 return NULL; \
4578 }
4579
4580 SetIntItem(NCURSES_VERSION_MAJOR)
4581 SetIntItem(NCURSES_VERSION_MINOR)
4582 SetIntItem(NCURSES_VERSION_PATCH)
4583#undef SetIntItem
4584
4585 return ncurses_version;
4586}
4587
4588#endif /* NCURSES_VERSION */
4589
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05004590/*[clinic input]
4591_curses.has_extended_color_support
4592
4593Return True if the module supports extended colors; otherwise, return False.
4594
4595Extended color support allows more than 256 color-pairs for terminals
4596that support more than 16 colors (e.g. xterm-256color).
4597[clinic start generated code]*/
4598
4599static PyObject *
4600_curses_has_extended_color_support_impl(PyObject *module)
4601/*[clinic end generated code: output=68f1be2b57d92e22 input=4b905f046e35ee9f]*/
4602{
4603 return PyBool_FromLong(_NCURSES_EXTENDED_COLOR_FUNCS);
4604}
Serhiy Storchakab232df92018-10-30 13:22:42 +02004605
Guido van Rossumf6971e21994-08-30 12:25:20 +00004606/* List of functions defined in the module */
4607
4608static PyMethodDef PyCurses_methods[] = {
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004609 _CURSES_BAUDRATE_METHODDEF
4610 _CURSES_BEEP_METHODDEF
4611 _CURSES_CAN_CHANGE_COLOR_METHODDEF
4612 _CURSES_CBREAK_METHODDEF
4613 _CURSES_COLOR_CONTENT_METHODDEF
4614 _CURSES_COLOR_PAIR_METHODDEF
4615 _CURSES_CURS_SET_METHODDEF
4616 _CURSES_DEF_PROG_MODE_METHODDEF
4617 _CURSES_DEF_SHELL_MODE_METHODDEF
4618 _CURSES_DELAY_OUTPUT_METHODDEF
4619 _CURSES_DOUPDATE_METHODDEF
4620 _CURSES_ECHO_METHODDEF
4621 _CURSES_ENDWIN_METHODDEF
4622 _CURSES_ERASECHAR_METHODDEF
4623 _CURSES_FILTER_METHODDEF
4624 _CURSES_FLASH_METHODDEF
4625 _CURSES_FLUSHINP_METHODDEF
4626 _CURSES_GETMOUSE_METHODDEF
4627 _CURSES_UNGETMOUSE_METHODDEF
4628 _CURSES_GETSYX_METHODDEF
4629 _CURSES_GETWIN_METHODDEF
4630 _CURSES_HAS_COLORS_METHODDEF
Hans Petter Janssonda4e09f2020-08-03 22:51:33 -05004631 _CURSES_HAS_EXTENDED_COLOR_SUPPORT_METHODDEF
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004632 _CURSES_HAS_IC_METHODDEF
4633 _CURSES_HAS_IL_METHODDEF
4634 _CURSES_HAS_KEY_METHODDEF
4635 _CURSES_HALFDELAY_METHODDEF
4636 _CURSES_INIT_COLOR_METHODDEF
4637 _CURSES_INIT_PAIR_METHODDEF
4638 _CURSES_INITSCR_METHODDEF
4639 _CURSES_INTRFLUSH_METHODDEF
4640 _CURSES_ISENDWIN_METHODDEF
4641 _CURSES_IS_TERM_RESIZED_METHODDEF
4642 _CURSES_KEYNAME_METHODDEF
4643 _CURSES_KILLCHAR_METHODDEF
4644 _CURSES_LONGNAME_METHODDEF
4645 _CURSES_META_METHODDEF
4646 _CURSES_MOUSEINTERVAL_METHODDEF
4647 _CURSES_MOUSEMASK_METHODDEF
4648 _CURSES_NAPMS_METHODDEF
4649 _CURSES_NEWPAD_METHODDEF
4650 _CURSES_NEWWIN_METHODDEF
4651 _CURSES_NL_METHODDEF
4652 _CURSES_NOCBREAK_METHODDEF
4653 _CURSES_NOECHO_METHODDEF
4654 _CURSES_NONL_METHODDEF
4655 _CURSES_NOQIFLUSH_METHODDEF
4656 _CURSES_NORAW_METHODDEF
4657 _CURSES_PAIR_CONTENT_METHODDEF
4658 _CURSES_PAIR_NUMBER_METHODDEF
4659 _CURSES_PUTP_METHODDEF
4660 _CURSES_QIFLUSH_METHODDEF
4661 _CURSES_RAW_METHODDEF
4662 _CURSES_RESET_PROG_MODE_METHODDEF
4663 _CURSES_RESET_SHELL_MODE_METHODDEF
4664 _CURSES_RESETTY_METHODDEF
4665 _CURSES_RESIZETERM_METHODDEF
4666 _CURSES_RESIZE_TERM_METHODDEF
4667 _CURSES_SAVETTY_METHODDEF
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03004668#if defined(NCURSES_EXT_FUNCS) && NCURSES_EXT_FUNCS >= 20081102
Anthony Sottileb32cb972019-10-31 02:13:48 -07004669 _CURSES_GET_ESCDELAY_METHODDEF
4670 _CURSES_SET_ESCDELAY_METHODDEF
Batuhan Taşkaya4991cf42020-03-03 05:00:10 +03004671#endif
Anthony Sottileb32cb972019-10-31 02:13:48 -07004672 _CURSES_GET_TABSIZE_METHODDEF
4673 _CURSES_SET_TABSIZE_METHODDEF
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004674 _CURSES_SETSYX_METHODDEF
4675 _CURSES_SETUPTERM_METHODDEF
4676 _CURSES_START_COLOR_METHODDEF
4677 _CURSES_TERMATTRS_METHODDEF
4678 _CURSES_TERMNAME_METHODDEF
4679 _CURSES_TIGETFLAG_METHODDEF
4680 _CURSES_TIGETNUM_METHODDEF
4681 _CURSES_TIGETSTR_METHODDEF
4682 _CURSES_TPARM_METHODDEF
4683 _CURSES_TYPEAHEAD_METHODDEF
4684 _CURSES_UNCTRL_METHODDEF
4685 _CURSES_UNGETCH_METHODDEF
4686 _CURSES_UPDATE_LINES_COLS_METHODDEF
4687 _CURSES_UNGET_WCH_METHODDEF
4688 _CURSES_USE_ENV_METHODDEF
4689 _CURSES_USE_DEFAULT_COLORS_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00004690 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00004691};
4692
4693/* Initialization function for the module */
4694
Martin v. Löwis1a214512008-06-11 05:26:20 +00004695
4696static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00004697 PyModuleDef_HEAD_INIT,
4698 "_curses",
4699 NULL,
4700 -1,
4701 PyCurses_methods,
4702 NULL,
4703 NULL,
4704 NULL,
4705 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00004706};
4707
Mark Hammondfe51c6d2002-08-02 02:27:13 +00004708PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00004709PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00004710{
Victor Stinner26486ea2010-05-15 22:23:53 +00004711 PyObject *m, *d, *v, *c_api_object;
4712 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00004713
Victor Stinner26486ea2010-05-15 22:23:53 +00004714 /* Initialize object type */
4715 if (PyType_Ready(&PyCursesWindow_Type) < 0)
4716 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00004717
Victor Stinner26486ea2010-05-15 22:23:53 +00004718 /* Initialize the C API pointer array */
4719 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
4720 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
4721 PyCurses_API[2] = (void *)func_PyCursesInitialised;
4722 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004723
Victor Stinner26486ea2010-05-15 22:23:53 +00004724 /* Create the module and add the functions */
4725 m = PyModule_Create(&_cursesmodule);
4726 if (m == NULL)
4727 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004728
Victor Stinner26486ea2010-05-15 22:23:53 +00004729 /* Add some symbolic constants to the module */
4730 d = PyModule_GetDict(m);
4731 if (d == NULL)
4732 return NULL;
4733 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00004734
Victor Stinner26486ea2010-05-15 22:23:53 +00004735 /* Add a capsule for the C API */
4736 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
4737 PyDict_SetItemString(d, "_C_API", c_api_object);
4738 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00004739
Victor Stinner26486ea2010-05-15 22:23:53 +00004740 /* For exception curses.error */
4741 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
4742 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00004743
Victor Stinner26486ea2010-05-15 22:23:53 +00004744 /* Make the version available */
4745 v = PyBytes_FromString(PyCursesVersion);
4746 PyDict_SetItemString(d, "version", v);
4747 PyDict_SetItemString(d, "__version__", v);
4748 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00004749
Serhiy Storchakab232df92018-10-30 13:22:42 +02004750#ifdef NCURSES_VERSION
4751 /* ncurses_version */
4752 if (NcursesVersionType.tp_name == NULL) {
4753 if (PyStructSequence_InitType2(&NcursesVersionType,
4754 &ncurses_version_desc) < 0)
4755 return NULL;
4756 }
4757 v = make_ncurses_version();
4758 if (v == NULL) {
4759 return NULL;
4760 }
4761 PyDict_SetItemString(d, "ncurses_version", v);
4762 Py_DECREF(v);
4763
4764 /* prevent user from creating new instances */
4765 NcursesVersionType.tp_init = NULL;
4766 NcursesVersionType.tp_new = NULL;
4767 if (PyDict_DelItemString(NcursesVersionType.tp_dict, "__new__") < 0 &&
4768 PyErr_ExceptionMatches(PyExc_KeyError))
4769 {
4770 PyErr_Clear();
4771 }
4772#endif /* NCURSES_VERSION */
4773
Victor Stinner26486ea2010-05-15 22:23:53 +00004774 SetDictInt("ERR", ERR);
4775 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00004776
Victor Stinner26486ea2010-05-15 22:23:53 +00004777 /* Here are some attributes you can add to chars to print */
4778
4779 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
4780 SetDictInt("A_NORMAL", A_NORMAL);
4781 SetDictInt("A_STANDOUT", A_STANDOUT);
4782 SetDictInt("A_UNDERLINE", A_UNDERLINE);
4783 SetDictInt("A_REVERSE", A_REVERSE);
4784 SetDictInt("A_BLINK", A_BLINK);
4785 SetDictInt("A_DIM", A_DIM);
4786 SetDictInt("A_BOLD", A_BOLD);
4787 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinner26486ea2010-05-15 22:23:53 +00004788 SetDictInt("A_INVIS", A_INVIS);
Victor Stinner26486ea2010-05-15 22:23:53 +00004789 SetDictInt("A_PROTECT", A_PROTECT);
4790 SetDictInt("A_CHARTEXT", A_CHARTEXT);
4791 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004792
Victor Stinner26486ea2010-05-15 22:23:53 +00004793 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004794#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00004795 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004796#endif
4797#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00004798 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004799#endif
4800#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00004801 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004802#endif
4803#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00004804 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004805#endif
4806#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00004807 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00004808#endif
4809#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00004810 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00004811#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004812
Xiang Zhang116dd5e2017-06-16 11:20:07 +08004813 /* ncurses extension */
4814#ifdef A_ITALIC
4815 SetDictInt("A_ITALIC", A_ITALIC);
4816#endif
4817
Victor Stinner26486ea2010-05-15 22:23:53 +00004818 SetDictInt("COLOR_BLACK", COLOR_BLACK);
4819 SetDictInt("COLOR_RED", COLOR_RED);
4820 SetDictInt("COLOR_GREEN", COLOR_GREEN);
4821 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
4822 SetDictInt("COLOR_BLUE", COLOR_BLUE);
4823 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
4824 SetDictInt("COLOR_CYAN", COLOR_CYAN);
4825 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00004826
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004827#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00004828 /* Mouse-related constants */
4829 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
4830 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
4831 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
4832 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
4833 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004834
Victor Stinner26486ea2010-05-15 22:23:53 +00004835 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
4836 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
4837 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
4838 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
4839 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004840
Victor Stinner26486ea2010-05-15 22:23:53 +00004841 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
4842 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
4843 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
4844 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
4845 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004846
Victor Stinner26486ea2010-05-15 22:23:53 +00004847 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
4848 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
4849 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
4850 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
4851 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004852
Victor Stinner26486ea2010-05-15 22:23:53 +00004853 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
4854 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
4855 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004856
Victor Stinner26486ea2010-05-15 22:23:53 +00004857 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
4858 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00004859#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00004860 /* Now set everything up for KEY_ variables */
4861 {
4862 int key;
4863 char *key_n;
4864 char *key_n2;
Victor Stinner26486ea2010-05-15 22:23:53 +00004865 for (key=KEY_MIN;key < KEY_MAX; key++) {
4866 key_n = (char *)keyname(key);
4867 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
4868 continue;
4869 if (strncmp(key_n,"KEY_F(",6)==0) {
4870 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02004871 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00004872 if (!key_n2) {
4873 PyErr_NoMemory();
4874 break;
4875 }
4876 p1 = key_n;
4877 p2 = key_n2;
4878 while (*p1) {
4879 if (*p1 != '(' && *p1 != ')') {
4880 *p2 = *p1;
4881 p2++;
4882 }
4883 p1++;
4884 }
4885 *p2 = (char)0;
4886 } else
4887 key_n2 = key_n;
4888 SetDictInt(key_n2,key);
4889 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02004890 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00004891 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004892 SetDictInt("KEY_MIN", KEY_MIN);
4893 SetDictInt("KEY_MAX", KEY_MAX);
4894 }
Serhiy Storchakab00854c2018-05-10 11:27:23 +03004895
Dong-hee Na37fcbb62020-03-25 07:08:51 +09004896 if (PyModule_AddType(m, &PyCursesWindow_Type) < 0) {
4897 return NULL;
4898 }
Victor Stinner26486ea2010-05-15 22:23:53 +00004899 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00004900}