blob: d30bd1ab20f826dc955e2b09e65e27baff927cbd [file] [log] [blame]
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001/*
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002 * This is a curses module for Python.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004 * Based on prior work by Lance Ellinghaus and Oliver Andrich
5 * Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
6 * Cathedral City, California Republic, United States of America.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00007 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00008 * Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
9 * Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
10 *
Andrew M. Kuchling3adefcc2002-10-30 21:08:34 +000011 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000012 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this source file to use, copy, modify, merge, or publish it
15 * subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or in any new file that contains a substantial portion of
19 * this file.
20 *
21 * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF
22 * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
23 * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES
24 * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
25 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
27 * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL,
28 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
29 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR
30 * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR
31 * PERFORMANCE OF THIS SOFTWARE.
32 */
Guido van Rossumf6971e21994-08-30 12:25:20 +000033
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000034/*
35
Victor Stinner26486ea2010-05-15 22:23:53 +000036 A number of SysV or ncurses functions don't have wrappers yet; if you
37 need a given function, add it and send a patch. See
38 http://www.python.org/dev/patches/ for instructions on how to submit
39 patches to Python.
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000040
Victor Stinner26486ea2010-05-15 22:23:53 +000041 Here's a list of currently unsupported functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +000042
Victor Stinner26486ea2010-05-15 22:23:53 +000043 addchnstr addchstr color_set define_key
44 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
45 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
46 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
47 mvwinchnstr mvwinchstr mvwinnstr newterm
48 restartterm ripoffline scr_dump
49 scr_init scr_restore scr_set scrl set_curterm set_term setterm
50 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
51 vidattr vidputs waddchnstr waddchstr
52 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000053
Victor Stinner26486ea2010-05-15 22:23:53 +000054 Low-priority:
55 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
56 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
57 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000058
Victor Stinner26486ea2010-05-15 22:23:53 +000059 Menu extension (ncurses and probably SYSV):
60 current_item free_item free_menu item_count item_description
61 item_index item_init item_name item_opts item_opts_off
62 item_opts_on item_term item_userptr item_value item_visible
63 menu_back menu_driver menu_fore menu_format menu_grey
64 menu_init menu_items menu_mark menu_opts menu_opts_off
65 menu_opts_on menu_pad menu_pattern menu_request_by_name
66 menu_request_name menu_spacing menu_sub menu_term menu_userptr
67 menu_win new_item new_menu pos_menu_cursor post_menu
68 scale_menu set_current_item set_item_init set_item_opts
69 set_item_term set_item_userptr set_item_value set_menu_back
70 set_menu_fore set_menu_format set_menu_grey set_menu_init
71 set_menu_items set_menu_mark set_menu_opts set_menu_pad
72 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
73 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000074
Victor Stinner26486ea2010-05-15 22:23:53 +000075 Form extension (ncurses and probably SYSV):
76 current_field data_ahead data_behind dup_field
77 dynamic_fieldinfo field_arg field_back field_buffer
78 field_count field_fore field_index field_info field_init
79 field_just field_opts field_opts_off field_opts_on field_pad
80 field_status field_term field_type field_userptr form_driver
81 form_fields form_init form_opts form_opts_off form_opts_on
82 form_page form_request_by_name form_request_name form_sub
83 form_term form_userptr form_win free_field free_form
84 link_field link_fieldtype move_field new_field new_form
85 new_page pos_form_cursor post_form scale_form
86 set_current_field set_field_back set_field_buffer
87 set_field_fore set_field_init set_field_just set_field_opts
88 set_field_pad set_field_status set_field_term set_field_type
89 set_field_userptr set_fieldtype_arg set_fieldtype_choice
90 set_form_fields set_form_init set_form_opts set_form_page
91 set_form_sub set_form_term set_form_userptr set_form_win
92 set_max_field set_new_page unpost_form
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000093
94
Victor Stinner26486ea2010-05-15 22:23:53 +000095*/
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000098
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +000099char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000101/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Mark Dickinsone047cfa2010-05-11 17:57:09 +0000103#define PY_SSIZE_T_CLEAN
104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000106
Benjamin Petersonb173f782009-05-05 22:31:58 +0000107
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000108#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#define STRICT_SYSV_CURSES
110#endif
111
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000112#define CURSES_MODULE
113#include "py_curses.h"
114
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200115#if defined(HAVE_TERM_H) || defined(__sgi)
116/* For termname, longname, putp, tigetflag, tigetnum, tigetstr, tparm
117 which are not declared in SysV curses and for setupterm. */
Fred Drake0368bc42001-07-19 20:48:32 +0000118#include <term.h>
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200119/* Including <term.h> #defines many common symbols. */
120#undef lines
121#undef columns
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000122#endif
123
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100124#ifdef HAVE_LANGINFO_H
125#include <langinfo.h>
126#endif
127
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000128#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000129#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000130typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000131#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000132
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000133#if defined(_AIX)
134#define STRICT_SYSV_CURSES
135#endif
136
Larry Hastings61272b72014-01-07 12:41:53 -0800137/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800138module curses
Larry Hastingsc2047262014-01-25 20:43:29 -0800139class curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800140[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800141/*[clinic end generated code: output=da39a3ee5e6b4b0d input=88c860abdbb50e0c]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800142
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300143#include "clinic/_cursesmodule.c.h"
144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000147static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000148
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000149/* Tells whether setupterm() has been called to initialise terminfo. */
150static int initialised_setupterm = FALSE;
151
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000152/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000153static int initialised = FALSE;
154
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000155/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000156static int initialisedcolors = FALSE;
157
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100158static char *screen_encoding = NULL;
159
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000160/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000161#define PyCursesSetupTermCalled \
162 if (initialised_setupterm != TRUE) { \
163 PyErr_SetString(PyCursesError, \
164 "must call (at least) setupterm() first"); \
165 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000166
Victor Stinner26486ea2010-05-15 22:23:53 +0000167#define PyCursesInitialised \
168 if (initialised != TRUE) { \
169 PyErr_SetString(PyCursesError, \
170 "must call initscr() first"); \
171 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000172
Victor Stinner26486ea2010-05-15 22:23:53 +0000173#define PyCursesInitialisedColor \
174 if (initialisedcolors != TRUE) { \
175 PyErr_SetString(PyCursesError, \
176 "must call start_color() first"); \
177 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000178
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000179/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000180
Guido van Rossum85738471995-02-17 13:50:17 +0000181/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000183 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000184 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000185 */
186
187static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100188PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000189{
Victor Stinner26486ea2010-05-15 22:23:53 +0000190 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200191 Py_RETURN_NONE;
Guido van Rossum85738471995-02-17 13:50:17 +0000192 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000193 if (fname == NULL) {
194 PyErr_SetString(PyCursesError, catchall_ERR);
195 } else {
196 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
197 }
198 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000199 }
Guido van Rossum85738471995-02-17 13:50:17 +0000200}
201
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100202/* Convert an object to a byte (an integer of type chtype):
203
204 - int
205 - bytes of length 1
206 - str of length 1
207
208 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000209static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100210PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000211{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100212 long value;
213 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
214 value = (unsigned char)PyBytes_AsString(obj)[0];
215 }
216 else if (PyUnicode_Check(obj)) {
217 if (PyUnicode_GetLength(obj) != 1) {
218 PyErr_Format(PyExc_TypeError,
219 "expect bytes or str of length 1, or int, "
220 "got a str of length %zi",
221 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000222 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100223 }
224 value = PyUnicode_READ_CHAR(obj, 0);
225 if (128 < value) {
226 PyObject *bytes;
227 const char *encoding;
228 if (win)
229 encoding = win->encoding;
230 else
231 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300232 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100233 if (bytes == NULL)
234 return 0;
235 if (PyBytes_GET_SIZE(bytes) == 1)
236 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
237 else
238 value = -1;
239 Py_DECREF(bytes);
240 if (value < 0)
241 goto overflow;
242 }
243 }
244 else if (PyLong_CheckExact(obj)) {
245 int long_overflow;
246 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
247 if (long_overflow)
248 goto overflow;
249 }
250 else {
251 PyErr_Format(PyExc_TypeError,
252 "expect bytes or str of length 1, or int, got %s",
253 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000254 return 0;
255 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100256 *ch = (chtype)value;
257 if ((long)*ch != value)
258 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000259 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100260
261overflow:
262 PyErr_SetString(PyExc_OverflowError,
263 "byte doesn't fit in chtype");
264 return 0;
265}
266
267/* Convert an object to a byte (chtype) or a character (cchar_t):
268
269 - int
270 - bytes of length 1
271 - str of length 1
272
273 Return:
274
275 - 2 if obj is a character (written into *wch)
276 - 1 if obj is a byte (written into *ch)
277 - 0 on error: raise an exception */
278static int
279PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
280 chtype *ch
281#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200282 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100283#endif
284 )
285{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100286 long value;
287#ifdef HAVE_NCURSESW
288 wchar_t buffer[2];
289#endif
290
291 if (PyUnicode_Check(obj)) {
292#ifdef HAVE_NCURSESW
293 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
294 PyErr_Format(PyExc_TypeError,
295 "expect bytes or str of length 1, or int, "
296 "got a str of length %zi",
297 PyUnicode_GET_LENGTH(obj));
298 return 0;
299 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200300 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100301 return 2;
302#else
303 return PyCurses_ConvertToChtype(win, obj, ch);
304#endif
305 }
306 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
307 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100308 }
309 else if (PyLong_CheckExact(obj)) {
310 int overflow;
311 value = PyLong_AsLongAndOverflow(obj, &overflow);
312 if (overflow) {
313 PyErr_SetString(PyExc_OverflowError,
314 "int doesn't fit in long");
315 return 0;
316 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100317 }
318 else {
319 PyErr_Format(PyExc_TypeError,
320 "expect bytes or str of length 1, or int, got %s",
321 Py_TYPE(obj)->tp_name);
322 return 0;
323 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200324
325 *ch = (chtype)value;
326 if ((long)*ch != value) {
327 PyErr_Format(PyExc_OverflowError,
328 "byte doesn't fit in chtype");
329 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100330 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200331 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332}
333
334/* Convert an object to a byte string (char*) or a wide character string
335 (wchar_t*). Return:
336
337 - 2 if obj is a character string (written into *wch)
338 - 1 if obj is a byte string (written into *bytes)
339 - 0 on error: raise an exception */
340static int
341PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
342 PyObject **bytes, wchar_t **wstr)
343{
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300344 char *str;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100345 if (PyUnicode_Check(obj)) {
346#ifdef HAVE_NCURSESW
347 assert (wstr != NULL);
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300348
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100349 *wstr = PyUnicode_AsWideCharString(obj, NULL);
350 if (*wstr == NULL)
351 return 0;
352 return 2;
353#else
354 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300355 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100356 if (*bytes == NULL)
357 return 0;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300358 /* check for embedded null bytes */
359 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
360 return 0;
361 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100362 return 1;
363#endif
364 }
365 else if (PyBytes_Check(obj)) {
366 Py_INCREF(obj);
367 *bytes = obj;
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +0300368 /* check for embedded null bytes */
369 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
370 return 0;
371 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100372 return 1;
373 }
374
375 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
376 Py_TYPE(obj)->tp_name);
377 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000378}
379
Benjamin Peterson21896a32010-03-21 22:03:03 +0000380/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000381 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000382
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000383static int func_PyCursesSetupTermCalled(void)
384{
385 PyCursesSetupTermCalled;
386 return 1;
387}
388
389static int func_PyCursesInitialised(void)
390{
391 PyCursesInitialised;
392 return 1;
393}
394
395static int func_PyCursesInitialisedColor(void)
396{
397 PyCursesInitialisedColor;
398 return 1;
399}
400
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000401/*****************************************************************************
402 The Window Object
403******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000404
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000405/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000406
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407PyTypeObject PyCursesWindow_Type;
408
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000409/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000410
411 X - function name
412 TYPE - parameter Type
413 ERGSTR - format string for construction of the return value
414 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000415*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000416
Victor Stinner26486ea2010-05-15 22:23:53 +0000417#define Window_NoArgNoReturnFunction(X) \
418 static PyObject *PyCursesWindow_ ## X \
419 (PyCursesWindowObject *self, PyObject *args) \
420 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000421
Victor Stinner26486ea2010-05-15 22:23:53 +0000422#define Window_NoArgTrueFalseFunction(X) \
423 static PyObject * PyCursesWindow_ ## X \
424 (PyCursesWindowObject *self) \
425 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200426 if (X (self->win) == FALSE) { Py_RETURN_FALSE; } \
427 else { Py_RETURN_TRUE; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000428
Victor Stinner26486ea2010-05-15 22:23:53 +0000429#define Window_NoArgNoReturnVoidFunction(X) \
430 static PyObject * PyCursesWindow_ ## X \
431 (PyCursesWindowObject *self) \
432 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200433 X(self->win); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000434
Victor Stinner26486ea2010-05-15 22:23:53 +0000435#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
436 static PyObject * PyCursesWindow_ ## X \
437 (PyCursesWindowObject *self) \
438 { \
439 TYPE arg1, arg2; \
440 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
443 static PyObject * PyCursesWindow_ ## X \
444 (PyCursesWindowObject *self, PyObject *args) \
445 { \
446 TYPE arg1; \
447 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200448 X(self->win,arg1); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449
Victor Stinner26486ea2010-05-15 22:23:53 +0000450#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
451 static PyObject * PyCursesWindow_ ## X \
452 (PyCursesWindowObject *self, PyObject *args) \
453 { \
454 TYPE arg1; \
455 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
456 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000457
Victor Stinner26486ea2010-05-15 22:23:53 +0000458#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
459 static PyObject * PyCursesWindow_ ## X \
460 (PyCursesWindowObject *self, PyObject *args) \
461 { \
462 TYPE arg1, arg2; \
463 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
464 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000465
Guido van Rossumf6971e21994-08-30 12:25:20 +0000466/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000467
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000468Window_NoArgNoReturnFunction(untouchwin)
469Window_NoArgNoReturnFunction(touchwin)
470Window_NoArgNoReturnFunction(redrawwin)
471Window_NoArgNoReturnFunction(winsertln)
472Window_NoArgNoReturnFunction(werase)
473Window_NoArgNoReturnFunction(wdeleteln)
474
475Window_NoArgTrueFalseFunction(is_wintouched)
476
477Window_NoArgNoReturnVoidFunction(wsyncup)
478Window_NoArgNoReturnVoidFunction(wsyncdown)
479Window_NoArgNoReturnVoidFunction(wstandend)
480Window_NoArgNoReturnVoidFunction(wstandout)
481Window_NoArgNoReturnVoidFunction(wcursyncup)
482Window_NoArgNoReturnVoidFunction(wclrtoeol)
483Window_NoArgNoReturnVoidFunction(wclrtobot)
484Window_NoArgNoReturnVoidFunction(wclear)
485
486Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200487#ifdef HAVE_CURSES_IMMEDOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000488Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200489#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000490Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000491
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000492Window_NoArg2TupleReturnFunction(getyx, int, "ii")
493Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
494Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
495Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000496
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000497Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
498Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
499Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
500Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
501Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
502Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
503Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000504Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200505#ifdef HAVE_CURSES_SYNCOK
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000506Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
Serhiy Storchakabaac01e2017-10-31 13:56:44 +0200507#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000509Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
510Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
511Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000512#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000513Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000514#endif
515
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000516/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000517
Guido van Rossumf6971e21994-08-30 12:25:20 +0000518static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100519PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000520{
Victor Stinner26486ea2010-05-15 22:23:53 +0000521 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000522
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100523 if (encoding == NULL) {
524#if defined(MS_WINDOWS)
525 char *buffer[100];
526 UINT cp;
527 cp = GetConsoleOutputCP();
528 if (cp != 0) {
529 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
530 encoding = buffer;
531 }
532#elif defined(CODESET)
533 const char *codeset = nl_langinfo(CODESET);
534 if (codeset != NULL && codeset[0] != 0)
535 encoding = codeset;
536#endif
537 if (encoding == NULL)
538 encoding = "utf-8";
539 }
540
Victor Stinner26486ea2010-05-15 22:23:53 +0000541 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
542 if (wo == NULL) return NULL;
543 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200544 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100545 if (wo->encoding == NULL) {
546 Py_DECREF(wo);
547 PyErr_NoMemory();
548 return NULL;
549 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000550 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000551}
552
553static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000554PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000555{
Victor Stinner26486ea2010-05-15 22:23:53 +0000556 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100557 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200558 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000559 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000560}
561
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000562/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000563
Larry Hastings61272b72014-01-07 12:41:53 -0800564/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700565
566curses.window.addch
567
568 [
Larry Hastings31826802013-10-19 00:09:25 -0700569 y: int
570 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700571 x: int
572 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700573 ]
574
575 ch: object
576 Character to add.
577
578 [
579 attr: long
580 Attributes for the character.
581 ]
582 /
583
584Paint character ch at (y, x) with attributes attr.
585
586Paint character ch at (y, x) with attributes attr,
587overwriting any character previously painted at that location.
588By default, the character position and attributes are the
589current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800590[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700591
Larry Hastings31826802013-10-19 00:09:25 -0700592static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400593curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
594 int x, PyObject *ch, int group_right_1, long attr)
595/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700596{
597 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
598 int coordinates_group = group_left_1;
599 int attr_group = group_right_1;
600 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100601 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100602 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100603#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200604 wchar_t wstr[2];
605 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100606#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000608
Larry Hastings31826802013-10-19 00:09:25 -0700609 if (!attr_group)
610 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000611
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100612#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200613 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100614 if (type == 2) {
615 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200616 wstr[1] = L'\0';
617 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700618 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200619 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100620 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200621 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100622 }
623 }
624 else
625#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300626 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100627#endif
628 if (type == 1) {
629 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700630 if (coordinates_group)
631 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100632 else {
Larry Hastings31826802013-10-19 00:09:25 -0700633 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100634 }
635 }
636 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000637 return NULL;
638 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100639 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000640}
641
642static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000643PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000644{
Victor Stinner26486ea2010-05-15 22:23:53 +0000645 int rtn;
646 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100647 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500648 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100649#ifdef HAVE_NCURSESW
650 wchar_t *wstr = NULL;
651#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000652 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
653 long lattr;
654 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100655 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000656
Victor Stinner26486ea2010-05-15 22:23:53 +0000657 switch (PyTuple_Size(args)) {
658 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000660 return NULL;
661 break;
662 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 attr = lattr;
666 use_attr = TRUE;
667 break;
668 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000670 return NULL;
671 use_xy = TRUE;
672 break;
673 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100674 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000675 return NULL;
676 attr = lattr;
677 use_xy = use_attr = TRUE;
678 break;
679 default:
680 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
681 return NULL;
682 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100683#ifdef HAVE_NCURSESW
684 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
685#else
686 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
687#endif
688 if (strtype == 0)
689 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000690 if (use_attr == TRUE) {
691 attr_old = getattrs(self->win);
692 (void)wattrset(self->win,attr);
693 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100694#ifdef HAVE_NCURSESW
695 if (strtype == 2) {
696 funcname = "addwstr";
697 if (use_xy == TRUE)
698 rtn = mvwaddwstr(self->win,y,x,wstr);
699 else
700 rtn = waddwstr(self->win,wstr);
701 PyMem_Free(wstr);
702 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000703 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100704#endif
705 {
706 char *str = PyBytes_AS_STRING(bytesobj);
707 funcname = "addstr";
708 if (use_xy == TRUE)
709 rtn = mvwaddstr(self->win,y,x,str);
710 else
711 rtn = waddstr(self->win,str);
712 Py_DECREF(bytesobj);
713 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000714 if (use_attr == TRUE)
715 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100716 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000717}
Guido van Rossum85738471995-02-17 13:50:17 +0000718
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000719static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000720PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000721{
Victor Stinner26486ea2010-05-15 22:23:53 +0000722 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100723 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500724 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725#ifdef HAVE_NCURSESW
726 wchar_t *wstr = NULL;
727#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000728 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
729 long lattr;
730 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100731 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000732
Victor Stinner26486ea2010-05-15 22:23:53 +0000733 switch (PyTuple_Size(args)) {
734 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100735 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000736 return NULL;
737 break;
738 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 attr = lattr;
742 use_attr = TRUE;
743 break;
744 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100745 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000746 return NULL;
747 use_xy = TRUE;
748 break;
749 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100750 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000751 return NULL;
752 attr = lattr;
753 use_xy = use_attr = TRUE;
754 break;
755 default:
756 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
757 return NULL;
758 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100759#ifdef HAVE_NCURSESW
760 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
761#else
762 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
763#endif
764 if (strtype == 0)
765 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000766
Victor Stinner26486ea2010-05-15 22:23:53 +0000767 if (use_attr == TRUE) {
768 attr_old = getattrs(self->win);
769 (void)wattrset(self->win,attr);
770 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100771#ifdef HAVE_NCURSESW
772 if (strtype == 2) {
773 funcname = "addnwstr";
774 if (use_xy == TRUE)
775 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
776 else
777 rtn = waddnwstr(self->win,wstr,n);
778 PyMem_Free(wstr);
779 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000780 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100781#endif
782 {
783 char *str = PyBytes_AS_STRING(bytesobj);
784 funcname = "addnstr";
785 if (use_xy == TRUE)
786 rtn = mvwaddnstr(self->win,y,x,str,n);
787 else
788 rtn = waddnstr(self->win,str,n);
789 Py_DECREF(bytesobj);
790 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000791 if (use_attr == TRUE)
792 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100793 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000794}
795
796static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000797PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798{
Victor Stinner26486ea2010-05-15 22:23:53 +0000799 PyObject *temp;
800 chtype bkgd;
801 attr_t attr = A_NORMAL;
802 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803
Victor Stinner26486ea2010-05-15 22:23:53 +0000804 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000805 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000806 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
807 return NULL;
808 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000810 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
811 return NULL;
812 attr = lattr;
813 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000814 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000815 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
816 return NULL;
817 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100819 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000820 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000821
Victor Stinner26486ea2010-05-15 22:23:53 +0000822 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000823}
824
825static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000826PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
827{
Victor Stinner26486ea2010-05-15 22:23:53 +0000828 long lattr;
829 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
830 return NULL;
831 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000832}
833
834static PyObject *
835PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
836{
Victor Stinner26486ea2010-05-15 22:23:53 +0000837 long lattr;
838 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
839 return NULL;
840 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000841}
842
843static PyObject *
844PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
845{
Victor Stinner26486ea2010-05-15 22:23:53 +0000846 long lattr;
847 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
848 return NULL;
849 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000850}
851
852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854{
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 PyObject *temp;
856 chtype bkgd;
857 attr_t attr = A_NORMAL;
858 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000862 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
863 return NULL;
864 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
867 return NULL;
868 attr = lattr;
869 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
872 return NULL;
873 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100875 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000876 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877
Victor Stinner26486ea2010-05-15 22:23:53 +0000878 wbkgdset(self->win, bkgd | attr);
879 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000880}
881
882static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000883PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884{
Victor Stinner26486ea2010-05-15 22:23:53 +0000885 PyObject *temp[8];
886 chtype ch[8];
887 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000888
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 /* Clear the array of parameters */
890 for(i=0; i<8; i++) {
891 temp[i] = NULL;
892 ch[i] = 0;
893 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000894
Victor Stinner26486ea2010-05-15 22:23:53 +0000895 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
896 &temp[0], &temp[1], &temp[2], &temp[3],
897 &temp[4], &temp[5], &temp[6], &temp[7]))
898 return NULL;
899
900 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100901 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000902 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000903 }
904
905 wborder(self->win,
906 ch[0], ch[1], ch[2], ch[3],
907 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200908 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000909}
910
911static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000912PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000913{
Victor Stinner26486ea2010-05-15 22:23:53 +0000914 chtype ch1=0,ch2=0;
915 switch(PyTuple_Size(args)){
916 case 0: break;
917 default:
918 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
919 return NULL;
920 }
921 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200922 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000923}
924
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000925#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
926#define py_mvwdelch mvwdelch
927#else
928int py_mvwdelch(WINDOW *w, int y, int x)
929{
Victor Stinner26486ea2010-05-15 22:23:53 +0000930 mvwdelch(w,y,x);
931 /* On HP/UX, mvwdelch already returns. On other systems,
932 we may well run into this return statement. */
933 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000934}
935#endif
936
Guido van Rossumd8faa362007-04-27 19:54:29 +0000937/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
938
939static PyObject *
940PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
941{
Victor Stinner26486ea2010-05-15 22:23:53 +0000942 int rtn;
943 int x, y;
944 int num = -1;
945 short color;
946 attr_t attr = A_NORMAL;
947 long lattr;
948 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000949
Victor Stinner26486ea2010-05-15 22:23:53 +0000950 switch (PyTuple_Size(args)) {
951 case 1:
952 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
953 return NULL;
954 attr = lattr;
955 break;
956 case 2:
957 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
958 return NULL;
959 attr = lattr;
960 break;
961 case 3:
962 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
963 return NULL;
964 attr = lattr;
965 use_xy = TRUE;
966 break;
967 case 4:
968 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
969 return NULL;
970 attr = lattr;
971 use_xy = TRUE;
972 break;
973 default:
974 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
975 return NULL;
976 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000977
Victor Stinner26486ea2010-05-15 22:23:53 +0000978 color = (short)((attr >> 8) & 0xff);
979 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000980
Victor Stinner26486ea2010-05-15 22:23:53 +0000981 if (use_xy == TRUE) {
982 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
983 touchline(self->win,y,1);
984 } else {
985 getyx(self->win,y,x);
986 rtn = wchgat(self->win,num,attr,color,NULL);
987 touchline(self->win,y,1);
988 }
989 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000990}
991
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000992
Guido van Rossumf6971e21994-08-30 12:25:20 +0000993static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000994PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000995{
Victor Stinner26486ea2010-05-15 22:23:53 +0000996 int rtn;
997 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000998
Victor Stinner26486ea2010-05-15 22:23:53 +0000999 switch (PyTuple_Size(args)) {
1000 case 0:
1001 rtn = wdelch(self->win);
1002 break;
1003 case 2:
1004 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1005 return NULL;
1006 rtn = py_mvwdelch(self->win,y,x);
1007 break;
1008 default:
1009 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1010 return NULL;
1011 }
1012 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001013}
1014
1015static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001016PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001017{
Victor Stinner26486ea2010-05-15 22:23:53 +00001018 WINDOW *win;
1019 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001020
Victor Stinner26486ea2010-05-15 22:23:53 +00001021 nlines = 0;
1022 ncols = 0;
1023 switch (PyTuple_Size(args)) {
1024 case 2:
1025 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1026 return NULL;
1027 break;
1028 case 4:
1029 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1030 &nlines,&ncols,&begin_y,&begin_x))
1031 return NULL;
1032 break;
1033 default:
1034 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1035 return NULL;
1036 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001037
Victor Stinner26486ea2010-05-15 22:23:53 +00001038 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001039
Victor Stinner26486ea2010-05-15 22:23:53 +00001040 if (win == NULL) {
1041 PyErr_SetString(PyCursesError, catchall_NULL);
1042 return NULL;
1043 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001044
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001045 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001046}
1047
1048static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001049PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001050{
Victor Stinner26486ea2010-05-15 22:23:53 +00001051 PyObject *temp;
1052 chtype ch;
1053 attr_t attr = A_NORMAL;
1054 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001055
Victor Stinner26486ea2010-05-15 22:23:53 +00001056 switch (PyTuple_Size(args)) {
1057 case 1:
1058 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1059 return NULL;
1060 break;
1061 case 2:
1062 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1063 return NULL;
1064 attr = lattr;
1065 break;
1066 default:
1067 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001068
1069
Victor Stinner26486ea2010-05-15 22:23:53 +00001070 return NULL;
1071 }
Guido van Rossum85738471995-02-17 13:50:17 +00001072
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001073 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001074 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001075
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001076#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001077 if (self->win->_flags & _ISPAD)
1078 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1079 "echochar");
1080 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001081#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001082 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1083 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001084}
1085
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001086#ifdef NCURSES_MOUSE_VERSION
1087static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001088PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001089{
Victor Stinner26486ea2010-05-15 22:23:53 +00001090 int x, y;
1091 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1092 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001093
Victor Stinner26486ea2010-05-15 22:23:53 +00001094 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001095}
1096#endif
1097
Guido van Rossumf6971e21994-08-30 12:25:20 +00001098static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001099PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001100{
Victor Stinner26486ea2010-05-15 22:23:53 +00001101 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001102}
1103
1104static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001105PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001106{
Victor Stinner26486ea2010-05-15 22:23:53 +00001107 int x, y;
1108 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001109
Victor Stinner26486ea2010-05-15 22:23:53 +00001110 switch (PyTuple_Size(args)) {
1111 case 0:
1112 Py_BEGIN_ALLOW_THREADS
1113 rtn = wgetch(self->win);
1114 Py_END_ALLOW_THREADS
1115 break;
1116 case 2:
1117 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1118 return NULL;
1119 Py_BEGIN_ALLOW_THREADS
1120 rtn = mvwgetch(self->win,y,x);
1121 Py_END_ALLOW_THREADS
1122 break;
1123 default:
1124 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1125 return NULL;
1126 }
1127 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001128}
Guido van Rossum85738471995-02-17 13:50:17 +00001129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001130static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001131PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001132{
Victor Stinner26486ea2010-05-15 22:23:53 +00001133 int x, y;
1134 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001135
Victor Stinner26486ea2010-05-15 22:23:53 +00001136 switch (PyTuple_Size(args)) {
1137 case 0:
1138 Py_BEGIN_ALLOW_THREADS
1139 rtn = wgetch(self->win);
1140 Py_END_ALLOW_THREADS
1141 break;
1142 case 2:
1143 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1144 return NULL;
1145 Py_BEGIN_ALLOW_THREADS
1146 rtn = mvwgetch(self->win,y,x);
1147 Py_END_ALLOW_THREADS
1148 break;
1149 default:
1150 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1151 return NULL;
1152 }
1153 if (rtn == ERR) {
1154 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001155 PyErr_CheckSignals();
1156 if (!PyErr_Occurred())
1157 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001158 return NULL;
1159 } else if (rtn<=255) {
1160 return Py_BuildValue("C", rtn);
1161 } else {
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02001162 const char *knp = keyname(rtn);
Victor Stinner26486ea2010-05-15 22:23:53 +00001163 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1164 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001165}
1166
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001167#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001168static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001169PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1170{
1171 int x, y;
1172 int ct;
1173 wint_t rtn;
1174
1175 switch (PyTuple_Size(args)) {
1176 case 0:
1177 Py_BEGIN_ALLOW_THREADS
1178 ct = wget_wch(self->win,&rtn);
1179 Py_END_ALLOW_THREADS
1180 break;
1181 case 2:
1182 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1183 return NULL;
1184 Py_BEGIN_ALLOW_THREADS
1185 ct = mvwget_wch(self->win,y,x,&rtn);
1186 Py_END_ALLOW_THREADS
1187 break;
1188 default:
1189 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1190 return NULL;
1191 }
1192 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001193 if (PyErr_CheckSignals())
1194 return NULL;
1195
Victor Stinnera7878b72011-07-14 23:07:44 +02001196 /* get_wch() returns ERR in nodelay mode */
1197 PyErr_SetString(PyCursesError, "no input");
1198 return NULL;
1199 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001200 if (ct == KEY_CODE_YES)
1201 return PyLong_FromLong(rtn);
1202 else
1203 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001204}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001205#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001206
1207static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001208PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001209{
Victor Stinner26486ea2010-05-15 22:23:53 +00001210 int x, y, n;
1211 char rtn[1024]; /* This should be big enough.. I hope */
1212 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001213
Victor Stinner26486ea2010-05-15 22:23:53 +00001214 switch (PyTuple_Size(args)) {
1215 case 0:
1216 Py_BEGIN_ALLOW_THREADS
1217 rtn2 = wgetnstr(self->win,rtn, 1023);
1218 Py_END_ALLOW_THREADS
1219 break;
1220 case 1:
1221 if (!PyArg_ParseTuple(args,"i;n", &n))
1222 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001223 if (n < 0) {
1224 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1225 return NULL;
1226 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001227 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001228 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001229 Py_END_ALLOW_THREADS
1230 break;
1231 case 2:
1232 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1233 return NULL;
1234 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001235#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001236 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001237#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001238 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001239#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001240 Py_END_ALLOW_THREADS
1241 break;
1242 case 3:
1243 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1244 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001245 if (n < 0) {
1246 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1247 return NULL;
1248 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001249#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001250 Py_BEGIN_ALLOW_THREADS
1251 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001252 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001253 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001254#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001255 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001256 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001257 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001258#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001259 break;
1260 default:
1261 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1262 return NULL;
1263 }
1264 if (rtn2 == ERR)
1265 rtn[0] = 0;
1266 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001267}
1268
1269static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001270PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001271{
Victor Stinner26486ea2010-05-15 22:23:53 +00001272 PyObject *temp;
1273 chtype ch;
1274 int n, x, y, code = OK;
1275 attr_t attr = A_NORMAL;
1276 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001277
Victor Stinner26486ea2010-05-15 22:23:53 +00001278 switch (PyTuple_Size(args)) {
1279 case 2:
1280 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1281 return NULL;
1282 break;
1283 case 3:
1284 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1285 return NULL;
1286 attr = lattr;
1287 break;
1288 case 4:
1289 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1290 return NULL;
1291 code = wmove(self->win, y, x);
1292 break;
1293 case 5:
1294 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1295 &y, &x, &temp, &n, &lattr))
1296 return NULL;
1297 attr = lattr;
1298 code = wmove(self->win, y, x);
1299 break;
1300 default:
1301 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1302 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001303 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001304
1305 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001306 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001307 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001308 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1309 } else
1310 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001311}
1312
1313static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001314PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001315{
Victor Stinner26486ea2010-05-15 22:23:53 +00001316 int rtn, x, y, use_xy = FALSE;
1317 PyObject *temp;
1318 chtype ch = 0;
1319 attr_t attr = A_NORMAL;
1320 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001321
Victor Stinner26486ea2010-05-15 22:23:53 +00001322 switch (PyTuple_Size(args)) {
1323 case 1:
1324 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1325 return NULL;
1326 break;
1327 case 2:
1328 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1329 return NULL;
1330 attr = lattr;
1331 break;
1332 case 3:
1333 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1334 return NULL;
1335 use_xy = TRUE;
1336 break;
1337 case 4:
1338 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1339 return NULL;
1340 attr = lattr;
1341 use_xy = TRUE;
1342 break;
1343 default:
1344 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1345 return NULL;
1346 }
1347
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001348 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001349 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001350
1351 if (use_xy == TRUE)
1352 rtn = mvwinsch(self->win,y,x, ch | attr);
1353 else {
1354 rtn = winsch(self->win, ch | attr);
1355 }
1356 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001357}
1358
1359static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001360PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001361{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001362 int x, y;
1363 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001364
Victor Stinner26486ea2010-05-15 22:23:53 +00001365 switch (PyTuple_Size(args)) {
1366 case 0:
1367 rtn = winch(self->win);
1368 break;
1369 case 2:
1370 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1371 return NULL;
1372 rtn = mvwinch(self->win,y,x);
1373 break;
1374 default:
1375 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1376 return NULL;
1377 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001378 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001379}
1380
1381static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001382PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001383{
Victor Stinner26486ea2010-05-15 22:23:53 +00001384 int x, y, n;
1385 char rtn[1024]; /* This should be big enough.. I hope */
1386 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001387
Victor Stinner26486ea2010-05-15 22:23:53 +00001388 switch (PyTuple_Size(args)) {
1389 case 0:
1390 rtn2 = winnstr(self->win,rtn, 1023);
1391 break;
1392 case 1:
1393 if (!PyArg_ParseTuple(args,"i;n", &n))
1394 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001395 if (n < 0) {
1396 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1397 return NULL;
1398 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001399 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001400 break;
1401 case 2:
1402 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1403 return NULL;
1404 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1405 break;
1406 case 3:
1407 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1408 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001409 if (n < 0) {
1410 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1411 return NULL;
1412 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001413 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001414 break;
1415 default:
1416 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1417 return NULL;
1418 }
1419 if (rtn2 == ERR)
1420 rtn[0] = 0;
1421 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001422}
1423
1424static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001425PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001426{
Victor Stinner26486ea2010-05-15 22:23:53 +00001427 int rtn;
1428 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001429 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001430 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001431#ifdef HAVE_NCURSESW
1432 wchar_t *wstr = NULL;
1433#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001434 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1435 long lattr;
1436 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001437 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001438
Victor Stinner26486ea2010-05-15 22:23:53 +00001439 switch (PyTuple_Size(args)) {
1440 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001441 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001442 return NULL;
1443 break;
1444 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001445 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001446 return NULL;
1447 attr = lattr;
1448 use_attr = TRUE;
1449 break;
1450 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001451 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001452 return NULL;
1453 use_xy = TRUE;
1454 break;
1455 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001456 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001457 return NULL;
1458 attr = lattr;
1459 use_xy = use_attr = TRUE;
1460 break;
1461 default:
1462 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1463 return NULL;
1464 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001465
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001466#ifdef HAVE_NCURSESW
1467 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1468#else
1469 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1470#endif
1471 if (strtype == 0)
1472 return NULL;
1473
Victor Stinner26486ea2010-05-15 22:23:53 +00001474 if (use_attr == TRUE) {
1475 attr_old = getattrs(self->win);
1476 (void)wattrset(self->win,attr);
1477 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001478#ifdef HAVE_NCURSESW
1479 if (strtype == 2) {
1480 funcname = "inswstr";
1481 if (use_xy == TRUE)
1482 rtn = mvwins_wstr(self->win,y,x,wstr);
1483 else
1484 rtn = wins_wstr(self->win,wstr);
1485 PyMem_Free(wstr);
1486 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001487 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001488#endif
1489 {
1490 char *str = PyBytes_AS_STRING(bytesobj);
1491 funcname = "insstr";
1492 if (use_xy == TRUE)
1493 rtn = mvwinsstr(self->win,y,x,str);
1494 else
1495 rtn = winsstr(self->win,str);
1496 Py_DECREF(bytesobj);
1497 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001498 if (use_attr == TRUE)
1499 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001500 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001501}
1502
1503static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001504PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001505{
Victor Stinner26486ea2010-05-15 22:23:53 +00001506 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001507 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001508 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001509#ifdef HAVE_NCURSESW
1510 wchar_t *wstr = NULL;
1511#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001512 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1513 long lattr;
1514 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001515 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001516
Victor Stinner26486ea2010-05-15 22:23:53 +00001517 switch (PyTuple_Size(args)) {
1518 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001519 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001520 return NULL;
1521 break;
1522 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001523 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001524 return NULL;
1525 attr = lattr;
1526 use_attr = TRUE;
1527 break;
1528 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001529 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001530 return NULL;
1531 use_xy = TRUE;
1532 break;
1533 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001534 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001535 return NULL;
1536 attr = lattr;
1537 use_xy = use_attr = TRUE;
1538 break;
1539 default:
1540 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1541 return NULL;
1542 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001543
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001544#ifdef HAVE_NCURSESW
1545 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1546#else
1547 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1548#endif
1549 if (strtype == 0)
1550 return NULL;
1551
Victor Stinner26486ea2010-05-15 22:23:53 +00001552 if (use_attr == TRUE) {
1553 attr_old = getattrs(self->win);
1554 (void)wattrset(self->win,attr);
1555 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001556#ifdef HAVE_NCURSESW
1557 if (strtype == 2) {
1558 funcname = "insn_wstr";
1559 if (use_xy == TRUE)
1560 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1561 else
1562 rtn = wins_nwstr(self->win,wstr,n);
1563 PyMem_Free(wstr);
1564 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001565 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001566#endif
1567 {
1568 char *str = PyBytes_AS_STRING(bytesobj);
1569 funcname = "insnstr";
1570 if (use_xy == TRUE)
1571 rtn = mvwinsnstr(self->win,y,x,str,n);
1572 else
1573 rtn = winsnstr(self->win,str,n);
1574 Py_DECREF(bytesobj);
1575 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001576 if (use_attr == TRUE)
1577 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001578 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001579}
1580
1581static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001582PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001583{
Victor Stinner26486ea2010-05-15 22:23:53 +00001584 int line, erg;
1585 if (!PyArg_ParseTuple(args,"i;line", &line))
1586 return NULL;
1587 erg = is_linetouched(self->win, line);
1588 if (erg == ERR) {
1589 PyErr_SetString(PyExc_TypeError,
1590 "is_linetouched: line number outside of boundaries");
1591 return NULL;
1592 } else
1593 if (erg == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001594 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001595 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001596 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001597 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001598}
1599
1600static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001601PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001602{
Victor Stinner26486ea2010-05-15 22:23:53 +00001603 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1604 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001605
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001606#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001607 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001608#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001609 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001610#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001611 {
1612 switch(PyTuple_Size(args)) {
1613 case 6:
1614 if (!PyArg_ParseTuple(args,
1615 "iiiiii;" \
1616 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1617 &pminrow, &pmincol, &sminrow,
1618 &smincol, &smaxrow, &smaxcol))
1619 return NULL;
1620 Py_BEGIN_ALLOW_THREADS
1621 rtn = pnoutrefresh(self->win,
1622 pminrow, pmincol, sminrow,
1623 smincol, smaxrow, smaxcol);
1624 Py_END_ALLOW_THREADS
1625 return PyCursesCheckERR(rtn, "pnoutrefresh");
1626 default:
1627 PyErr_SetString(PyCursesError,
1628 "noutrefresh() called for a pad "
1629 "requires 6 arguments");
1630 return NULL;
1631 }
1632 } else {
1633 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1634 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001635
Victor Stinner26486ea2010-05-15 22:23:53 +00001636 Py_BEGIN_ALLOW_THREADS
1637 rtn = wnoutrefresh(self->win);
1638 Py_END_ALLOW_THREADS
1639 return PyCursesCheckERR(rtn, "wnoutrefresh");
1640 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001641}
1642
1643static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001644PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1645{
1646 PyCursesWindowObject *temp;
1647 int use_copywin = FALSE;
1648 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1649 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001650
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001651 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001652 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001653 if (!PyArg_ParseTuple(args, "O!;window object",
1654 &PyCursesWindow_Type, &temp))
1655 return NULL;
1656 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001657 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001658 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1659 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1660 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1661 return NULL;
1662 use_copywin = TRUE;
1663 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001664 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001665 PyErr_SetString(PyExc_TypeError,
1666 "overlay requires one or seven arguments");
1667 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001668 }
1669
1670 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001671 rtn = copywin(self->win, temp->win, sminrow, smincol,
1672 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1673 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001674 }
1675 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001676 rtn = overlay(self->win, temp->win);
1677 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001678 }
1679}
1680
1681static PyObject *
1682PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1683{
1684 PyCursesWindowObject *temp;
1685 int use_copywin = FALSE;
1686 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1687 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001688
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001689 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001690 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001691 if (!PyArg_ParseTuple(args, "O!;window object",
1692 &PyCursesWindow_Type, &temp))
1693 return NULL;
1694 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001695 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001696 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1697 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1698 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1699 return NULL;
1700 use_copywin = TRUE;
1701 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001703 PyErr_SetString(PyExc_TypeError,
1704 "overwrite requires one or seven arguments");
1705 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001706 }
1707
1708 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001709 rtn = copywin(self->win, temp->win, sminrow, smincol,
1710 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001711 return PyCursesCheckERR(rtn, "copywin");
1712 }
1713 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001714 rtn = overwrite(self->win, temp->win);
1715 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001716 }
1717}
1718
1719static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001720PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001721{
Victor Stinner26486ea2010-05-15 22:23:53 +00001722 /* We have to simulate this by writing to a temporary FILE*,
1723 then reading back, then writing to the argument stream. */
Christian Heimes2b221b72017-03-02 11:09:01 +01001724 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001725 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001726
Christian Heimes2b221b72017-03-02 11:09:01 +01001727 fp = tmpfile();
1728 if (fp == NULL)
1729 return PyErr_SetFromErrno(PyExc_OSError);
1730 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001731 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001732 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001733 if (res == NULL)
1734 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001735 fseek(fp, 0, 0);
1736 while (1) {
1737 char buf[BUFSIZ];
1738 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001739 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001740
Victor Stinner26486ea2010-05-15 22:23:53 +00001741 if (n <= 0)
1742 break;
1743 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001744 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001745 if (res == NULL)
1746 break;
1747 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001748
1749exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01001750 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001751 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001752}
1753
1754static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001755PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001756{
Victor Stinner26486ea2010-05-15 22:23:53 +00001757 int beg, num;
1758 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1759 return NULL;
1760 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001761}
1762
1763static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001764PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001765{
Victor Stinner26486ea2010-05-15 22:23:53 +00001766 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1767 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001768
Victor Stinner26486ea2010-05-15 22:23:53 +00001769#ifndef WINDOW_HAS_FLAGS
1770 if (0)
1771#else
1772 if (self->win->_flags & _ISPAD)
1773#endif
1774 {
1775 switch(PyTuple_Size(args)) {
1776 case 6:
1777 if (!PyArg_ParseTuple(args,
1778 "iiiiii;" \
1779 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1780 &pminrow, &pmincol, &sminrow,
1781 &smincol, &smaxrow, &smaxcol))
1782 return NULL;
1783
1784 Py_BEGIN_ALLOW_THREADS
1785 rtn = prefresh(self->win,
1786 pminrow, pmincol, sminrow,
1787 smincol, smaxrow, smaxcol);
1788 Py_END_ALLOW_THREADS
1789 return PyCursesCheckERR(rtn, "prefresh");
1790 default:
1791 PyErr_SetString(PyCursesError,
1792 "refresh() for a pad requires 6 arguments");
1793 return NULL;
1794 }
1795 } else {
1796 if (!PyArg_ParseTuple(args, ":refresh"))
1797 return NULL;
1798 Py_BEGIN_ALLOW_THREADS
1799 rtn = wrefresh(self->win);
1800 Py_END_ALLOW_THREADS
1801 return PyCursesCheckERR(rtn, "prefresh");
1802 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001803}
1804
1805static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001806PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001807{
Victor Stinner26486ea2010-05-15 22:23:53 +00001808 int x, y;
1809 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1810 return NULL;
1811 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001812}
1813
1814static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001815PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001816{
Victor Stinner26486ea2010-05-15 22:23:53 +00001817 WINDOW *win;
1818 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001819
Victor Stinner26486ea2010-05-15 22:23:53 +00001820 nlines = 0;
1821 ncols = 0;
1822 switch (PyTuple_Size(args)) {
1823 case 2:
1824 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1825 return NULL;
1826 break;
1827 case 4:
1828 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1829 &nlines,&ncols,&begin_y,&begin_x))
1830 return NULL;
1831 break;
1832 default:
1833 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1834 return NULL;
1835 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001836
Victor Stinner26486ea2010-05-15 22:23:53 +00001837 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001838#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001839 if (self->win->_flags & _ISPAD)
1840 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1841 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001842#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001843 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001844
Victor Stinner26486ea2010-05-15 22:23:53 +00001845 if (win == NULL) {
1846 PyErr_SetString(PyCursesError, catchall_NULL);
1847 return NULL;
1848 }
1849
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001850 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001851}
1852
1853static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001854PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001855{
Victor Stinner26486ea2010-05-15 22:23:53 +00001856 int nlines;
1857 switch(PyTuple_Size(args)) {
1858 case 0:
1859 return PyCursesCheckERR(scroll(self->win), "scroll");
1860 case 1:
1861 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1862 return NULL;
1863 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1864 default:
1865 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1866 return NULL;
1867 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001868}
1869
1870static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001871PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001872{
Victor Stinner26486ea2010-05-15 22:23:53 +00001873 int st, cnt, val;
1874 switch (PyTuple_Size(args)) {
1875 case 2:
1876 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1877 return NULL;
1878 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1879 case 3:
1880 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1881 return NULL;
1882 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1883 default:
1884 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1885 return NULL;
1886 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001887}
1888
1889static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001890PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001891{
Victor Stinner26486ea2010-05-15 22:23:53 +00001892 PyObject *temp;
1893 chtype ch;
1894 int n, x, y, code = OK;
1895 attr_t attr = A_NORMAL;
1896 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001897
Victor Stinner26486ea2010-05-15 22:23:53 +00001898 switch (PyTuple_Size(args)) {
1899 case 2:
1900 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1901 return NULL;
1902 break;
1903 case 3:
1904 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1905 return NULL;
1906 attr = lattr;
1907 break;
1908 case 4:
1909 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1910 return NULL;
1911 code = wmove(self->win, y, x);
1912 break;
1913 case 5:
1914 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1915 &y, &x, &temp, &n, &lattr))
1916 return NULL;
1917 attr = lattr;
1918 code = wmove(self->win, y, x);
1919 break;
1920 default:
1921 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1922 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001923 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001924
1925 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001926 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001927 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001928 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1929 } else
1930 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001931}
1932
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001933static PyObject *
1934PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1935{
1936 return PyUnicode_FromString(self->encoding);
1937}
1938
1939static int
1940PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1941{
1942 PyObject *ascii;
1943 char *encoding;
1944
1945 /* It is illegal to del win.encoding */
1946 if (value == NULL) {
1947 PyErr_SetString(PyExc_TypeError,
1948 "encoding may not be deleted");
1949 return -1;
1950 }
1951
1952 if (!PyUnicode_Check(value)) {
1953 PyErr_SetString(PyExc_TypeError,
1954 "setting encoding to a non-string");
1955 return -1;
1956 }
1957 ascii = PyUnicode_AsASCIIString(value);
1958 if (ascii == NULL)
1959 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001960 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001961 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001962 if (encoding == NULL) {
1963 PyErr_NoMemory();
1964 return -1;
1965 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001966 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001967 self->encoding = encoding;
1968 return 0;
1969}
1970
1971
Guido van Rossumf6971e21994-08-30 12:25:20 +00001972static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001973 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001974 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1975 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1976 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1977 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1978 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1979 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1980 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1981 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1982 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1983 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1984 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1985 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1986 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1987 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1988 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1989 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1990 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1991 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1992 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001993#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00001994 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001995#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001996 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1997 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1998 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1999 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2000 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002001#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002002 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002003#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002004 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2005 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2006 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2007 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2008 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2009 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2010 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002011#ifdef HAVE_CURSES_IMMEDOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002012 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002013#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002014 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2015 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2016 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2017 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2018 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2019 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2020 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2021 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2022 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2023 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2024 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2025 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2026 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2027 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2028 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2029 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2030 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002031 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2032 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2033 METH_VARARGS},
2034 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2035 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2036 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2037 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002038#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002039 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002040#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002041 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2042 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2043 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2044 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2045 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2046 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2047 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2048 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002049#ifdef HAVE_CURSES_SYNCOK
Victor Stinner26486ea2010-05-15 22:23:53 +00002050 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002051#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002052 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2053 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2054 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2055 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2056 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2057 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2058 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002059};
2060
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002061static PyGetSetDef PyCursesWindow_getsets[] = {
2062 {"encoding",
2063 (getter)PyCursesWindow_get_encoding,
2064 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002065 "the typecode character used to create the array"},
2066 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002067};
2068
Guido van Rossumf6971e21994-08-30 12:25:20 +00002069/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002070
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002071PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002072 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002073 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002074 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2075 0, /*tp_itemsize*/
2076 /* methods */
2077 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2078 0, /*tp_print*/
2079 (getattrfunc)0, /*tp_getattr*/
2080 (setattrfunc)0, /*tp_setattr*/
2081 0, /*tp_reserved*/
2082 0, /*tp_repr*/
2083 0, /*tp_as_number*/
2084 0, /*tp_as_sequence*/
2085 0, /*tp_as_mapping*/
2086 0, /*tp_hash*/
2087 0, /*tp_call*/
2088 0, /*tp_str*/
2089 0, /*tp_getattro*/
2090 0, /*tp_setattro*/
2091 0, /*tp_as_buffer*/
2092 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2093 0, /*tp_doc*/
2094 0, /*tp_traverse*/
2095 0, /*tp_clear*/
2096 0, /*tp_richcompare*/
2097 0, /*tp_weaklistoffset*/
2098 0, /*tp_iter*/
2099 0, /*tp_iternext*/
2100 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002101 0, /* tp_members */
2102 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002103};
2104
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002105/*********************************************************************
2106 Global Functions
2107**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002108
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002109NoArgNoReturnFunction(beep)
2110NoArgNoReturnFunction(def_prog_mode)
2111NoArgNoReturnFunction(def_shell_mode)
2112NoArgNoReturnFunction(doupdate)
2113NoArgNoReturnFunction(endwin)
2114NoArgNoReturnFunction(flash)
2115NoArgNoReturnFunction(nocbreak)
2116NoArgNoReturnFunction(noecho)
2117NoArgNoReturnFunction(nonl)
2118NoArgNoReturnFunction(noraw)
2119NoArgNoReturnFunction(reset_prog_mode)
2120NoArgNoReturnFunction(reset_shell_mode)
2121NoArgNoReturnFunction(resetty)
2122NoArgNoReturnFunction(savetty)
2123
2124NoArgOrFlagNoReturnFunction(cbreak)
2125NoArgOrFlagNoReturnFunction(echo)
2126NoArgOrFlagNoReturnFunction(nl)
2127NoArgOrFlagNoReturnFunction(raw)
2128
2129NoArgReturnIntFunction(baudrate)
2130NoArgReturnIntFunction(termattrs)
2131
2132NoArgReturnStringFunction(termname)
2133NoArgReturnStringFunction(longname)
2134
2135NoArgTrueFalseFunction(can_change_color)
2136NoArgTrueFalseFunction(has_colors)
2137NoArgTrueFalseFunction(has_ic)
2138NoArgTrueFalseFunction(has_il)
2139NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002140NoArgNoReturnVoidFunction(flushinp)
2141NoArgNoReturnVoidFunction(noqiflush)
2142
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002143#ifdef HAVE_CURSES_FILTER
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002144static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002145PyCurses_filter(PyObject *self)
2146{
Victor Stinner26486ea2010-05-15 22:23:53 +00002147 /* not checking for PyCursesInitialised here since filter() must
2148 be called before initscr() */
2149 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002150 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002151}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002152#endif
Christian Heimesaf98da12008-01-27 15:18:18 +00002153
2154static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002155PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002156{
Victor Stinner26486ea2010-05-15 22:23:53 +00002157 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002158
Victor Stinner26486ea2010-05-15 22:23:53 +00002159 PyCursesInitialised;
2160 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002161
Victor Stinner26486ea2010-05-15 22:23:53 +00002162 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163
Victor Stinner26486ea2010-05-15 22:23:53 +00002164 if (color_content(color, &r, &g, &b) != ERR)
2165 return Py_BuildValue("(iii)", r, g, b);
2166 else {
2167 PyErr_SetString(PyCursesError,
2168 "Argument 1 was out of range. Check value of COLORS.");
2169 return NULL;
2170 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002171}
2172
2173static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002174PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002175{
Victor Stinner26486ea2010-05-15 22:23:53 +00002176 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002177
Victor Stinner26486ea2010-05-15 22:23:53 +00002178 PyCursesInitialised;
2179 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002180
Victor Stinner26486ea2010-05-15 22:23:53 +00002181 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2182 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183}
2184
2185static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002186PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002187{
Victor Stinner26486ea2010-05-15 22:23:53 +00002188 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002189
Victor Stinner26486ea2010-05-15 22:23:53 +00002190 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191
Victor Stinner26486ea2010-05-15 22:23:53 +00002192 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002193
Victor Stinner26486ea2010-05-15 22:23:53 +00002194 erg = curs_set(vis);
2195 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196
Victor Stinner26486ea2010-05-15 22:23:53 +00002197 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198}
2199
2200static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002201PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202{
Victor Stinner26486ea2010-05-15 22:23:53 +00002203 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002204
Victor Stinner26486ea2010-05-15 22:23:53 +00002205 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002206
Victor Stinner26486ea2010-05-15 22:23:53 +00002207 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002208
Victor Stinner26486ea2010-05-15 22:23:53 +00002209 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002210}
2211
2212static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002213PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214{
Victor Stinner26486ea2010-05-15 22:23:53 +00002215 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216
Victor Stinner26486ea2010-05-15 22:23:53 +00002217 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218
Victor Stinner26486ea2010-05-15 22:23:53 +00002219 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002220
Victor Stinner26486ea2010-05-15 22:23:53 +00002221 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002222}
2223
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002224#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002226PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227{
Victor Stinner26486ea2010-05-15 22:23:53 +00002228 int x = 0;
2229 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002230
Victor Stinner26486ea2010-05-15 22:23:53 +00002231 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232
Victor Stinner26486ea2010-05-15 22:23:53 +00002233 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002237#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002238
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002239#ifdef NCURSES_MOUSE_VERSION
2240static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002241PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002242{
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 int rtn;
2244 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002245
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002247
Victor Stinner26486ea2010-05-15 22:23:53 +00002248 rtn = getmouse( &event );
2249 if (rtn == ERR) {
2250 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2251 return NULL;
2252 }
2253 return Py_BuildValue("(hiiil)",
2254 (short)event.id,
2255 event.x, event.y, event.z,
2256 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002257}
2258
2259static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002260PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002261{
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002263
Victor Stinner26486ea2010-05-15 22:23:53 +00002264 PyCursesInitialised;
2265 if (!PyArg_ParseTuple(args, "hiiil",
2266 &event.id,
2267 &event.x, &event.y, &event.z,
2268 (int *) &event.bstate))
2269 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002270
Victor Stinner26486ea2010-05-15 22:23:53 +00002271 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002272}
2273#endif
2274
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002276PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277{
Christian Heimes2b221b72017-03-02 11:09:01 +01002278 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00002279 PyObject *data;
2280 size_t datalen;
2281 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002282 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002283 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002284
Victor Stinner26486ea2010-05-15 22:23:53 +00002285 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286
Christian Heimes2b221b72017-03-02 11:09:01 +01002287 fp = tmpfile();
2288 if (fp == NULL)
2289 return PyErr_SetFromErrno(PyExc_OSError);
2290
2291 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002292 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01002293
Victor Stinnerdaf45552013-08-28 00:53:59 +02002294
Victor Stinner3466bde2016-09-05 18:16:01 -07002295 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002296 if (data == NULL)
2297 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 if (!PyBytes_Check(data)) {
2299 PyErr_Format(PyExc_TypeError,
2300 "f.read() returned %.100s instead of bytes",
2301 data->ob_type->tp_name);
2302 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002303 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002304 }
2305 datalen = PyBytes_GET_SIZE(data);
2306 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2307 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01002308 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002309 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002310 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002311 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002312
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 fseek(fp, 0, 0);
2314 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002315 if (win == NULL) {
2316 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002317 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002318 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002319 res = PyCursesWindow_New(win, NULL);
2320
2321error:
Christian Heimes2b221b72017-03-02 11:09:01 +01002322 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002323 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002324}
2325
2326static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002327PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002328{
Victor Stinner26486ea2010-05-15 22:23:53 +00002329 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002330
Victor Stinner26486ea2010-05-15 22:23:53 +00002331 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002332
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002334
Victor Stinner26486ea2010-05-15 22:23:53 +00002335 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002336}
2337
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002338#ifdef HAVE_CURSES_HAS_KEY
2339static PyObject *
2340PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002341{
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002345
Victor Stinner26486ea2010-05-15 22:23:53 +00002346 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002347
Victor Stinner26486ea2010-05-15 22:23:53 +00002348 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002349 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002351 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002352}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002353#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002354
2355static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002356PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002357{
Victor Stinner26486ea2010-05-15 22:23:53 +00002358 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002359
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 PyCursesInitialised;
2361 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 switch(PyTuple_Size(args)) {
2364 case 4:
2365 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2366 break;
2367 default:
2368 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2369 return NULL;
2370 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002371
Victor Stinner26486ea2010-05-15 22:23:53 +00002372 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002373}
2374
2375static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002376PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002377{
Victor Stinner26486ea2010-05-15 22:23:53 +00002378 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002379
Victor Stinner26486ea2010-05-15 22:23:53 +00002380 PyCursesInitialised;
2381 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002382
Victor Stinner26486ea2010-05-15 22:23:53 +00002383 if (PyTuple_Size(args) != 3) {
2384 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2385 return NULL;
2386 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002387
Victor Stinner26486ea2010-05-15 22:23:53 +00002388 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002391}
2392
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002393static PyObject *ModDict;
2394
Victor Stinner26486ea2010-05-15 22:23:53 +00002395static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002396PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002397{
Victor Stinner26486ea2010-05-15 22:23:53 +00002398 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002399 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002400
Victor Stinner26486ea2010-05-15 22:23:53 +00002401 if (initialised == TRUE) {
2402 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002403 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002405
Victor Stinner26486ea2010-05-15 22:23:53 +00002406 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 if (win == NULL) {
2409 PyErr_SetString(PyCursesError, catchall_NULL);
2410 return NULL;
2411 }
Guido van Rossum85738471995-02-17 13:50:17 +00002412
Victor Stinner26486ea2010-05-15 22:23:53 +00002413 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002414
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002415/* This was moved from initcurses() because it core dumped on SGI,
2416 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002417#define SetDictInt(string,ch) \
2418 do { \
2419 PyObject *o = PyLong_FromLong((long) (ch)); \
2420 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2421 Py_DECREF(o); \
2422 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002423 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002424
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 /* Here are some graphic symbols you can use */
2426 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2427 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2428 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2429 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2430 SetDictInt("ACS_LTEE", (ACS_LTEE));
2431 SetDictInt("ACS_RTEE", (ACS_RTEE));
2432 SetDictInt("ACS_BTEE", (ACS_BTEE));
2433 SetDictInt("ACS_TTEE", (ACS_TTEE));
2434 SetDictInt("ACS_HLINE", (ACS_HLINE));
2435 SetDictInt("ACS_VLINE", (ACS_VLINE));
2436 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002437#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002438 /* On HP/UX 11, these are of type cchar_t, which is not an
2439 integral type. If this is a problem on more platforms, a
2440 configure test should be added to determine whether ACS_S1
2441 is of integral type. */
2442 SetDictInt("ACS_S1", (ACS_S1));
2443 SetDictInt("ACS_S9", (ACS_S9));
2444 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2445 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2446 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2447 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2448 SetDictInt("ACS_BULLET", (ACS_BULLET));
2449 SetDictInt("ACS_LARROW", (ACS_LARROW));
2450 SetDictInt("ACS_RARROW", (ACS_RARROW));
2451 SetDictInt("ACS_DARROW", (ACS_DARROW));
2452 SetDictInt("ACS_UARROW", (ACS_UARROW));
2453 SetDictInt("ACS_BOARD", (ACS_BOARD));
2454 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2455 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002456#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002457 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2458 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2459 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2460 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2461 SetDictInt("ACS_SBSS", (ACS_RTEE));
2462 SetDictInt("ACS_SSSB", (ACS_LTEE));
2463 SetDictInt("ACS_SSBS", (ACS_BTEE));
2464 SetDictInt("ACS_BSSS", (ACS_TTEE));
2465 SetDictInt("ACS_BSBS", (ACS_HLINE));
2466 SetDictInt("ACS_SBSB", (ACS_VLINE));
2467 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002468
Victor Stinner26486ea2010-05-15 22:23:53 +00002469 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002470#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002472#endif
2473#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002474 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002475#endif
2476#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002477 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002478#endif
2479#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002480 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002481#endif
2482#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002483 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002484#endif
2485#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002486 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002487#endif
2488#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002489 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002490#endif
2491
Victor Stinner26486ea2010-05-15 22:23:53 +00002492 SetDictInt("LINES", LINES);
2493 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002494
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002495 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2496 screen_encoding = winobj->encoding;
2497 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002498}
2499
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002500static PyObject *
2501PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2502{
Victor Stinner26486ea2010-05-15 22:23:53 +00002503 int fd = -1;
2504 int err;
2505 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002506
Victor Stinner26486ea2010-05-15 22:23:53 +00002507 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002508
Victor Stinner26486ea2010-05-15 22:23:53 +00002509 if (!PyArg_ParseTupleAndKeywords(
2510 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2511 return NULL;
2512 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002513
Victor Stinner26486ea2010-05-15 22:23:53 +00002514 if (fd == -1) {
2515 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002516
Victor Stinnerbd303c12013-11-07 23:07:29 +01002517 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002518
Victor Stinner26486ea2010-05-15 22:23:53 +00002519 if (sys_stdout == NULL || sys_stdout == Py_None) {
2520 PyErr_SetString(
2521 PyCursesError,
2522 "lost sys.stdout");
2523 return NULL;
2524 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002525
Victor Stinner26486ea2010-05-15 22:23:53 +00002526 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002527
Victor Stinner26486ea2010-05-15 22:23:53 +00002528 if (fd == -1) {
2529 return NULL;
2530 }
2531 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002532
Matthias Klose635edd12010-07-30 21:40:57 +00002533 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002534 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002535
Victor Stinner26486ea2010-05-15 22:23:53 +00002536 if (err == 0) {
2537 s = "setupterm: could not find terminal";
2538 } else if (err == -1) {
2539 s = "setupterm: could not find terminfo database";
2540 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002541
Victor Stinner26486ea2010-05-15 22:23:53 +00002542 PyErr_SetString(PyCursesError,s);
2543 return NULL;
2544 }
2545
2546 initialised_setupterm = TRUE;
2547
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002548 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002549}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002550
2551static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002552PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002553{
Victor Stinner26486ea2010-05-15 22:23:53 +00002554 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002555
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002557
Victor Stinner26486ea2010-05-15 22:23:53 +00002558 switch(PyTuple_Size(args)) {
2559 case 1:
2560 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2561 break;
2562 default:
2563 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2564 return NULL;
2565 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002566
Victor Stinner26486ea2010-05-15 22:23:53 +00002567 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002568}
2569
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002570#ifdef HAVE_CURSES_IS_TERM_RESIZED
2571static PyObject *
2572PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2573{
Victor Stinner26486ea2010-05-15 22:23:53 +00002574 int lines;
2575 int columns;
2576 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002577
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002579
Victor Stinner26486ea2010-05-15 22:23:53 +00002580 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2581 return NULL;
2582 result = is_term_resized(lines, columns);
2583 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002584 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002585 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002586 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002587 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002588}
2589#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2590
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002591static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002592PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002593{
Victor Stinner26486ea2010-05-15 22:23:53 +00002594 const char *knp;
2595 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002596
Victor Stinner26486ea2010-05-15 22:23:53 +00002597 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002598
Victor Stinner26486ea2010-05-15 22:23:53 +00002599 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002600
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 if (ch < 0) {
2602 PyErr_SetString(PyExc_ValueError, "invalid key number");
2603 return NULL;
2604 }
2605 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002606
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002607 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002608}
2609
Victor Stinner26486ea2010-05-15 22:23:53 +00002610static PyObject *
2611PyCurses_KillChar(PyObject *self)
2612{
2613 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002614
Victor Stinner26486ea2010-05-15 22:23:53 +00002615 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002616
Victor Stinner26486ea2010-05-15 22:23:53 +00002617 return PyBytes_FromStringAndSize(&ch, 1);
2618}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002619
2620static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002621PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622{
Victor Stinner26486ea2010-05-15 22:23:53 +00002623 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002626
Victor Stinner26486ea2010-05-15 22:23:53 +00002627 switch(PyTuple_Size(args)) {
2628 case 1:
2629 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2630 break;
2631 default:
2632 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2633 return NULL;
2634 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002635
Victor Stinner26486ea2010-05-15 22:23:53 +00002636 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002637}
2638
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002639#ifdef NCURSES_MOUSE_VERSION
2640static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002641PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002642{
Victor Stinner26486ea2010-05-15 22:23:53 +00002643 int interval;
2644 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002645
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2647 return NULL;
2648 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002649}
2650
2651static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002652PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002653{
Victor Stinner26486ea2010-05-15 22:23:53 +00002654 int newmask;
2655 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002656
Victor Stinner26486ea2010-05-15 22:23:53 +00002657 PyCursesInitialised;
2658 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2659 return NULL;
2660 availmask = mousemask(newmask, &oldmask);
2661 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002662}
2663#endif
2664
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002665static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002666PyCurses_Napms(PyObject *self, PyObject *args)
2667{
2668 int ms;
2669
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002670 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002671 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002672
2673 return Py_BuildValue("i", napms(ms));
2674}
2675
2676
2677static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002678PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002679{
Victor Stinner26486ea2010-05-15 22:23:53 +00002680 WINDOW *win;
2681 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002682
Victor Stinner26486ea2010-05-15 22:23:53 +00002683 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002684
Victor Stinner26486ea2010-05-15 22:23:53 +00002685 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002686
Victor Stinner26486ea2010-05-15 22:23:53 +00002687 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002688
Victor Stinner26486ea2010-05-15 22:23:53 +00002689 if (win == NULL) {
2690 PyErr_SetString(PyCursesError, catchall_NULL);
2691 return NULL;
2692 }
2693
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002694 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002695}
2696
2697static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002698PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002699{
Victor Stinner26486ea2010-05-15 22:23:53 +00002700 WINDOW *win;
2701 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002702
Victor Stinner26486ea2010-05-15 22:23:53 +00002703 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002704
Victor Stinner26486ea2010-05-15 22:23:53 +00002705 switch (PyTuple_Size(args)) {
2706 case 2:
2707 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2708 return NULL;
2709 break;
2710 case 4:
2711 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2712 &nlines,&ncols,&begin_y,&begin_x))
2713 return NULL;
2714 break;
2715 default:
2716 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2717 return NULL;
2718 }
Guido van Rossum85738471995-02-17 13:50:17 +00002719
Victor Stinner26486ea2010-05-15 22:23:53 +00002720 win = newwin(nlines,ncols,begin_y,begin_x);
2721 if (win == NULL) {
2722 PyErr_SetString(PyCursesError, catchall_NULL);
2723 return NULL;
2724 }
Guido van Rossum85738471995-02-17 13:50:17 +00002725
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002726 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002727}
2728
2729static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002730PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002731{
Victor Stinner26486ea2010-05-15 22:23:53 +00002732 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002733
Victor Stinner26486ea2010-05-15 22:23:53 +00002734 PyCursesInitialised;
2735 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002736
Victor Stinner26486ea2010-05-15 22:23:53 +00002737 switch(PyTuple_Size(args)) {
2738 case 1:
2739 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2740 break;
2741 default:
2742 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2743 return NULL;
2744 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002745
Victor Stinner26486ea2010-05-15 22:23:53 +00002746 if (pair_content(pair, &f, &b)==ERR) {
2747 PyErr_SetString(PyCursesError,
2748 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2749 return NULL;
2750 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002753}
2754
2755static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002756PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002757{
Victor Stinner26486ea2010-05-15 22:23:53 +00002758 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002759
Victor Stinner26486ea2010-05-15 22:23:53 +00002760 PyCursesInitialised;
2761 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002762
Victor Stinner26486ea2010-05-15 22:23:53 +00002763 switch(PyTuple_Size(args)) {
2764 case 1:
2765 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2766 break;
2767 default:
2768 PyErr_SetString(PyExc_TypeError,
2769 "pair_number requires 1 argument");
2770 return NULL;
2771 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002774}
2775
2776static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002777PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002778{
Victor Stinner26486ea2010-05-15 22:23:53 +00002779 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002780
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002781 if (!PyArg_ParseTuple(args,"y;str", &str))
2782 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002783 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002784}
2785
2786static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002787PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002788{
Victor Stinner26486ea2010-05-15 22:23:53 +00002789 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002790
Victor Stinner26486ea2010-05-15 22:23:53 +00002791 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002792
Victor Stinner26486ea2010-05-15 22:23:53 +00002793 switch(PyTuple_Size(args)) {
2794 case 0:
2795 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002796 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002797 case 1:
2798 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2799 if (flag) qiflush();
2800 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002801 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002802 default:
2803 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2804 return NULL;
2805 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002806}
2807
Guido van Rossumd8faa362007-04-27 19:54:29 +00002808/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2809 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002810#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002811static int
2812update_lines_cols(void)
2813{
Victor Stinner26486ea2010-05-15 22:23:53 +00002814 PyObject *o;
2815 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002816 _Py_IDENTIFIER(LINES);
2817 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002818
Victor Stinner26486ea2010-05-15 22:23:53 +00002819 if (!m)
2820 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002821
Victor Stinner26486ea2010-05-15 22:23:53 +00002822 o = PyLong_FromLong(LINES);
2823 if (!o) {
2824 Py_DECREF(m);
2825 return 0;
2826 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002827 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002828 Py_DECREF(m);
2829 Py_DECREF(o);
2830 return 0;
2831 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002832 /* PyId_LINES.object will be initialized here. */
2833 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002834 Py_DECREF(m);
2835 Py_DECREF(o);
2836 return 0;
2837 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002838 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002839 o = PyLong_FromLong(COLS);
2840 if (!o) {
2841 Py_DECREF(m);
2842 return 0;
2843 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002844 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002845 Py_DECREF(m);
2846 Py_DECREF(o);
2847 return 0;
2848 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002849 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002850 Py_DECREF(m);
2851 Py_DECREF(o);
2852 return 0;
2853 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002854 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002855 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002856 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002857}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002858
2859static PyObject *
2860PyCurses_update_lines_cols(PyObject *self)
2861{
2862 return PyLong_FromLong((long) update_lines_cols());
2863}
2864
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002865#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002866
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002867#ifdef HAVE_CURSES_RESIZETERM
2868static PyObject *
2869PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2870{
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 int lines;
2872 int columns;
2873 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002874
Victor Stinner26486ea2010-05-15 22:23:53 +00002875 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002876
Victor Stinner26486ea2010-05-15 22:23:53 +00002877 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2878 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002879
Victor Stinner26486ea2010-05-15 22:23:53 +00002880 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2881 if (!result)
2882 return NULL;
2883 if (!update_lines_cols())
2884 return NULL;
2885 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002886}
2887
2888#endif
2889
2890#ifdef HAVE_CURSES_RESIZE_TERM
2891static PyObject *
2892PyCurses_Resize_Term(PyObject *self, PyObject *args)
2893{
Victor Stinner26486ea2010-05-15 22:23:53 +00002894 int lines;
2895 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002896
Victor Stinner26486ea2010-05-15 22:23:53 +00002897 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002898
Victor Stinner26486ea2010-05-15 22:23:53 +00002899 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002900
Victor Stinner26486ea2010-05-15 22:23:53 +00002901 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2902 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002903
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2905 if (!result)
2906 return NULL;
2907 if (!update_lines_cols())
2908 return NULL;
2909 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002910}
2911#endif /* HAVE_CURSES_RESIZE_TERM */
2912
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002913#ifdef getsyx
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002914static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002915PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002916{
Victor Stinner26486ea2010-05-15 22:23:53 +00002917 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002918
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002920
Victor Stinner26486ea2010-05-15 22:23:53 +00002921 if (PyTuple_Size(args)!=2) {
2922 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2923 return NULL;
2924 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002925
Victor Stinner26486ea2010-05-15 22:23:53 +00002926 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002927
Victor Stinner26486ea2010-05-15 22:23:53 +00002928 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002929
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002930 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002931}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02002932#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002933
2934static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002935PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002936{
Victor Stinner26486ea2010-05-15 22:23:53 +00002937 int code;
2938 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002939
Victor Stinner26486ea2010-05-15 22:23:53 +00002940 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002941
Victor Stinner26486ea2010-05-15 22:23:53 +00002942 code = start_color();
2943 if (code != ERR) {
2944 initialisedcolors = TRUE;
2945 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002946 if (c == NULL)
2947 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002948 PyDict_SetItemString(ModDict, "COLORS", c);
2949 Py_DECREF(c);
2950 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002951 if (cp == NULL)
2952 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2954 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002955 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002956 } else {
2957 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2958 return NULL;
2959 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002960}
2961
2962static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002963PyCurses_tigetflag(PyObject *self, PyObject *args)
2964{
Victor Stinner26486ea2010-05-15 22:23:53 +00002965 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002966
Victor Stinner26486ea2010-05-15 22:23:53 +00002967 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002968
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 if (!PyArg_ParseTuple(args, "s", &capname))
2970 return NULL;
2971
2972 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002973}
2974
2975static PyObject *
2976PyCurses_tigetnum(PyObject *self, PyObject *args)
2977{
Victor Stinner26486ea2010-05-15 22:23:53 +00002978 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002979
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002981
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 if (!PyArg_ParseTuple(args, "s", &capname))
2983 return NULL;
2984
2985 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002986}
2987
2988static PyObject *
2989PyCurses_tigetstr(PyObject *self, PyObject *args)
2990{
Victor Stinner26486ea2010-05-15 22:23:53 +00002991 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002994
Victor Stinner26486ea2010-05-15 22:23:53 +00002995 if (!PyArg_ParseTuple(args, "s", &capname))
2996 return NULL;
2997
2998 capname = tigetstr( capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02002999 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003000 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003001 }
3002 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003003}
3004
3005static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003006PyCurses_tparm(PyObject *self, PyObject *args)
3007{
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 char* fmt;
3009 char* result = NULL;
3010 int i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,i9=0;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003011
Victor Stinner26486ea2010-05-15 22:23:53 +00003012 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003013
Victor Stinner26621332011-11-02 23:45:29 +01003014 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003015 &fmt, &i1, &i2, &i3, &i4,
3016 &i5, &i6, &i7, &i8, &i9)) {
3017 return NULL;
3018 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003019
Victor Stinner26486ea2010-05-15 22:23:53 +00003020 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3021 if (!result) {
3022 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3023 return NULL;
3024 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003025
Victor Stinner26486ea2010-05-15 22:23:53 +00003026 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003027}
3028
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003029#ifdef HAVE_CURSES_TYPEAHEAD
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003030static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003031PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003032{
Victor Stinner26486ea2010-05-15 22:23:53 +00003033 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003034
Victor Stinner26486ea2010-05-15 22:23:53 +00003035 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003036
Victor Stinner26486ea2010-05-15 22:23:53 +00003037 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003038
Victor Stinner26486ea2010-05-15 22:23:53 +00003039 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003040}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003041#endif
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003042
3043static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003044PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003045{
Victor Stinner26486ea2010-05-15 22:23:53 +00003046 PyObject *temp;
3047 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003050
Victor Stinner26486ea2010-05-15 22:23:53 +00003051 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003052
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003053 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003054 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003055
Victor Stinner26486ea2010-05-15 22:23:53 +00003056 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003057}
3058
3059static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003060PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003061{
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 PyObject *temp;
3063 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003064
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003066
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003067 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003068 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003069
3070 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3071 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003072
Victor Stinner26486ea2010-05-15 22:23:53 +00003073 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003074}
3075
Victor Stinner71e44cb2011-09-06 01:53:03 +02003076#ifdef HAVE_NCURSESW
3077/* Convert an object to a character (wchar_t):
3078
3079 - int
3080 - str of length 1
3081
3082 Return 1 on success, 0 on error. */
3083static int
3084PyCurses_ConvertToWchar_t(PyObject *obj,
3085 wchar_t *wch)
3086{
3087 if (PyUnicode_Check(obj)) {
3088 wchar_t buffer[2];
3089 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3090 PyErr_Format(PyExc_TypeError,
3091 "expect bytes or str of length 1, or int, "
3092 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003093 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003094 return 0;
3095 }
3096 *wch = buffer[0];
3097 return 2;
3098 }
3099 else if (PyLong_CheckExact(obj)) {
3100 long value;
3101 int overflow;
3102 value = PyLong_AsLongAndOverflow(obj, &overflow);
3103 if (overflow) {
3104 PyErr_SetString(PyExc_OverflowError,
3105 "int doesn't fit in long");
3106 return 0;
3107 }
3108 *wch = (wchar_t)value;
3109 if ((long)*wch != value) {
3110 PyErr_Format(PyExc_OverflowError,
3111 "character doesn't fit in wchar_t");
3112 return 0;
3113 }
3114 return 1;
3115 }
3116 else {
3117 PyErr_Format(PyExc_TypeError,
3118 "expect bytes or str of length 1, or int, got %s",
3119 Py_TYPE(obj)->tp_name);
3120 return 0;
3121 }
3122}
3123
3124static PyObject *
3125PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3126{
3127 PyObject *obj;
3128 wchar_t wch;
3129
3130 PyCursesInitialised;
3131
3132 if (!PyArg_ParseTuple(args,"O", &obj))
3133 return NULL;
3134
3135 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3136 return NULL;
3137 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3138}
3139#endif
3140
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003141#ifdef HAVE_CURSES_TYPEAHEAD
Guido van Rossumf6971e21994-08-30 12:25:20 +00003142static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003143PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003144{
Victor Stinner26486ea2010-05-15 22:23:53 +00003145 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003146
Victor Stinner26486ea2010-05-15 22:23:53 +00003147 switch(PyTuple_Size(args)) {
3148 case 1:
3149 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3150 return NULL;
3151 break;
3152 default:
3153 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3154 return NULL;
3155 }
3156 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003157 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003158}
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003159#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00003160
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003161#ifndef STRICT_SYSV_CURSES
3162static PyObject *
3163PyCurses_Use_Default_Colors(PyObject *self)
3164{
Victor Stinner26486ea2010-05-15 22:23:53 +00003165 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003166
Victor Stinner26486ea2010-05-15 22:23:53 +00003167 PyCursesInitialised;
3168 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003169
Victor Stinner26486ea2010-05-15 22:23:53 +00003170 code = use_default_colors();
3171 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003172 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003173 } else {
3174 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3175 return NULL;
3176 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003177}
3178#endif /* STRICT_SYSV_CURSES */
3179
Guido van Rossumf6971e21994-08-30 12:25:20 +00003180/* List of functions defined in the module */
3181
3182static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003183 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3184 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3185 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3186 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3187 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3188 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3189 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3190 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3191 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3192 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3193 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3194 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3195 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3196 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003197#ifdef HAVE_CURSES_FILTER
Victor Stinner26486ea2010-05-15 22:23:53 +00003198 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003199#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003200 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3201 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003202#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003203 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3204 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003205#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003206#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003207 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003208#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003209 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3210 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3211 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3212 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003213#ifdef HAVE_CURSES_HAS_KEY
Victor Stinner26486ea2010-05-15 22:23:53 +00003214 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003215#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003216 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3217 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3218 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3219 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3220 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3221 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003222#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003223 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003224#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003225 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00003226 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3227 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3228 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003229#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003230 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3231 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003232#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003233 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3234 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3235 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3236 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3237 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3238 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3239 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3240 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3241 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3242 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3243 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3244 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3245 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3246 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3247 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3248 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3249 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003250#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003251 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003252#endif
3253#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003254 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003255#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003256 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003257#ifdef getsyx
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003259#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003260 {"setupterm", (PyCFunction)PyCurses_setupterm,
3261 METH_VARARGS|METH_KEYWORDS},
3262 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3263 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3264 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3265 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3266 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3267 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3268 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003269#ifdef HAVE_CURSES_TYPEAHEAD
Victor Stinner26486ea2010-05-15 22:23:53 +00003270 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003271#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003272 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3273 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003274#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3275 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3276#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003277#ifdef HAVE_NCURSESW
3278 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3279#endif
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003280#ifdef HAVE_CURSES_USE_ENV
Victor Stinner26486ea2010-05-15 22:23:53 +00003281 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Serhiy Storchakabaac01e2017-10-31 13:56:44 +02003282#endif
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003283#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003284 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003285#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003287};
3288
3289/* Initialization function for the module */
3290
Martin v. Löwis1a214512008-06-11 05:26:20 +00003291
3292static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003293 PyModuleDef_HEAD_INIT,
3294 "_curses",
3295 NULL,
3296 -1,
3297 PyCurses_methods,
3298 NULL,
3299 NULL,
3300 NULL,
3301 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003302};
3303
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003304PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003305PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003306{
Victor Stinner26486ea2010-05-15 22:23:53 +00003307 PyObject *m, *d, *v, *c_api_object;
3308 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003309
Victor Stinner26486ea2010-05-15 22:23:53 +00003310 /* Initialize object type */
3311 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3312 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003313
Victor Stinner26486ea2010-05-15 22:23:53 +00003314 /* Initialize the C API pointer array */
3315 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3316 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3317 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3318 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003319
Victor Stinner26486ea2010-05-15 22:23:53 +00003320 /* Create the module and add the functions */
3321 m = PyModule_Create(&_cursesmodule);
3322 if (m == NULL)
3323 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003324
Victor Stinner26486ea2010-05-15 22:23:53 +00003325 /* Add some symbolic constants to the module */
3326 d = PyModule_GetDict(m);
3327 if (d == NULL)
3328 return NULL;
3329 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003330
Victor Stinner26486ea2010-05-15 22:23:53 +00003331 /* Add a capsule for the C API */
3332 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3333 PyDict_SetItemString(d, "_C_API", c_api_object);
3334 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003335
Victor Stinner26486ea2010-05-15 22:23:53 +00003336 /* For exception curses.error */
3337 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3338 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003339
Victor Stinner26486ea2010-05-15 22:23:53 +00003340 /* Make the version available */
3341 v = PyBytes_FromString(PyCursesVersion);
3342 PyDict_SetItemString(d, "version", v);
3343 PyDict_SetItemString(d, "__version__", v);
3344 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003345
Victor Stinner26486ea2010-05-15 22:23:53 +00003346 SetDictInt("ERR", ERR);
3347 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003348
Victor Stinner26486ea2010-05-15 22:23:53 +00003349 /* Here are some attributes you can add to chars to print */
3350
3351 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3352 SetDictInt("A_NORMAL", A_NORMAL);
3353 SetDictInt("A_STANDOUT", A_STANDOUT);
3354 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3355 SetDictInt("A_REVERSE", A_REVERSE);
3356 SetDictInt("A_BLINK", A_BLINK);
3357 SetDictInt("A_DIM", A_DIM);
3358 SetDictInt("A_BOLD", A_BOLD);
3359 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Victor Stinner26486ea2010-05-15 22:23:53 +00003360 SetDictInt("A_INVIS", A_INVIS);
Victor Stinner26486ea2010-05-15 22:23:53 +00003361 SetDictInt("A_PROTECT", A_PROTECT);
3362 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3363 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003364
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003366#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003367 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003368#endif
3369#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003371#endif
3372#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003373 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003374#endif
3375#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003377#endif
3378#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003379 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003380#endif
3381#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003382 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003383#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003384
Xiang Zhang116dd5e2017-06-16 11:20:07 +08003385 /* ncurses extension */
3386#ifdef A_ITALIC
3387 SetDictInt("A_ITALIC", A_ITALIC);
3388#endif
3389
Victor Stinner26486ea2010-05-15 22:23:53 +00003390 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3391 SetDictInt("COLOR_RED", COLOR_RED);
3392 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3393 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3394 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3395 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3396 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3397 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003398
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003399#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003400 /* Mouse-related constants */
3401 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3402 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3403 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3404 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3405 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003406
Victor Stinner26486ea2010-05-15 22:23:53 +00003407 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3408 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3409 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3410 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3411 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003412
Victor Stinner26486ea2010-05-15 22:23:53 +00003413 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3414 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3415 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3416 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3417 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003418
Victor Stinner26486ea2010-05-15 22:23:53 +00003419 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3420 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3421 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3422 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3423 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003424
Victor Stinner26486ea2010-05-15 22:23:53 +00003425 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3426 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3427 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003428
Victor Stinner26486ea2010-05-15 22:23:53 +00003429 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3430 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003431#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 /* Now set everything up for KEY_ variables */
3433 {
3434 int key;
3435 char *key_n;
3436 char *key_n2;
Victor Stinner26486ea2010-05-15 22:23:53 +00003437 for (key=KEY_MIN;key < KEY_MAX; key++) {
3438 key_n = (char *)keyname(key);
3439 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3440 continue;
3441 if (strncmp(key_n,"KEY_F(",6)==0) {
3442 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003443 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003444 if (!key_n2) {
3445 PyErr_NoMemory();
3446 break;
3447 }
3448 p1 = key_n;
3449 p2 = key_n2;
3450 while (*p1) {
3451 if (*p1 != '(' && *p1 != ')') {
3452 *p2 = *p1;
3453 p2++;
3454 }
3455 p1++;
3456 }
3457 *p2 = (char)0;
3458 } else
3459 key_n2 = key_n;
3460 SetDictInt(key_n2,key);
3461 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003462 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003463 }
Victor Stinner26486ea2010-05-15 22:23:53 +00003464 SetDictInt("KEY_MIN", KEY_MIN);
3465 SetDictInt("KEY_MAX", KEY_MAX);
3466 }
3467 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003468}