blob: 78a79e8eef03bcd404a1a34b1366e0dca45ba73d [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. */
1723 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001724 int fd = -1;
1725 FILE *fp = NULL;
1726 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001727
Victor Stinner26486ea2010-05-15 22:23:53 +00001728 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1729 fd = mkstemp(fn);
1730 if (fd < 0)
1731 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001732 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1733 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001734 fp = fdopen(fd, "wb+");
1735 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001736 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1737 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001738 }
1739 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001740 if (res == NULL)
1741 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001742 fseek(fp, 0, 0);
1743 while (1) {
1744 char buf[BUFSIZ];
1745 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001746 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001747
Victor Stinner26486ea2010-05-15 22:23:53 +00001748 if (n <= 0)
1749 break;
1750 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001751 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001752 if (res == NULL)
1753 break;
1754 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001755
1756exit:
1757 if (fp != NULL)
1758 fclose(fp);
1759 else if (fd != -1)
1760 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001761 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001762 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001763}
1764
1765static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001766PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001767{
Victor Stinner26486ea2010-05-15 22:23:53 +00001768 int beg, num;
1769 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1770 return NULL;
1771 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772}
1773
1774static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001775PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001776{
Victor Stinner26486ea2010-05-15 22:23:53 +00001777 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1778 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001779
Victor Stinner26486ea2010-05-15 22:23:53 +00001780#ifndef WINDOW_HAS_FLAGS
1781 if (0)
1782#else
1783 if (self->win->_flags & _ISPAD)
1784#endif
1785 {
1786 switch(PyTuple_Size(args)) {
1787 case 6:
1788 if (!PyArg_ParseTuple(args,
1789 "iiiiii;" \
1790 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1791 &pminrow, &pmincol, &sminrow,
1792 &smincol, &smaxrow, &smaxcol))
1793 return NULL;
1794
1795 Py_BEGIN_ALLOW_THREADS
1796 rtn = prefresh(self->win,
1797 pminrow, pmincol, sminrow,
1798 smincol, smaxrow, smaxcol);
1799 Py_END_ALLOW_THREADS
1800 return PyCursesCheckERR(rtn, "prefresh");
1801 default:
1802 PyErr_SetString(PyCursesError,
1803 "refresh() for a pad requires 6 arguments");
1804 return NULL;
1805 }
1806 } else {
1807 if (!PyArg_ParseTuple(args, ":refresh"))
1808 return NULL;
1809 Py_BEGIN_ALLOW_THREADS
1810 rtn = wrefresh(self->win);
1811 Py_END_ALLOW_THREADS
1812 return PyCursesCheckERR(rtn, "prefresh");
1813 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001814}
1815
1816static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001817PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001818{
Victor Stinner26486ea2010-05-15 22:23:53 +00001819 int x, y;
1820 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1821 return NULL;
1822 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001823}
1824
1825static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001826PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001827{
Victor Stinner26486ea2010-05-15 22:23:53 +00001828 WINDOW *win;
1829 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001830
Victor Stinner26486ea2010-05-15 22:23:53 +00001831 nlines = 0;
1832 ncols = 0;
1833 switch (PyTuple_Size(args)) {
1834 case 2:
1835 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1836 return NULL;
1837 break;
1838 case 4:
1839 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1840 &nlines,&ncols,&begin_y,&begin_x))
1841 return NULL;
1842 break;
1843 default:
1844 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1845 return NULL;
1846 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001847
Victor Stinner26486ea2010-05-15 22:23:53 +00001848 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001849#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001850 if (self->win->_flags & _ISPAD)
1851 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1852 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001853#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001854 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001855
Victor Stinner26486ea2010-05-15 22:23:53 +00001856 if (win == NULL) {
1857 PyErr_SetString(PyCursesError, catchall_NULL);
1858 return NULL;
1859 }
1860
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001861 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001862}
1863
1864static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001865PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001866{
Victor Stinner26486ea2010-05-15 22:23:53 +00001867 int nlines;
1868 switch(PyTuple_Size(args)) {
1869 case 0:
1870 return PyCursesCheckERR(scroll(self->win), "scroll");
1871 case 1:
1872 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1873 return NULL;
1874 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1875 default:
1876 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1877 return NULL;
1878 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001879}
1880
1881static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001882PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001883{
Victor Stinner26486ea2010-05-15 22:23:53 +00001884 int st, cnt, val;
1885 switch (PyTuple_Size(args)) {
1886 case 2:
1887 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1888 return NULL;
1889 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1890 case 3:
1891 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1892 return NULL;
1893 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1894 default:
1895 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1896 return NULL;
1897 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001898}
1899
1900static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001901PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001902{
Victor Stinner26486ea2010-05-15 22:23:53 +00001903 PyObject *temp;
1904 chtype ch;
1905 int n, x, y, code = OK;
1906 attr_t attr = A_NORMAL;
1907 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001908
Victor Stinner26486ea2010-05-15 22:23:53 +00001909 switch (PyTuple_Size(args)) {
1910 case 2:
1911 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1912 return NULL;
1913 break;
1914 case 3:
1915 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1916 return NULL;
1917 attr = lattr;
1918 break;
1919 case 4:
1920 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1921 return NULL;
1922 code = wmove(self->win, y, x);
1923 break;
1924 case 5:
1925 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1926 &y, &x, &temp, &n, &lattr))
1927 return NULL;
1928 attr = lattr;
1929 code = wmove(self->win, y, x);
1930 break;
1931 default:
1932 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1933 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001934 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001935
1936 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001937 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001938 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001939 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1940 } else
1941 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001942}
1943
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001944static PyObject *
1945PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1946{
1947 return PyUnicode_FromString(self->encoding);
1948}
1949
1950static int
1951PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1952{
1953 PyObject *ascii;
1954 char *encoding;
1955
1956 /* It is illegal to del win.encoding */
1957 if (value == NULL) {
1958 PyErr_SetString(PyExc_TypeError,
1959 "encoding may not be deleted");
1960 return -1;
1961 }
1962
1963 if (!PyUnicode_Check(value)) {
1964 PyErr_SetString(PyExc_TypeError,
1965 "setting encoding to a non-string");
1966 return -1;
1967 }
1968 ascii = PyUnicode_AsASCIIString(value);
1969 if (ascii == NULL)
1970 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001971 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001972 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001973 if (encoding == NULL) {
1974 PyErr_NoMemory();
1975 return -1;
1976 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001977 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001978 self->encoding = encoding;
1979 return 0;
1980}
1981
1982
Guido van Rossumf6971e21994-08-30 12:25:20 +00001983static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001984 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001985 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1986 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1987 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1988 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1989 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1990 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1991 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1992 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1993 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1994 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1995 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1996 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1997 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1998 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1999 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2000 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2001 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2002 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2003 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002004#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002005 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002006#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002007 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2008 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2009 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2010 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2011 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002012#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002013 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002014#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002015 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2016 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2017 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2018 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2019 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2020 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2021 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2022 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2023 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2024 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2025 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2026 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2027 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2028 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2029 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2030 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2031 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2032 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2033 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2034 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2035 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2036 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2037 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2038 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2039 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002040 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2041 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2042 METH_VARARGS},
2043 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2044 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2045 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2046 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002047#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002048 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002049#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002050 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2051 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2052 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2053 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2054 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2055 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2056 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2057 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2058 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2059 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2060 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2061 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2062 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2063 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2064 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2065 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002066};
2067
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002068static PyGetSetDef PyCursesWindow_getsets[] = {
2069 {"encoding",
2070 (getter)PyCursesWindow_get_encoding,
2071 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002072 "the typecode character used to create the array"},
2073 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002074};
2075
Guido van Rossumf6971e21994-08-30 12:25:20 +00002076/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002077
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002078PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002079 PyVarObject_HEAD_INIT(NULL, 0)
Victor Stinner61e2bc72017-02-12 23:42:02 +01002080 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002081 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2082 0, /*tp_itemsize*/
2083 /* methods */
2084 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2085 0, /*tp_print*/
2086 (getattrfunc)0, /*tp_getattr*/
2087 (setattrfunc)0, /*tp_setattr*/
2088 0, /*tp_reserved*/
2089 0, /*tp_repr*/
2090 0, /*tp_as_number*/
2091 0, /*tp_as_sequence*/
2092 0, /*tp_as_mapping*/
2093 0, /*tp_hash*/
2094 0, /*tp_call*/
2095 0, /*tp_str*/
2096 0, /*tp_getattro*/
2097 0, /*tp_setattro*/
2098 0, /*tp_as_buffer*/
2099 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2100 0, /*tp_doc*/
2101 0, /*tp_traverse*/
2102 0, /*tp_clear*/
2103 0, /*tp_richcompare*/
2104 0, /*tp_weaklistoffset*/
2105 0, /*tp_iter*/
2106 0, /*tp_iternext*/
2107 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002108 0, /* tp_members */
2109 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002110};
2111
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002112/*********************************************************************
2113 Global Functions
2114**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002115
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002116NoArgNoReturnFunction(beep)
2117NoArgNoReturnFunction(def_prog_mode)
2118NoArgNoReturnFunction(def_shell_mode)
2119NoArgNoReturnFunction(doupdate)
2120NoArgNoReturnFunction(endwin)
2121NoArgNoReturnFunction(flash)
2122NoArgNoReturnFunction(nocbreak)
2123NoArgNoReturnFunction(noecho)
2124NoArgNoReturnFunction(nonl)
2125NoArgNoReturnFunction(noraw)
2126NoArgNoReturnFunction(reset_prog_mode)
2127NoArgNoReturnFunction(reset_shell_mode)
2128NoArgNoReturnFunction(resetty)
2129NoArgNoReturnFunction(savetty)
2130
2131NoArgOrFlagNoReturnFunction(cbreak)
2132NoArgOrFlagNoReturnFunction(echo)
2133NoArgOrFlagNoReturnFunction(nl)
2134NoArgOrFlagNoReturnFunction(raw)
2135
2136NoArgReturnIntFunction(baudrate)
2137NoArgReturnIntFunction(termattrs)
2138
2139NoArgReturnStringFunction(termname)
2140NoArgReturnStringFunction(longname)
2141
2142NoArgTrueFalseFunction(can_change_color)
2143NoArgTrueFalseFunction(has_colors)
2144NoArgTrueFalseFunction(has_ic)
2145NoArgTrueFalseFunction(has_il)
2146NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002147NoArgNoReturnVoidFunction(flushinp)
2148NoArgNoReturnVoidFunction(noqiflush)
2149
2150static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002151PyCurses_filter(PyObject *self)
2152{
Victor Stinner26486ea2010-05-15 22:23:53 +00002153 /* not checking for PyCursesInitialised here since filter() must
2154 be called before initscr() */
2155 filter();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002156 Py_RETURN_NONE;
Christian Heimesaf98da12008-01-27 15:18:18 +00002157}
2158
2159static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002160PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002161{
Victor Stinner26486ea2010-05-15 22:23:53 +00002162 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163
Victor Stinner26486ea2010-05-15 22:23:53 +00002164 PyCursesInitialised;
2165 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002166
Victor Stinner26486ea2010-05-15 22:23:53 +00002167 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168
Victor Stinner26486ea2010-05-15 22:23:53 +00002169 if (color_content(color, &r, &g, &b) != ERR)
2170 return Py_BuildValue("(iii)", r, g, b);
2171 else {
2172 PyErr_SetString(PyCursesError,
2173 "Argument 1 was out of range. Check value of COLORS.");
2174 return NULL;
2175 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176}
2177
2178static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002179PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002180{
Victor Stinner26486ea2010-05-15 22:23:53 +00002181 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002182
Victor Stinner26486ea2010-05-15 22:23:53 +00002183 PyCursesInitialised;
2184 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185
Victor Stinner26486ea2010-05-15 22:23:53 +00002186 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2187 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002188}
2189
2190static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002191PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002192{
Victor Stinner26486ea2010-05-15 22:23:53 +00002193 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002194
Victor Stinner26486ea2010-05-15 22:23:53 +00002195 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196
Victor Stinner26486ea2010-05-15 22:23:53 +00002197 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198
Victor Stinner26486ea2010-05-15 22:23:53 +00002199 erg = curs_set(vis);
2200 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201
Victor Stinner26486ea2010-05-15 22:23:53 +00002202 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203}
2204
2205static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002206PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207{
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 int ms;
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 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215}
2216
2217static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002218PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219{
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221
Victor Stinner26486ea2010-05-15 22:23:53 +00002222 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223
Victor Stinner26486ea2010-05-15 22:23:53 +00002224 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225
Victor Stinner26486ea2010-05-15 22:23:53 +00002226 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227}
2228
2229static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002230PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231{
Victor Stinner26486ea2010-05-15 22:23:53 +00002232 int x = 0;
2233 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002238
Victor Stinner26486ea2010-05-15 22:23:53 +00002239 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240}
2241
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002242#ifdef NCURSES_MOUSE_VERSION
2243static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002244PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002245{
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 int rtn;
2247 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002248
Victor Stinner26486ea2010-05-15 22:23:53 +00002249 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002250
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 rtn = getmouse( &event );
2252 if (rtn == ERR) {
2253 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2254 return NULL;
2255 }
2256 return Py_BuildValue("(hiiil)",
2257 (short)event.id,
2258 event.x, event.y, event.z,
2259 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002260}
2261
2262static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002263PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002264{
Victor Stinner26486ea2010-05-15 22:23:53 +00002265 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002266
Victor Stinner26486ea2010-05-15 22:23:53 +00002267 PyCursesInitialised;
2268 if (!PyArg_ParseTuple(args, "hiiil",
2269 &event.id,
2270 &event.x, &event.y, &event.z,
2271 (int *) &event.bstate))
2272 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002275}
2276#endif
2277
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002278static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002279PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002280{
Victor Stinner26486ea2010-05-15 22:23:53 +00002281 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002282 int fd = -1;
2283 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002284 PyObject *data;
2285 size_t datalen;
2286 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002287 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002288 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002289
Victor Stinner26486ea2010-05-15 22:23:53 +00002290 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002291
Victor Stinner26486ea2010-05-15 22:23:53 +00002292 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2293 fd = mkstemp(fn);
2294 if (fd < 0)
2295 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002296 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2297 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 fp = fdopen(fd, "wb+");
2299 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002300 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2301 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002302 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002303
Victor Stinner3466bde2016-09-05 18:16:01 -07002304 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002305 if (data == NULL)
2306 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002307 if (!PyBytes_Check(data)) {
2308 PyErr_Format(PyExc_TypeError,
2309 "f.read() returned %.100s instead of bytes",
2310 data->ob_type->tp_name);
2311 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002312 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 }
2314 datalen = PyBytes_GET_SIZE(data);
2315 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2316 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002317 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2318 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002320 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002321
Victor Stinner26486ea2010-05-15 22:23:53 +00002322 fseek(fp, 0, 0);
2323 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002324 if (win == NULL) {
2325 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002326 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002327 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002328 res = PyCursesWindow_New(win, NULL);
2329
2330error:
2331 if (fp != NULL)
2332 fclose(fp);
2333 else if (fd != -1)
2334 close(fd);
2335 remove(fn);
2336 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002337}
2338
2339static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002340PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002341{
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002345
Victor Stinner26486ea2010-05-15 22:23:53 +00002346 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002347
Victor Stinner26486ea2010-05-15 22:23:53 +00002348 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002349}
2350
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002351#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002352/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002353static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002354{
Victor Stinner26486ea2010-05-15 22:23:53 +00002355 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002356
Victor Stinner26486ea2010-05-15 22:23:53 +00002357 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002358
Victor Stinner26486ea2010-05-15 22:23:53 +00002359 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002360
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 if (has_key(ch) == FALSE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002362 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002364 Py_RETURN_TRUE;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002365}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002366#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002367
2368static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002369PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002370{
Victor Stinner26486ea2010-05-15 22:23:53 +00002371 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002372
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 PyCursesInitialised;
2374 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002375
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 switch(PyTuple_Size(args)) {
2377 case 4:
2378 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2379 break;
2380 default:
2381 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2382 return NULL;
2383 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002384
Victor Stinner26486ea2010-05-15 22:23:53 +00002385 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002386}
2387
2388static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002389PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390{
Victor Stinner26486ea2010-05-15 22:23:53 +00002391 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 PyCursesInitialised;
2394 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395
Victor Stinner26486ea2010-05-15 22:23:53 +00002396 if (PyTuple_Size(args) != 3) {
2397 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2398 return NULL;
2399 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002400
Victor Stinner26486ea2010-05-15 22:23:53 +00002401 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002402
Victor Stinner26486ea2010-05-15 22:23:53 +00002403 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002404}
2405
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002406static PyObject *ModDict;
2407
Victor Stinner26486ea2010-05-15 22:23:53 +00002408static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002409PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002410{
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002412 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002413
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 if (initialised == TRUE) {
2415 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002416 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002417 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002418
Victor Stinner26486ea2010-05-15 22:23:53 +00002419 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002420
Victor Stinner26486ea2010-05-15 22:23:53 +00002421 if (win == NULL) {
2422 PyErr_SetString(PyCursesError, catchall_NULL);
2423 return NULL;
2424 }
Guido van Rossum85738471995-02-17 13:50:17 +00002425
Victor Stinner26486ea2010-05-15 22:23:53 +00002426 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002427
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002428/* This was moved from initcurses() because it core dumped on SGI,
2429 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002430#define SetDictInt(string,ch) \
2431 do { \
2432 PyObject *o = PyLong_FromLong((long) (ch)); \
2433 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2434 Py_DECREF(o); \
2435 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002436 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002437
Victor Stinner26486ea2010-05-15 22:23:53 +00002438 /* Here are some graphic symbols you can use */
2439 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2440 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2441 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2442 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2443 SetDictInt("ACS_LTEE", (ACS_LTEE));
2444 SetDictInt("ACS_RTEE", (ACS_RTEE));
2445 SetDictInt("ACS_BTEE", (ACS_BTEE));
2446 SetDictInt("ACS_TTEE", (ACS_TTEE));
2447 SetDictInt("ACS_HLINE", (ACS_HLINE));
2448 SetDictInt("ACS_VLINE", (ACS_VLINE));
2449 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002450#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002451 /* On HP/UX 11, these are of type cchar_t, which is not an
2452 integral type. If this is a problem on more platforms, a
2453 configure test should be added to determine whether ACS_S1
2454 is of integral type. */
2455 SetDictInt("ACS_S1", (ACS_S1));
2456 SetDictInt("ACS_S9", (ACS_S9));
2457 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2458 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2459 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2460 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2461 SetDictInt("ACS_BULLET", (ACS_BULLET));
2462 SetDictInt("ACS_LARROW", (ACS_LARROW));
2463 SetDictInt("ACS_RARROW", (ACS_RARROW));
2464 SetDictInt("ACS_DARROW", (ACS_DARROW));
2465 SetDictInt("ACS_UARROW", (ACS_UARROW));
2466 SetDictInt("ACS_BOARD", (ACS_BOARD));
2467 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2468 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002469#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002470 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2471 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2472 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2473 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2474 SetDictInt("ACS_SBSS", (ACS_RTEE));
2475 SetDictInt("ACS_SSSB", (ACS_LTEE));
2476 SetDictInt("ACS_SSBS", (ACS_BTEE));
2477 SetDictInt("ACS_BSSS", (ACS_TTEE));
2478 SetDictInt("ACS_BSBS", (ACS_HLINE));
2479 SetDictInt("ACS_SBSB", (ACS_VLINE));
2480 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002481
Victor Stinner26486ea2010-05-15 22:23:53 +00002482 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002483#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002484 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002485#endif
2486#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002488#endif
2489#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002490 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002491#endif
2492#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002494#endif
2495#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002496 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002497#endif
2498#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002499 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002500#endif
2501#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002502 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002503#endif
2504
Victor Stinner26486ea2010-05-15 22:23:53 +00002505 SetDictInt("LINES", LINES);
2506 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002507
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002508 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2509 screen_encoding = winobj->encoding;
2510 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002511}
2512
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002513static PyObject *
2514PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2515{
Victor Stinner26486ea2010-05-15 22:23:53 +00002516 int fd = -1;
2517 int err;
2518 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002519
Victor Stinner26486ea2010-05-15 22:23:53 +00002520 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002521
Victor Stinner26486ea2010-05-15 22:23:53 +00002522 if (!PyArg_ParseTupleAndKeywords(
2523 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2524 return NULL;
2525 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002526
Victor Stinner26486ea2010-05-15 22:23:53 +00002527 if (fd == -1) {
2528 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002529
Victor Stinnerbd303c12013-11-07 23:07:29 +01002530 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002531
Victor Stinner26486ea2010-05-15 22:23:53 +00002532 if (sys_stdout == NULL || sys_stdout == Py_None) {
2533 PyErr_SetString(
2534 PyCursesError,
2535 "lost sys.stdout");
2536 return NULL;
2537 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002538
Victor Stinner26486ea2010-05-15 22:23:53 +00002539 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002540
Victor Stinner26486ea2010-05-15 22:23:53 +00002541 if (fd == -1) {
2542 return NULL;
2543 }
2544 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002545
Matthias Klose635edd12010-07-30 21:40:57 +00002546 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002548
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 if (err == 0) {
2550 s = "setupterm: could not find terminal";
2551 } else if (err == -1) {
2552 s = "setupterm: could not find terminfo database";
2553 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002554
Victor Stinner26486ea2010-05-15 22:23:53 +00002555 PyErr_SetString(PyCursesError,s);
2556 return NULL;
2557 }
2558
2559 initialised_setupterm = TRUE;
2560
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002561 Py_RETURN_NONE;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002562}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002563
2564static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002565PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002566{
Victor Stinner26486ea2010-05-15 22:23:53 +00002567 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002568
Victor Stinner26486ea2010-05-15 22:23:53 +00002569 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002570
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 switch(PyTuple_Size(args)) {
2572 case 1:
2573 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2574 break;
2575 default:
2576 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2577 return NULL;
2578 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002579
Victor Stinner26486ea2010-05-15 22:23:53 +00002580 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002581}
2582
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002583#ifdef HAVE_CURSES_IS_TERM_RESIZED
2584static PyObject *
2585PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2586{
Victor Stinner26486ea2010-05-15 22:23:53 +00002587 int lines;
2588 int columns;
2589 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002590
Victor Stinner26486ea2010-05-15 22:23:53 +00002591 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002592
Victor Stinner26486ea2010-05-15 22:23:53 +00002593 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2594 return NULL;
2595 result = is_term_resized(lines, columns);
2596 if (result == TRUE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002597 Py_RETURN_TRUE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002598 } else {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002599 Py_RETURN_FALSE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002600 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002601}
2602#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2603
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002604#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002605static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002606PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002607{
Victor Stinner26486ea2010-05-15 22:23:53 +00002608 const char *knp;
2609 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002612
Victor Stinner26486ea2010-05-15 22:23:53 +00002613 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002614
Victor Stinner26486ea2010-05-15 22:23:53 +00002615 if (ch < 0) {
2616 PyErr_SetString(PyExc_ValueError, "invalid key number");
2617 return NULL;
2618 }
2619 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002620
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002621 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002623#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625static PyObject *
2626PyCurses_KillChar(PyObject *self)
2627{
2628 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002629
Victor Stinner26486ea2010-05-15 22:23:53 +00002630 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631
Victor Stinner26486ea2010-05-15 22:23:53 +00002632 return PyBytes_FromStringAndSize(&ch, 1);
2633}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
2635static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002636PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002637{
Victor Stinner26486ea2010-05-15 22:23:53 +00002638 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002639
Victor Stinner26486ea2010-05-15 22:23:53 +00002640 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002641
Victor Stinner26486ea2010-05-15 22:23:53 +00002642 switch(PyTuple_Size(args)) {
2643 case 1:
2644 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2645 break;
2646 default:
2647 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2648 return NULL;
2649 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002650
Victor Stinner26486ea2010-05-15 22:23:53 +00002651 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002652}
2653
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002654#ifdef NCURSES_MOUSE_VERSION
2655static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002656PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002657{
Victor Stinner26486ea2010-05-15 22:23:53 +00002658 int interval;
2659 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002660
Victor Stinner26486ea2010-05-15 22:23:53 +00002661 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2662 return NULL;
2663 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002664}
2665
2666static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002667PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002668{
Victor Stinner26486ea2010-05-15 22:23:53 +00002669 int newmask;
2670 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002671
Victor Stinner26486ea2010-05-15 22:23:53 +00002672 PyCursesInitialised;
2673 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2674 return NULL;
2675 availmask = mousemask(newmask, &oldmask);
2676 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002677}
2678#endif
2679
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002680static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002681PyCurses_Napms(PyObject *self, PyObject *args)
2682{
2683 int ms;
2684
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002685 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002686 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002687
2688 return Py_BuildValue("i", napms(ms));
2689}
2690
2691
2692static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002693PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694{
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 WINDOW *win;
2696 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697
Victor Stinner26486ea2010-05-15 22:23:53 +00002698 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002699
Victor Stinner26486ea2010-05-15 22:23:53 +00002700 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002701
Victor Stinner26486ea2010-05-15 22:23:53 +00002702 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002703
Victor Stinner26486ea2010-05-15 22:23:53 +00002704 if (win == NULL) {
2705 PyErr_SetString(PyCursesError, catchall_NULL);
2706 return NULL;
2707 }
2708
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002709 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002710}
2711
2712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002713PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002714{
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 WINDOW *win;
2716 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002717
Victor Stinner26486ea2010-05-15 22:23:53 +00002718 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002719
Victor Stinner26486ea2010-05-15 22:23:53 +00002720 switch (PyTuple_Size(args)) {
2721 case 2:
2722 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2723 return NULL;
2724 break;
2725 case 4:
2726 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2727 &nlines,&ncols,&begin_y,&begin_x))
2728 return NULL;
2729 break;
2730 default:
2731 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2732 return NULL;
2733 }
Guido van Rossum85738471995-02-17 13:50:17 +00002734
Victor Stinner26486ea2010-05-15 22:23:53 +00002735 win = newwin(nlines,ncols,begin_y,begin_x);
2736 if (win == NULL) {
2737 PyErr_SetString(PyCursesError, catchall_NULL);
2738 return NULL;
2739 }
Guido van Rossum85738471995-02-17 13:50:17 +00002740
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002741 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002742}
2743
2744static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002745PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002746{
Victor Stinner26486ea2010-05-15 22:23:53 +00002747 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002748
Victor Stinner26486ea2010-05-15 22:23:53 +00002749 PyCursesInitialised;
2750 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 switch(PyTuple_Size(args)) {
2753 case 1:
2754 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2755 break;
2756 default:
2757 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2758 return NULL;
2759 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002760
Victor Stinner26486ea2010-05-15 22:23:53 +00002761 if (pair_content(pair, &f, &b)==ERR) {
2762 PyErr_SetString(PyCursesError,
2763 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2764 return NULL;
2765 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002766
Victor Stinner26486ea2010-05-15 22:23:53 +00002767 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002768}
2769
2770static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002771PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772{
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002774
Victor Stinner26486ea2010-05-15 22:23:53 +00002775 PyCursesInitialised;
2776 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777
Victor Stinner26486ea2010-05-15 22:23:53 +00002778 switch(PyTuple_Size(args)) {
2779 case 1:
2780 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2781 break;
2782 default:
2783 PyErr_SetString(PyExc_TypeError,
2784 "pair_number requires 1 argument");
2785 return NULL;
2786 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002787
Victor Stinner26486ea2010-05-15 22:23:53 +00002788 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002789}
2790
2791static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002792PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002793{
Victor Stinner26486ea2010-05-15 22:23:53 +00002794 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002795
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002796 if (!PyArg_ParseTuple(args,"y;str", &str))
2797 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002798 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002799}
2800
2801static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002802PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002803{
Victor Stinner26486ea2010-05-15 22:23:53 +00002804 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002805
Victor Stinner26486ea2010-05-15 22:23:53 +00002806 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002807
Victor Stinner26486ea2010-05-15 22:23:53 +00002808 switch(PyTuple_Size(args)) {
2809 case 0:
2810 qiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002811 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002812 case 1:
2813 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2814 if (flag) qiflush();
2815 else noqiflush();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002816 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002817 default:
2818 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2819 return NULL;
2820 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002821}
2822
Guido van Rossumd8faa362007-04-27 19:54:29 +00002823/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2824 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002825#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002826static int
2827update_lines_cols(void)
2828{
Victor Stinner26486ea2010-05-15 22:23:53 +00002829 PyObject *o;
2830 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002831 _Py_IDENTIFIER(LINES);
2832 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002833
Victor Stinner26486ea2010-05-15 22:23:53 +00002834 if (!m)
2835 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002836
Victor Stinner26486ea2010-05-15 22:23:53 +00002837 o = PyLong_FromLong(LINES);
2838 if (!o) {
2839 Py_DECREF(m);
2840 return 0;
2841 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002842 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002843 Py_DECREF(m);
2844 Py_DECREF(o);
2845 return 0;
2846 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002847 /* PyId_LINES.object will be initialized here. */
2848 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002849 Py_DECREF(m);
2850 Py_DECREF(o);
2851 return 0;
2852 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002853 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002854 o = PyLong_FromLong(COLS);
2855 if (!o) {
2856 Py_DECREF(m);
2857 return 0;
2858 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002859 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002860 Py_DECREF(m);
2861 Py_DECREF(o);
2862 return 0;
2863 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002864 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002865 Py_DECREF(m);
2866 Py_DECREF(o);
2867 return 0;
2868 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002869 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002870 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002872}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002873
2874static PyObject *
2875PyCurses_update_lines_cols(PyObject *self)
2876{
2877 return PyLong_FromLong((long) update_lines_cols());
2878}
2879
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002880#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002881
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002882#ifdef HAVE_CURSES_RESIZETERM
2883static PyObject *
2884PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2885{
Victor Stinner26486ea2010-05-15 22:23:53 +00002886 int lines;
2887 int columns;
2888 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889
Victor Stinner26486ea2010-05-15 22:23:53 +00002890 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002891
Victor Stinner26486ea2010-05-15 22:23:53 +00002892 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2893 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002894
Victor Stinner26486ea2010-05-15 22:23:53 +00002895 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2896 if (!result)
2897 return NULL;
2898 if (!update_lines_cols())
2899 return NULL;
2900 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002901}
2902
2903#endif
2904
2905#ifdef HAVE_CURSES_RESIZE_TERM
2906static PyObject *
2907PyCurses_Resize_Term(PyObject *self, PyObject *args)
2908{
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 int lines;
2910 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002911
Victor Stinner26486ea2010-05-15 22:23:53 +00002912 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002913
Victor Stinner26486ea2010-05-15 22:23:53 +00002914 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002915
Victor Stinner26486ea2010-05-15 22:23:53 +00002916 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2917 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002918
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2920 if (!result)
2921 return NULL;
2922 if (!update_lines_cols())
2923 return NULL;
2924 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002925}
2926#endif /* HAVE_CURSES_RESIZE_TERM */
2927
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002928static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002929PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002930{
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002932
Victor Stinner26486ea2010-05-15 22:23:53 +00002933 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002934
Victor Stinner26486ea2010-05-15 22:23:53 +00002935 if (PyTuple_Size(args)!=2) {
2936 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2937 return NULL;
2938 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002939
Victor Stinner26486ea2010-05-15 22:23:53 +00002940 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002941
Victor Stinner26486ea2010-05-15 22:23:53 +00002942 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002943
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002944 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002945}
2946
2947static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002948PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002949{
Victor Stinner26486ea2010-05-15 22:23:53 +00002950 int code;
2951 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002952
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002954
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 code = start_color();
2956 if (code != ERR) {
2957 initialisedcolors = TRUE;
2958 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002959 if (c == NULL)
2960 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002961 PyDict_SetItemString(ModDict, "COLORS", c);
2962 Py_DECREF(c);
2963 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002964 if (cp == NULL)
2965 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2967 Py_DECREF(cp);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002968 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 } else {
2970 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2971 return NULL;
2972 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002973}
2974
2975static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002976PyCurses_tigetflag(PyObject *self, PyObject *args)
2977{
Victor Stinner26486ea2010-05-15 22:23:53 +00002978 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002979
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002981
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 if (!PyArg_ParseTuple(args, "s", &capname))
2983 return NULL;
2984
2985 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002986}
2987
2988static PyObject *
2989PyCurses_tigetnum(PyObject *self, PyObject *args)
2990{
Victor Stinner26486ea2010-05-15 22:23:53 +00002991 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002994
Victor Stinner26486ea2010-05-15 22:23:53 +00002995 if (!PyArg_ParseTuple(args, "s", &capname))
2996 return NULL;
2997
2998 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002999}
3000
3001static PyObject *
3002PyCurses_tigetstr(PyObject *self, PyObject *args)
3003{
Victor Stinner26486ea2010-05-15 22:23:53 +00003004 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003005
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003007
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 if (!PyArg_ParseTuple(args, "s", &capname))
3009 return NULL;
3010
3011 capname = tigetstr( capname );
3012 if (capname == 0 || capname == (char*) -1) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003013 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 }
3015 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003016}
3017
3018static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003019PyCurses_tparm(PyObject *self, PyObject *args)
3020{
Victor Stinner26486ea2010-05-15 22:23:53 +00003021 char* fmt;
3022 char* result = NULL;
3023 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 +00003024
Victor Stinner26486ea2010-05-15 22:23:53 +00003025 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003026
Victor Stinner26621332011-11-02 23:45:29 +01003027 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003028 &fmt, &i1, &i2, &i3, &i4,
3029 &i5, &i6, &i7, &i8, &i9)) {
3030 return NULL;
3031 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003032
Victor Stinner26486ea2010-05-15 22:23:53 +00003033 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3034 if (!result) {
3035 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3036 return NULL;
3037 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003038
Victor Stinner26486ea2010-05-15 22:23:53 +00003039 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003040}
3041
3042static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003043PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003044{
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003046
Victor Stinner26486ea2010-05-15 22:23:53 +00003047 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003050
Victor Stinner26486ea2010-05-15 22:23:53 +00003051 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003052}
3053
3054static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003055PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003056{
Victor Stinner26486ea2010-05-15 22:23:53 +00003057 PyObject *temp;
3058 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003059
Victor Stinner26486ea2010-05-15 22:23:53 +00003060 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003061
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003063
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003064 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003066
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003068}
3069
3070static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003071PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003072{
Victor Stinner26486ea2010-05-15 22:23:53 +00003073 PyObject *temp;
3074 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003077
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003078 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003079 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003080
3081 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3082 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003083
Victor Stinner26486ea2010-05-15 22:23:53 +00003084 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003085}
3086
Victor Stinner71e44cb2011-09-06 01:53:03 +02003087#ifdef HAVE_NCURSESW
3088/* Convert an object to a character (wchar_t):
3089
3090 - int
3091 - str of length 1
3092
3093 Return 1 on success, 0 on error. */
3094static int
3095PyCurses_ConvertToWchar_t(PyObject *obj,
3096 wchar_t *wch)
3097{
3098 if (PyUnicode_Check(obj)) {
3099 wchar_t buffer[2];
3100 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3101 PyErr_Format(PyExc_TypeError,
3102 "expect bytes or str of length 1, or int, "
3103 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003104 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003105 return 0;
3106 }
3107 *wch = buffer[0];
3108 return 2;
3109 }
3110 else if (PyLong_CheckExact(obj)) {
3111 long value;
3112 int overflow;
3113 value = PyLong_AsLongAndOverflow(obj, &overflow);
3114 if (overflow) {
3115 PyErr_SetString(PyExc_OverflowError,
3116 "int doesn't fit in long");
3117 return 0;
3118 }
3119 *wch = (wchar_t)value;
3120 if ((long)*wch != value) {
3121 PyErr_Format(PyExc_OverflowError,
3122 "character doesn't fit in wchar_t");
3123 return 0;
3124 }
3125 return 1;
3126 }
3127 else {
3128 PyErr_Format(PyExc_TypeError,
3129 "expect bytes or str of length 1, or int, got %s",
3130 Py_TYPE(obj)->tp_name);
3131 return 0;
3132 }
3133}
3134
3135static PyObject *
3136PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3137{
3138 PyObject *obj;
3139 wchar_t wch;
3140
3141 PyCursesInitialised;
3142
3143 if (!PyArg_ParseTuple(args,"O", &obj))
3144 return NULL;
3145
3146 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3147 return NULL;
3148 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3149}
3150#endif
3151
Guido van Rossumf6971e21994-08-30 12:25:20 +00003152static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003153PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003154{
Victor Stinner26486ea2010-05-15 22:23:53 +00003155 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003156
Victor Stinner26486ea2010-05-15 22:23:53 +00003157 switch(PyTuple_Size(args)) {
3158 case 1:
3159 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3160 return NULL;
3161 break;
3162 default:
3163 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3164 return NULL;
3165 }
3166 use_env(flag);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003167 Py_RETURN_NONE;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003168}
3169
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003170#ifndef STRICT_SYSV_CURSES
3171static PyObject *
3172PyCurses_Use_Default_Colors(PyObject *self)
3173{
Victor Stinner26486ea2010-05-15 22:23:53 +00003174 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003175
Victor Stinner26486ea2010-05-15 22:23:53 +00003176 PyCursesInitialised;
3177 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003178
Victor Stinner26486ea2010-05-15 22:23:53 +00003179 code = use_default_colors();
3180 if (code != ERR) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003181 Py_RETURN_NONE;
Victor Stinner26486ea2010-05-15 22:23:53 +00003182 } else {
3183 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3184 return NULL;
3185 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003186}
3187#endif /* STRICT_SYSV_CURSES */
3188
Guido van Rossumf6971e21994-08-30 12:25:20 +00003189/* List of functions defined in the module */
3190
3191static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003192 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3193 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3194 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3195 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3196 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3197 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3198 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3199 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3200 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3201 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3202 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3203 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3204 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3205 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3206 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3207 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3208 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003209#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003210 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3211 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003212#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003213 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3214 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3215 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3216 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3217 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003218#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003219 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003220#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003221 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3222 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3223 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3224 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3225 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3226 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003227#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003228 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003229#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003230#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003231 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003232#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003233 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3234 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3235 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003236#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003237 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3238 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003239#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003240 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3241 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3242 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3243 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3244 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3245 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3246 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3247 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3248 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3249 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3250 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3251 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3252 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3253 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3254 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3255 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3256 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003257#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003259#endif
3260#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003261 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003262#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003263 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3264 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3265 {"setupterm", (PyCFunction)PyCurses_setupterm,
3266 METH_VARARGS|METH_KEYWORDS},
3267 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3268 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3269 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3270 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3271 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3272 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3273 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3274 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3275 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3276 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003277#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3278 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3279#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003280#ifdef HAVE_NCURSESW
3281 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3282#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003283 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003284#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003285 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003286#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003287 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003288};
3289
3290/* Initialization function for the module */
3291
Martin v. Löwis1a214512008-06-11 05:26:20 +00003292
3293static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 PyModuleDef_HEAD_INIT,
3295 "_curses",
3296 NULL,
3297 -1,
3298 PyCurses_methods,
3299 NULL,
3300 NULL,
3301 NULL,
3302 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003303};
3304
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003305PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003306PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003307{
Victor Stinner26486ea2010-05-15 22:23:53 +00003308 PyObject *m, *d, *v, *c_api_object;
3309 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003310
Victor Stinner26486ea2010-05-15 22:23:53 +00003311 /* Initialize object type */
3312 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3313 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003314
Victor Stinner26486ea2010-05-15 22:23:53 +00003315 /* Initialize the C API pointer array */
3316 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3317 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3318 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3319 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003320
Victor Stinner26486ea2010-05-15 22:23:53 +00003321 /* Create the module and add the functions */
3322 m = PyModule_Create(&_cursesmodule);
3323 if (m == NULL)
3324 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003325
Victor Stinner26486ea2010-05-15 22:23:53 +00003326 /* Add some symbolic constants to the module */
3327 d = PyModule_GetDict(m);
3328 if (d == NULL)
3329 return NULL;
3330 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003331
Victor Stinner26486ea2010-05-15 22:23:53 +00003332 /* Add a capsule for the C API */
3333 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3334 PyDict_SetItemString(d, "_C_API", c_api_object);
3335 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003336
Victor Stinner26486ea2010-05-15 22:23:53 +00003337 /* For exception curses.error */
3338 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3339 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003340
Victor Stinner26486ea2010-05-15 22:23:53 +00003341 /* Make the version available */
3342 v = PyBytes_FromString(PyCursesVersion);
3343 PyDict_SetItemString(d, "version", v);
3344 PyDict_SetItemString(d, "__version__", v);
3345 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003346
Victor Stinner26486ea2010-05-15 22:23:53 +00003347 SetDictInt("ERR", ERR);
3348 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003349
Victor Stinner26486ea2010-05-15 22:23:53 +00003350 /* Here are some attributes you can add to chars to print */
3351
3352 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3353 SetDictInt("A_NORMAL", A_NORMAL);
3354 SetDictInt("A_STANDOUT", A_STANDOUT);
3355 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3356 SetDictInt("A_REVERSE", A_REVERSE);
3357 SetDictInt("A_BLINK", A_BLINK);
3358 SetDictInt("A_DIM", A_DIM);
3359 SetDictInt("A_BOLD", A_BOLD);
3360 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003361#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003362 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003363#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003364 SetDictInt("A_PROTECT", A_PROTECT);
3365 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3366 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003367
Victor Stinner26486ea2010-05-15 22:23:53 +00003368 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003369#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003371#endif
3372#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003373 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003374#endif
3375#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003377#endif
3378#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003379 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003380#endif
3381#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003382 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003383#endif
3384#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003385 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003386#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003387
Victor Stinner26486ea2010-05-15 22:23:53 +00003388 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3389 SetDictInt("COLOR_RED", COLOR_RED);
3390 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3391 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3392 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3393 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3394 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3395 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003396
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003397#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003398 /* Mouse-related constants */
3399 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3400 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3401 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3402 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3403 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003404
Victor Stinner26486ea2010-05-15 22:23:53 +00003405 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3406 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3407 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3408 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3409 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003410
Victor Stinner26486ea2010-05-15 22:23:53 +00003411 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3412 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3413 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3414 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3415 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003416
Victor Stinner26486ea2010-05-15 22:23:53 +00003417 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3418 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3419 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3420 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3421 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003422
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3424 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3425 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003426
Victor Stinner26486ea2010-05-15 22:23:53 +00003427 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3428 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003429#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003430 /* Now set everything up for KEY_ variables */
3431 {
3432 int key;
3433 char *key_n;
3434 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003435#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003436 for (key=KEY_MIN;key < KEY_MAX; key++) {
3437 key_n = (char *)keyname(key);
3438 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3439 continue;
3440 if (strncmp(key_n,"KEY_F(",6)==0) {
3441 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003442 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003443 if (!key_n2) {
3444 PyErr_NoMemory();
3445 break;
3446 }
3447 p1 = key_n;
3448 p2 = key_n2;
3449 while (*p1) {
3450 if (*p1 != '(' && *p1 != ')') {
3451 *p2 = *p1;
3452 p2++;
3453 }
3454 p1++;
3455 }
3456 *p2 = (char)0;
3457 } else
3458 key_n2 = key_n;
3459 SetDictInt(key_n2,key);
3460 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003461 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003462 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003463#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003464 SetDictInt("KEY_MIN", KEY_MIN);
3465 SetDictInt("KEY_MAX", KEY_MAX);
3466 }
3467 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003468}