blob: 4d714cecdfb9545c2ddaf440b0f8ba84dd88867c [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{
344 if (PyUnicode_Check(obj)) {
345#ifdef HAVE_NCURSESW
346 assert (wstr != NULL);
347 *wstr = PyUnicode_AsWideCharString(obj, NULL);
348 if (*wstr == NULL)
349 return 0;
350 return 2;
351#else
352 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300353 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100354 if (*bytes == NULL)
355 return 0;
356 return 1;
357#endif
358 }
359 else if (PyBytes_Check(obj)) {
360 Py_INCREF(obj);
361 *bytes = obj;
362 return 1;
363 }
364
365 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
366 Py_TYPE(obj)->tp_name);
367 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000368}
369
Benjamin Peterson21896a32010-03-21 22:03:03 +0000370/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000371 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000372
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000373static int func_PyCursesSetupTermCalled(void)
374{
375 PyCursesSetupTermCalled;
376 return 1;
377}
378
379static int func_PyCursesInitialised(void)
380{
381 PyCursesInitialised;
382 return 1;
383}
384
385static int func_PyCursesInitialisedColor(void)
386{
387 PyCursesInitialisedColor;
388 return 1;
389}
390
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000391/*****************************************************************************
392 The Window Object
393******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000394
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000395/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000396
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000397PyTypeObject PyCursesWindow_Type;
398
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000399/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400
401 X - function name
402 TYPE - parameter Type
403 ERGSTR - format string for construction of the return value
404 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000405*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000406
Victor Stinner26486ea2010-05-15 22:23:53 +0000407#define Window_NoArgNoReturnFunction(X) \
408 static PyObject *PyCursesWindow_ ## X \
409 (PyCursesWindowObject *self, PyObject *args) \
410 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000411
Victor Stinner26486ea2010-05-15 22:23:53 +0000412#define Window_NoArgTrueFalseFunction(X) \
413 static PyObject * PyCursesWindow_ ## X \
414 (PyCursesWindowObject *self) \
415 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200416 if (X (self->win) == FALSE) { Py_RETURN_FALSE; } \
417 else { Py_RETURN_TRUE; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000418
Victor Stinner26486ea2010-05-15 22:23:53 +0000419#define Window_NoArgNoReturnVoidFunction(X) \
420 static PyObject * PyCursesWindow_ ## X \
421 (PyCursesWindowObject *self) \
422 { \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200423 X(self->win); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000424
Victor Stinner26486ea2010-05-15 22:23:53 +0000425#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
426 static PyObject * PyCursesWindow_ ## X \
427 (PyCursesWindowObject *self) \
428 { \
429 TYPE arg1, arg2; \
430 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000431
Victor Stinner26486ea2010-05-15 22:23:53 +0000432#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
433 static PyObject * PyCursesWindow_ ## X \
434 (PyCursesWindowObject *self, PyObject *args) \
435 { \
436 TYPE arg1; \
437 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200438 X(self->win,arg1); Py_RETURN_NONE; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000439
Victor Stinner26486ea2010-05-15 22:23:53 +0000440#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
441 static PyObject * PyCursesWindow_ ## X \
442 (PyCursesWindowObject *self, PyObject *args) \
443 { \
444 TYPE arg1; \
445 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
446 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000447
Victor Stinner26486ea2010-05-15 22:23:53 +0000448#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
449 static PyObject * PyCursesWindow_ ## X \
450 (PyCursesWindowObject *self, PyObject *args) \
451 { \
452 TYPE arg1, arg2; \
453 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
454 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000455
Guido van Rossumf6971e21994-08-30 12:25:20 +0000456/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458Window_NoArgNoReturnFunction(untouchwin)
459Window_NoArgNoReturnFunction(touchwin)
460Window_NoArgNoReturnFunction(redrawwin)
461Window_NoArgNoReturnFunction(winsertln)
462Window_NoArgNoReturnFunction(werase)
463Window_NoArgNoReturnFunction(wdeleteln)
464
465Window_NoArgTrueFalseFunction(is_wintouched)
466
467Window_NoArgNoReturnVoidFunction(wsyncup)
468Window_NoArgNoReturnVoidFunction(wsyncdown)
469Window_NoArgNoReturnVoidFunction(wstandend)
470Window_NoArgNoReturnVoidFunction(wstandout)
471Window_NoArgNoReturnVoidFunction(wcursyncup)
472Window_NoArgNoReturnVoidFunction(wclrtoeol)
473Window_NoArgNoReturnVoidFunction(wclrtobot)
474Window_NoArgNoReturnVoidFunction(wclear)
475
476Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
477Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000478Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000480Window_NoArg2TupleReturnFunction(getyx, int, "ii")
481Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
482Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000484
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000485Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
486Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000487#if defined(__NetBSD__)
488Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
489#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000490Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000491#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000493#if defined(__NetBSD__)
494Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
495#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000496Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000497#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
499Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000500Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000501Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
502
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000503Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
504Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
505Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000506#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000507Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508#endif
509
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000510/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511
Guido van Rossumf6971e21994-08-30 12:25:20 +0000512static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100513PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000514{
Victor Stinner26486ea2010-05-15 22:23:53 +0000515 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000516
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100517 if (encoding == NULL) {
518#if defined(MS_WINDOWS)
519 char *buffer[100];
520 UINT cp;
521 cp = GetConsoleOutputCP();
522 if (cp != 0) {
523 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
524 encoding = buffer;
525 }
526#elif defined(CODESET)
527 const char *codeset = nl_langinfo(CODESET);
528 if (codeset != NULL && codeset[0] != 0)
529 encoding = codeset;
530#endif
531 if (encoding == NULL)
532 encoding = "utf-8";
533 }
534
Victor Stinner26486ea2010-05-15 22:23:53 +0000535 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
536 if (wo == NULL) return NULL;
537 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200538 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100539 if (wo->encoding == NULL) {
540 Py_DECREF(wo);
541 PyErr_NoMemory();
542 return NULL;
543 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000544 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000545}
546
547static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000548PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000549{
Victor Stinner26486ea2010-05-15 22:23:53 +0000550 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100551 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200552 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000553 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000554}
555
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000556/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000557
Larry Hastings61272b72014-01-07 12:41:53 -0800558/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700559
560curses.window.addch
561
562 [
Larry Hastings31826802013-10-19 00:09:25 -0700563 y: int
564 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700565 x: int
566 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700567 ]
568
569 ch: object
570 Character to add.
571
572 [
573 attr: long
574 Attributes for the character.
575 ]
576 /
577
578Paint character ch at (y, x) with attributes attr.
579
580Paint character ch at (y, x) with attributes attr,
581overwriting any character previously painted at that location.
582By default, the character position and attributes are the
583current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800584[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700585
Larry Hastings31826802013-10-19 00:09:25 -0700586static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400587curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
588 int x, PyObject *ch, int group_right_1, long attr)
589/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700590{
591 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
592 int coordinates_group = group_left_1;
593 int attr_group = group_right_1;
594 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100595 int type;
Victor Stinnerb110dad2016-12-09 17:06:43 +0100596 chtype cch = 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100597#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200598 wchar_t wstr[2];
599 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100600#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100601 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000602
Larry Hastings31826802013-10-19 00:09:25 -0700603 if (!attr_group)
604 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000605
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100606#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200607 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100608 if (type == 2) {
609 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200610 wstr[1] = L'\0';
611 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700612 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200613 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100614 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200615 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100616 }
617 }
618 else
619#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300620 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100621#endif
622 if (type == 1) {
623 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700624 if (coordinates_group)
625 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100626 else {
Larry Hastings31826802013-10-19 00:09:25 -0700627 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100628 }
629 }
630 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000631 return NULL;
632 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100633 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000634}
635
636static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000637PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000638{
Victor Stinner26486ea2010-05-15 22:23:53 +0000639 int rtn;
640 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100641 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500642 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100643#ifdef HAVE_NCURSESW
644 wchar_t *wstr = NULL;
645#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000646 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
647 long lattr;
648 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100649 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000650
Victor Stinner26486ea2010-05-15 22:23:53 +0000651 switch (PyTuple_Size(args)) {
652 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100653 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000654 return NULL;
655 break;
656 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100657 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000658 return NULL;
659 attr = lattr;
660 use_attr = TRUE;
661 break;
662 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 use_xy = TRUE;
666 break;
667 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100668 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000669 return NULL;
670 attr = lattr;
671 use_xy = use_attr = TRUE;
672 break;
673 default:
674 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
675 return NULL;
676 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100677#ifdef HAVE_NCURSESW
678 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
679#else
680 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
681#endif
682 if (strtype == 0)
683 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000684 if (use_attr == TRUE) {
685 attr_old = getattrs(self->win);
686 (void)wattrset(self->win,attr);
687 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100688#ifdef HAVE_NCURSESW
689 if (strtype == 2) {
690 funcname = "addwstr";
691 if (use_xy == TRUE)
692 rtn = mvwaddwstr(self->win,y,x,wstr);
693 else
694 rtn = waddwstr(self->win,wstr);
695 PyMem_Free(wstr);
696 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000697 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100698#endif
699 {
700 char *str = PyBytes_AS_STRING(bytesobj);
701 funcname = "addstr";
702 if (use_xy == TRUE)
703 rtn = mvwaddstr(self->win,y,x,str);
704 else
705 rtn = waddstr(self->win,str);
706 Py_DECREF(bytesobj);
707 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000708 if (use_attr == TRUE)
709 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100710 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000711}
Guido van Rossum85738471995-02-17 13:50:17 +0000712
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000713static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000714PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000715{
Victor Stinner26486ea2010-05-15 22:23:53 +0000716 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100717 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500718 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100719#ifdef HAVE_NCURSESW
720 wchar_t *wstr = NULL;
721#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000722 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
723 long lattr;
724 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000726
Victor Stinner26486ea2010-05-15 22:23:53 +0000727 switch (PyTuple_Size(args)) {
728 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100729 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000730 return NULL;
731 break;
732 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100733 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000734 return NULL;
735 attr = lattr;
736 use_attr = TRUE;
737 break;
738 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 use_xy = TRUE;
742 break;
743 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100744 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000745 return NULL;
746 attr = lattr;
747 use_xy = use_attr = TRUE;
748 break;
749 default:
750 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
751 return NULL;
752 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100753#ifdef HAVE_NCURSESW
754 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
755#else
756 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
757#endif
758 if (strtype == 0)
759 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000760
Victor Stinner26486ea2010-05-15 22:23:53 +0000761 if (use_attr == TRUE) {
762 attr_old = getattrs(self->win);
763 (void)wattrset(self->win,attr);
764 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100765#ifdef HAVE_NCURSESW
766 if (strtype == 2) {
767 funcname = "addnwstr";
768 if (use_xy == TRUE)
769 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
770 else
771 rtn = waddnwstr(self->win,wstr,n);
772 PyMem_Free(wstr);
773 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000774 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775#endif
776 {
777 char *str = PyBytes_AS_STRING(bytesobj);
778 funcname = "addnstr";
779 if (use_xy == TRUE)
780 rtn = mvwaddnstr(self->win,y,x,str,n);
781 else
782 rtn = waddnstr(self->win,str,n);
783 Py_DECREF(bytesobj);
784 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000785 if (use_attr == TRUE)
786 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100787 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000788}
789
790static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000791PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000792{
Victor Stinner26486ea2010-05-15 22:23:53 +0000793 PyObject *temp;
794 chtype bkgd;
795 attr_t attr = A_NORMAL;
796 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000797
Victor Stinner26486ea2010-05-15 22:23:53 +0000798 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000799 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000800 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
801 return NULL;
802 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000804 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
805 return NULL;
806 attr = lattr;
807 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000808 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000809 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
810 return NULL;
811 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000812
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100813 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000814 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000815
Victor Stinner26486ea2010-05-15 22:23:53 +0000816 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000817}
818
819static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000820PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
821{
Victor Stinner26486ea2010-05-15 22:23:53 +0000822 long lattr;
823 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
824 return NULL;
825 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000826}
827
828static PyObject *
829PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
830{
Victor Stinner26486ea2010-05-15 22:23:53 +0000831 long lattr;
832 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
833 return NULL;
834 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000835}
836
837static PyObject *
838PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
839{
Victor Stinner26486ea2010-05-15 22:23:53 +0000840 long lattr;
841 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
842 return NULL;
843 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000844}
845
846static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000847PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000848{
Victor Stinner26486ea2010-05-15 22:23:53 +0000849 PyObject *temp;
850 chtype bkgd;
851 attr_t attr = A_NORMAL;
852 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000853
Victor Stinner26486ea2010-05-15 22:23:53 +0000854 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000855 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000856 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
857 return NULL;
858 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
861 return NULL;
862 attr = lattr;
863 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000864 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000865 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
866 return NULL;
867 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000868
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100869 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000870 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000871
Victor Stinner26486ea2010-05-15 22:23:53 +0000872 wbkgdset(self->win, bkgd | attr);
873 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874}
875
876static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000877PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878{
Victor Stinner26486ea2010-05-15 22:23:53 +0000879 PyObject *temp[8];
880 chtype ch[8];
881 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000882
Victor Stinner26486ea2010-05-15 22:23:53 +0000883 /* Clear the array of parameters */
884 for(i=0; i<8; i++) {
885 temp[i] = NULL;
886 ch[i] = 0;
887 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000888
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
890 &temp[0], &temp[1], &temp[2], &temp[3],
891 &temp[4], &temp[5], &temp[6], &temp[7]))
892 return NULL;
893
894 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100895 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000896 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000897 }
898
899 wborder(self->win,
900 ch[0], ch[1], ch[2], ch[3],
901 ch[4], ch[5], ch[6], ch[7]);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200902 Py_RETURN_NONE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000903}
904
905static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000906PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907{
Victor Stinner26486ea2010-05-15 22:23:53 +0000908 chtype ch1=0,ch2=0;
909 switch(PyTuple_Size(args)){
910 case 0: break;
911 default:
912 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
913 return NULL;
914 }
915 box(self->win,ch1,ch2);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200916 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000917}
918
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000919#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
920#define py_mvwdelch mvwdelch
921#else
922int py_mvwdelch(WINDOW *w, int y, int x)
923{
Victor Stinner26486ea2010-05-15 22:23:53 +0000924 mvwdelch(w,y,x);
925 /* On HP/UX, mvwdelch already returns. On other systems,
926 we may well run into this return statement. */
927 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000928}
929#endif
930
Guido van Rossumd8faa362007-04-27 19:54:29 +0000931/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
932
933static PyObject *
934PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
935{
Victor Stinner26486ea2010-05-15 22:23:53 +0000936 int rtn;
937 int x, y;
938 int num = -1;
939 short color;
940 attr_t attr = A_NORMAL;
941 long lattr;
942 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943
Victor Stinner26486ea2010-05-15 22:23:53 +0000944 switch (PyTuple_Size(args)) {
945 case 1:
946 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
947 return NULL;
948 attr = lattr;
949 break;
950 case 2:
951 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
952 return NULL;
953 attr = lattr;
954 break;
955 case 3:
956 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
957 return NULL;
958 attr = lattr;
959 use_xy = TRUE;
960 break;
961 case 4:
962 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
963 return NULL;
964 attr = lattr;
965 use_xy = TRUE;
966 break;
967 default:
968 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
969 return NULL;
970 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000971
Victor Stinner26486ea2010-05-15 22:23:53 +0000972 color = (short)((attr >> 8) & 0xff);
973 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000974
Victor Stinner26486ea2010-05-15 22:23:53 +0000975 if (use_xy == TRUE) {
976 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
977 touchline(self->win,y,1);
978 } else {
979 getyx(self->win,y,x);
980 rtn = wchgat(self->win,num,attr,color,NULL);
981 touchline(self->win,y,1);
982 }
983 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000984}
985
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000986
Guido van Rossumf6971e21994-08-30 12:25:20 +0000987static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000988PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000989{
Victor Stinner26486ea2010-05-15 22:23:53 +0000990 int rtn;
991 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000992
Victor Stinner26486ea2010-05-15 22:23:53 +0000993 switch (PyTuple_Size(args)) {
994 case 0:
995 rtn = wdelch(self->win);
996 break;
997 case 2:
998 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
999 return NULL;
1000 rtn = py_mvwdelch(self->win,y,x);
1001 break;
1002 default:
1003 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1004 return NULL;
1005 }
1006 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001007}
1008
1009static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001010PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001011{
Victor Stinner26486ea2010-05-15 22:23:53 +00001012 WINDOW *win;
1013 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001014
Victor Stinner26486ea2010-05-15 22:23:53 +00001015 nlines = 0;
1016 ncols = 0;
1017 switch (PyTuple_Size(args)) {
1018 case 2:
1019 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1020 return NULL;
1021 break;
1022 case 4:
1023 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1024 &nlines,&ncols,&begin_y,&begin_x))
1025 return NULL;
1026 break;
1027 default:
1028 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1029 return NULL;
1030 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001031
Victor Stinner26486ea2010-05-15 22:23:53 +00001032 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001033
Victor Stinner26486ea2010-05-15 22:23:53 +00001034 if (win == NULL) {
1035 PyErr_SetString(PyCursesError, catchall_NULL);
1036 return NULL;
1037 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001038
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001039 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001040}
1041
1042static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001043PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001044{
Victor Stinner26486ea2010-05-15 22:23:53 +00001045 PyObject *temp;
1046 chtype ch;
1047 attr_t attr = A_NORMAL;
1048 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001049
Victor Stinner26486ea2010-05-15 22:23:53 +00001050 switch (PyTuple_Size(args)) {
1051 case 1:
1052 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1053 return NULL;
1054 break;
1055 case 2:
1056 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1057 return NULL;
1058 attr = lattr;
1059 break;
1060 default:
1061 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001062
1063
Victor Stinner26486ea2010-05-15 22:23:53 +00001064 return NULL;
1065 }
Guido van Rossum85738471995-02-17 13:50:17 +00001066
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001067 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001068 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001069
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001070#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001071 if (self->win->_flags & _ISPAD)
1072 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1073 "echochar");
1074 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001075#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1077 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001078}
1079
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001080#ifdef NCURSES_MOUSE_VERSION
1081static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001082PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001083{
Victor Stinner26486ea2010-05-15 22:23:53 +00001084 int x, y;
1085 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1086 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001087
Victor Stinner26486ea2010-05-15 22:23:53 +00001088 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001089}
1090#endif
1091
Guido van Rossumf6971e21994-08-30 12:25:20 +00001092static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001093PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001094{
Victor Stinner26486ea2010-05-15 22:23:53 +00001095 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001096}
1097
1098static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001099PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001100{
Victor Stinner26486ea2010-05-15 22:23:53 +00001101 int x, y;
1102 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001103
Victor Stinner26486ea2010-05-15 22:23:53 +00001104 switch (PyTuple_Size(args)) {
1105 case 0:
1106 Py_BEGIN_ALLOW_THREADS
1107 rtn = wgetch(self->win);
1108 Py_END_ALLOW_THREADS
1109 break;
1110 case 2:
1111 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1112 return NULL;
1113 Py_BEGIN_ALLOW_THREADS
1114 rtn = mvwgetch(self->win,y,x);
1115 Py_END_ALLOW_THREADS
1116 break;
1117 default:
1118 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1119 return NULL;
1120 }
1121 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001122}
Guido van Rossum85738471995-02-17 13:50:17 +00001123
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001124static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001125PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001126{
Victor Stinner26486ea2010-05-15 22:23:53 +00001127 int x, y;
1128 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001129
Victor Stinner26486ea2010-05-15 22:23:53 +00001130 switch (PyTuple_Size(args)) {
1131 case 0:
1132 Py_BEGIN_ALLOW_THREADS
1133 rtn = wgetch(self->win);
1134 Py_END_ALLOW_THREADS
1135 break;
1136 case 2:
1137 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1138 return NULL;
1139 Py_BEGIN_ALLOW_THREADS
1140 rtn = mvwgetch(self->win,y,x);
1141 Py_END_ALLOW_THREADS
1142 break;
1143 default:
1144 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1145 return NULL;
1146 }
1147 if (rtn == ERR) {
1148 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001149 PyErr_CheckSignals();
1150 if (!PyErr_Occurred())
1151 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001152 return NULL;
1153 } else if (rtn<=255) {
1154 return Py_BuildValue("C", rtn);
1155 } else {
1156 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001157#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001158 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001159#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001160 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001161#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001162 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1163 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001164}
1165
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001166#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001167static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001168PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1169{
1170 int x, y;
1171 int ct;
1172 wint_t rtn;
1173
1174 switch (PyTuple_Size(args)) {
1175 case 0:
1176 Py_BEGIN_ALLOW_THREADS
1177 ct = wget_wch(self->win,&rtn);
1178 Py_END_ALLOW_THREADS
1179 break;
1180 case 2:
1181 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1182 return NULL;
1183 Py_BEGIN_ALLOW_THREADS
1184 ct = mvwget_wch(self->win,y,x,&rtn);
1185 Py_END_ALLOW_THREADS
1186 break;
1187 default:
1188 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1189 return NULL;
1190 }
1191 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001192 if (PyErr_CheckSignals())
1193 return NULL;
1194
Victor Stinnera7878b72011-07-14 23:07:44 +02001195 /* get_wch() returns ERR in nodelay mode */
1196 PyErr_SetString(PyCursesError, "no input");
1197 return NULL;
1198 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001199 if (ct == KEY_CODE_YES)
1200 return PyLong_FromLong(rtn);
1201 else
1202 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001203}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001204#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001205
1206static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001207PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001208{
Victor Stinner26486ea2010-05-15 22:23:53 +00001209 int x, y, n;
1210 char rtn[1024]; /* This should be big enough.. I hope */
1211 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001212
Victor Stinner26486ea2010-05-15 22:23:53 +00001213 switch (PyTuple_Size(args)) {
1214 case 0:
1215 Py_BEGIN_ALLOW_THREADS
1216 rtn2 = wgetnstr(self->win,rtn, 1023);
1217 Py_END_ALLOW_THREADS
1218 break;
1219 case 1:
1220 if (!PyArg_ParseTuple(args,"i;n", &n))
1221 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001222 if (n < 0) {
1223 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1224 return NULL;
1225 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001226 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001227 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001228 Py_END_ALLOW_THREADS
1229 break;
1230 case 2:
1231 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1232 return NULL;
1233 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001234#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001235 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001236#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001237 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001238#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001239 Py_END_ALLOW_THREADS
1240 break;
1241 case 3:
1242 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1243 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001244 if (n < 0) {
1245 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1246 return NULL;
1247 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001248#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001249 Py_BEGIN_ALLOW_THREADS
1250 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001251 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001252 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001253#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001254 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001255 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001256 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001257#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001258 break;
1259 default:
1260 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1261 return NULL;
1262 }
1263 if (rtn2 == ERR)
1264 rtn[0] = 0;
1265 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001266}
1267
1268static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001269PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001270{
Victor Stinner26486ea2010-05-15 22:23:53 +00001271 PyObject *temp;
1272 chtype ch;
1273 int n, x, y, code = OK;
1274 attr_t attr = A_NORMAL;
1275 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001276
Victor Stinner26486ea2010-05-15 22:23:53 +00001277 switch (PyTuple_Size(args)) {
1278 case 2:
1279 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1280 return NULL;
1281 break;
1282 case 3:
1283 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1284 return NULL;
1285 attr = lattr;
1286 break;
1287 case 4:
1288 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1289 return NULL;
1290 code = wmove(self->win, y, x);
1291 break;
1292 case 5:
1293 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1294 &y, &x, &temp, &n, &lattr))
1295 return NULL;
1296 attr = lattr;
1297 code = wmove(self->win, y, x);
1298 break;
1299 default:
1300 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1301 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001302 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001303
1304 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001305 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001306 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001307 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1308 } else
1309 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001310}
1311
1312static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001313PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001314{
Victor Stinner26486ea2010-05-15 22:23:53 +00001315 int rtn, x, y, use_xy = FALSE;
1316 PyObject *temp;
1317 chtype ch = 0;
1318 attr_t attr = A_NORMAL;
1319 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001320
Victor Stinner26486ea2010-05-15 22:23:53 +00001321 switch (PyTuple_Size(args)) {
1322 case 1:
1323 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1324 return NULL;
1325 break;
1326 case 2:
1327 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1328 return NULL;
1329 attr = lattr;
1330 break;
1331 case 3:
1332 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1333 return NULL;
1334 use_xy = TRUE;
1335 break;
1336 case 4:
1337 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1338 return NULL;
1339 attr = lattr;
1340 use_xy = TRUE;
1341 break;
1342 default:
1343 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1344 return NULL;
1345 }
1346
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001347 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001348 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001349
1350 if (use_xy == TRUE)
1351 rtn = mvwinsch(self->win,y,x, ch | attr);
1352 else {
1353 rtn = winsch(self->win, ch | attr);
1354 }
1355 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001356}
1357
1358static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001359PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001360{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001361 int x, y;
1362 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001363
Victor Stinner26486ea2010-05-15 22:23:53 +00001364 switch (PyTuple_Size(args)) {
1365 case 0:
1366 rtn = winch(self->win);
1367 break;
1368 case 2:
1369 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1370 return NULL;
1371 rtn = mvwinch(self->win,y,x);
1372 break;
1373 default:
1374 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1375 return NULL;
1376 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001377 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001378}
1379
1380static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001381PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001382{
Victor Stinner26486ea2010-05-15 22:23:53 +00001383 int x, y, n;
1384 char rtn[1024]; /* This should be big enough.. I hope */
1385 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001386
Victor Stinner26486ea2010-05-15 22:23:53 +00001387 switch (PyTuple_Size(args)) {
1388 case 0:
1389 rtn2 = winnstr(self->win,rtn, 1023);
1390 break;
1391 case 1:
1392 if (!PyArg_ParseTuple(args,"i;n", &n))
1393 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001394 if (n < 0) {
1395 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1396 return NULL;
1397 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001398 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001399 break;
1400 case 2:
1401 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1402 return NULL;
1403 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1404 break;
1405 case 3:
1406 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1407 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001408 if (n < 0) {
1409 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1410 return NULL;
1411 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001412 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001413 break;
1414 default:
1415 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1416 return NULL;
1417 }
1418 if (rtn2 == ERR)
1419 rtn[0] = 0;
1420 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001421}
1422
1423static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001424PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001425{
Victor Stinner26486ea2010-05-15 22:23:53 +00001426 int rtn;
1427 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001428 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001429 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001430#ifdef HAVE_NCURSESW
1431 wchar_t *wstr = NULL;
1432#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001433 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1434 long lattr;
1435 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001436 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001437
Victor Stinner26486ea2010-05-15 22:23:53 +00001438 switch (PyTuple_Size(args)) {
1439 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001440 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 return NULL;
1442 break;
1443 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001444 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001445 return NULL;
1446 attr = lattr;
1447 use_attr = TRUE;
1448 break;
1449 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001450 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001451 return NULL;
1452 use_xy = TRUE;
1453 break;
1454 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001455 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001456 return NULL;
1457 attr = lattr;
1458 use_xy = use_attr = TRUE;
1459 break;
1460 default:
1461 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1462 return NULL;
1463 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001464
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001465#ifdef HAVE_NCURSESW
1466 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1467#else
1468 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1469#endif
1470 if (strtype == 0)
1471 return NULL;
1472
Victor Stinner26486ea2010-05-15 22:23:53 +00001473 if (use_attr == TRUE) {
1474 attr_old = getattrs(self->win);
1475 (void)wattrset(self->win,attr);
1476 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001477#ifdef HAVE_NCURSESW
1478 if (strtype == 2) {
1479 funcname = "inswstr";
1480 if (use_xy == TRUE)
1481 rtn = mvwins_wstr(self->win,y,x,wstr);
1482 else
1483 rtn = wins_wstr(self->win,wstr);
1484 PyMem_Free(wstr);
1485 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001486 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001487#endif
1488 {
1489 char *str = PyBytes_AS_STRING(bytesobj);
1490 funcname = "insstr";
1491 if (use_xy == TRUE)
1492 rtn = mvwinsstr(self->win,y,x,str);
1493 else
1494 rtn = winsstr(self->win,str);
1495 Py_DECREF(bytesobj);
1496 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001497 if (use_attr == TRUE)
1498 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001499 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001500}
1501
1502static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001503PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001504{
Victor Stinner26486ea2010-05-15 22:23:53 +00001505 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001506 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001507 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001508#ifdef HAVE_NCURSESW
1509 wchar_t *wstr = NULL;
1510#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001511 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1512 long lattr;
1513 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001514 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001515
Victor Stinner26486ea2010-05-15 22:23:53 +00001516 switch (PyTuple_Size(args)) {
1517 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001518 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001519 return NULL;
1520 break;
1521 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001522 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001523 return NULL;
1524 attr = lattr;
1525 use_attr = TRUE;
1526 break;
1527 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001528 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001529 return NULL;
1530 use_xy = TRUE;
1531 break;
1532 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001533 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001534 return NULL;
1535 attr = lattr;
1536 use_xy = use_attr = TRUE;
1537 break;
1538 default:
1539 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1540 return NULL;
1541 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001542
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001543#ifdef HAVE_NCURSESW
1544 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1545#else
1546 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1547#endif
1548 if (strtype == 0)
1549 return NULL;
1550
Victor Stinner26486ea2010-05-15 22:23:53 +00001551 if (use_attr == TRUE) {
1552 attr_old = getattrs(self->win);
1553 (void)wattrset(self->win,attr);
1554 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001555#ifdef HAVE_NCURSESW
1556 if (strtype == 2) {
1557 funcname = "insn_wstr";
1558 if (use_xy == TRUE)
1559 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1560 else
1561 rtn = wins_nwstr(self->win,wstr,n);
1562 PyMem_Free(wstr);
1563 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001564 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001565#endif
1566 {
1567 char *str = PyBytes_AS_STRING(bytesobj);
1568 funcname = "insnstr";
1569 if (use_xy == TRUE)
1570 rtn = mvwinsnstr(self->win,y,x,str,n);
1571 else
1572 rtn = winsnstr(self->win,str,n);
1573 Py_DECREF(bytesobj);
1574 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001575 if (use_attr == TRUE)
1576 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001577 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001578}
1579
1580static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001581PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001582{
Victor Stinner26486ea2010-05-15 22:23:53 +00001583 int line, erg;
1584 if (!PyArg_ParseTuple(args,"i;line", &line))
1585 return NULL;
1586 erg = is_linetouched(self->win, line);
1587 if (erg == ERR) {
1588 PyErr_SetString(PyExc_TypeError,
1589 "is_linetouched: line number outside of boundaries");
1590 return NULL;
1591 } else
1592 if (erg == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001593 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001594 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001595 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00001596 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001597}
1598
1599static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001600PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001601{
Victor Stinner26486ea2010-05-15 22:23:53 +00001602 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1603 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001604
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001605#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001606 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001607#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001608 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001609#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001610 {
1611 switch(PyTuple_Size(args)) {
1612 case 6:
1613 if (!PyArg_ParseTuple(args,
1614 "iiiiii;" \
1615 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1616 &pminrow, &pmincol, &sminrow,
1617 &smincol, &smaxrow, &smaxcol))
1618 return NULL;
1619 Py_BEGIN_ALLOW_THREADS
1620 rtn = pnoutrefresh(self->win,
1621 pminrow, pmincol, sminrow,
1622 smincol, smaxrow, smaxcol);
1623 Py_END_ALLOW_THREADS
1624 return PyCursesCheckERR(rtn, "pnoutrefresh");
1625 default:
1626 PyErr_SetString(PyCursesError,
1627 "noutrefresh() called for a pad "
1628 "requires 6 arguments");
1629 return NULL;
1630 }
1631 } else {
1632 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1633 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001634
Victor Stinner26486ea2010-05-15 22:23:53 +00001635 Py_BEGIN_ALLOW_THREADS
1636 rtn = wnoutrefresh(self->win);
1637 Py_END_ALLOW_THREADS
1638 return PyCursesCheckERR(rtn, "wnoutrefresh");
1639 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001640}
1641
1642static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001643PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1644{
1645 PyCursesWindowObject *temp;
1646 int use_copywin = FALSE;
1647 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1648 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001649
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001650 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001651 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001652 if (!PyArg_ParseTuple(args, "O!;window object",
1653 &PyCursesWindow_Type, &temp))
1654 return NULL;
1655 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001656 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001657 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1658 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1659 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1660 return NULL;
1661 use_copywin = TRUE;
1662 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001663 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001664 PyErr_SetString(PyExc_TypeError,
1665 "overlay requires one or seven arguments");
1666 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001667 }
1668
1669 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001670 rtn = copywin(self->win, temp->win, sminrow, smincol,
1671 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1672 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001673 }
1674 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001675 rtn = overlay(self->win, temp->win);
1676 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001677 }
1678}
1679
1680static PyObject *
1681PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1682{
1683 PyCursesWindowObject *temp;
1684 int use_copywin = FALSE;
1685 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1686 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001687
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001688 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001689 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001690 if (!PyArg_ParseTuple(args, "O!;window object",
1691 &PyCursesWindow_Type, &temp))
1692 return NULL;
1693 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001694 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001695 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1696 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1697 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1698 return NULL;
1699 use_copywin = TRUE;
1700 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001701 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001702 PyErr_SetString(PyExc_TypeError,
1703 "overwrite requires one or seven arguments");
1704 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001705 }
1706
1707 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001708 rtn = copywin(self->win, temp->win, sminrow, smincol,
1709 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001710 return PyCursesCheckERR(rtn, "copywin");
1711 }
1712 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001713 rtn = overwrite(self->win, temp->win);
1714 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001715 }
1716}
1717
1718static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001719PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001720{
Victor Stinner26486ea2010-05-15 22:23:53 +00001721 /* We have to simulate this by writing to a temporary FILE*,
1722 then reading back, then writing to the argument stream. */
Christian Heimes2b221b72017-03-02 11:09:01 +01001723 FILE *fp;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001724 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001725
Christian Heimes2b221b72017-03-02 11:09:01 +01001726 fp = tmpfile();
1727 if (fp == NULL)
1728 return PyErr_SetFromErrno(PyExc_OSError);
1729 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001730 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001731 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001732 if (res == NULL)
1733 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001734 fseek(fp, 0, 0);
1735 while (1) {
1736 char buf[BUFSIZ];
1737 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001738 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001739
Victor Stinner26486ea2010-05-15 22:23:53 +00001740 if (n <= 0)
1741 break;
1742 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001743 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001744 if (res == NULL)
1745 break;
1746 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001747
1748exit:
Christian Heimes2b221b72017-03-02 11:09:01 +01001749 fclose(fp);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001750 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001751}
1752
1753static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001754PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001755{
Victor Stinner26486ea2010-05-15 22:23:53 +00001756 int beg, num;
1757 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1758 return NULL;
1759 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001760}
1761
1762static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001763PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001764{
Victor Stinner26486ea2010-05-15 22:23:53 +00001765 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1766 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001767
Victor Stinner26486ea2010-05-15 22:23:53 +00001768#ifndef WINDOW_HAS_FLAGS
1769 if (0)
1770#else
1771 if (self->win->_flags & _ISPAD)
1772#endif
1773 {
1774 switch(PyTuple_Size(args)) {
1775 case 6:
1776 if (!PyArg_ParseTuple(args,
1777 "iiiiii;" \
1778 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1779 &pminrow, &pmincol, &sminrow,
1780 &smincol, &smaxrow, &smaxcol))
1781 return NULL;
1782
1783 Py_BEGIN_ALLOW_THREADS
1784 rtn = prefresh(self->win,
1785 pminrow, pmincol, sminrow,
1786 smincol, smaxrow, smaxcol);
1787 Py_END_ALLOW_THREADS
1788 return PyCursesCheckERR(rtn, "prefresh");
1789 default:
1790 PyErr_SetString(PyCursesError,
1791 "refresh() for a pad requires 6 arguments");
1792 return NULL;
1793 }
1794 } else {
1795 if (!PyArg_ParseTuple(args, ":refresh"))
1796 return NULL;
1797 Py_BEGIN_ALLOW_THREADS
1798 rtn = wrefresh(self->win);
1799 Py_END_ALLOW_THREADS
1800 return PyCursesCheckERR(rtn, "prefresh");
1801 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001802}
1803
1804static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001805PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001806{
Victor Stinner26486ea2010-05-15 22:23:53 +00001807 int x, y;
1808 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1809 return NULL;
1810 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001811}
1812
1813static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001814PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001815{
Victor Stinner26486ea2010-05-15 22:23:53 +00001816 WINDOW *win;
1817 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818
Victor Stinner26486ea2010-05-15 22:23:53 +00001819 nlines = 0;
1820 ncols = 0;
1821 switch (PyTuple_Size(args)) {
1822 case 2:
1823 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1824 return NULL;
1825 break;
1826 case 4:
1827 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1828 &nlines,&ncols,&begin_y,&begin_x))
1829 return NULL;
1830 break;
1831 default:
1832 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1833 return NULL;
1834 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001835
Victor Stinner26486ea2010-05-15 22:23:53 +00001836 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001837#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001838 if (self->win->_flags & _ISPAD)
1839 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1840 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001841#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001842 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001843
Victor Stinner26486ea2010-05-15 22:23:53 +00001844 if (win == NULL) {
1845 PyErr_SetString(PyCursesError, catchall_NULL);
1846 return NULL;
1847 }
1848
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001849 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001850}
1851
1852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001853PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001854{
Victor Stinner26486ea2010-05-15 22:23:53 +00001855 int nlines;
1856 switch(PyTuple_Size(args)) {
1857 case 0:
1858 return PyCursesCheckERR(scroll(self->win), "scroll");
1859 case 1:
1860 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1861 return NULL;
1862 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1863 default:
1864 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1865 return NULL;
1866 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001867}
1868
1869static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001870PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001871{
Victor Stinner26486ea2010-05-15 22:23:53 +00001872 int st, cnt, val;
1873 switch (PyTuple_Size(args)) {
1874 case 2:
1875 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1876 return NULL;
1877 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1878 case 3:
1879 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1880 return NULL;
1881 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1882 default:
1883 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1884 return NULL;
1885 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001886}
1887
1888static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001889PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001890{
Victor Stinner26486ea2010-05-15 22:23:53 +00001891 PyObject *temp;
1892 chtype ch;
1893 int n, x, y, code = OK;
1894 attr_t attr = A_NORMAL;
1895 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896
Victor Stinner26486ea2010-05-15 22:23:53 +00001897 switch (PyTuple_Size(args)) {
1898 case 2:
1899 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1900 return NULL;
1901 break;
1902 case 3:
1903 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1904 return NULL;
1905 attr = lattr;
1906 break;
1907 case 4:
1908 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1909 return NULL;
1910 code = wmove(self->win, y, x);
1911 break;
1912 case 5:
1913 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1914 &y, &x, &temp, &n, &lattr))
1915 return NULL;
1916 attr = lattr;
1917 code = wmove(self->win, y, x);
1918 break;
1919 default:
1920 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1921 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001922 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001923
1924 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001925 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001926 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001927 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1928 } else
1929 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001930}
1931
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001932static PyObject *
1933PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1934{
1935 return PyUnicode_FromString(self->encoding);
1936}
1937
1938static int
1939PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1940{
1941 PyObject *ascii;
1942 char *encoding;
1943
1944 /* It is illegal to del win.encoding */
1945 if (value == NULL) {
1946 PyErr_SetString(PyExc_TypeError,
1947 "encoding may not be deleted");
1948 return -1;
1949 }
1950
1951 if (!PyUnicode_Check(value)) {
1952 PyErr_SetString(PyExc_TypeError,
1953 "setting encoding to a non-string");
1954 return -1;
1955 }
1956 ascii = PyUnicode_AsASCIIString(value);
1957 if (ascii == NULL)
1958 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001959 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001960 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001961 if (encoding == NULL) {
1962 PyErr_NoMemory();
1963 return -1;
1964 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001965 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001966 self->encoding = encoding;
1967 return 0;
1968}
1969
1970
Guido van Rossumf6971e21994-08-30 12:25:20 +00001971static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001972 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001973 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1974 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1975 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1976 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1977 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1978 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1979 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1980 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1981 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1982 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1983 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1984 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1985 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1986 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1987 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1988 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1989 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1990 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1991 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001992#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00001993 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001994#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001995 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1996 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1997 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1998 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1999 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002000#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002001 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002002#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002003 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2004 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2005 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2006 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2007 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2008 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2009 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2010 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2011 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2012 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2013 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2014 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2015 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2016 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2017 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2018 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2019 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2020 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2021 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2022 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2023 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2024 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2025 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2026 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2027 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002028 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2029 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2030 METH_VARARGS},
2031 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2032 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2033 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2034 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002035#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002036 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002037#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002038 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2039 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2040 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2041 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2042 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2043 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2044 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2045 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2046 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2047 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2048 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2049 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2050 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2051 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2052 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2053 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002054};
2055
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002056static PyGetSetDef PyCursesWindow_getsets[] = {
2057 {"encoding",
2058 (getter)PyCursesWindow_get_encoding,
2059 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002060 "the typecode character used to create the array"},
2061 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002062};
2063
Guido van Rossumf6971e21994-08-30 12:25:20 +00002064/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002065
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002066PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002067 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002068 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002069 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2070 0, /*tp_itemsize*/
2071 /* methods */
2072 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2073 0, /*tp_print*/
2074 (getattrfunc)0, /*tp_getattr*/
2075 (setattrfunc)0, /*tp_setattr*/
2076 0, /*tp_reserved*/
2077 0, /*tp_repr*/
2078 0, /*tp_as_number*/
2079 0, /*tp_as_sequence*/
2080 0, /*tp_as_mapping*/
2081 0, /*tp_hash*/
2082 0, /*tp_call*/
2083 0, /*tp_str*/
2084 0, /*tp_getattro*/
2085 0, /*tp_setattro*/
2086 0, /*tp_as_buffer*/
2087 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2088 0, /*tp_doc*/
2089 0, /*tp_traverse*/
2090 0, /*tp_clear*/
2091 0, /*tp_richcompare*/
2092 0, /*tp_weaklistoffset*/
2093 0, /*tp_iter*/
2094 0, /*tp_iternext*/
2095 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002096 0, /* tp_members */
2097 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002098};
2099
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002100/*********************************************************************
2101 Global Functions
2102**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002103
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002104NoArgNoReturnFunction(beep)
2105NoArgNoReturnFunction(def_prog_mode)
2106NoArgNoReturnFunction(def_shell_mode)
2107NoArgNoReturnFunction(doupdate)
2108NoArgNoReturnFunction(endwin)
2109NoArgNoReturnFunction(flash)
2110NoArgNoReturnFunction(nocbreak)
2111NoArgNoReturnFunction(noecho)
2112NoArgNoReturnFunction(nonl)
2113NoArgNoReturnFunction(noraw)
2114NoArgNoReturnFunction(reset_prog_mode)
2115NoArgNoReturnFunction(reset_shell_mode)
2116NoArgNoReturnFunction(resetty)
2117NoArgNoReturnFunction(savetty)
2118
2119NoArgOrFlagNoReturnFunction(cbreak)
2120NoArgOrFlagNoReturnFunction(echo)
2121NoArgOrFlagNoReturnFunction(nl)
2122NoArgOrFlagNoReturnFunction(raw)
2123
2124NoArgReturnIntFunction(baudrate)
2125NoArgReturnIntFunction(termattrs)
2126
2127NoArgReturnStringFunction(termname)
2128NoArgReturnStringFunction(longname)
2129
2130NoArgTrueFalseFunction(can_change_color)
2131NoArgTrueFalseFunction(has_colors)
2132NoArgTrueFalseFunction(has_ic)
2133NoArgTrueFalseFunction(has_il)
2134NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002135NoArgNoReturnVoidFunction(flushinp)
2136NoArgNoReturnVoidFunction(noqiflush)
2137
2138static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002139PyCurses_filter(PyObject *self)
2140{
Victor Stinner26486ea2010-05-15 22:23:53 +00002141 /* not checking for PyCursesInitialised here since filter() must
2142 be called before initscr() */
2143 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002144 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002145}
2146
2147static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002148PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002149{
Victor Stinner26486ea2010-05-15 22:23:53 +00002150 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002151
Victor Stinner26486ea2010-05-15 22:23:53 +00002152 PyCursesInitialised;
2153 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002154
Victor Stinner26486ea2010-05-15 22:23:53 +00002155 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002156
Victor Stinner26486ea2010-05-15 22:23:53 +00002157 if (color_content(color, &r, &g, &b) != ERR)
2158 return Py_BuildValue("(iii)", r, g, b);
2159 else {
2160 PyErr_SetString(PyCursesError,
2161 "Argument 1 was out of range. Check value of COLORS.");
2162 return NULL;
2163 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164}
2165
2166static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002167PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168{
Victor Stinner26486ea2010-05-15 22:23:53 +00002169 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002170
Victor Stinner26486ea2010-05-15 22:23:53 +00002171 PyCursesInitialised;
2172 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002173
Victor Stinner26486ea2010-05-15 22:23:53 +00002174 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2175 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176}
2177
2178static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002179PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002180{
Victor Stinner26486ea2010-05-15 22:23:53 +00002181 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002182
Victor Stinner26486ea2010-05-15 22:23:53 +00002183 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002184
Victor Stinner26486ea2010-05-15 22:23:53 +00002185 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186
Victor Stinner26486ea2010-05-15 22:23:53 +00002187 erg = curs_set(vis);
2188 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002189
Victor Stinner26486ea2010-05-15 22:23:53 +00002190 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191}
2192
2193static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002194PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002195{
Victor Stinner26486ea2010-05-15 22:23:53 +00002196 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002197
Victor Stinner26486ea2010-05-15 22:23:53 +00002198 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002199
Victor Stinner26486ea2010-05-15 22:23:53 +00002200 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201
Victor Stinner26486ea2010-05-15 22:23:53 +00002202 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203}
2204
2205static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002206PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207{
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002209
Victor Stinner26486ea2010-05-15 22:23:53 +00002210 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002211
Victor Stinner26486ea2010-05-15 22:23:53 +00002212 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215}
2216
2217static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002218PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219{
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 int x = 0;
2221 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002222
Victor Stinner26486ea2010-05-15 22:23:53 +00002223 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002224
Victor Stinner26486ea2010-05-15 22:23:53 +00002225 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226
Victor Stinner26486ea2010-05-15 22:23:53 +00002227 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228}
2229
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002230#ifdef NCURSES_MOUSE_VERSION
2231static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002232PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002233{
Victor Stinner26486ea2010-05-15 22:23:53 +00002234 int rtn;
2235 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002238
Victor Stinner26486ea2010-05-15 22:23:53 +00002239 rtn = getmouse( &event );
2240 if (rtn == ERR) {
2241 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2242 return NULL;
2243 }
2244 return Py_BuildValue("(hiiil)",
2245 (short)event.id,
2246 event.x, event.y, event.z,
2247 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002248}
2249
2250static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002251PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002252{
Victor Stinner26486ea2010-05-15 22:23:53 +00002253 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002254
Victor Stinner26486ea2010-05-15 22:23:53 +00002255 PyCursesInitialised;
2256 if (!PyArg_ParseTuple(args, "hiiil",
2257 &event.id,
2258 &event.x, &event.y, &event.z,
2259 (int *) &event.bstate))
2260 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002263}
2264#endif
2265
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002266static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002267PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002268{
Christian Heimes2b221b72017-03-02 11:09:01 +01002269 FILE *fp;
Victor Stinner26486ea2010-05-15 22:23:53 +00002270 PyObject *data;
2271 size_t datalen;
2272 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002273 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002274 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275
Victor Stinner26486ea2010-05-15 22:23:53 +00002276 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277
Christian Heimes2b221b72017-03-02 11:09:01 +01002278 fp = tmpfile();
2279 if (fp == NULL)
2280 return PyErr_SetFromErrno(PyExc_OSError);
2281
2282 if (_Py_set_inheritable(fileno(fp), 0, NULL) < 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002283 goto error;
Christian Heimes2b221b72017-03-02 11:09:01 +01002284
Victor Stinnerdaf45552013-08-28 00:53:59 +02002285
Victor Stinner3466bde2016-09-05 18:16:01 -07002286 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002287 if (data == NULL)
2288 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002289 if (!PyBytes_Check(data)) {
2290 PyErr_Format(PyExc_TypeError,
2291 "f.read() returned %.100s instead of bytes",
2292 data->ob_type->tp_name);
2293 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002294 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 }
2296 datalen = PyBytes_GET_SIZE(data);
2297 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2298 Py_DECREF(data);
Christian Heimes2b221b72017-03-02 11:09:01 +01002299 PyErr_SetFromErrno(PyExc_OSError);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002300 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002301 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002302 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002303
Victor Stinner26486ea2010-05-15 22:23:53 +00002304 fseek(fp, 0, 0);
2305 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002306 if (win == NULL) {
2307 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002308 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002309 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002310 res = PyCursesWindow_New(win, NULL);
2311
2312error:
Christian Heimes2b221b72017-03-02 11:09:01 +01002313 fclose(fp);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002314 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002315}
2316
2317static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002318PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002319{
Victor Stinner26486ea2010-05-15 22:23:53 +00002320 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002321
Victor Stinner26486ea2010-05-15 22:23:53 +00002322 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002323
Victor Stinner26486ea2010-05-15 22:23:53 +00002324 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002325
Victor Stinner26486ea2010-05-15 22:23:53 +00002326 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002327}
2328
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002329#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002330/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002331static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002332{
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002334
Victor Stinner26486ea2010-05-15 22:23:53 +00002335 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002336
Victor Stinner26486ea2010-05-15 22:23:53 +00002337 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002338
Victor Stinner26486ea2010-05-15 22:23:53 +00002339 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002340 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002341 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002342 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002344#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002345
2346static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002347PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002348{
Victor Stinner26486ea2010-05-15 22:23:53 +00002349 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002350
Victor Stinner26486ea2010-05-15 22:23:53 +00002351 PyCursesInitialised;
2352 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002353
Victor Stinner26486ea2010-05-15 22:23:53 +00002354 switch(PyTuple_Size(args)) {
2355 case 4:
2356 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2357 break;
2358 default:
2359 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2360 return NULL;
2361 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002364}
2365
2366static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002367PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002368{
Victor Stinner26486ea2010-05-15 22:23:53 +00002369 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002370
Victor Stinner26486ea2010-05-15 22:23:53 +00002371 PyCursesInitialised;
2372 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002373
Victor Stinner26486ea2010-05-15 22:23:53 +00002374 if (PyTuple_Size(args) != 3) {
2375 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2376 return NULL;
2377 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002380
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002382}
2383
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002384static PyObject *ModDict;
2385
Victor Stinner26486ea2010-05-15 22:23:53 +00002386static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002387PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002388{
Victor Stinner26486ea2010-05-15 22:23:53 +00002389 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002390 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002391
Victor Stinner26486ea2010-05-15 22:23:53 +00002392 if (initialised == TRUE) {
2393 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002394 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002395 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002396
Victor Stinner26486ea2010-05-15 22:23:53 +00002397 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002398
Victor Stinner26486ea2010-05-15 22:23:53 +00002399 if (win == NULL) {
2400 PyErr_SetString(PyCursesError, catchall_NULL);
2401 return NULL;
2402 }
Guido van Rossum85738471995-02-17 13:50:17 +00002403
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002405
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002406/* This was moved from initcurses() because it core dumped on SGI,
2407 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002408#define SetDictInt(string,ch) \
2409 do { \
2410 PyObject *o = PyLong_FromLong((long) (ch)); \
2411 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2412 Py_DECREF(o); \
2413 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002414 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002415
Victor Stinner26486ea2010-05-15 22:23:53 +00002416 /* Here are some graphic symbols you can use */
2417 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2418 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2419 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2420 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2421 SetDictInt("ACS_LTEE", (ACS_LTEE));
2422 SetDictInt("ACS_RTEE", (ACS_RTEE));
2423 SetDictInt("ACS_BTEE", (ACS_BTEE));
2424 SetDictInt("ACS_TTEE", (ACS_TTEE));
2425 SetDictInt("ACS_HLINE", (ACS_HLINE));
2426 SetDictInt("ACS_VLINE", (ACS_VLINE));
2427 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002428#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002429 /* On HP/UX 11, these are of type cchar_t, which is not an
2430 integral type. If this is a problem on more platforms, a
2431 configure test should be added to determine whether ACS_S1
2432 is of integral type. */
2433 SetDictInt("ACS_S1", (ACS_S1));
2434 SetDictInt("ACS_S9", (ACS_S9));
2435 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2436 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2437 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2438 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2439 SetDictInt("ACS_BULLET", (ACS_BULLET));
2440 SetDictInt("ACS_LARROW", (ACS_LARROW));
2441 SetDictInt("ACS_RARROW", (ACS_RARROW));
2442 SetDictInt("ACS_DARROW", (ACS_DARROW));
2443 SetDictInt("ACS_UARROW", (ACS_UARROW));
2444 SetDictInt("ACS_BOARD", (ACS_BOARD));
2445 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2446 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002447#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002448 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2449 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2450 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2451 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2452 SetDictInt("ACS_SBSS", (ACS_RTEE));
2453 SetDictInt("ACS_SSSB", (ACS_LTEE));
2454 SetDictInt("ACS_SSBS", (ACS_BTEE));
2455 SetDictInt("ACS_BSSS", (ACS_TTEE));
2456 SetDictInt("ACS_BSBS", (ACS_HLINE));
2457 SetDictInt("ACS_SBSB", (ACS_VLINE));
2458 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002459
Victor Stinner26486ea2010-05-15 22:23:53 +00002460 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002461#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002462 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002463#endif
2464#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002465 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002466#endif
2467#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002468 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002469#endif
2470#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002472#endif
2473#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002474 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002475#endif
2476#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002477 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002478#endif
2479#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002480 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002481#endif
2482
Victor Stinner26486ea2010-05-15 22:23:53 +00002483 SetDictInt("LINES", LINES);
2484 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002485
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002486 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2487 screen_encoding = winobj->encoding;
2488 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002489}
2490
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002491static PyObject *
2492PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2493{
Victor Stinner26486ea2010-05-15 22:23:53 +00002494 int fd = -1;
2495 int err;
2496 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002497
Victor Stinner26486ea2010-05-15 22:23:53 +00002498 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002499
Victor Stinner26486ea2010-05-15 22:23:53 +00002500 if (!PyArg_ParseTupleAndKeywords(
2501 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2502 return NULL;
2503 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002504
Victor Stinner26486ea2010-05-15 22:23:53 +00002505 if (fd == -1) {
2506 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002507
Victor Stinnerbd303c12013-11-07 23:07:29 +01002508 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002509
Victor Stinner26486ea2010-05-15 22:23:53 +00002510 if (sys_stdout == NULL || sys_stdout == Py_None) {
2511 PyErr_SetString(
2512 PyCursesError,
2513 "lost sys.stdout");
2514 return NULL;
2515 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002516
Victor Stinner26486ea2010-05-15 22:23:53 +00002517 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002518
Victor Stinner26486ea2010-05-15 22:23:53 +00002519 if (fd == -1) {
2520 return NULL;
2521 }
2522 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002523
Matthias Klose635edd12010-07-30 21:40:57 +00002524 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002525 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002526
Victor Stinner26486ea2010-05-15 22:23:53 +00002527 if (err == 0) {
2528 s = "setupterm: could not find terminal";
2529 } else if (err == -1) {
2530 s = "setupterm: could not find terminfo database";
2531 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002532
Victor Stinner26486ea2010-05-15 22:23:53 +00002533 PyErr_SetString(PyCursesError,s);
2534 return NULL;
2535 }
2536
2537 initialised_setupterm = TRUE;
2538
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002539 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002540}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002541
2542static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002543PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002544{
Victor Stinner26486ea2010-05-15 22:23:53 +00002545 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002546
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002548
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 switch(PyTuple_Size(args)) {
2550 case 1:
2551 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2552 break;
2553 default:
2554 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2555 return NULL;
2556 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002557
Victor Stinner26486ea2010-05-15 22:23:53 +00002558 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002559}
2560
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002561#ifdef HAVE_CURSES_IS_TERM_RESIZED
2562static PyObject *
2563PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2564{
Victor Stinner26486ea2010-05-15 22:23:53 +00002565 int lines;
2566 int columns;
2567 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002568
Victor Stinner26486ea2010-05-15 22:23:53 +00002569 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002570
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2572 return NULL;
2573 result = is_term_resized(lines, columns);
2574 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002575 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002576 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002577 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002579}
2580#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2581
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002582#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002583static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002584PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002585{
Victor Stinner26486ea2010-05-15 22:23:53 +00002586 const char *knp;
2587 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002590
Victor Stinner26486ea2010-05-15 22:23:53 +00002591 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002592
Victor Stinner26486ea2010-05-15 22:23:53 +00002593 if (ch < 0) {
2594 PyErr_SetString(PyExc_ValueError, "invalid key number");
2595 return NULL;
2596 }
2597 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002598
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002599 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002600}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002601#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002602
Victor Stinner26486ea2010-05-15 22:23:53 +00002603static PyObject *
2604PyCurses_KillChar(PyObject *self)
2605{
2606 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002607
Victor Stinner26486ea2010-05-15 22:23:53 +00002608 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002609
Victor Stinner26486ea2010-05-15 22:23:53 +00002610 return PyBytes_FromStringAndSize(&ch, 1);
2611}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002612
2613static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002614PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002615{
Victor Stinner26486ea2010-05-15 22:23:53 +00002616 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002617
Victor Stinner26486ea2010-05-15 22:23:53 +00002618 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002619
Victor Stinner26486ea2010-05-15 22:23:53 +00002620 switch(PyTuple_Size(args)) {
2621 case 1:
2622 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2623 break;
2624 default:
2625 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2626 return NULL;
2627 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002628
Victor Stinner26486ea2010-05-15 22:23:53 +00002629 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002630}
2631
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002632#ifdef NCURSES_MOUSE_VERSION
2633static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002634PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002635{
Victor Stinner26486ea2010-05-15 22:23:53 +00002636 int interval;
2637 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002638
Victor Stinner26486ea2010-05-15 22:23:53 +00002639 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2640 return NULL;
2641 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002642}
2643
2644static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002645PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002646{
Victor Stinner26486ea2010-05-15 22:23:53 +00002647 int newmask;
2648 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002649
Victor Stinner26486ea2010-05-15 22:23:53 +00002650 PyCursesInitialised;
2651 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2652 return NULL;
2653 availmask = mousemask(newmask, &oldmask);
2654 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002655}
2656#endif
2657
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002658static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002659PyCurses_Napms(PyObject *self, PyObject *args)
2660{
2661 int ms;
2662
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002663 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002664 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002665
2666 return Py_BuildValue("i", napms(ms));
2667}
2668
2669
2670static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002671PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002672{
Victor Stinner26486ea2010-05-15 22:23:53 +00002673 WINDOW *win;
2674 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002675
Victor Stinner26486ea2010-05-15 22:23:53 +00002676 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002677
Victor Stinner26486ea2010-05-15 22:23:53 +00002678 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002679
Victor Stinner26486ea2010-05-15 22:23:53 +00002680 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002681
Victor Stinner26486ea2010-05-15 22:23:53 +00002682 if (win == NULL) {
2683 PyErr_SetString(PyCursesError, catchall_NULL);
2684 return NULL;
2685 }
2686
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002687 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002688}
2689
2690static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002691PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002692{
Victor Stinner26486ea2010-05-15 22:23:53 +00002693 WINDOW *win;
2694 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002695
Victor Stinner26486ea2010-05-15 22:23:53 +00002696 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697
Victor Stinner26486ea2010-05-15 22:23:53 +00002698 switch (PyTuple_Size(args)) {
2699 case 2:
2700 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2701 return NULL;
2702 break;
2703 case 4:
2704 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2705 &nlines,&ncols,&begin_y,&begin_x))
2706 return NULL;
2707 break;
2708 default:
2709 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2710 return NULL;
2711 }
Guido van Rossum85738471995-02-17 13:50:17 +00002712
Victor Stinner26486ea2010-05-15 22:23:53 +00002713 win = newwin(nlines,ncols,begin_y,begin_x);
2714 if (win == NULL) {
2715 PyErr_SetString(PyCursesError, catchall_NULL);
2716 return NULL;
2717 }
Guido van Rossum85738471995-02-17 13:50:17 +00002718
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002719 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002720}
2721
2722static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002723PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002724{
Victor Stinner26486ea2010-05-15 22:23:53 +00002725 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002726
Victor Stinner26486ea2010-05-15 22:23:53 +00002727 PyCursesInitialised;
2728 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002729
Victor Stinner26486ea2010-05-15 22:23:53 +00002730 switch(PyTuple_Size(args)) {
2731 case 1:
2732 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2733 break;
2734 default:
2735 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2736 return NULL;
2737 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002738
Victor Stinner26486ea2010-05-15 22:23:53 +00002739 if (pair_content(pair, &f, &b)==ERR) {
2740 PyErr_SetString(PyCursesError,
2741 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2742 return NULL;
2743 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002744
Victor Stinner26486ea2010-05-15 22:23:53 +00002745 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002746}
2747
2748static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002749PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002750{
Victor Stinner26486ea2010-05-15 22:23:53 +00002751 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002752
Victor Stinner26486ea2010-05-15 22:23:53 +00002753 PyCursesInitialised;
2754 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002755
Victor Stinner26486ea2010-05-15 22:23:53 +00002756 switch(PyTuple_Size(args)) {
2757 case 1:
2758 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2759 break;
2760 default:
2761 PyErr_SetString(PyExc_TypeError,
2762 "pair_number requires 1 argument");
2763 return NULL;
2764 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002765
Victor Stinner26486ea2010-05-15 22:23:53 +00002766 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767}
2768
2769static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002770PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002771{
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002773
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002774 if (!PyArg_ParseTuple(args,"y;str", &str))
2775 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002776 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777}
2778
2779static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002780PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002781{
Victor Stinner26486ea2010-05-15 22:23:53 +00002782 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002783
Victor Stinner26486ea2010-05-15 22:23:53 +00002784 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002785
Victor Stinner26486ea2010-05-15 22:23:53 +00002786 switch(PyTuple_Size(args)) {
2787 case 0:
2788 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002789 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002790 case 1:
2791 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2792 if (flag) qiflush();
2793 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002794 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002795 default:
2796 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2797 return NULL;
2798 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002799}
2800
Guido van Rossumd8faa362007-04-27 19:54:29 +00002801/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2802 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002803#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002804static int
2805update_lines_cols(void)
2806{
Victor Stinner26486ea2010-05-15 22:23:53 +00002807 PyObject *o;
2808 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002809 _Py_IDENTIFIER(LINES);
2810 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002811
Victor Stinner26486ea2010-05-15 22:23:53 +00002812 if (!m)
2813 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002814
Victor Stinner26486ea2010-05-15 22:23:53 +00002815 o = PyLong_FromLong(LINES);
2816 if (!o) {
2817 Py_DECREF(m);
2818 return 0;
2819 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002820 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002821 Py_DECREF(m);
2822 Py_DECREF(o);
2823 return 0;
2824 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002825 /* PyId_LINES.object will be initialized here. */
2826 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002827 Py_DECREF(m);
2828 Py_DECREF(o);
2829 return 0;
2830 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002831 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 o = PyLong_FromLong(COLS);
2833 if (!o) {
2834 Py_DECREF(m);
2835 return 0;
2836 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002837 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002838 Py_DECREF(m);
2839 Py_DECREF(o);
2840 return 0;
2841 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002842 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002843 Py_DECREF(m);
2844 Py_DECREF(o);
2845 return 0;
2846 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002847 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002848 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002849 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002850}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002851
2852static PyObject *
2853PyCurses_update_lines_cols(PyObject *self)
2854{
2855 return PyLong_FromLong((long) update_lines_cols());
2856}
2857
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002858#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002859
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002860#ifdef HAVE_CURSES_RESIZETERM
2861static PyObject *
2862PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2863{
Victor Stinner26486ea2010-05-15 22:23:53 +00002864 int lines;
2865 int columns;
2866 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002867
Victor Stinner26486ea2010-05-15 22:23:53 +00002868 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002869
Victor Stinner26486ea2010-05-15 22:23:53 +00002870 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2871 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002872
Victor Stinner26486ea2010-05-15 22:23:53 +00002873 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2874 if (!result)
2875 return NULL;
2876 if (!update_lines_cols())
2877 return NULL;
2878 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002879}
2880
2881#endif
2882
2883#ifdef HAVE_CURSES_RESIZE_TERM
2884static PyObject *
2885PyCurses_Resize_Term(PyObject *self, PyObject *args)
2886{
Victor Stinner26486ea2010-05-15 22:23:53 +00002887 int lines;
2888 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889
Victor Stinner26486ea2010-05-15 22:23:53 +00002890 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002891
Victor Stinner26486ea2010-05-15 22:23:53 +00002892 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002893
Victor Stinner26486ea2010-05-15 22:23:53 +00002894 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2895 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002896
Victor Stinner26486ea2010-05-15 22:23:53 +00002897 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2898 if (!result)
2899 return NULL;
2900 if (!update_lines_cols())
2901 return NULL;
2902 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002903}
2904#endif /* HAVE_CURSES_RESIZE_TERM */
2905
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002906static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002907PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002908{
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002910
Victor Stinner26486ea2010-05-15 22:23:53 +00002911 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002912
Victor Stinner26486ea2010-05-15 22:23:53 +00002913 if (PyTuple_Size(args)!=2) {
2914 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2915 return NULL;
2916 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002917
Victor Stinner26486ea2010-05-15 22:23:53 +00002918 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002919
Victor Stinner26486ea2010-05-15 22:23:53 +00002920 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002921
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002922 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002923}
2924
2925static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002926PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002927{
Victor Stinner26486ea2010-05-15 22:23:53 +00002928 int code;
2929 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002930
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002932
Victor Stinner26486ea2010-05-15 22:23:53 +00002933 code = start_color();
2934 if (code != ERR) {
2935 initialisedcolors = TRUE;
2936 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002937 if (c == NULL)
2938 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002939 PyDict_SetItemString(ModDict, "COLORS", c);
2940 Py_DECREF(c);
2941 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002942 if (cp == NULL)
2943 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2945 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002946 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002947 } else {
2948 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2949 return NULL;
2950 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002951}
2952
2953static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002954PyCurses_tigetflag(PyObject *self, PyObject *args)
2955{
Victor Stinner26486ea2010-05-15 22:23:53 +00002956 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002957
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002959
Victor Stinner26486ea2010-05-15 22:23:53 +00002960 if (!PyArg_ParseTuple(args, "s", &capname))
2961 return NULL;
2962
2963 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002964}
2965
2966static PyObject *
2967PyCurses_tigetnum(PyObject *self, PyObject *args)
2968{
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002970
Victor Stinner26486ea2010-05-15 22:23:53 +00002971 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002972
Victor Stinner26486ea2010-05-15 22:23:53 +00002973 if (!PyArg_ParseTuple(args, "s", &capname))
2974 return NULL;
2975
2976 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002977}
2978
2979static PyObject *
2980PyCurses_tigetstr(PyObject *self, PyObject *args)
2981{
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002983
Victor Stinner26486ea2010-05-15 22:23:53 +00002984 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002985
Victor Stinner26486ea2010-05-15 22:23:53 +00002986 if (!PyArg_ParseTuple(args, "s", &capname))
2987 return NULL;
2988
2989 capname = tigetstr( capname );
2990 if (capname == 0 || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002991 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 }
2993 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002994}
2995
2996static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002997PyCurses_tparm(PyObject *self, PyObject *args)
2998{
Victor Stinner26486ea2010-05-15 22:23:53 +00002999 char* fmt;
3000 char* result = NULL;
3001 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 +00003002
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003004
Victor Stinner26621332011-11-02 23:45:29 +01003005 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 &fmt, &i1, &i2, &i3, &i4,
3007 &i5, &i6, &i7, &i8, &i9)) {
3008 return NULL;
3009 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003010
Victor Stinner26486ea2010-05-15 22:23:53 +00003011 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3012 if (!result) {
3013 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3014 return NULL;
3015 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003016
Victor Stinner26486ea2010-05-15 22:23:53 +00003017 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003018}
3019
3020static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003021PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003022{
Victor Stinner26486ea2010-05-15 22:23:53 +00003023 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003024
Victor Stinner26486ea2010-05-15 22:23:53 +00003025 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003026
Victor Stinner26486ea2010-05-15 22:23:53 +00003027 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003028
Victor Stinner26486ea2010-05-15 22:23:53 +00003029 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003030}
3031
3032static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003033PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003034{
Victor Stinner26486ea2010-05-15 22:23:53 +00003035 PyObject *temp;
3036 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003037
Victor Stinner26486ea2010-05-15 22:23:53 +00003038 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003039
Victor Stinner26486ea2010-05-15 22:23:53 +00003040 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003041
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003042 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003043 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003044
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003046}
3047
3048static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003049PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003050{
Victor Stinner26486ea2010-05-15 22:23:53 +00003051 PyObject *temp;
3052 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003053
Victor Stinner26486ea2010-05-15 22:23:53 +00003054 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003055
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003056 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003057 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003058
3059 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3060 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003061
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003063}
3064
Victor Stinner71e44cb2011-09-06 01:53:03 +02003065#ifdef HAVE_NCURSESW
3066/* Convert an object to a character (wchar_t):
3067
3068 - int
3069 - str of length 1
3070
3071 Return 1 on success, 0 on error. */
3072static int
3073PyCurses_ConvertToWchar_t(PyObject *obj,
3074 wchar_t *wch)
3075{
3076 if (PyUnicode_Check(obj)) {
3077 wchar_t buffer[2];
3078 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3079 PyErr_Format(PyExc_TypeError,
3080 "expect bytes or str of length 1, or int, "
3081 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003082 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003083 return 0;
3084 }
3085 *wch = buffer[0];
3086 return 2;
3087 }
3088 else if (PyLong_CheckExact(obj)) {
3089 long value;
3090 int overflow;
3091 value = PyLong_AsLongAndOverflow(obj, &overflow);
3092 if (overflow) {
3093 PyErr_SetString(PyExc_OverflowError,
3094 "int doesn't fit in long");
3095 return 0;
3096 }
3097 *wch = (wchar_t)value;
3098 if ((long)*wch != value) {
3099 PyErr_Format(PyExc_OverflowError,
3100 "character doesn't fit in wchar_t");
3101 return 0;
3102 }
3103 return 1;
3104 }
3105 else {
3106 PyErr_Format(PyExc_TypeError,
3107 "expect bytes or str of length 1, or int, got %s",
3108 Py_TYPE(obj)->tp_name);
3109 return 0;
3110 }
3111}
3112
3113static PyObject *
3114PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3115{
3116 PyObject *obj;
3117 wchar_t wch;
3118
3119 PyCursesInitialised;
3120
3121 if (!PyArg_ParseTuple(args,"O", &obj))
3122 return NULL;
3123
3124 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3125 return NULL;
3126 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3127}
3128#endif
3129
Guido van Rossumf6971e21994-08-30 12:25:20 +00003130static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003131PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003132{
Victor Stinner26486ea2010-05-15 22:23:53 +00003133 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003134
Victor Stinner26486ea2010-05-15 22:23:53 +00003135 switch(PyTuple_Size(args)) {
3136 case 1:
3137 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3138 return NULL;
3139 break;
3140 default:
3141 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3142 return NULL;
3143 }
3144 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003145 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003146}
3147
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003148#ifndef STRICT_SYSV_CURSES
3149static PyObject *
3150PyCurses_Use_Default_Colors(PyObject *self)
3151{
Victor Stinner26486ea2010-05-15 22:23:53 +00003152 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003153
Victor Stinner26486ea2010-05-15 22:23:53 +00003154 PyCursesInitialised;
3155 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003156
Victor Stinner26486ea2010-05-15 22:23:53 +00003157 code = use_default_colors();
3158 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003159 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003160 } else {
3161 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3162 return NULL;
3163 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003164}
3165#endif /* STRICT_SYSV_CURSES */
3166
Guido van Rossumf6971e21994-08-30 12:25:20 +00003167/* List of functions defined in the module */
3168
3169static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003170 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3171 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3172 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3173 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3174 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3175 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3176 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3177 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3178 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3179 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3180 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3181 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3182 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3183 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3184 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3185 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3186 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003187#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003188 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3189 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003190#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003191 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3192 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3193 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3194 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3195 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003196#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003197 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003198#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003199 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3200 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3201 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3202 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3203 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3204 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003205#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003206 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003207#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003208#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003209 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003210#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003211 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3212 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3213 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003214#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003215 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3216 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003217#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003218 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3219 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3220 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3221 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3222 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3223 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3224 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3225 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3226 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3227 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3228 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3229 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3230 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3231 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3232 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3233 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3234 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003235#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003236 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003237#endif
3238#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003239 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003240#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003241 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3242 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3243 {"setupterm", (PyCFunction)PyCurses_setupterm,
3244 METH_VARARGS|METH_KEYWORDS},
3245 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3246 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3247 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3248 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3249 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3250 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3251 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3252 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3253 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3254 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003255#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3256 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3257#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003258#ifdef HAVE_NCURSESW
3259 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3260#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003261 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003262#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003263 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003264#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003265 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003266};
3267
3268/* Initialization function for the module */
3269
Martin v. Löwis1a214512008-06-11 05:26:20 +00003270
3271static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003272 PyModuleDef_HEAD_INIT,
3273 "_curses",
3274 NULL,
3275 -1,
3276 PyCurses_methods,
3277 NULL,
3278 NULL,
3279 NULL,
3280 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003281};
3282
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003283PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003284PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003285{
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 PyObject *m, *d, *v, *c_api_object;
3287 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003288
Victor Stinner26486ea2010-05-15 22:23:53 +00003289 /* Initialize object type */
3290 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3291 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003292
Victor Stinner26486ea2010-05-15 22:23:53 +00003293 /* Initialize the C API pointer array */
3294 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3295 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3296 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3297 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003298
Victor Stinner26486ea2010-05-15 22:23:53 +00003299 /* Create the module and add the functions */
3300 m = PyModule_Create(&_cursesmodule);
3301 if (m == NULL)
3302 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003303
Victor Stinner26486ea2010-05-15 22:23:53 +00003304 /* Add some symbolic constants to the module */
3305 d = PyModule_GetDict(m);
3306 if (d == NULL)
3307 return NULL;
3308 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003309
Victor Stinner26486ea2010-05-15 22:23:53 +00003310 /* Add a capsule for the C API */
3311 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3312 PyDict_SetItemString(d, "_C_API", c_api_object);
3313 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003314
Victor Stinner26486ea2010-05-15 22:23:53 +00003315 /* For exception curses.error */
3316 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3317 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003318
Victor Stinner26486ea2010-05-15 22:23:53 +00003319 /* Make the version available */
3320 v = PyBytes_FromString(PyCursesVersion);
3321 PyDict_SetItemString(d, "version", v);
3322 PyDict_SetItemString(d, "__version__", v);
3323 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003324
Victor Stinner26486ea2010-05-15 22:23:53 +00003325 SetDictInt("ERR", ERR);
3326 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003327
Victor Stinner26486ea2010-05-15 22:23:53 +00003328 /* Here are some attributes you can add to chars to print */
3329
3330 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3331 SetDictInt("A_NORMAL", A_NORMAL);
3332 SetDictInt("A_STANDOUT", A_STANDOUT);
3333 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3334 SetDictInt("A_REVERSE", A_REVERSE);
3335 SetDictInt("A_BLINK", A_BLINK);
3336 SetDictInt("A_DIM", A_DIM);
3337 SetDictInt("A_BOLD", A_BOLD);
3338 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003339#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003340 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003341#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003342 SetDictInt("A_PROTECT", A_PROTECT);
3343 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3344 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003345
Victor Stinner26486ea2010-05-15 22:23:53 +00003346 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003347#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003348 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003349#endif
3350#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003351 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003352#endif
3353#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003354 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003355#endif
3356#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003357 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003358#endif
3359#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003360 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003361#endif
3362#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003364#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003365
Victor Stinner26486ea2010-05-15 22:23:53 +00003366 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3367 SetDictInt("COLOR_RED", COLOR_RED);
3368 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3369 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3370 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3371 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3372 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3373 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003374
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003375#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 /* Mouse-related constants */
3377 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3378 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3379 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3380 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3381 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003382
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3384 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3385 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3386 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3387 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003388
Victor Stinner26486ea2010-05-15 22:23:53 +00003389 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3390 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3391 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3392 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3393 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003394
Victor Stinner26486ea2010-05-15 22:23:53 +00003395 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3396 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3397 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3398 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3399 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003400
Victor Stinner26486ea2010-05-15 22:23:53 +00003401 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3402 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3403 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003404
Victor Stinner26486ea2010-05-15 22:23:53 +00003405 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3406 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003407#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003408 /* Now set everything up for KEY_ variables */
3409 {
3410 int key;
3411 char *key_n;
3412 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003413#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003414 for (key=KEY_MIN;key < KEY_MAX; key++) {
3415 key_n = (char *)keyname(key);
3416 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3417 continue;
3418 if (strncmp(key_n,"KEY_F(",6)==0) {
3419 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003420 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003421 if (!key_n2) {
3422 PyErr_NoMemory();
3423 break;
3424 }
3425 p1 = key_n;
3426 p2 = key_n2;
3427 while (*p1) {
3428 if (*p1 != '(' && *p1 != ')') {
3429 *p2 = *p1;
3430 p2++;
3431 }
3432 p1++;
3433 }
3434 *p2 = (char)0;
3435 } else
3436 key_n2 = key_n;
3437 SetDictInt(key_n2,key);
3438 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003439 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003440 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003441#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003442 SetDictInt("KEY_MIN", KEY_MIN);
3443 SetDictInt("KEY_MAX", KEY_MAX);
3444 }
3445 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003446}