blob: a70915143c1048e2bee9ce05723fcfb88a02f396 [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
Victor Stinner26486ea2010-05-15 22:23:53 +0000115/* These prototypes are in <term.h>, but including this header
116 #defines many common symbols (such as "lines") which breaks the
117 curses module in other ways. So the code will just specify
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000118 explicit prototypes here. */
119extern int setupterm(char *,int,int *);
Fred Drake0368bc42001-07-19 20:48:32 +0000120#ifdef __sgi
121#include <term.h>
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)")
487Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000488Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000489
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000490Window_NoArg2TupleReturnFunction(getyx, int, "ii")
491Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
492Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
493Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000494
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000495Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
496Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000497#if defined(__NetBSD__)
498Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
499#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000500Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000501#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000502Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000503#if defined(__NetBSD__)
504Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
505#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000506Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000507#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
509Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000510Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
512
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000513Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
514Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
515Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000516#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000517Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000518#endif
519
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000520/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000521
Guido van Rossumf6971e21994-08-30 12:25:20 +0000522static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100523PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000524{
Victor Stinner26486ea2010-05-15 22:23:53 +0000525 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000526
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100527 if (encoding == NULL) {
528#if defined(MS_WINDOWS)
529 char *buffer[100];
530 UINT cp;
531 cp = GetConsoleOutputCP();
532 if (cp != 0) {
533 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
534 encoding = buffer;
535 }
536#elif defined(CODESET)
537 const char *codeset = nl_langinfo(CODESET);
538 if (codeset != NULL && codeset[0] != 0)
539 encoding = codeset;
540#endif
541 if (encoding == NULL)
542 encoding = "utf-8";
543 }
544
Victor Stinner26486ea2010-05-15 22:23:53 +0000545 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
546 if (wo == NULL) return NULL;
547 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200548 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100549 if (wo->encoding == NULL) {
550 Py_DECREF(wo);
551 PyErr_NoMemory();
552 return NULL;
553 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000554 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000555}
556
557static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000558PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000559{
Victor Stinner26486ea2010-05-15 22:23:53 +0000560 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100561 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200562 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000563 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000564}
565
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000566/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000567
Larry Hastings61272b72014-01-07 12:41:53 -0800568/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700569
570curses.window.addch
571
572 [
Larry Hastings31826802013-10-19 00:09:25 -0700573 y: int
574 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700575 x: int
576 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700577 ]
578
579 ch: object
580 Character to add.
581
582 [
583 attr: long
584 Attributes for the character.
585 ]
586 /
587
588Paint character ch at (y, x) with attributes attr.
589
590Paint character ch at (y, x) with attributes attr,
591overwriting any character previously painted at that location.
592By default, the character position and attributes are the
593current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800594[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700595
Larry Hastings31826802013-10-19 00:09:25 -0700596static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400597curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
598 int x, PyObject *ch, int group_right_1, long attr)
599/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700600{
601 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
602 int coordinates_group = group_left_1;
603 int attr_group = group_right_1;
604 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100605 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100606 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200608 wchar_t wstr[2];
609 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100610#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100611 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000612
Larry Hastings31826802013-10-19 00:09:25 -0700613 if (!attr_group)
614 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000615
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100616#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200617 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100618 if (type == 2) {
619 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200620 wstr[1] = L'\0';
621 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700622 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200623 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100624 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200625 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100626 }
627 }
628 else
629#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300630 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100631#endif
632 if (type == 1) {
633 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700634 if (coordinates_group)
635 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100636 else {
Larry Hastings31826802013-10-19 00:09:25 -0700637 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100638 }
639 }
640 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000641 return NULL;
642 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100643 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000644}
645
646static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000647PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000648{
Victor Stinner26486ea2010-05-15 22:23:53 +0000649 int rtn;
650 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100651 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500652 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100653#ifdef HAVE_NCURSESW
654 wchar_t *wstr = NULL;
655#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000656 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
657 long lattr;
658 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000660
Victor Stinner26486ea2010-05-15 22:23:53 +0000661 switch (PyTuple_Size(args)) {
662 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 break;
666 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100667 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000668 return NULL;
669 attr = lattr;
670 use_attr = TRUE;
671 break;
672 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100673 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000674 return NULL;
675 use_xy = TRUE;
676 break;
677 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100678 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000679 return NULL;
680 attr = lattr;
681 use_xy = use_attr = TRUE;
682 break;
683 default:
684 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
685 return NULL;
686 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100687#ifdef HAVE_NCURSESW
688 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
689#else
690 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
691#endif
692 if (strtype == 0)
693 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000694 if (use_attr == TRUE) {
695 attr_old = getattrs(self->win);
696 (void)wattrset(self->win,attr);
697 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100698#ifdef HAVE_NCURSESW
699 if (strtype == 2) {
700 funcname = "addwstr";
701 if (use_xy == TRUE)
702 rtn = mvwaddwstr(self->win,y,x,wstr);
703 else
704 rtn = waddwstr(self->win,wstr);
705 PyMem_Free(wstr);
706 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000707 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100708#endif
709 {
710 char *str = PyBytes_AS_STRING(bytesobj);
711 funcname = "addstr";
712 if (use_xy == TRUE)
713 rtn = mvwaddstr(self->win,y,x,str);
714 else
715 rtn = waddstr(self->win,str);
716 Py_DECREF(bytesobj);
717 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000718 if (use_attr == TRUE)
719 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100720 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000721}
Guido van Rossum85738471995-02-17 13:50:17 +0000722
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000723static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000724PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000725{
Victor Stinner26486ea2010-05-15 22:23:53 +0000726 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100727 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500728 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100729#ifdef HAVE_NCURSESW
730 wchar_t *wstr = NULL;
731#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000732 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
733 long lattr;
734 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100735 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000736
Victor Stinner26486ea2010-05-15 22:23:53 +0000737 switch (PyTuple_Size(args)) {
738 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 break;
742 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100743 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000744 return NULL;
745 attr = lattr;
746 use_attr = TRUE;
747 break;
748 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100749 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000750 return NULL;
751 use_xy = TRUE;
752 break;
753 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100754 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000755 return NULL;
756 attr = lattr;
757 use_xy = use_attr = TRUE;
758 break;
759 default:
760 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
761 return NULL;
762 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100763#ifdef HAVE_NCURSESW
764 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
765#else
766 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
767#endif
768 if (strtype == 0)
769 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000770
Victor Stinner26486ea2010-05-15 22:23:53 +0000771 if (use_attr == TRUE) {
772 attr_old = getattrs(self->win);
773 (void)wattrset(self->win,attr);
774 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775#ifdef HAVE_NCURSESW
776 if (strtype == 2) {
777 funcname = "addnwstr";
778 if (use_xy == TRUE)
779 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
780 else
781 rtn = waddnwstr(self->win,wstr,n);
782 PyMem_Free(wstr);
783 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000784 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100785#endif
786 {
787 char *str = PyBytes_AS_STRING(bytesobj);
788 funcname = "addnstr";
789 if (use_xy == TRUE)
790 rtn = mvwaddnstr(self->win,y,x,str,n);
791 else
792 rtn = waddnstr(self->win,str,n);
793 Py_DECREF(bytesobj);
794 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000795 if (use_attr == TRUE)
796 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100797 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798}
799
800static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000801PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000802{
Victor Stinner26486ea2010-05-15 22:23:53 +0000803 PyObject *temp;
804 chtype bkgd;
805 attr_t attr = A_NORMAL;
806 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000807
Victor Stinner26486ea2010-05-15 22:23:53 +0000808 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000810 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
811 return NULL;
812 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000814 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
815 return NULL;
816 attr = lattr;
817 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000819 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
820 return NULL;
821 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000822
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100823 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000824 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000825
Victor Stinner26486ea2010-05-15 22:23:53 +0000826 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000827}
828
829static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000830PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
831{
Victor Stinner26486ea2010-05-15 22:23:53 +0000832 long lattr;
833 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
834 return NULL;
835 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000836}
837
838static PyObject *
839PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
840{
Victor Stinner26486ea2010-05-15 22:23:53 +0000841 long lattr;
842 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
843 return NULL;
844 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000845}
846
847static PyObject *
848PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
849{
Victor Stinner26486ea2010-05-15 22:23:53 +0000850 long lattr;
851 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
852 return NULL;
853 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000854}
855
856static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000857PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000858{
Victor Stinner26486ea2010-05-15 22:23:53 +0000859 PyObject *temp;
860 chtype bkgd;
861 attr_t attr = A_NORMAL;
862 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863
Victor Stinner26486ea2010-05-15 22:23:53 +0000864 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
867 return NULL;
868 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000869 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000870 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
871 return NULL;
872 attr = lattr;
873 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000875 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
876 return NULL;
877 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100879 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000880 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000881
Victor Stinner26486ea2010-05-15 22:23:53 +0000882 wbkgdset(self->win, bkgd | attr);
883 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884}
885
886static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000887PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000888{
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 PyObject *temp[8];
890 chtype ch[8];
891 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000892
Victor Stinner26486ea2010-05-15 22:23:53 +0000893 /* Clear the array of parameters */
894 for(i=0; i<8; i++) {
895 temp[i] = NULL;
896 ch[i] = 0;
897 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000898
Victor Stinner26486ea2010-05-15 22:23:53 +0000899 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
900 &temp[0], &temp[1], &temp[2], &temp[3],
901 &temp[4], &temp[5], &temp[6], &temp[7]))
902 return NULL;
903
904 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100905 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000906 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000907 }
908
909 wborder(self->win,
910 ch[0], ch[1], ch[2], ch[3],
911 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200912 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000913}
914
915static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000916PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000917{
Victor Stinner26486ea2010-05-15 22:23:53 +0000918 chtype ch1=0,ch2=0;
919 switch(PyTuple_Size(args)){
920 case 0: break;
921 default:
922 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
923 return NULL;
924 }
925 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200926 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000927}
928
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000929#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
930#define py_mvwdelch mvwdelch
931#else
932int py_mvwdelch(WINDOW *w, int y, int x)
933{
Victor Stinner26486ea2010-05-15 22:23:53 +0000934 mvwdelch(w,y,x);
935 /* On HP/UX, mvwdelch already returns. On other systems,
936 we may well run into this return statement. */
937 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000938}
939#endif
940
Guido van Rossumd8faa362007-04-27 19:54:29 +0000941/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
942
943static PyObject *
944PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
945{
Victor Stinner26486ea2010-05-15 22:23:53 +0000946 int rtn;
947 int x, y;
948 int num = -1;
949 short color;
950 attr_t attr = A_NORMAL;
951 long lattr;
952 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000953
Victor Stinner26486ea2010-05-15 22:23:53 +0000954 switch (PyTuple_Size(args)) {
955 case 1:
956 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
957 return NULL;
958 attr = lattr;
959 break;
960 case 2:
961 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
962 return NULL;
963 attr = lattr;
964 break;
965 case 3:
966 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
967 return NULL;
968 attr = lattr;
969 use_xy = TRUE;
970 break;
971 case 4:
972 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
973 return NULL;
974 attr = lattr;
975 use_xy = TRUE;
976 break;
977 default:
978 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
979 return NULL;
980 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000981
Victor Stinner26486ea2010-05-15 22:23:53 +0000982 color = (short)((attr >> 8) & 0xff);
983 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000984
Victor Stinner26486ea2010-05-15 22:23:53 +0000985 if (use_xy == TRUE) {
986 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
987 touchline(self->win,y,1);
988 } else {
989 getyx(self->win,y,x);
990 rtn = wchgat(self->win,num,attr,color,NULL);
991 touchline(self->win,y,1);
992 }
993 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000994}
995
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000996
Guido van Rossumf6971e21994-08-30 12:25:20 +0000997static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000998PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000999{
Victor Stinner26486ea2010-05-15 22:23:53 +00001000 int rtn;
1001 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001002
Victor Stinner26486ea2010-05-15 22:23:53 +00001003 switch (PyTuple_Size(args)) {
1004 case 0:
1005 rtn = wdelch(self->win);
1006 break;
1007 case 2:
1008 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1009 return NULL;
1010 rtn = py_mvwdelch(self->win,y,x);
1011 break;
1012 default:
1013 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1014 return NULL;
1015 }
1016 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001017}
1018
1019static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001020PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001021{
Victor Stinner26486ea2010-05-15 22:23:53 +00001022 WINDOW *win;
1023 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001024
Victor Stinner26486ea2010-05-15 22:23:53 +00001025 nlines = 0;
1026 ncols = 0;
1027 switch (PyTuple_Size(args)) {
1028 case 2:
1029 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1030 return NULL;
1031 break;
1032 case 4:
1033 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1034 &nlines,&ncols,&begin_y,&begin_x))
1035 return NULL;
1036 break;
1037 default:
1038 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1039 return NULL;
1040 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001041
Victor Stinner26486ea2010-05-15 22:23:53 +00001042 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001043
Victor Stinner26486ea2010-05-15 22:23:53 +00001044 if (win == NULL) {
1045 PyErr_SetString(PyCursesError, catchall_NULL);
1046 return NULL;
1047 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001048
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001049 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001050}
1051
1052static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001053PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001054{
Victor Stinner26486ea2010-05-15 22:23:53 +00001055 PyObject *temp;
1056 chtype ch;
1057 attr_t attr = A_NORMAL;
1058 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001059
Victor Stinner26486ea2010-05-15 22:23:53 +00001060 switch (PyTuple_Size(args)) {
1061 case 1:
1062 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1063 return NULL;
1064 break;
1065 case 2:
1066 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1067 return NULL;
1068 attr = lattr;
1069 break;
1070 default:
1071 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001072
1073
Victor Stinner26486ea2010-05-15 22:23:53 +00001074 return NULL;
1075 }
Guido van Rossum85738471995-02-17 13:50:17 +00001076
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001077 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001078 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001079
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001080#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001081 if (self->win->_flags & _ISPAD)
1082 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1083 "echochar");
1084 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001085#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001086 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1087 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001088}
1089
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001090#ifdef NCURSES_MOUSE_VERSION
1091static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001092PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001093{
Victor Stinner26486ea2010-05-15 22:23:53 +00001094 int x, y;
1095 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1096 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001097
Victor Stinner26486ea2010-05-15 22:23:53 +00001098 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001099}
1100#endif
1101
Guido van Rossumf6971e21994-08-30 12:25:20 +00001102static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001103PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001104{
Victor Stinner26486ea2010-05-15 22:23:53 +00001105 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001106}
1107
1108static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001109PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001110{
Victor Stinner26486ea2010-05-15 22:23:53 +00001111 int x, y;
1112 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001113
Victor Stinner26486ea2010-05-15 22:23:53 +00001114 switch (PyTuple_Size(args)) {
1115 case 0:
1116 Py_BEGIN_ALLOW_THREADS
1117 rtn = wgetch(self->win);
1118 Py_END_ALLOW_THREADS
1119 break;
1120 case 2:
1121 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1122 return NULL;
1123 Py_BEGIN_ALLOW_THREADS
1124 rtn = mvwgetch(self->win,y,x);
1125 Py_END_ALLOW_THREADS
1126 break;
1127 default:
1128 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1129 return NULL;
1130 }
1131 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001132}
Guido van Rossum85738471995-02-17 13:50:17 +00001133
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001134static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001135PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001136{
Victor Stinner26486ea2010-05-15 22:23:53 +00001137 int x, y;
1138 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001139
Victor Stinner26486ea2010-05-15 22:23:53 +00001140 switch (PyTuple_Size(args)) {
1141 case 0:
1142 Py_BEGIN_ALLOW_THREADS
1143 rtn = wgetch(self->win);
1144 Py_END_ALLOW_THREADS
1145 break;
1146 case 2:
1147 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1148 return NULL;
1149 Py_BEGIN_ALLOW_THREADS
1150 rtn = mvwgetch(self->win,y,x);
1151 Py_END_ALLOW_THREADS
1152 break;
1153 default:
1154 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1155 return NULL;
1156 }
1157 if (rtn == ERR) {
1158 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001159 PyErr_CheckSignals();
1160 if (!PyErr_Occurred())
1161 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001162 return NULL;
1163 } else if (rtn<=255) {
1164 return Py_BuildValue("C", rtn);
1165 } else {
1166 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001167#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001168 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001169#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001170 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001171#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001172 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1173 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001174}
1175
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001176#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001177static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001178PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1179{
1180 int x, y;
1181 int ct;
1182 wint_t rtn;
1183
1184 switch (PyTuple_Size(args)) {
1185 case 0:
1186 Py_BEGIN_ALLOW_THREADS
1187 ct = wget_wch(self->win,&rtn);
1188 Py_END_ALLOW_THREADS
1189 break;
1190 case 2:
1191 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1192 return NULL;
1193 Py_BEGIN_ALLOW_THREADS
1194 ct = mvwget_wch(self->win,y,x,&rtn);
1195 Py_END_ALLOW_THREADS
1196 break;
1197 default:
1198 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1199 return NULL;
1200 }
1201 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001202 if (PyErr_CheckSignals())
1203 return NULL;
1204
Victor Stinnera7878b72011-07-14 23:07:44 +02001205 /* get_wch() returns ERR in nodelay mode */
1206 PyErr_SetString(PyCursesError, "no input");
1207 return NULL;
1208 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001209 if (ct == KEY_CODE_YES)
1210 return PyLong_FromLong(rtn);
1211 else
1212 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001213}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001214#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001215
1216static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001217PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001218{
Victor Stinner26486ea2010-05-15 22:23:53 +00001219 int x, y, n;
1220 char rtn[1024]; /* This should be big enough.. I hope */
1221 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001222
Victor Stinner26486ea2010-05-15 22:23:53 +00001223 switch (PyTuple_Size(args)) {
1224 case 0:
1225 Py_BEGIN_ALLOW_THREADS
1226 rtn2 = wgetnstr(self->win,rtn, 1023);
1227 Py_END_ALLOW_THREADS
1228 break;
1229 case 1:
1230 if (!PyArg_ParseTuple(args,"i;n", &n))
1231 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001232 if (n < 0) {
1233 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1234 return NULL;
1235 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001236 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001237 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001238 Py_END_ALLOW_THREADS
1239 break;
1240 case 2:
1241 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1242 return NULL;
1243 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001244#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001245 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001246#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001247 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001248#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001249 Py_END_ALLOW_THREADS
1250 break;
1251 case 3:
1252 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1253 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001254 if (n < 0) {
1255 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1256 return NULL;
1257 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001258#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001259 Py_BEGIN_ALLOW_THREADS
1260 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001261 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001262 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001263#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001264 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001265 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001266 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001267#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001268 break;
1269 default:
1270 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1271 return NULL;
1272 }
1273 if (rtn2 == ERR)
1274 rtn[0] = 0;
1275 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001276}
1277
1278static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001279PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001280{
Victor Stinner26486ea2010-05-15 22:23:53 +00001281 PyObject *temp;
1282 chtype ch;
1283 int n, x, y, code = OK;
1284 attr_t attr = A_NORMAL;
1285 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001286
Victor Stinner26486ea2010-05-15 22:23:53 +00001287 switch (PyTuple_Size(args)) {
1288 case 2:
1289 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1290 return NULL;
1291 break;
1292 case 3:
1293 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1294 return NULL;
1295 attr = lattr;
1296 break;
1297 case 4:
1298 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1299 return NULL;
1300 code = wmove(self->win, y, x);
1301 break;
1302 case 5:
1303 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1304 &y, &x, &temp, &n, &lattr))
1305 return NULL;
1306 attr = lattr;
1307 code = wmove(self->win, y, x);
1308 break;
1309 default:
1310 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1311 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001312 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001313
1314 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001315 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001316 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001317 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1318 } else
1319 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001320}
1321
1322static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001323PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001324{
Victor Stinner26486ea2010-05-15 22:23:53 +00001325 int rtn, x, y, use_xy = FALSE;
1326 PyObject *temp;
1327 chtype ch = 0;
1328 attr_t attr = A_NORMAL;
1329 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001330
Victor Stinner26486ea2010-05-15 22:23:53 +00001331 switch (PyTuple_Size(args)) {
1332 case 1:
1333 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1334 return NULL;
1335 break;
1336 case 2:
1337 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1338 return NULL;
1339 attr = lattr;
1340 break;
1341 case 3:
1342 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1343 return NULL;
1344 use_xy = TRUE;
1345 break;
1346 case 4:
1347 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1348 return NULL;
1349 attr = lattr;
1350 use_xy = TRUE;
1351 break;
1352 default:
1353 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1354 return NULL;
1355 }
1356
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001357 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001358 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001359
1360 if (use_xy == TRUE)
1361 rtn = mvwinsch(self->win,y,x, ch | attr);
1362 else {
1363 rtn = winsch(self->win, ch | attr);
1364 }
1365 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001366}
1367
1368static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001369PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001370{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001371 int x, y;
1372 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001373
Victor Stinner26486ea2010-05-15 22:23:53 +00001374 switch (PyTuple_Size(args)) {
1375 case 0:
1376 rtn = winch(self->win);
1377 break;
1378 case 2:
1379 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1380 return NULL;
1381 rtn = mvwinch(self->win,y,x);
1382 break;
1383 default:
1384 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1385 return NULL;
1386 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001387 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001388}
1389
1390static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001391PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001392{
Victor Stinner26486ea2010-05-15 22:23:53 +00001393 int x, y, n;
1394 char rtn[1024]; /* This should be big enough.. I hope */
1395 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001396
Victor Stinner26486ea2010-05-15 22:23:53 +00001397 switch (PyTuple_Size(args)) {
1398 case 0:
1399 rtn2 = winnstr(self->win,rtn, 1023);
1400 break;
1401 case 1:
1402 if (!PyArg_ParseTuple(args,"i;n", &n))
1403 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001404 if (n < 0) {
1405 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1406 return NULL;
1407 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001408 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001409 break;
1410 case 2:
1411 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1412 return NULL;
1413 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1414 break;
1415 case 3:
1416 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1417 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001418 if (n < 0) {
1419 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1420 return NULL;
1421 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001422 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001423 break;
1424 default:
1425 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1426 return NULL;
1427 }
1428 if (rtn2 == ERR)
1429 rtn[0] = 0;
1430 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001431}
1432
1433static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001434PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001435{
Victor Stinner26486ea2010-05-15 22:23:53 +00001436 int rtn;
1437 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001438 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001439 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001440#ifdef HAVE_NCURSESW
1441 wchar_t *wstr = NULL;
1442#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001443 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1444 long lattr;
1445 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001446 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001447
Victor Stinner26486ea2010-05-15 22:23:53 +00001448 switch (PyTuple_Size(args)) {
1449 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001450 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001451 return NULL;
1452 break;
1453 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001454 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001455 return NULL;
1456 attr = lattr;
1457 use_attr = TRUE;
1458 break;
1459 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001460 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001461 return NULL;
1462 use_xy = TRUE;
1463 break;
1464 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001465 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001466 return NULL;
1467 attr = lattr;
1468 use_xy = use_attr = TRUE;
1469 break;
1470 default:
1471 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1472 return NULL;
1473 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001474
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001475#ifdef HAVE_NCURSESW
1476 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1477#else
1478 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1479#endif
1480 if (strtype == 0)
1481 return NULL;
1482
Victor Stinner26486ea2010-05-15 22:23:53 +00001483 if (use_attr == TRUE) {
1484 attr_old = getattrs(self->win);
1485 (void)wattrset(self->win,attr);
1486 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001487#ifdef HAVE_NCURSESW
1488 if (strtype == 2) {
1489 funcname = "inswstr";
1490 if (use_xy == TRUE)
1491 rtn = mvwins_wstr(self->win,y,x,wstr);
1492 else
1493 rtn = wins_wstr(self->win,wstr);
1494 PyMem_Free(wstr);
1495 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001496 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001497#endif
1498 {
1499 char *str = PyBytes_AS_STRING(bytesobj);
1500 funcname = "insstr";
1501 if (use_xy == TRUE)
1502 rtn = mvwinsstr(self->win,y,x,str);
1503 else
1504 rtn = winsstr(self->win,str);
1505 Py_DECREF(bytesobj);
1506 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001507 if (use_attr == TRUE)
1508 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001509 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001510}
1511
1512static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001513PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001514{
Victor Stinner26486ea2010-05-15 22:23:53 +00001515 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001516 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001517 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001518#ifdef HAVE_NCURSESW
1519 wchar_t *wstr = NULL;
1520#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001521 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1522 long lattr;
1523 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001524 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001525
Victor Stinner26486ea2010-05-15 22:23:53 +00001526 switch (PyTuple_Size(args)) {
1527 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001528 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001529 return NULL;
1530 break;
1531 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001532 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001533 return NULL;
1534 attr = lattr;
1535 use_attr = TRUE;
1536 break;
1537 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001538 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001539 return NULL;
1540 use_xy = TRUE;
1541 break;
1542 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001543 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001544 return NULL;
1545 attr = lattr;
1546 use_xy = use_attr = TRUE;
1547 break;
1548 default:
1549 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1550 return NULL;
1551 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001552
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001553#ifdef HAVE_NCURSESW
1554 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1555#else
1556 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1557#endif
1558 if (strtype == 0)
1559 return NULL;
1560
Victor Stinner26486ea2010-05-15 22:23:53 +00001561 if (use_attr == TRUE) {
1562 attr_old = getattrs(self->win);
1563 (void)wattrset(self->win,attr);
1564 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001565#ifdef HAVE_NCURSESW
1566 if (strtype == 2) {
1567 funcname = "insn_wstr";
1568 if (use_xy == TRUE)
1569 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1570 else
1571 rtn = wins_nwstr(self->win,wstr,n);
1572 PyMem_Free(wstr);
1573 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001574 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001575#endif
1576 {
1577 char *str = PyBytes_AS_STRING(bytesobj);
1578 funcname = "insnstr";
1579 if (use_xy == TRUE)
1580 rtn = mvwinsnstr(self->win,y,x,str,n);
1581 else
1582 rtn = winsnstr(self->win,str,n);
1583 Py_DECREF(bytesobj);
1584 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001585 if (use_attr == TRUE)
1586 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001587 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001588}
1589
1590static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001591PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001592{
Victor Stinner26486ea2010-05-15 22:23:53 +00001593 int line, erg;
1594 if (!PyArg_ParseTuple(args,"i;line", &line))
1595 return NULL;
1596 erg = is_linetouched(self->win, line);
1597 if (erg == ERR) {
1598 PyErr_SetString(PyExc_TypeError,
1599 "is_linetouched: line number outside of boundaries");
1600 return NULL;
1601 } else
1602 if (erg == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001603 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001604 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001605 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001606 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001607}
1608
1609static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001610PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001611{
Victor Stinner26486ea2010-05-15 22:23:53 +00001612 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1613 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001614
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001615#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001616 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001617#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001618 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001619#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001620 {
1621 switch(PyTuple_Size(args)) {
1622 case 6:
1623 if (!PyArg_ParseTuple(args,
1624 "iiiiii;" \
1625 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1626 &pminrow, &pmincol, &sminrow,
1627 &smincol, &smaxrow, &smaxcol))
1628 return NULL;
1629 Py_BEGIN_ALLOW_THREADS
1630 rtn = pnoutrefresh(self->win,
1631 pminrow, pmincol, sminrow,
1632 smincol, smaxrow, smaxcol);
1633 Py_END_ALLOW_THREADS
1634 return PyCursesCheckERR(rtn, "pnoutrefresh");
1635 default:
1636 PyErr_SetString(PyCursesError,
1637 "noutrefresh() called for a pad "
1638 "requires 6 arguments");
1639 return NULL;
1640 }
1641 } else {
1642 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1643 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001644
Victor Stinner26486ea2010-05-15 22:23:53 +00001645 Py_BEGIN_ALLOW_THREADS
1646 rtn = wnoutrefresh(self->win);
1647 Py_END_ALLOW_THREADS
1648 return PyCursesCheckERR(rtn, "wnoutrefresh");
1649 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001650}
1651
1652static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001653PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1654{
1655 PyCursesWindowObject *temp;
1656 int use_copywin = FALSE;
1657 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1658 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001659
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001660 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001661 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001662 if (!PyArg_ParseTuple(args, "O!;window object",
1663 &PyCursesWindow_Type, &temp))
1664 return NULL;
1665 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001666 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001667 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1668 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1669 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1670 return NULL;
1671 use_copywin = TRUE;
1672 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001673 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001674 PyErr_SetString(PyExc_TypeError,
1675 "overlay requires one or seven arguments");
1676 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001677 }
1678
1679 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001680 rtn = copywin(self->win, temp->win, sminrow, smincol,
1681 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1682 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001683 }
1684 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001685 rtn = overlay(self->win, temp->win);
1686 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001687 }
1688}
1689
1690static PyObject *
1691PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1692{
1693 PyCursesWindowObject *temp;
1694 int use_copywin = FALSE;
1695 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1696 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001697
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001698 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001699 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001700 if (!PyArg_ParseTuple(args, "O!;window object",
1701 &PyCursesWindow_Type, &temp))
1702 return NULL;
1703 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001704 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001705 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1706 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1707 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1708 return NULL;
1709 use_copywin = TRUE;
1710 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001711 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001712 PyErr_SetString(PyExc_TypeError,
1713 "overwrite requires one or seven arguments");
1714 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001715 }
1716
1717 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001718 rtn = copywin(self->win, temp->win, sminrow, smincol,
1719 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001720 return PyCursesCheckERR(rtn, "copywin");
1721 }
1722 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001723 rtn = overwrite(self->win, temp->win);
1724 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001725 }
1726}
1727
1728static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001729PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001730{
Victor Stinner26486ea2010-05-15 22:23:53 +00001731 /* We have to simulate this by writing to a temporary FILE*,
1732 then reading back, then writing to the argument stream. */
Christian Heimes2b221b72017-03-02 11:09:01 +01001733 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001734 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001735
Christian Heimes2b221b72017-03-02 11:09:01 +01001736 fp = tmpfile();
1737 if (fp == NULL)
1738 return PyErr_SetFromErrno(PyExc_OSError);
1739 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001740 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001741 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001742 if (res == NULL)
1743 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001744 fseek(fp, 0, 0);
1745 while (1) {
1746 char buf[BUFSIZ];
1747 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001748 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001749
Victor Stinner26486ea2010-05-15 22:23:53 +00001750 if (n <= 0)
1751 break;
1752 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001753 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001754 if (res == NULL)
1755 break;
1756 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001757
1758exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01001759 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001760 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001761}
1762
1763static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001764PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001765{
Victor Stinner26486ea2010-05-15 22:23:53 +00001766 int beg, num;
1767 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1768 return NULL;
1769 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001770}
1771
1772static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001773PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001774{
Victor Stinner26486ea2010-05-15 22:23:53 +00001775 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1776 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001777
Victor Stinner26486ea2010-05-15 22:23:53 +00001778#ifndef WINDOW_HAS_FLAGS
1779 if (0)
1780#else
1781 if (self->win->_flags & _ISPAD)
1782#endif
1783 {
1784 switch(PyTuple_Size(args)) {
1785 case 6:
1786 if (!PyArg_ParseTuple(args,
1787 "iiiiii;" \
1788 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1789 &pminrow, &pmincol, &sminrow,
1790 &smincol, &smaxrow, &smaxcol))
1791 return NULL;
1792
1793 Py_BEGIN_ALLOW_THREADS
1794 rtn = prefresh(self->win,
1795 pminrow, pmincol, sminrow,
1796 smincol, smaxrow, smaxcol);
1797 Py_END_ALLOW_THREADS
1798 return PyCursesCheckERR(rtn, "prefresh");
1799 default:
1800 PyErr_SetString(PyCursesError,
1801 "refresh() for a pad requires 6 arguments");
1802 return NULL;
1803 }
1804 } else {
1805 if (!PyArg_ParseTuple(args, ":refresh"))
1806 return NULL;
1807 Py_BEGIN_ALLOW_THREADS
1808 rtn = wrefresh(self->win);
1809 Py_END_ALLOW_THREADS
1810 return PyCursesCheckERR(rtn, "prefresh");
1811 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001812}
1813
1814static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001815PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001816{
Victor Stinner26486ea2010-05-15 22:23:53 +00001817 int x, y;
1818 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1819 return NULL;
1820 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001821}
1822
1823static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001824PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001825{
Victor Stinner26486ea2010-05-15 22:23:53 +00001826 WINDOW *win;
1827 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001828
Victor Stinner26486ea2010-05-15 22:23:53 +00001829 nlines = 0;
1830 ncols = 0;
1831 switch (PyTuple_Size(args)) {
1832 case 2:
1833 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1834 return NULL;
1835 break;
1836 case 4:
1837 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1838 &nlines,&ncols,&begin_y,&begin_x))
1839 return NULL;
1840 break;
1841 default:
1842 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1843 return NULL;
1844 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001845
Victor Stinner26486ea2010-05-15 22:23:53 +00001846 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001847#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001848 if (self->win->_flags & _ISPAD)
1849 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1850 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001851#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001852 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001853
Victor Stinner26486ea2010-05-15 22:23:53 +00001854 if (win == NULL) {
1855 PyErr_SetString(PyCursesError, catchall_NULL);
1856 return NULL;
1857 }
1858
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001859 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001860}
1861
1862static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001863PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001864{
Victor Stinner26486ea2010-05-15 22:23:53 +00001865 int nlines;
1866 switch(PyTuple_Size(args)) {
1867 case 0:
1868 return PyCursesCheckERR(scroll(self->win), "scroll");
1869 case 1:
1870 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1871 return NULL;
1872 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1873 default:
1874 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1875 return NULL;
1876 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001877}
1878
1879static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001880PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001881{
Victor Stinner26486ea2010-05-15 22:23:53 +00001882 int st, cnt, val;
1883 switch (PyTuple_Size(args)) {
1884 case 2:
1885 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1886 return NULL;
1887 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1888 case 3:
1889 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1890 return NULL;
1891 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1892 default:
1893 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1894 return NULL;
1895 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896}
1897
1898static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001899PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001900{
Victor Stinner26486ea2010-05-15 22:23:53 +00001901 PyObject *temp;
1902 chtype ch;
1903 int n, x, y, code = OK;
1904 attr_t attr = A_NORMAL;
1905 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001906
Victor Stinner26486ea2010-05-15 22:23:53 +00001907 switch (PyTuple_Size(args)) {
1908 case 2:
1909 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1910 return NULL;
1911 break;
1912 case 3:
1913 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1914 return NULL;
1915 attr = lattr;
1916 break;
1917 case 4:
1918 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1919 return NULL;
1920 code = wmove(self->win, y, x);
1921 break;
1922 case 5:
1923 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1924 &y, &x, &temp, &n, &lattr))
1925 return NULL;
1926 attr = lattr;
1927 code = wmove(self->win, y, x);
1928 break;
1929 default:
1930 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1931 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001932 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001933
1934 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001935 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001936 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001937 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1938 } else
1939 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001940}
1941
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001942static PyObject *
1943PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1944{
1945 return PyUnicode_FromString(self->encoding);
1946}
1947
1948static int
1949PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1950{
1951 PyObject *ascii;
1952 char *encoding;
1953
1954 /* It is illegal to del win.encoding */
1955 if (value == NULL) {
1956 PyErr_SetString(PyExc_TypeError,
1957 "encoding may not be deleted");
1958 return -1;
1959 }
1960
1961 if (!PyUnicode_Check(value)) {
1962 PyErr_SetString(PyExc_TypeError,
1963 "setting encoding to a non-string");
1964 return -1;
1965 }
1966 ascii = PyUnicode_AsASCIIString(value);
1967 if (ascii == NULL)
1968 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001969 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001970 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001971 if (encoding == NULL) {
1972 PyErr_NoMemory();
1973 return -1;
1974 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001975 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001976 self->encoding = encoding;
1977 return 0;
1978}
1979
1980
Guido van Rossumf6971e21994-08-30 12:25:20 +00001981static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001982 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001983 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1984 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1985 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1986 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1987 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1988 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1989 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1990 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1991 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1992 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1993 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1994 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1995 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1996 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1997 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1998 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1999 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2000 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2001 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002002#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002003 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002004#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002005 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2006 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2007 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2008 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2009 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002010#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002011 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002012#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002013 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2014 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2015 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2016 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2017 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2018 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2019 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2020 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2021 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2022 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2023 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2024 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2025 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2026 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2027 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2028 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2029 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2030 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2031 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2032 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2033 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2034 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2035 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2036 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2037 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002038 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2039 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2040 METH_VARARGS},
2041 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2042 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2043 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2044 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002045#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002046 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002047#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002048 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2049 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2050 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2051 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2052 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2053 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2054 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2055 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2056 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2057 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2058 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2059 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2060 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2061 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2062 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2063 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002064};
2065
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002066static PyGetSetDef PyCursesWindow_getsets[] = {
2067 {"encoding",
2068 (getter)PyCursesWindow_get_encoding,
2069 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002070 "the typecode character used to create the array"},
2071 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002072};
2073
Guido van Rossumf6971e21994-08-30 12:25:20 +00002074/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002075
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002076PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002077 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002078 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002079 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2080 0, /*tp_itemsize*/
2081 /* methods */
2082 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2083 0, /*tp_print*/
2084 (getattrfunc)0, /*tp_getattr*/
2085 (setattrfunc)0, /*tp_setattr*/
2086 0, /*tp_reserved*/
2087 0, /*tp_repr*/
2088 0, /*tp_as_number*/
2089 0, /*tp_as_sequence*/
2090 0, /*tp_as_mapping*/
2091 0, /*tp_hash*/
2092 0, /*tp_call*/
2093 0, /*tp_str*/
2094 0, /*tp_getattro*/
2095 0, /*tp_setattro*/
2096 0, /*tp_as_buffer*/
2097 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2098 0, /*tp_doc*/
2099 0, /*tp_traverse*/
2100 0, /*tp_clear*/
2101 0, /*tp_richcompare*/
2102 0, /*tp_weaklistoffset*/
2103 0, /*tp_iter*/
2104 0, /*tp_iternext*/
2105 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002106 0, /* tp_members */
2107 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002108};
2109
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002110/*********************************************************************
2111 Global Functions
2112**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002113
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002114NoArgNoReturnFunction(beep)
2115NoArgNoReturnFunction(def_prog_mode)
2116NoArgNoReturnFunction(def_shell_mode)
2117NoArgNoReturnFunction(doupdate)
2118NoArgNoReturnFunction(endwin)
2119NoArgNoReturnFunction(flash)
2120NoArgNoReturnFunction(nocbreak)
2121NoArgNoReturnFunction(noecho)
2122NoArgNoReturnFunction(nonl)
2123NoArgNoReturnFunction(noraw)
2124NoArgNoReturnFunction(reset_prog_mode)
2125NoArgNoReturnFunction(reset_shell_mode)
2126NoArgNoReturnFunction(resetty)
2127NoArgNoReturnFunction(savetty)
2128
2129NoArgOrFlagNoReturnFunction(cbreak)
2130NoArgOrFlagNoReturnFunction(echo)
2131NoArgOrFlagNoReturnFunction(nl)
2132NoArgOrFlagNoReturnFunction(raw)
2133
2134NoArgReturnIntFunction(baudrate)
2135NoArgReturnIntFunction(termattrs)
2136
2137NoArgReturnStringFunction(termname)
2138NoArgReturnStringFunction(longname)
2139
2140NoArgTrueFalseFunction(can_change_color)
2141NoArgTrueFalseFunction(has_colors)
2142NoArgTrueFalseFunction(has_ic)
2143NoArgTrueFalseFunction(has_il)
2144NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002145NoArgNoReturnVoidFunction(flushinp)
2146NoArgNoReturnVoidFunction(noqiflush)
2147
2148static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002149PyCurses_filter(PyObject *self)
2150{
Victor Stinner26486ea2010-05-15 22:23:53 +00002151 /* not checking for PyCursesInitialised here since filter() must
2152 be called before initscr() */
2153 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002154 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002155}
2156
2157static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002158PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002159{
Victor Stinner26486ea2010-05-15 22:23:53 +00002160 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002161
Victor Stinner26486ea2010-05-15 22:23:53 +00002162 PyCursesInitialised;
2163 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164
Victor Stinner26486ea2010-05-15 22:23:53 +00002165 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002166
Victor Stinner26486ea2010-05-15 22:23:53 +00002167 if (color_content(color, &r, &g, &b) != ERR)
2168 return Py_BuildValue("(iii)", r, g, b);
2169 else {
2170 PyErr_SetString(PyCursesError,
2171 "Argument 1 was out of range. Check value of COLORS.");
2172 return NULL;
2173 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002174}
2175
2176static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002177PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002178{
Victor Stinner26486ea2010-05-15 22:23:53 +00002179 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002180
Victor Stinner26486ea2010-05-15 22:23:53 +00002181 PyCursesInitialised;
2182 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183
Victor Stinner26486ea2010-05-15 22:23:53 +00002184 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2185 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186}
2187
2188static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002189PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002190{
Victor Stinner26486ea2010-05-15 22:23:53 +00002191 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002192
Victor Stinner26486ea2010-05-15 22:23:53 +00002193 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002194
Victor Stinner26486ea2010-05-15 22:23:53 +00002195 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196
Victor Stinner26486ea2010-05-15 22:23:53 +00002197 erg = curs_set(vis);
2198 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002199
Victor Stinner26486ea2010-05-15 22:23:53 +00002200 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201}
2202
2203static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002204PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002205{
Victor Stinner26486ea2010-05-15 22:23:53 +00002206 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002209
Victor Stinner26486ea2010-05-15 22:23:53 +00002210 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002211
Victor Stinner26486ea2010-05-15 22:23:53 +00002212 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213}
2214
2215static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002216PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002217{
Victor Stinner26486ea2010-05-15 22:23:53 +00002218 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221
Victor Stinner26486ea2010-05-15 22:23:53 +00002222 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223
Victor Stinner26486ea2010-05-15 22:23:53 +00002224 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225}
2226
2227static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002228PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229{
Victor Stinner26486ea2010-05-15 22:23:53 +00002230 int x = 0;
2231 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232
Victor Stinner26486ea2010-05-15 22:23:53 +00002233 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002238}
2239
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002240#ifdef NCURSES_MOUSE_VERSION
2241static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002242PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002243{
Victor Stinner26486ea2010-05-15 22:23:53 +00002244 int rtn;
2245 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002246
Victor Stinner26486ea2010-05-15 22:23:53 +00002247 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002248
Victor Stinner26486ea2010-05-15 22:23:53 +00002249 rtn = getmouse( &event );
2250 if (rtn == ERR) {
2251 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2252 return NULL;
2253 }
2254 return Py_BuildValue("(hiiil)",
2255 (short)event.id,
2256 event.x, event.y, event.z,
2257 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002258}
2259
2260static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002261PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002262{
Victor Stinner26486ea2010-05-15 22:23:53 +00002263 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002264
Victor Stinner26486ea2010-05-15 22:23:53 +00002265 PyCursesInitialised;
2266 if (!PyArg_ParseTuple(args, "hiiil",
2267 &event.id,
2268 &event.x, &event.y, &event.z,
2269 (int *) &event.bstate))
2270 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002271
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002273}
2274#endif
2275
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002276static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002277PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002278{
Christian Heimes2b221b72017-03-02 11:09:01 +01002279 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 PyObject *data;
2281 size_t datalen;
2282 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002283 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002284 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002285
Victor Stinner26486ea2010-05-15 22:23:53 +00002286 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287
Christian Heimes2b221b72017-03-02 11:09:01 +01002288 fp = tmpfile();
2289 if (fp == NULL)
2290 return PyErr_SetFromErrno(PyExc_OSError);
2291
2292 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002293 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01002294
Victor Stinnerdaf45552013-08-28 00:53:59 +02002295
Victor Stinner3466bde2016-09-05 18:16:01 -07002296 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002297 if (data == NULL)
2298 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002299 if (!PyBytes_Check(data)) {
2300 PyErr_Format(PyExc_TypeError,
2301 "f.read() returned %.100s instead of bytes",
2302 data->ob_type->tp_name);
2303 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002304 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002305 }
2306 datalen = PyBytes_GET_SIZE(data);
2307 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2308 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01002309 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002310 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002311 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002312 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002313
Victor Stinner26486ea2010-05-15 22:23:53 +00002314 fseek(fp, 0, 0);
2315 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002316 if (win == NULL) {
2317 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002318 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002320 res = PyCursesWindow_New(win, NULL);
2321
2322error:
Christian Heimes2b221b72017-03-02 11:09:01 +01002323 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002324 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002325}
2326
2327static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002328PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002329{
Victor Stinner26486ea2010-05-15 22:23:53 +00002330 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002331
Victor Stinner26486ea2010-05-15 22:23:53 +00002332 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002333
Victor Stinner26486ea2010-05-15 22:23:53 +00002334 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002335
Victor Stinner26486ea2010-05-15 22:23:53 +00002336 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002337}
2338
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002339#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002340/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002341static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002342{
Victor Stinner26486ea2010-05-15 22:23:53 +00002343 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002344
Victor Stinner26486ea2010-05-15 22:23:53 +00002345 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346
Victor Stinner26486ea2010-05-15 22:23:53 +00002347 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002348
Victor Stinner26486ea2010-05-15 22:23:53 +00002349 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002350 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002351 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002352 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002353}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002354#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355
2356static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002357PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002358{
Victor Stinner26486ea2010-05-15 22:23:53 +00002359 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002360
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 PyCursesInitialised;
2362 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002363
Victor Stinner26486ea2010-05-15 22:23:53 +00002364 switch(PyTuple_Size(args)) {
2365 case 4:
2366 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2367 break;
2368 default:
2369 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2370 return NULL;
2371 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002372
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002374}
2375
2376static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002377PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378{
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002380
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 PyCursesInitialised;
2382 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383
Victor Stinner26486ea2010-05-15 22:23:53 +00002384 if (PyTuple_Size(args) != 3) {
2385 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2386 return NULL;
2387 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002388
Victor Stinner26486ea2010-05-15 22:23:53 +00002389 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390
Victor Stinner26486ea2010-05-15 22:23:53 +00002391 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392}
2393
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002394static PyObject *ModDict;
2395
Victor Stinner26486ea2010-05-15 22:23:53 +00002396static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002397PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002398{
Victor Stinner26486ea2010-05-15 22:23:53 +00002399 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002400 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401
Victor Stinner26486ea2010-05-15 22:23:53 +00002402 if (initialised == TRUE) {
2403 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002404 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002405 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002406
Victor Stinner26486ea2010-05-15 22:23:53 +00002407 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 if (win == NULL) {
2410 PyErr_SetString(PyCursesError, catchall_NULL);
2411 return NULL;
2412 }
Guido van Rossum85738471995-02-17 13:50:17 +00002413
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002415
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002416/* This was moved from initcurses() because it core dumped on SGI,
2417 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002418#define SetDictInt(string,ch) \
2419 do { \
2420 PyObject *o = PyLong_FromLong((long) (ch)); \
2421 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2422 Py_DECREF(o); \
2423 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002424 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002425
Victor Stinner26486ea2010-05-15 22:23:53 +00002426 /* Here are some graphic symbols you can use */
2427 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2428 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2429 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2430 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2431 SetDictInt("ACS_LTEE", (ACS_LTEE));
2432 SetDictInt("ACS_RTEE", (ACS_RTEE));
2433 SetDictInt("ACS_BTEE", (ACS_BTEE));
2434 SetDictInt("ACS_TTEE", (ACS_TTEE));
2435 SetDictInt("ACS_HLINE", (ACS_HLINE));
2436 SetDictInt("ACS_VLINE", (ACS_VLINE));
2437 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002438#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002439 /* On HP/UX 11, these are of type cchar_t, which is not an
2440 integral type. If this is a problem on more platforms, a
2441 configure test should be added to determine whether ACS_S1
2442 is of integral type. */
2443 SetDictInt("ACS_S1", (ACS_S1));
2444 SetDictInt("ACS_S9", (ACS_S9));
2445 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2446 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2447 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2448 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2449 SetDictInt("ACS_BULLET", (ACS_BULLET));
2450 SetDictInt("ACS_LARROW", (ACS_LARROW));
2451 SetDictInt("ACS_RARROW", (ACS_RARROW));
2452 SetDictInt("ACS_DARROW", (ACS_DARROW));
2453 SetDictInt("ACS_UARROW", (ACS_UARROW));
2454 SetDictInt("ACS_BOARD", (ACS_BOARD));
2455 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2456 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002457#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002458 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2459 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2460 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2461 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2462 SetDictInt("ACS_SBSS", (ACS_RTEE));
2463 SetDictInt("ACS_SSSB", (ACS_LTEE));
2464 SetDictInt("ACS_SSBS", (ACS_BTEE));
2465 SetDictInt("ACS_BSSS", (ACS_TTEE));
2466 SetDictInt("ACS_BSBS", (ACS_HLINE));
2467 SetDictInt("ACS_SBSB", (ACS_VLINE));
2468 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002469
Victor Stinner26486ea2010-05-15 22:23:53 +00002470 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002471#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002472 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002473#endif
2474#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002475 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002476#endif
2477#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002478 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002479#endif
2480#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002482#endif
2483#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002484 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002485#endif
2486#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002488#endif
2489#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002490 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002491#endif
2492
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 SetDictInt("LINES", LINES);
2494 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002495
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002496 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2497 screen_encoding = winobj->encoding;
2498 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002499}
2500
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002501static PyObject *
2502PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2503{
Victor Stinner26486ea2010-05-15 22:23:53 +00002504 int fd = -1;
2505 int err;
2506 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002507
Victor Stinner26486ea2010-05-15 22:23:53 +00002508 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002509
Victor Stinner26486ea2010-05-15 22:23:53 +00002510 if (!PyArg_ParseTupleAndKeywords(
2511 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2512 return NULL;
2513 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002514
Victor Stinner26486ea2010-05-15 22:23:53 +00002515 if (fd == -1) {
2516 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002517
Victor Stinnerbd303c12013-11-07 23:07:29 +01002518 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002519
Victor Stinner26486ea2010-05-15 22:23:53 +00002520 if (sys_stdout == NULL || sys_stdout == Py_None) {
2521 PyErr_SetString(
2522 PyCursesError,
2523 "lost sys.stdout");
2524 return NULL;
2525 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002526
Victor Stinner26486ea2010-05-15 22:23:53 +00002527 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002528
Victor Stinner26486ea2010-05-15 22:23:53 +00002529 if (fd == -1) {
2530 return NULL;
2531 }
2532 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002533
Matthias Klose635edd12010-07-30 21:40:57 +00002534 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002535 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002536
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 if (err == 0) {
2538 s = "setupterm: could not find terminal";
2539 } else if (err == -1) {
2540 s = "setupterm: could not find terminfo database";
2541 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002542
Victor Stinner26486ea2010-05-15 22:23:53 +00002543 PyErr_SetString(PyCursesError,s);
2544 return NULL;
2545 }
2546
2547 initialised_setupterm = TRUE;
2548
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002549 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002550}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002551
2552static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002553PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002554{
Victor Stinner26486ea2010-05-15 22:23:53 +00002555 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002556
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002558
Victor Stinner26486ea2010-05-15 22:23:53 +00002559 switch(PyTuple_Size(args)) {
2560 case 1:
2561 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2562 break;
2563 default:
2564 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2565 return NULL;
2566 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002567
Victor Stinner26486ea2010-05-15 22:23:53 +00002568 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002569}
2570
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002571#ifdef HAVE_CURSES_IS_TERM_RESIZED
2572static PyObject *
2573PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2574{
Victor Stinner26486ea2010-05-15 22:23:53 +00002575 int lines;
2576 int columns;
2577 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002578
Victor Stinner26486ea2010-05-15 22:23:53 +00002579 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002580
Victor Stinner26486ea2010-05-15 22:23:53 +00002581 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2582 return NULL;
2583 result = is_term_resized(lines, columns);
2584 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002585 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002586 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002587 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002588 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002589}
2590#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2591
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002592#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002593static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002594PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002595{
Victor Stinner26486ea2010-05-15 22:23:53 +00002596 const char *knp;
2597 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002598
Victor Stinner26486ea2010-05-15 22:23:53 +00002599 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002600
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002602
Victor Stinner26486ea2010-05-15 22:23:53 +00002603 if (ch < 0) {
2604 PyErr_SetString(PyExc_ValueError, "invalid key number");
2605 return NULL;
2606 }
2607 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002608
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002609 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002610}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002611#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002612
Victor Stinner26486ea2010-05-15 22:23:53 +00002613static PyObject *
2614PyCurses_KillChar(PyObject *self)
2615{
2616 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002617
Victor Stinner26486ea2010-05-15 22:23:53 +00002618 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002619
Victor Stinner26486ea2010-05-15 22:23:53 +00002620 return PyBytes_FromStringAndSize(&ch, 1);
2621}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622
2623static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002624PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625{
Victor Stinner26486ea2010-05-15 22:23:53 +00002626 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002627
Victor Stinner26486ea2010-05-15 22:23:53 +00002628 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002629
Victor Stinner26486ea2010-05-15 22:23:53 +00002630 switch(PyTuple_Size(args)) {
2631 case 1:
2632 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2633 break;
2634 default:
2635 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2636 return NULL;
2637 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002638
Victor Stinner26486ea2010-05-15 22:23:53 +00002639 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002640}
2641
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002642#ifdef NCURSES_MOUSE_VERSION
2643static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002644PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002645{
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 int interval;
2647 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002648
Victor Stinner26486ea2010-05-15 22:23:53 +00002649 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2650 return NULL;
2651 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002652}
2653
2654static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002655PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002656{
Victor Stinner26486ea2010-05-15 22:23:53 +00002657 int newmask;
2658 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002659
Victor Stinner26486ea2010-05-15 22:23:53 +00002660 PyCursesInitialised;
2661 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2662 return NULL;
2663 availmask = mousemask(newmask, &oldmask);
2664 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002665}
2666#endif
2667
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002668static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002669PyCurses_Napms(PyObject *self, PyObject *args)
2670{
2671 int ms;
2672
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002673 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002674 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002675
2676 return Py_BuildValue("i", napms(ms));
2677}
2678
2679
2680static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002681PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002682{
Victor Stinner26486ea2010-05-15 22:23:53 +00002683 WINDOW *win;
2684 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002685
Victor Stinner26486ea2010-05-15 22:23:53 +00002686 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687
Victor Stinner26486ea2010-05-15 22:23:53 +00002688 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002689
Victor Stinner26486ea2010-05-15 22:23:53 +00002690 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691
Victor Stinner26486ea2010-05-15 22:23:53 +00002692 if (win == NULL) {
2693 PyErr_SetString(PyCursesError, catchall_NULL);
2694 return NULL;
2695 }
2696
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002697 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002698}
2699
2700static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002701PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002702{
Victor Stinner26486ea2010-05-15 22:23:53 +00002703 WINDOW *win;
2704 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002705
Victor Stinner26486ea2010-05-15 22:23:53 +00002706 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002707
Victor Stinner26486ea2010-05-15 22:23:53 +00002708 switch (PyTuple_Size(args)) {
2709 case 2:
2710 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2711 return NULL;
2712 break;
2713 case 4:
2714 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2715 &nlines,&ncols,&begin_y,&begin_x))
2716 return NULL;
2717 break;
2718 default:
2719 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2720 return NULL;
2721 }
Guido van Rossum85738471995-02-17 13:50:17 +00002722
Victor Stinner26486ea2010-05-15 22:23:53 +00002723 win = newwin(nlines,ncols,begin_y,begin_x);
2724 if (win == NULL) {
2725 PyErr_SetString(PyCursesError, catchall_NULL);
2726 return NULL;
2727 }
Guido van Rossum85738471995-02-17 13:50:17 +00002728
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002729 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002730}
2731
2732static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002733PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002734{
Victor Stinner26486ea2010-05-15 22:23:53 +00002735 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002736
Victor Stinner26486ea2010-05-15 22:23:53 +00002737 PyCursesInitialised;
2738 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002739
Victor Stinner26486ea2010-05-15 22:23:53 +00002740 switch(PyTuple_Size(args)) {
2741 case 1:
2742 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2743 break;
2744 default:
2745 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2746 return NULL;
2747 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002748
Victor Stinner26486ea2010-05-15 22:23:53 +00002749 if (pair_content(pair, &f, &b)==ERR) {
2750 PyErr_SetString(PyCursesError,
2751 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2752 return NULL;
2753 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756}
2757
2758static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002759PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002760{
Victor Stinner26486ea2010-05-15 22:23:53 +00002761 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002762
Victor Stinner26486ea2010-05-15 22:23:53 +00002763 PyCursesInitialised;
2764 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002765
Victor Stinner26486ea2010-05-15 22:23:53 +00002766 switch(PyTuple_Size(args)) {
2767 case 1:
2768 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2769 break;
2770 default:
2771 PyErr_SetString(PyExc_TypeError,
2772 "pair_number requires 1 argument");
2773 return NULL;
2774 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002775
Victor Stinner26486ea2010-05-15 22:23:53 +00002776 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777}
2778
2779static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002780PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002781{
Victor Stinner26486ea2010-05-15 22:23:53 +00002782 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002783
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002784 if (!PyArg_ParseTuple(args,"y;str", &str))
2785 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002786 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002787}
2788
2789static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002790PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002791{
Victor Stinner26486ea2010-05-15 22:23:53 +00002792 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002793
Victor Stinner26486ea2010-05-15 22:23:53 +00002794 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002795
Victor Stinner26486ea2010-05-15 22:23:53 +00002796 switch(PyTuple_Size(args)) {
2797 case 0:
2798 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002799 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002800 case 1:
2801 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2802 if (flag) qiflush();
2803 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002804 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002805 default:
2806 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2807 return NULL;
2808 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002809}
2810
Guido van Rossumd8faa362007-04-27 19:54:29 +00002811/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2812 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002813#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002814static int
2815update_lines_cols(void)
2816{
Victor Stinner26486ea2010-05-15 22:23:53 +00002817 PyObject *o;
2818 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002819 _Py_IDENTIFIER(LINES);
2820 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002821
Victor Stinner26486ea2010-05-15 22:23:53 +00002822 if (!m)
2823 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002824
Victor Stinner26486ea2010-05-15 22:23:53 +00002825 o = PyLong_FromLong(LINES);
2826 if (!o) {
2827 Py_DECREF(m);
2828 return 0;
2829 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002830 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002831 Py_DECREF(m);
2832 Py_DECREF(o);
2833 return 0;
2834 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002835 /* PyId_LINES.object will be initialized here. */
2836 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002837 Py_DECREF(m);
2838 Py_DECREF(o);
2839 return 0;
2840 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002841 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002842 o = PyLong_FromLong(COLS);
2843 if (!o) {
2844 Py_DECREF(m);
2845 return 0;
2846 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002847 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002848 Py_DECREF(m);
2849 Py_DECREF(o);
2850 return 0;
2851 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002852 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002853 Py_DECREF(m);
2854 Py_DECREF(o);
2855 return 0;
2856 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002857 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002858 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002859 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002860}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002861
2862static PyObject *
2863PyCurses_update_lines_cols(PyObject *self)
2864{
2865 return PyLong_FromLong((long) update_lines_cols());
2866}
2867
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002868#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002869
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002870#ifdef HAVE_CURSES_RESIZETERM
2871static PyObject *
2872PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2873{
Victor Stinner26486ea2010-05-15 22:23:53 +00002874 int lines;
2875 int columns;
2876 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002877
Victor Stinner26486ea2010-05-15 22:23:53 +00002878 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002879
Victor Stinner26486ea2010-05-15 22:23:53 +00002880 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2881 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002882
Victor Stinner26486ea2010-05-15 22:23:53 +00002883 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2884 if (!result)
2885 return NULL;
2886 if (!update_lines_cols())
2887 return NULL;
2888 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889}
2890
2891#endif
2892
2893#ifdef HAVE_CURSES_RESIZE_TERM
2894static PyObject *
2895PyCurses_Resize_Term(PyObject *self, PyObject *args)
2896{
Victor Stinner26486ea2010-05-15 22:23:53 +00002897 int lines;
2898 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002899
Victor Stinner26486ea2010-05-15 22:23:53 +00002900 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002901
Victor Stinner26486ea2010-05-15 22:23:53 +00002902 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002903
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2905 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002906
Victor Stinner26486ea2010-05-15 22:23:53 +00002907 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2908 if (!result)
2909 return NULL;
2910 if (!update_lines_cols())
2911 return NULL;
2912 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002913}
2914#endif /* HAVE_CURSES_RESIZE_TERM */
2915
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002916static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002917PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002918{
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002920
Victor Stinner26486ea2010-05-15 22:23:53 +00002921 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002922
Victor Stinner26486ea2010-05-15 22:23:53 +00002923 if (PyTuple_Size(args)!=2) {
2924 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2925 return NULL;
2926 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002927
Victor Stinner26486ea2010-05-15 22:23:53 +00002928 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002929
Victor Stinner26486ea2010-05-15 22:23:53 +00002930 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002931
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002932 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002933}
2934
2935static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002936PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002937{
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 int code;
2939 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002940
Victor Stinner26486ea2010-05-15 22:23:53 +00002941 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002942
Victor Stinner26486ea2010-05-15 22:23:53 +00002943 code = start_color();
2944 if (code != ERR) {
2945 initialisedcolors = TRUE;
2946 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002947 if (c == NULL)
2948 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002949 PyDict_SetItemString(ModDict, "COLORS", c);
2950 Py_DECREF(c);
2951 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002952 if (cp == NULL)
2953 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002954 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2955 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002956 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002957 } else {
2958 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2959 return NULL;
2960 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002961}
2962
2963static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002964PyCurses_tigetflag(PyObject *self, PyObject *args)
2965{
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002967
Victor Stinner26486ea2010-05-15 22:23:53 +00002968 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002969
Victor Stinner26486ea2010-05-15 22:23:53 +00002970 if (!PyArg_ParseTuple(args, "s", &capname))
2971 return NULL;
2972
2973 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002974}
2975
2976static PyObject *
2977PyCurses_tigetnum(PyObject *self, PyObject *args)
2978{
Victor Stinner26486ea2010-05-15 22:23:53 +00002979 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002980
Victor Stinner26486ea2010-05-15 22:23:53 +00002981 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002982
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 if (!PyArg_ParseTuple(args, "s", &capname))
2984 return NULL;
2985
2986 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002987}
2988
2989static PyObject *
2990PyCurses_tigetstr(PyObject *self, PyObject *args)
2991{
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002993
Victor Stinner26486ea2010-05-15 22:23:53 +00002994 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002995
Victor Stinner26486ea2010-05-15 22:23:53 +00002996 if (!PyArg_ParseTuple(args, "s", &capname))
2997 return NULL;
2998
2999 capname = tigetstr( capname );
Serhiy Storchaka0b3ec192017-03-23 17:53:47 +02003000 if (capname == NULL || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003001 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003002 }
3003 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003004}
3005
3006static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003007PyCurses_tparm(PyObject *self, PyObject *args)
3008{
Victor Stinner26486ea2010-05-15 22:23:53 +00003009 char* fmt;
3010 char* result = NULL;
3011 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 +00003012
Victor Stinner26486ea2010-05-15 22:23:53 +00003013 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003014
Victor Stinner26621332011-11-02 23:45:29 +01003015 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003016 &fmt, &i1, &i2, &i3, &i4,
3017 &i5, &i6, &i7, &i8, &i9)) {
3018 return NULL;
3019 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003020
Victor Stinner26486ea2010-05-15 22:23:53 +00003021 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3022 if (!result) {
3023 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3024 return NULL;
3025 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003026
Victor Stinner26486ea2010-05-15 22:23:53 +00003027 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003028}
3029
3030static 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}
3041
3042static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003043PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003044{
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 PyObject *temp;
3046 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003047
Victor Stinner26486ea2010-05-15 22:23:53 +00003048 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003051
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003052 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003053 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003054
Victor Stinner26486ea2010-05-15 22:23:53 +00003055 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003056}
3057
3058static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003059PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003060{
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 PyObject *temp;
3062 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003063
Victor Stinner26486ea2010-05-15 22:23:53 +00003064 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003065
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003066 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003068
3069 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3070 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003071
Victor Stinner26486ea2010-05-15 22:23:53 +00003072 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003073}
3074
Victor Stinner71e44cb2011-09-06 01:53:03 +02003075#ifdef HAVE_NCURSESW
3076/* Convert an object to a character (wchar_t):
3077
3078 - int
3079 - str of length 1
3080
3081 Return 1 on success, 0 on error. */
3082static int
3083PyCurses_ConvertToWchar_t(PyObject *obj,
3084 wchar_t *wch)
3085{
3086 if (PyUnicode_Check(obj)) {
3087 wchar_t buffer[2];
3088 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3089 PyErr_Format(PyExc_TypeError,
3090 "expect bytes or str of length 1, or int, "
3091 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003092 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003093 return 0;
3094 }
3095 *wch = buffer[0];
3096 return 2;
3097 }
3098 else if (PyLong_CheckExact(obj)) {
3099 long value;
3100 int overflow;
3101 value = PyLong_AsLongAndOverflow(obj, &overflow);
3102 if (overflow) {
3103 PyErr_SetString(PyExc_OverflowError,
3104 "int doesn't fit in long");
3105 return 0;
3106 }
3107 *wch = (wchar_t)value;
3108 if ((long)*wch != value) {
3109 PyErr_Format(PyExc_OverflowError,
3110 "character doesn't fit in wchar_t");
3111 return 0;
3112 }
3113 return 1;
3114 }
3115 else {
3116 PyErr_Format(PyExc_TypeError,
3117 "expect bytes or str of length 1, or int, got %s",
3118 Py_TYPE(obj)->tp_name);
3119 return 0;
3120 }
3121}
3122
3123static PyObject *
3124PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3125{
3126 PyObject *obj;
3127 wchar_t wch;
3128
3129 PyCursesInitialised;
3130
3131 if (!PyArg_ParseTuple(args,"O", &obj))
3132 return NULL;
3133
3134 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3135 return NULL;
3136 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3137}
3138#endif
3139
Guido van Rossumf6971e21994-08-30 12:25:20 +00003140static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003141PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003142{
Victor Stinner26486ea2010-05-15 22:23:53 +00003143 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003144
Victor Stinner26486ea2010-05-15 22:23:53 +00003145 switch(PyTuple_Size(args)) {
3146 case 1:
3147 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3148 return NULL;
3149 break;
3150 default:
3151 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3152 return NULL;
3153 }
3154 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003155 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003156}
3157
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003158#ifndef STRICT_SYSV_CURSES
3159static PyObject *
3160PyCurses_Use_Default_Colors(PyObject *self)
3161{
Victor Stinner26486ea2010-05-15 22:23:53 +00003162 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003163
Victor Stinner26486ea2010-05-15 22:23:53 +00003164 PyCursesInitialised;
3165 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003166
Victor Stinner26486ea2010-05-15 22:23:53 +00003167 code = use_default_colors();
3168 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003169 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003170 } else {
3171 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3172 return NULL;
3173 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003174}
3175#endif /* STRICT_SYSV_CURSES */
3176
Guido van Rossumf6971e21994-08-30 12:25:20 +00003177/* List of functions defined in the module */
3178
3179static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003180 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3181 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3182 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3183 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3184 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3185 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3186 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3187 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3188 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3189 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3190 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3191 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3192 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3193 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3194 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3195 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3196 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003197#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003198 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3199 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003200#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003201 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3202 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3203 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3204 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3205 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003206#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003207 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003208#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003209 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3210 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3211 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3212 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3213 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3214 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003215#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003216 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003217#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003218#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003219 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003220#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003221 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3222 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3223 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003224#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003225 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3226 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003227#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003228 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3229 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3230 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3231 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3232 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3233 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3234 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3235 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3236 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3237 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3238 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3239 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3240 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3241 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3242 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3243 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3244 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003247#endif
3248#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003249 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003250#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003251 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3252 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3253 {"setupterm", (PyCFunction)PyCurses_setupterm,
3254 METH_VARARGS|METH_KEYWORDS},
3255 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3256 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3257 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3258 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3259 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3260 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3261 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3262 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3263 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3264 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003265#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3266 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3267#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003268#ifdef HAVE_NCURSESW
3269 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3270#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003271 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003272#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003273 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003274#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003275 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003276};
3277
3278/* Initialization function for the module */
3279
Martin v. Löwis1a214512008-06-11 05:26:20 +00003280
3281static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003282 PyModuleDef_HEAD_INIT,
3283 "_curses",
3284 NULL,
3285 -1,
3286 PyCurses_methods,
3287 NULL,
3288 NULL,
3289 NULL,
3290 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003291};
3292
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003293PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003294PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003295{
Victor Stinner26486ea2010-05-15 22:23:53 +00003296 PyObject *m, *d, *v, *c_api_object;
3297 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003298
Victor Stinner26486ea2010-05-15 22:23:53 +00003299 /* Initialize object type */
3300 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3301 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003302
Victor Stinner26486ea2010-05-15 22:23:53 +00003303 /* Initialize the C API pointer array */
3304 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3305 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3306 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3307 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003308
Victor Stinner26486ea2010-05-15 22:23:53 +00003309 /* Create the module and add the functions */
3310 m = PyModule_Create(&_cursesmodule);
3311 if (m == NULL)
3312 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003313
Victor Stinner26486ea2010-05-15 22:23:53 +00003314 /* Add some symbolic constants to the module */
3315 d = PyModule_GetDict(m);
3316 if (d == NULL)
3317 return NULL;
3318 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003319
Victor Stinner26486ea2010-05-15 22:23:53 +00003320 /* Add a capsule for the C API */
3321 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3322 PyDict_SetItemString(d, "_C_API", c_api_object);
3323 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003324
Victor Stinner26486ea2010-05-15 22:23:53 +00003325 /* For exception curses.error */
3326 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3327 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003328
Victor Stinner26486ea2010-05-15 22:23:53 +00003329 /* Make the version available */
3330 v = PyBytes_FromString(PyCursesVersion);
3331 PyDict_SetItemString(d, "version", v);
3332 PyDict_SetItemString(d, "__version__", v);
3333 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003334
Victor Stinner26486ea2010-05-15 22:23:53 +00003335 SetDictInt("ERR", ERR);
3336 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003337
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 /* Here are some attributes you can add to chars to print */
3339
3340 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3341 SetDictInt("A_NORMAL", A_NORMAL);
3342 SetDictInt("A_STANDOUT", A_STANDOUT);
3343 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3344 SetDictInt("A_REVERSE", A_REVERSE);
3345 SetDictInt("A_BLINK", A_BLINK);
3346 SetDictInt("A_DIM", A_DIM);
3347 SetDictInt("A_BOLD", A_BOLD);
3348 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003349#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003350 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003351#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003352 SetDictInt("A_PROTECT", A_PROTECT);
3353 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3354 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003355
Victor Stinner26486ea2010-05-15 22:23:53 +00003356 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003357#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003358 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003359#endif
3360#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003361 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003362#endif
3363#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003364 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003365#endif
3366#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003367 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003368#endif
3369#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003371#endif
3372#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003373 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003374#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003375
Xiang Zhang116dd5e2017-06-16 11:20:07 +08003376 /* ncurses extension */
3377#ifdef A_ITALIC
3378 SetDictInt("A_ITALIC", A_ITALIC);
3379#endif
3380
Victor Stinner26486ea2010-05-15 22:23:53 +00003381 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3382 SetDictInt("COLOR_RED", COLOR_RED);
3383 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3384 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3385 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3386 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3387 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3388 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003389
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003390#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 /* Mouse-related constants */
3392 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3393 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3394 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3395 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3396 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003397
Victor Stinner26486ea2010-05-15 22:23:53 +00003398 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3399 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3400 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3401 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3402 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003403
Victor Stinner26486ea2010-05-15 22:23:53 +00003404 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3405 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3406 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3407 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3408 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003409
Victor Stinner26486ea2010-05-15 22:23:53 +00003410 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3411 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3412 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3413 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3414 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003415
Victor Stinner26486ea2010-05-15 22:23:53 +00003416 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3417 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3418 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003419
Victor Stinner26486ea2010-05-15 22:23:53 +00003420 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3421 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003422#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 /* Now set everything up for KEY_ variables */
3424 {
3425 int key;
3426 char *key_n;
3427 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003428#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003429 for (key=KEY_MIN;key < KEY_MAX; key++) {
3430 key_n = (char *)keyname(key);
3431 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3432 continue;
3433 if (strncmp(key_n,"KEY_F(",6)==0) {
3434 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003435 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003436 if (!key_n2) {
3437 PyErr_NoMemory();
3438 break;
3439 }
3440 p1 = key_n;
3441 p2 = key_n2;
3442 while (*p1) {
3443 if (*p1 != '(' && *p1 != ')') {
3444 *p2 = *p1;
3445 p2++;
3446 }
3447 p1++;
3448 }
3449 *p2 = (char)0;
3450 } else
3451 key_n2 = key_n;
3452 SetDictInt(key_n2,key);
3453 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003454 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003455 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003456#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003457 SetDictInt("KEY_MIN", KEY_MIN);
3458 SetDictInt("KEY_MAX", KEY_MAX);
3459 }
3460 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003461}