blob: 7a7095118a0bafd8fe244deafa533a778f344291 [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) {
191 Py_INCREF(Py_None);
192 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000193 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000194 if (fname == NULL) {
195 PyErr_SetString(PyCursesError, catchall_ERR);
196 } else {
197 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
198 }
199 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000200 }
Guido van Rossum85738471995-02-17 13:50:17 +0000201}
202
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100203/* Convert an object to a byte (an integer of type chtype):
204
205 - int
206 - bytes of length 1
207 - str of length 1
208
209 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000210static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100211PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000212{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100213 long value;
214 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
215 value = (unsigned char)PyBytes_AsString(obj)[0];
216 }
217 else if (PyUnicode_Check(obj)) {
218 if (PyUnicode_GetLength(obj) != 1) {
219 PyErr_Format(PyExc_TypeError,
220 "expect bytes or str of length 1, or int, "
221 "got a str of length %zi",
222 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000223 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100224 }
225 value = PyUnicode_READ_CHAR(obj, 0);
226 if (128 < value) {
227 PyObject *bytes;
228 const char *encoding;
229 if (win)
230 encoding = win->encoding;
231 else
232 encoding = screen_encoding;
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300233 bytes = PyUnicode_AsEncodedString(obj, encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100234 if (bytes == NULL)
235 return 0;
236 if (PyBytes_GET_SIZE(bytes) == 1)
237 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
238 else
239 value = -1;
240 Py_DECREF(bytes);
241 if (value < 0)
242 goto overflow;
243 }
244 }
245 else if (PyLong_CheckExact(obj)) {
246 int long_overflow;
247 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
248 if (long_overflow)
249 goto overflow;
250 }
251 else {
252 PyErr_Format(PyExc_TypeError,
253 "expect bytes or str of length 1, or int, got %s",
254 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000255 return 0;
256 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100257 *ch = (chtype)value;
258 if ((long)*ch != value)
259 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000260 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100261
262overflow:
263 PyErr_SetString(PyExc_OverflowError,
264 "byte doesn't fit in chtype");
265 return 0;
266}
267
268/* Convert an object to a byte (chtype) or a character (cchar_t):
269
270 - int
271 - bytes of length 1
272 - str of length 1
273
274 Return:
275
276 - 2 if obj is a character (written into *wch)
277 - 1 if obj is a byte (written into *ch)
278 - 0 on error: raise an exception */
279static int
280PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
281 chtype *ch
282#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200283 , wchar_t *wch
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100284#endif
285 )
286{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100287 long value;
288#ifdef HAVE_NCURSESW
289 wchar_t buffer[2];
290#endif
291
292 if (PyUnicode_Check(obj)) {
293#ifdef HAVE_NCURSESW
294 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
295 PyErr_Format(PyExc_TypeError,
296 "expect bytes or str of length 1, or int, "
297 "got a str of length %zi",
298 PyUnicode_GET_LENGTH(obj));
299 return 0;
300 }
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200301 *wch = buffer[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100302 return 2;
303#else
304 return PyCurses_ConvertToChtype(win, obj, ch);
305#endif
306 }
307 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
308 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100309 }
310 else if (PyLong_CheckExact(obj)) {
311 int overflow;
312 value = PyLong_AsLongAndOverflow(obj, &overflow);
313 if (overflow) {
314 PyErr_SetString(PyExc_OverflowError,
315 "int doesn't fit in long");
316 return 0;
317 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100318 }
319 else {
320 PyErr_Format(PyExc_TypeError,
321 "expect bytes or str of length 1, or int, got %s",
322 Py_TYPE(obj)->tp_name);
323 return 0;
324 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200325
326 *ch = (chtype)value;
327 if ((long)*ch != value) {
328 PyErr_Format(PyExc_OverflowError,
329 "byte doesn't fit in chtype");
330 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100331 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200332 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100333}
334
335/* Convert an object to a byte string (char*) or a wide character string
336 (wchar_t*). Return:
337
338 - 2 if obj is a character string (written into *wch)
339 - 1 if obj is a byte string (written into *bytes)
340 - 0 on error: raise an exception */
341static int
342PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
343 PyObject **bytes, wchar_t **wstr)
344{
Serhiy Storchaka08349052017-06-28 09:27:35 +0300345 char *str;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100346 if (PyUnicode_Check(obj)) {
347#ifdef HAVE_NCURSESW
348 assert (wstr != NULL);
Serhiy Storchaka0edffa32017-06-27 21:08:58 +0300349 *wstr = _PyUnicode_AsWideCharString(obj);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100350 if (*wstr == NULL)
351 return 0;
352 return 2;
353#else
354 assert (wstr == NULL);
Serhiy Storchakab29cee42016-10-27 19:31:49 +0300355 *bytes = PyUnicode_AsEncodedString(obj, win->encoding, NULL);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100356 if (*bytes == NULL)
357 return 0;
Serhiy Storchaka08349052017-06-28 09:27:35 +0300358 /* check for embedded null bytes */
359 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
360 return 0;
361 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100362 return 1;
363#endif
364 }
365 else if (PyBytes_Check(obj)) {
366 Py_INCREF(obj);
367 *bytes = obj;
Serhiy Storchaka08349052017-06-28 09:27:35 +0300368 /* check for embedded null bytes */
369 if (PyBytes_AsStringAndSize(*bytes, &str, NULL) < 0) {
370 return 0;
371 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100372 return 1;
373 }
374
375 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
376 Py_TYPE(obj)->tp_name);
377 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000378}
379
Benjamin Peterson21896a32010-03-21 22:03:03 +0000380/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000381 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000382
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000383static int func_PyCursesSetupTermCalled(void)
384{
385 PyCursesSetupTermCalled;
386 return 1;
387}
388
389static int func_PyCursesInitialised(void)
390{
391 PyCursesInitialised;
392 return 1;
393}
394
395static int func_PyCursesInitialisedColor(void)
396{
397 PyCursesInitialisedColor;
398 return 1;
399}
400
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000401/*****************************************************************************
402 The Window Object
403******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000404
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000405/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000406
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000407PyTypeObject PyCursesWindow_Type;
408
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000409/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000410
411 X - function name
412 TYPE - parameter Type
413 ERGSTR - format string for construction of the return value
414 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000415*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000416
Victor Stinner26486ea2010-05-15 22:23:53 +0000417#define Window_NoArgNoReturnFunction(X) \
418 static PyObject *PyCursesWindow_ ## X \
419 (PyCursesWindowObject *self, PyObject *args) \
420 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000421
Victor Stinner26486ea2010-05-15 22:23:53 +0000422#define Window_NoArgTrueFalseFunction(X) \
423 static PyObject * PyCursesWindow_ ## X \
424 (PyCursesWindowObject *self) \
425 { \
426 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
427 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000428
Victor Stinner26486ea2010-05-15 22:23:53 +0000429#define Window_NoArgNoReturnVoidFunction(X) \
430 static PyObject * PyCursesWindow_ ## X \
431 (PyCursesWindowObject *self) \
432 { \
433 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000434
Victor Stinner26486ea2010-05-15 22:23:53 +0000435#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
436 static PyObject * PyCursesWindow_ ## X \
437 (PyCursesWindowObject *self) \
438 { \
439 TYPE arg1, arg2; \
440 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
443 static PyObject * PyCursesWindow_ ## X \
444 (PyCursesWindowObject *self, PyObject *args) \
445 { \
446 TYPE arg1; \
447 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
448 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449
Victor Stinner26486ea2010-05-15 22:23:53 +0000450#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
451 static PyObject * PyCursesWindow_ ## X \
452 (PyCursesWindowObject *self, PyObject *args) \
453 { \
454 TYPE arg1; \
455 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
456 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000457
Victor Stinner26486ea2010-05-15 22:23:53 +0000458#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
459 static PyObject * PyCursesWindow_ ## X \
460 (PyCursesWindowObject *self, PyObject *args) \
461 { \
462 TYPE arg1, arg2; \
463 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
464 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000465
Guido van Rossumf6971e21994-08-30 12:25:20 +0000466/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000467
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000468Window_NoArgNoReturnFunction(untouchwin)
469Window_NoArgNoReturnFunction(touchwin)
470Window_NoArgNoReturnFunction(redrawwin)
471Window_NoArgNoReturnFunction(winsertln)
472Window_NoArgNoReturnFunction(werase)
473Window_NoArgNoReturnFunction(wdeleteln)
474
475Window_NoArgTrueFalseFunction(is_wintouched)
476
477Window_NoArgNoReturnVoidFunction(wsyncup)
478Window_NoArgNoReturnVoidFunction(wsyncdown)
479Window_NoArgNoReturnVoidFunction(wstandend)
480Window_NoArgNoReturnVoidFunction(wstandout)
481Window_NoArgNoReturnVoidFunction(wcursyncup)
482Window_NoArgNoReturnVoidFunction(wclrtoeol)
483Window_NoArgNoReturnVoidFunction(wclrtobot)
484Window_NoArgNoReturnVoidFunction(wclear)
485
486Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
487Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000488Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000489
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000490Window_NoArg2TupleReturnFunction(getyx, int, "ii")
491Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
492Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
493Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000494
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000495Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
496Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000497#if defined(__NetBSD__)
498Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
499#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000500Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000501#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000502Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000503#if defined(__NetBSD__)
504Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
505#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000506Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000507#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
509Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000510Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
512
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000513Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
514Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
515Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000516#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000517Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000518#endif
519
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000520/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000521
Guido van Rossumf6971e21994-08-30 12:25:20 +0000522static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100523PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000524{
Victor Stinner26486ea2010-05-15 22:23:53 +0000525 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000526
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100527 if (encoding == NULL) {
528#if defined(MS_WINDOWS)
529 char *buffer[100];
530 UINT cp;
531 cp = GetConsoleOutputCP();
532 if (cp != 0) {
533 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
534 encoding = buffer;
535 }
536#elif defined(CODESET)
537 const char *codeset = nl_langinfo(CODESET);
538 if (codeset != NULL && codeset[0] != 0)
539 encoding = codeset;
540#endif
541 if (encoding == NULL)
542 encoding = "utf-8";
543 }
544
Victor Stinner26486ea2010-05-15 22:23:53 +0000545 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
546 if (wo == NULL) return NULL;
547 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200548 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100549 if (wo->encoding == NULL) {
550 Py_DECREF(wo);
551 PyErr_NoMemory();
552 return NULL;
553 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000554 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000555}
556
557static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000558PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000559{
Victor Stinner26486ea2010-05-15 22:23:53 +0000560 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100561 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200562 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000563 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000564}
565
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000566/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000567
Larry Hastings61272b72014-01-07 12:41:53 -0800568/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700569
570curses.window.addch
571
572 [
Larry Hastings31826802013-10-19 00:09:25 -0700573 y: int
574 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700575 x: int
576 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700577 ]
578
579 ch: object
580 Character to add.
581
582 [
583 attr: long
584 Attributes for the character.
585 ]
586 /
587
588Paint character ch at (y, x) with attributes attr.
589
590Paint character ch at (y, x) with attributes attr,
591overwriting any character previously painted at that location.
592By default, the character position and attributes are the
593current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800594[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700595
Larry Hastings31826802013-10-19 00:09:25 -0700596static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400597curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
598 int x, PyObject *ch, int group_right_1, long attr)
599/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700600{
601 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
602 int coordinates_group = group_left_1;
603 int attr_group = group_right_1;
604 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100605 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700606 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200608 wchar_t wstr[2];
609 cchar_t wcval;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100610#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100611 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000612
Larry Hastings31826802013-10-19 00:09:25 -0700613 if (!attr_group)
614 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000615
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100616#ifdef HAVE_NCURSESW
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200617 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, wstr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100618 if (type == 2) {
619 funcname = "add_wch";
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200620 wstr[1] = L'\0';
621 setcchar(&wcval, wstr, attr, 0, NULL);
Larry Hastings31826802013-10-19 00:09:25 -0700622 if (coordinates_group)
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200623 rtn = mvwadd_wch(cwself->win,y,x, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100624 else {
Serhiy Storchaka0bcd89b2016-10-30 22:52:06 +0200625 rtn = wadd_wch(cwself->win, &wcval);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100626 }
627 }
628 else
629#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300630 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100631#endif
632 if (type == 1) {
633 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700634 if (coordinates_group)
635 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100636 else {
Larry Hastings31826802013-10-19 00:09:25 -0700637 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100638 }
639 }
640 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000641 return NULL;
642 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100643 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000644}
645
646static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000647PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000648{
Victor Stinner26486ea2010-05-15 22:23:53 +0000649 int rtn;
650 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100651 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500652 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100653#ifdef HAVE_NCURSESW
654 wchar_t *wstr = NULL;
655#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000656 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
657 long lattr;
658 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000660
Victor Stinner26486ea2010-05-15 22:23:53 +0000661 switch (PyTuple_Size(args)) {
662 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 break;
666 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100667 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000668 return NULL;
669 attr = lattr;
670 use_attr = TRUE;
671 break;
672 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100673 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000674 return NULL;
675 use_xy = TRUE;
676 break;
677 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100678 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000679 return NULL;
680 attr = lattr;
681 use_xy = use_attr = TRUE;
682 break;
683 default:
684 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
685 return NULL;
686 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100687#ifdef HAVE_NCURSESW
688 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
689#else
690 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
691#endif
692 if (strtype == 0)
693 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000694 if (use_attr == TRUE) {
695 attr_old = getattrs(self->win);
696 (void)wattrset(self->win,attr);
697 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100698#ifdef HAVE_NCURSESW
699 if (strtype == 2) {
700 funcname = "addwstr";
701 if (use_xy == TRUE)
702 rtn = mvwaddwstr(self->win,y,x,wstr);
703 else
704 rtn = waddwstr(self->win,wstr);
705 PyMem_Free(wstr);
706 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000707 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100708#endif
709 {
710 char *str = PyBytes_AS_STRING(bytesobj);
711 funcname = "addstr";
712 if (use_xy == TRUE)
713 rtn = mvwaddstr(self->win,y,x,str);
714 else
715 rtn = waddstr(self->win,str);
716 Py_DECREF(bytesobj);
717 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000718 if (use_attr == TRUE)
719 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100720 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000721}
Guido van Rossum85738471995-02-17 13:50:17 +0000722
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000723static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000724PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000725{
Victor Stinner26486ea2010-05-15 22:23:53 +0000726 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100727 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500728 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100729#ifdef HAVE_NCURSESW
730 wchar_t *wstr = NULL;
731#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000732 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
733 long lattr;
734 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100735 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000736
Victor Stinner26486ea2010-05-15 22:23:53 +0000737 switch (PyTuple_Size(args)) {
738 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 break;
742 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100743 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000744 return NULL;
745 attr = lattr;
746 use_attr = TRUE;
747 break;
748 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100749 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000750 return NULL;
751 use_xy = TRUE;
752 break;
753 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100754 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000755 return NULL;
756 attr = lattr;
757 use_xy = use_attr = TRUE;
758 break;
759 default:
760 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
761 return NULL;
762 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100763#ifdef HAVE_NCURSESW
764 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
765#else
766 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
767#endif
768 if (strtype == 0)
769 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000770
Victor Stinner26486ea2010-05-15 22:23:53 +0000771 if (use_attr == TRUE) {
772 attr_old = getattrs(self->win);
773 (void)wattrset(self->win,attr);
774 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775#ifdef HAVE_NCURSESW
776 if (strtype == 2) {
777 funcname = "addnwstr";
778 if (use_xy == TRUE)
779 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
780 else
781 rtn = waddnwstr(self->win,wstr,n);
782 PyMem_Free(wstr);
783 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000784 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100785#endif
786 {
787 char *str = PyBytes_AS_STRING(bytesobj);
788 funcname = "addnstr";
789 if (use_xy == TRUE)
790 rtn = mvwaddnstr(self->win,y,x,str,n);
791 else
792 rtn = waddnstr(self->win,str,n);
793 Py_DECREF(bytesobj);
794 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000795 if (use_attr == TRUE)
796 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100797 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798}
799
800static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000801PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000802{
Victor Stinner26486ea2010-05-15 22:23:53 +0000803 PyObject *temp;
804 chtype bkgd;
805 attr_t attr = A_NORMAL;
806 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000807
Victor Stinner26486ea2010-05-15 22:23:53 +0000808 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000810 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
811 return NULL;
812 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000814 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
815 return NULL;
816 attr = lattr;
817 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000819 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
820 return NULL;
821 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000822
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100823 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000824 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000825
Victor Stinner26486ea2010-05-15 22:23:53 +0000826 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000827}
828
829static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000830PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
831{
Victor Stinner26486ea2010-05-15 22:23:53 +0000832 long lattr;
833 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
834 return NULL;
835 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000836}
837
838static PyObject *
839PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
840{
Victor Stinner26486ea2010-05-15 22:23:53 +0000841 long lattr;
842 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
843 return NULL;
844 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000845}
846
847static PyObject *
848PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
849{
Victor Stinner26486ea2010-05-15 22:23:53 +0000850 long lattr;
851 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
852 return NULL;
853 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000854}
855
856static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000857PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000858{
Victor Stinner26486ea2010-05-15 22:23:53 +0000859 PyObject *temp;
860 chtype bkgd;
861 attr_t attr = A_NORMAL;
862 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863
Victor Stinner26486ea2010-05-15 22:23:53 +0000864 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
867 return NULL;
868 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000869 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000870 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
871 return NULL;
872 attr = lattr;
873 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000875 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
876 return NULL;
877 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100879 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000880 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000881
Victor Stinner26486ea2010-05-15 22:23:53 +0000882 wbkgdset(self->win, bkgd | attr);
883 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000884}
885
886static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000887PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000888{
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 PyObject *temp[8];
890 chtype ch[8];
891 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000892
Victor Stinner26486ea2010-05-15 22:23:53 +0000893 /* Clear the array of parameters */
894 for(i=0; i<8; i++) {
895 temp[i] = NULL;
896 ch[i] = 0;
897 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000898
Victor Stinner26486ea2010-05-15 22:23:53 +0000899 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
900 &temp[0], &temp[1], &temp[2], &temp[3],
901 &temp[4], &temp[5], &temp[6], &temp[7]))
902 return NULL;
903
904 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100905 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000906 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000907 }
908
909 wborder(self->win,
910 ch[0], ch[1], ch[2], ch[3],
911 ch[4], ch[5], ch[6], ch[7]);
912 Py_INCREF(Py_None);
913 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000914}
915
916static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000917PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000918{
Victor Stinner26486ea2010-05-15 22:23:53 +0000919 chtype ch1=0,ch2=0;
920 switch(PyTuple_Size(args)){
921 case 0: break;
922 default:
923 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
924 return NULL;
925 }
926 box(self->win,ch1,ch2);
927 Py_INCREF(Py_None);
928 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000929}
930
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000931#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
932#define py_mvwdelch mvwdelch
933#else
934int py_mvwdelch(WINDOW *w, int y, int x)
935{
Victor Stinner26486ea2010-05-15 22:23:53 +0000936 mvwdelch(w,y,x);
937 /* On HP/UX, mvwdelch already returns. On other systems,
938 we may well run into this return statement. */
939 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000940}
941#endif
942
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
944
945static PyObject *
946PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
947{
Victor Stinner26486ea2010-05-15 22:23:53 +0000948 int rtn;
949 int x, y;
950 int num = -1;
951 short color;
952 attr_t attr = A_NORMAL;
953 long lattr;
954 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000955
Victor Stinner26486ea2010-05-15 22:23:53 +0000956 switch (PyTuple_Size(args)) {
957 case 1:
958 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
959 return NULL;
960 attr = lattr;
961 break;
962 case 2:
963 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
964 return NULL;
965 attr = lattr;
966 break;
967 case 3:
968 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
969 return NULL;
970 attr = lattr;
971 use_xy = TRUE;
972 break;
973 case 4:
974 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
975 return NULL;
976 attr = lattr;
977 use_xy = TRUE;
978 break;
979 default:
980 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
981 return NULL;
982 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000983
Victor Stinner26486ea2010-05-15 22:23:53 +0000984 color = (short)((attr >> 8) & 0xff);
985 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000986
Victor Stinner26486ea2010-05-15 22:23:53 +0000987 if (use_xy == TRUE) {
988 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
989 touchline(self->win,y,1);
990 } else {
991 getyx(self->win,y,x);
992 rtn = wchgat(self->win,num,attr,color,NULL);
993 touchline(self->win,y,1);
994 }
995 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000996}
997
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000998
Guido van Rossumf6971e21994-08-30 12:25:20 +0000999static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001000PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001001{
Victor Stinner26486ea2010-05-15 22:23:53 +00001002 int rtn;
1003 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001004
Victor Stinner26486ea2010-05-15 22:23:53 +00001005 switch (PyTuple_Size(args)) {
1006 case 0:
1007 rtn = wdelch(self->win);
1008 break;
1009 case 2:
1010 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1011 return NULL;
1012 rtn = py_mvwdelch(self->win,y,x);
1013 break;
1014 default:
1015 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1016 return NULL;
1017 }
1018 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001019}
1020
1021static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001022PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001023{
Victor Stinner26486ea2010-05-15 22:23:53 +00001024 WINDOW *win;
1025 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001026
Victor Stinner26486ea2010-05-15 22:23:53 +00001027 nlines = 0;
1028 ncols = 0;
1029 switch (PyTuple_Size(args)) {
1030 case 2:
1031 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1032 return NULL;
1033 break;
1034 case 4:
1035 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1036 &nlines,&ncols,&begin_y,&begin_x))
1037 return NULL;
1038 break;
1039 default:
1040 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1041 return NULL;
1042 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001043
Victor Stinner26486ea2010-05-15 22:23:53 +00001044 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001045
Victor Stinner26486ea2010-05-15 22:23:53 +00001046 if (win == NULL) {
1047 PyErr_SetString(PyCursesError, catchall_NULL);
1048 return NULL;
1049 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001050
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001051 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001052}
1053
1054static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001055PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001056{
Victor Stinner26486ea2010-05-15 22:23:53 +00001057 PyObject *temp;
1058 chtype ch;
1059 attr_t attr = A_NORMAL;
1060 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001061
Victor Stinner26486ea2010-05-15 22:23:53 +00001062 switch (PyTuple_Size(args)) {
1063 case 1:
1064 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1065 return NULL;
1066 break;
1067 case 2:
1068 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1069 return NULL;
1070 attr = lattr;
1071 break;
1072 default:
1073 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001074
1075
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 return NULL;
1077 }
Guido van Rossum85738471995-02-17 13:50:17 +00001078
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001079 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001080 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001081
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001082#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001083 if (self->win->_flags & _ISPAD)
1084 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1085 "echochar");
1086 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001087#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001088 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1089 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001090}
1091
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001092#ifdef NCURSES_MOUSE_VERSION
1093static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001094PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001095{
Victor Stinner26486ea2010-05-15 22:23:53 +00001096 int x, y;
1097 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1098 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001099
Victor Stinner26486ea2010-05-15 22:23:53 +00001100 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001101}
1102#endif
1103
Guido van Rossumf6971e21994-08-30 12:25:20 +00001104static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001105PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001106{
Victor Stinner26486ea2010-05-15 22:23:53 +00001107 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001108}
1109
1110static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001111PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001112{
Victor Stinner26486ea2010-05-15 22:23:53 +00001113 int x, y;
1114 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001115
Victor Stinner26486ea2010-05-15 22:23:53 +00001116 switch (PyTuple_Size(args)) {
1117 case 0:
1118 Py_BEGIN_ALLOW_THREADS
1119 rtn = wgetch(self->win);
1120 Py_END_ALLOW_THREADS
1121 break;
1122 case 2:
1123 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1124 return NULL;
1125 Py_BEGIN_ALLOW_THREADS
1126 rtn = mvwgetch(self->win,y,x);
1127 Py_END_ALLOW_THREADS
1128 break;
1129 default:
1130 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1131 return NULL;
1132 }
1133 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001134}
Guido van Rossum85738471995-02-17 13:50:17 +00001135
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001136static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001137PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001138{
Victor Stinner26486ea2010-05-15 22:23:53 +00001139 int x, y;
1140 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001141
Victor Stinner26486ea2010-05-15 22:23:53 +00001142 switch (PyTuple_Size(args)) {
1143 case 0:
1144 Py_BEGIN_ALLOW_THREADS
1145 rtn = wgetch(self->win);
1146 Py_END_ALLOW_THREADS
1147 break;
1148 case 2:
1149 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1150 return NULL;
1151 Py_BEGIN_ALLOW_THREADS
1152 rtn = mvwgetch(self->win,y,x);
1153 Py_END_ALLOW_THREADS
1154 break;
1155 default:
1156 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1157 return NULL;
1158 }
1159 if (rtn == ERR) {
1160 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001161 PyErr_CheckSignals();
1162 if (!PyErr_Occurred())
1163 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001164 return NULL;
1165 } else if (rtn<=255) {
1166 return Py_BuildValue("C", rtn);
1167 } else {
1168 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001169#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001170 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001171#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001172 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001173#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001174 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1175 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001176}
1177
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001178#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001179static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001180PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1181{
1182 int x, y;
1183 int ct;
1184 wint_t rtn;
1185
1186 switch (PyTuple_Size(args)) {
1187 case 0:
1188 Py_BEGIN_ALLOW_THREADS
1189 ct = wget_wch(self->win,&rtn);
1190 Py_END_ALLOW_THREADS
1191 break;
1192 case 2:
1193 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1194 return NULL;
1195 Py_BEGIN_ALLOW_THREADS
1196 ct = mvwget_wch(self->win,y,x,&rtn);
1197 Py_END_ALLOW_THREADS
1198 break;
1199 default:
1200 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1201 return NULL;
1202 }
1203 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001204 if (PyErr_CheckSignals())
1205 return NULL;
1206
Victor Stinnera7878b72011-07-14 23:07:44 +02001207 /* get_wch() returns ERR in nodelay mode */
1208 PyErr_SetString(PyCursesError, "no input");
1209 return NULL;
1210 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001211 if (ct == KEY_CODE_YES)
1212 return PyLong_FromLong(rtn);
1213 else
1214 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001215}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001216#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001217
1218static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001219PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001220{
Victor Stinner26486ea2010-05-15 22:23:53 +00001221 int x, y, n;
1222 char rtn[1024]; /* This should be big enough.. I hope */
1223 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001224
Victor Stinner26486ea2010-05-15 22:23:53 +00001225 switch (PyTuple_Size(args)) {
1226 case 0:
1227 Py_BEGIN_ALLOW_THREADS
1228 rtn2 = wgetnstr(self->win,rtn, 1023);
1229 Py_END_ALLOW_THREADS
1230 break;
1231 case 1:
1232 if (!PyArg_ParseTuple(args,"i;n", &n))
1233 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001234 if (n < 0) {
1235 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1236 return NULL;
1237 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001238 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001239 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001240 Py_END_ALLOW_THREADS
1241 break;
1242 case 2:
1243 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1244 return NULL;
1245 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001246#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001247 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001248#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001249 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001250#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001251 Py_END_ALLOW_THREADS
1252 break;
1253 case 3:
1254 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1255 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001256 if (n < 0) {
1257 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1258 return NULL;
1259 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001260#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001261 Py_BEGIN_ALLOW_THREADS
1262 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001263 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001264 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001265#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001266 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001267 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001268 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001269#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001270 break;
1271 default:
1272 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1273 return NULL;
1274 }
1275 if (rtn2 == ERR)
1276 rtn[0] = 0;
1277 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001278}
1279
1280static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001281PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001282{
Victor Stinner26486ea2010-05-15 22:23:53 +00001283 PyObject *temp;
1284 chtype ch;
1285 int n, x, y, code = OK;
1286 attr_t attr = A_NORMAL;
1287 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001288
Victor Stinner26486ea2010-05-15 22:23:53 +00001289 switch (PyTuple_Size(args)) {
1290 case 2:
1291 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1292 return NULL;
1293 break;
1294 case 3:
1295 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1296 return NULL;
1297 attr = lattr;
1298 break;
1299 case 4:
1300 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1301 return NULL;
1302 code = wmove(self->win, y, x);
1303 break;
1304 case 5:
1305 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1306 &y, &x, &temp, &n, &lattr))
1307 return NULL;
1308 attr = lattr;
1309 code = wmove(self->win, y, x);
1310 break;
1311 default:
1312 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1313 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001314 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001315
1316 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001317 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001318 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001319 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1320 } else
1321 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322}
1323
1324static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001325PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001326{
Victor Stinner26486ea2010-05-15 22:23:53 +00001327 int rtn, x, y, use_xy = FALSE;
1328 PyObject *temp;
1329 chtype ch = 0;
1330 attr_t attr = A_NORMAL;
1331 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001332
Victor Stinner26486ea2010-05-15 22:23:53 +00001333 switch (PyTuple_Size(args)) {
1334 case 1:
1335 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1336 return NULL;
1337 break;
1338 case 2:
1339 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1340 return NULL;
1341 attr = lattr;
1342 break;
1343 case 3:
1344 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1345 return NULL;
1346 use_xy = TRUE;
1347 break;
1348 case 4:
1349 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1350 return NULL;
1351 attr = lattr;
1352 use_xy = TRUE;
1353 break;
1354 default:
1355 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1356 return NULL;
1357 }
1358
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001359 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001360 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001361
1362 if (use_xy == TRUE)
1363 rtn = mvwinsch(self->win,y,x, ch | attr);
1364 else {
1365 rtn = winsch(self->win, ch | attr);
1366 }
1367 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001368}
1369
1370static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001371PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001372{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001373 int x, y;
1374 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001375
Victor Stinner26486ea2010-05-15 22:23:53 +00001376 switch (PyTuple_Size(args)) {
1377 case 0:
1378 rtn = winch(self->win);
1379 break;
1380 case 2:
1381 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1382 return NULL;
1383 rtn = mvwinch(self->win,y,x);
1384 break;
1385 default:
1386 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1387 return NULL;
1388 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001389 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001390}
1391
1392static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001393PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001394{
Victor Stinner26486ea2010-05-15 22:23:53 +00001395 int x, y, n;
1396 char rtn[1024]; /* This should be big enough.. I hope */
1397 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001398
Victor Stinner26486ea2010-05-15 22:23:53 +00001399 switch (PyTuple_Size(args)) {
1400 case 0:
1401 rtn2 = winnstr(self->win,rtn, 1023);
1402 break;
1403 case 1:
1404 if (!PyArg_ParseTuple(args,"i;n", &n))
1405 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001406 if (n < 0) {
1407 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1408 return NULL;
1409 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001410 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001411 break;
1412 case 2:
1413 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1414 return NULL;
1415 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1416 break;
1417 case 3:
1418 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1419 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001420 if (n < 0) {
1421 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1422 return NULL;
1423 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001424 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001425 break;
1426 default:
1427 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1428 return NULL;
1429 }
1430 if (rtn2 == ERR)
1431 rtn[0] = 0;
1432 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001433}
1434
1435static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001436PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001437{
Victor Stinner26486ea2010-05-15 22:23:53 +00001438 int rtn;
1439 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001440 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001441 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001442#ifdef HAVE_NCURSESW
1443 wchar_t *wstr = NULL;
1444#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001445 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1446 long lattr;
1447 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001448 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001449
Victor Stinner26486ea2010-05-15 22:23:53 +00001450 switch (PyTuple_Size(args)) {
1451 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001452 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001453 return NULL;
1454 break;
1455 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001456 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001457 return NULL;
1458 attr = lattr;
1459 use_attr = TRUE;
1460 break;
1461 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001462 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001463 return NULL;
1464 use_xy = TRUE;
1465 break;
1466 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001467 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001468 return NULL;
1469 attr = lattr;
1470 use_xy = use_attr = TRUE;
1471 break;
1472 default:
1473 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1474 return NULL;
1475 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001476
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001477#ifdef HAVE_NCURSESW
1478 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1479#else
1480 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1481#endif
1482 if (strtype == 0)
1483 return NULL;
1484
Victor Stinner26486ea2010-05-15 22:23:53 +00001485 if (use_attr == TRUE) {
1486 attr_old = getattrs(self->win);
1487 (void)wattrset(self->win,attr);
1488 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001489#ifdef HAVE_NCURSESW
1490 if (strtype == 2) {
1491 funcname = "inswstr";
1492 if (use_xy == TRUE)
1493 rtn = mvwins_wstr(self->win,y,x,wstr);
1494 else
1495 rtn = wins_wstr(self->win,wstr);
1496 PyMem_Free(wstr);
1497 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001498 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001499#endif
1500 {
1501 char *str = PyBytes_AS_STRING(bytesobj);
1502 funcname = "insstr";
1503 if (use_xy == TRUE)
1504 rtn = mvwinsstr(self->win,y,x,str);
1505 else
1506 rtn = winsstr(self->win,str);
1507 Py_DECREF(bytesobj);
1508 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001509 if (use_attr == TRUE)
1510 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001511 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001512}
1513
1514static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001515PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001516{
Victor Stinner26486ea2010-05-15 22:23:53 +00001517 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001518 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001519 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001520#ifdef HAVE_NCURSESW
1521 wchar_t *wstr = NULL;
1522#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001523 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1524 long lattr;
1525 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001526 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001527
Victor Stinner26486ea2010-05-15 22:23:53 +00001528 switch (PyTuple_Size(args)) {
1529 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001530 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001531 return NULL;
1532 break;
1533 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001534 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001535 return NULL;
1536 attr = lattr;
1537 use_attr = TRUE;
1538 break;
1539 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001540 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001541 return NULL;
1542 use_xy = TRUE;
1543 break;
1544 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001545 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001546 return NULL;
1547 attr = lattr;
1548 use_xy = use_attr = TRUE;
1549 break;
1550 default:
1551 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1552 return NULL;
1553 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001554
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001555#ifdef HAVE_NCURSESW
1556 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1557#else
1558 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1559#endif
1560 if (strtype == 0)
1561 return NULL;
1562
Victor Stinner26486ea2010-05-15 22:23:53 +00001563 if (use_attr == TRUE) {
1564 attr_old = getattrs(self->win);
1565 (void)wattrset(self->win,attr);
1566 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001567#ifdef HAVE_NCURSESW
1568 if (strtype == 2) {
1569 funcname = "insn_wstr";
1570 if (use_xy == TRUE)
1571 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1572 else
1573 rtn = wins_nwstr(self->win,wstr,n);
1574 PyMem_Free(wstr);
1575 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001576 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001577#endif
1578 {
1579 char *str = PyBytes_AS_STRING(bytesobj);
1580 funcname = "insnstr";
1581 if (use_xy == TRUE)
1582 rtn = mvwinsnstr(self->win,y,x,str,n);
1583 else
1584 rtn = winsnstr(self->win,str,n);
1585 Py_DECREF(bytesobj);
1586 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001587 if (use_attr == TRUE)
1588 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001589 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001590}
1591
1592static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001593PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001594{
Victor Stinner26486ea2010-05-15 22:23:53 +00001595 int line, erg;
1596 if (!PyArg_ParseTuple(args,"i;line", &line))
1597 return NULL;
1598 erg = is_linetouched(self->win, line);
1599 if (erg == ERR) {
1600 PyErr_SetString(PyExc_TypeError,
1601 "is_linetouched: line number outside of boundaries");
1602 return NULL;
1603 } else
1604 if (erg == FALSE) {
1605 Py_INCREF(Py_False);
1606 return Py_False;
1607 } else {
1608 Py_INCREF(Py_True);
1609 return Py_True;
1610 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001611}
1612
1613static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001614PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001615{
Victor Stinner26486ea2010-05-15 22:23:53 +00001616 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1617 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001618
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001619#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001620 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001621#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001622 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001623#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001624 {
1625 switch(PyTuple_Size(args)) {
1626 case 6:
1627 if (!PyArg_ParseTuple(args,
1628 "iiiiii;" \
1629 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1630 &pminrow, &pmincol, &sminrow,
1631 &smincol, &smaxrow, &smaxcol))
1632 return NULL;
1633 Py_BEGIN_ALLOW_THREADS
1634 rtn = pnoutrefresh(self->win,
1635 pminrow, pmincol, sminrow,
1636 smincol, smaxrow, smaxcol);
1637 Py_END_ALLOW_THREADS
1638 return PyCursesCheckERR(rtn, "pnoutrefresh");
1639 default:
1640 PyErr_SetString(PyCursesError,
1641 "noutrefresh() called for a pad "
1642 "requires 6 arguments");
1643 return NULL;
1644 }
1645 } else {
1646 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1647 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001648
Victor Stinner26486ea2010-05-15 22:23:53 +00001649 Py_BEGIN_ALLOW_THREADS
1650 rtn = wnoutrefresh(self->win);
1651 Py_END_ALLOW_THREADS
1652 return PyCursesCheckERR(rtn, "wnoutrefresh");
1653 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001654}
1655
1656static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001657PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1658{
1659 PyCursesWindowObject *temp;
1660 int use_copywin = FALSE;
1661 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1662 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001663
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001664 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001665 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001666 if (!PyArg_ParseTuple(args, "O!;window object",
1667 &PyCursesWindow_Type, &temp))
1668 return NULL;
1669 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001670 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001671 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1672 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1673 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1674 return NULL;
1675 use_copywin = TRUE;
1676 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001677 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001678 PyErr_SetString(PyExc_TypeError,
1679 "overlay requires one or seven arguments");
1680 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001681 }
1682
1683 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001684 rtn = copywin(self->win, temp->win, sminrow, smincol,
1685 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1686 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001687 }
1688 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001689 rtn = overlay(self->win, temp->win);
1690 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001691 }
1692}
1693
1694static PyObject *
1695PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1696{
1697 PyCursesWindowObject *temp;
1698 int use_copywin = FALSE;
1699 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1700 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001701
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001702 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001703 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001704 if (!PyArg_ParseTuple(args, "O!;window object",
1705 &PyCursesWindow_Type, &temp))
1706 return NULL;
1707 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001708 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001709 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1710 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1711 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1712 return NULL;
1713 use_copywin = TRUE;
1714 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001715 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001716 PyErr_SetString(PyExc_TypeError,
1717 "overwrite requires one or seven arguments");
1718 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001719 }
1720
1721 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001722 rtn = copywin(self->win, temp->win, sminrow, smincol,
1723 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001724 return PyCursesCheckERR(rtn, "copywin");
1725 }
1726 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001727 rtn = overwrite(self->win, temp->win);
1728 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001729 }
1730}
1731
1732static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001733PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001734{
Victor Stinner26486ea2010-05-15 22:23:53 +00001735 /* We have to simulate this by writing to a temporary FILE*,
1736 then reading back, then writing to the argument stream. */
1737 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001738 int fd = -1;
1739 FILE *fp = NULL;
1740 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001741
Victor Stinner26486ea2010-05-15 22:23:53 +00001742 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1743 fd = mkstemp(fn);
1744 if (fd < 0)
1745 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001746 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1747 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001748 fp = fdopen(fd, "wb+");
1749 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001750 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1751 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001752 }
1753 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001754 if (res == NULL)
1755 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001756 fseek(fp, 0, 0);
1757 while (1) {
1758 char buf[BUFSIZ];
1759 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001760 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001761
Victor Stinner26486ea2010-05-15 22:23:53 +00001762 if (n <= 0)
1763 break;
1764 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001765 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001766 if (res == NULL)
1767 break;
1768 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001769
1770exit:
1771 if (fp != NULL)
1772 fclose(fp);
1773 else if (fd != -1)
1774 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001775 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001776 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001777}
1778
1779static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001780PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001781{
Victor Stinner26486ea2010-05-15 22:23:53 +00001782 int beg, num;
1783 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1784 return NULL;
1785 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001786}
1787
1788static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001789PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001790{
Victor Stinner26486ea2010-05-15 22:23:53 +00001791 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1792 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001793
Victor Stinner26486ea2010-05-15 22:23:53 +00001794#ifndef WINDOW_HAS_FLAGS
1795 if (0)
1796#else
1797 if (self->win->_flags & _ISPAD)
1798#endif
1799 {
1800 switch(PyTuple_Size(args)) {
1801 case 6:
1802 if (!PyArg_ParseTuple(args,
1803 "iiiiii;" \
1804 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1805 &pminrow, &pmincol, &sminrow,
1806 &smincol, &smaxrow, &smaxcol))
1807 return NULL;
1808
1809 Py_BEGIN_ALLOW_THREADS
1810 rtn = prefresh(self->win,
1811 pminrow, pmincol, sminrow,
1812 smincol, smaxrow, smaxcol);
1813 Py_END_ALLOW_THREADS
1814 return PyCursesCheckERR(rtn, "prefresh");
1815 default:
1816 PyErr_SetString(PyCursesError,
1817 "refresh() for a pad requires 6 arguments");
1818 return NULL;
1819 }
1820 } else {
1821 if (!PyArg_ParseTuple(args, ":refresh"))
1822 return NULL;
1823 Py_BEGIN_ALLOW_THREADS
1824 rtn = wrefresh(self->win);
1825 Py_END_ALLOW_THREADS
1826 return PyCursesCheckERR(rtn, "prefresh");
1827 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001828}
1829
1830static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001831PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001832{
Victor Stinner26486ea2010-05-15 22:23:53 +00001833 int x, y;
1834 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1835 return NULL;
1836 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001837}
1838
1839static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001840PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001841{
Victor Stinner26486ea2010-05-15 22:23:53 +00001842 WINDOW *win;
1843 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001844
Victor Stinner26486ea2010-05-15 22:23:53 +00001845 nlines = 0;
1846 ncols = 0;
1847 switch (PyTuple_Size(args)) {
1848 case 2:
1849 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1850 return NULL;
1851 break;
1852 case 4:
1853 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1854 &nlines,&ncols,&begin_y,&begin_x))
1855 return NULL;
1856 break;
1857 default:
1858 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1859 return NULL;
1860 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001861
Victor Stinner26486ea2010-05-15 22:23:53 +00001862 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001863#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001864 if (self->win->_flags & _ISPAD)
1865 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1866 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001867#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001868 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001869
Victor Stinner26486ea2010-05-15 22:23:53 +00001870 if (win == NULL) {
1871 PyErr_SetString(PyCursesError, catchall_NULL);
1872 return NULL;
1873 }
1874
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001875 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001876}
1877
1878static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001879PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001880{
Victor Stinner26486ea2010-05-15 22:23:53 +00001881 int nlines;
1882 switch(PyTuple_Size(args)) {
1883 case 0:
1884 return PyCursesCheckERR(scroll(self->win), "scroll");
1885 case 1:
1886 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1887 return NULL;
1888 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1889 default:
1890 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1891 return NULL;
1892 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001893}
1894
1895static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001896PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001897{
Victor Stinner26486ea2010-05-15 22:23:53 +00001898 int st, cnt, val;
1899 switch (PyTuple_Size(args)) {
1900 case 2:
1901 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1902 return NULL;
1903 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1904 case 3:
1905 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1906 return NULL;
1907 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1908 default:
1909 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1910 return NULL;
1911 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001912}
1913
1914static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001915PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001916{
Victor Stinner26486ea2010-05-15 22:23:53 +00001917 PyObject *temp;
1918 chtype ch;
1919 int n, x, y, code = OK;
1920 attr_t attr = A_NORMAL;
1921 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001922
Victor Stinner26486ea2010-05-15 22:23:53 +00001923 switch (PyTuple_Size(args)) {
1924 case 2:
1925 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1926 return NULL;
1927 break;
1928 case 3:
1929 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1930 return NULL;
1931 attr = lattr;
1932 break;
1933 case 4:
1934 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1935 return NULL;
1936 code = wmove(self->win, y, x);
1937 break;
1938 case 5:
1939 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1940 &y, &x, &temp, &n, &lattr))
1941 return NULL;
1942 attr = lattr;
1943 code = wmove(self->win, y, x);
1944 break;
1945 default:
1946 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1947 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001948 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001949
1950 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001951 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001952 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001953 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1954 } else
1955 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001956}
1957
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001958static PyObject *
1959PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1960{
1961 return PyUnicode_FromString(self->encoding);
1962}
1963
1964static int
1965PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1966{
1967 PyObject *ascii;
1968 char *encoding;
1969
1970 /* It is illegal to del win.encoding */
1971 if (value == NULL) {
1972 PyErr_SetString(PyExc_TypeError,
1973 "encoding may not be deleted");
1974 return -1;
1975 }
1976
1977 if (!PyUnicode_Check(value)) {
1978 PyErr_SetString(PyExc_TypeError,
1979 "setting encoding to a non-string");
1980 return -1;
1981 }
1982 ascii = PyUnicode_AsASCIIString(value);
1983 if (ascii == NULL)
1984 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001985 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001986 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001987 if (encoding == NULL) {
1988 PyErr_NoMemory();
1989 return -1;
1990 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001991 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001992 self->encoding = encoding;
1993 return 0;
1994}
1995
1996
Guido van Rossumf6971e21994-08-30 12:25:20 +00001997static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001998 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001999 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2000 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2001 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2002 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2003 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2004 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2005 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2006 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2007 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2008 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2009 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2010 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2011 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2012 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2013 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2014 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2015 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2016 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2017 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002018#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002019 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002020#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002021 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2022 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2023 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2024 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2025 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002026#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002027 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002028#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002029 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2030 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2031 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2032 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2033 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2034 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2035 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2036 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2037 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2038 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2039 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2040 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2041 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2042 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2043 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2044 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2045 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2046 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2047 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2048 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2049 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2050 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2051 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2052 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2053 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002054 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2055 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2056 METH_VARARGS},
2057 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2058 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2059 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2060 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002061#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002062 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002063#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002064 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2065 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2066 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2067 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2068 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2069 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2070 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2071 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2072 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2073 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2074 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2075 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2076 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2077 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2078 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2079 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002080};
2081
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002082static PyGetSetDef PyCursesWindow_getsets[] = {
2083 {"encoding",
2084 (getter)PyCursesWindow_get_encoding,
2085 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002086 "the typecode character used to create the array"},
2087 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002088};
2089
Guido van Rossumf6971e21994-08-30 12:25:20 +00002090/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002091
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002092PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002093 PyVarObject_HEAD_INIT(NULL, 0)
Mariatta7253ade2017-03-08 08:19:57 -08002094 "_curses.window", /*tp_name*/
Victor Stinner26486ea2010-05-15 22:23:53 +00002095 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2096 0, /*tp_itemsize*/
2097 /* methods */
2098 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2099 0, /*tp_print*/
2100 (getattrfunc)0, /*tp_getattr*/
2101 (setattrfunc)0, /*tp_setattr*/
2102 0, /*tp_reserved*/
2103 0, /*tp_repr*/
2104 0, /*tp_as_number*/
2105 0, /*tp_as_sequence*/
2106 0, /*tp_as_mapping*/
2107 0, /*tp_hash*/
2108 0, /*tp_call*/
2109 0, /*tp_str*/
2110 0, /*tp_getattro*/
2111 0, /*tp_setattro*/
2112 0, /*tp_as_buffer*/
2113 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2114 0, /*tp_doc*/
2115 0, /*tp_traverse*/
2116 0, /*tp_clear*/
2117 0, /*tp_richcompare*/
2118 0, /*tp_weaklistoffset*/
2119 0, /*tp_iter*/
2120 0, /*tp_iternext*/
2121 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002122 0, /* tp_members */
2123 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002124};
2125
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002126/*********************************************************************
2127 Global Functions
2128**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002130NoArgNoReturnFunction(beep)
2131NoArgNoReturnFunction(def_prog_mode)
2132NoArgNoReturnFunction(def_shell_mode)
2133NoArgNoReturnFunction(doupdate)
2134NoArgNoReturnFunction(endwin)
2135NoArgNoReturnFunction(flash)
2136NoArgNoReturnFunction(nocbreak)
2137NoArgNoReturnFunction(noecho)
2138NoArgNoReturnFunction(nonl)
2139NoArgNoReturnFunction(noraw)
2140NoArgNoReturnFunction(reset_prog_mode)
2141NoArgNoReturnFunction(reset_shell_mode)
2142NoArgNoReturnFunction(resetty)
2143NoArgNoReturnFunction(savetty)
2144
2145NoArgOrFlagNoReturnFunction(cbreak)
2146NoArgOrFlagNoReturnFunction(echo)
2147NoArgOrFlagNoReturnFunction(nl)
2148NoArgOrFlagNoReturnFunction(raw)
2149
2150NoArgReturnIntFunction(baudrate)
2151NoArgReturnIntFunction(termattrs)
2152
2153NoArgReturnStringFunction(termname)
2154NoArgReturnStringFunction(longname)
2155
2156NoArgTrueFalseFunction(can_change_color)
2157NoArgTrueFalseFunction(has_colors)
2158NoArgTrueFalseFunction(has_ic)
2159NoArgTrueFalseFunction(has_il)
2160NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002161NoArgNoReturnVoidFunction(flushinp)
2162NoArgNoReturnVoidFunction(noqiflush)
2163
2164static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002165PyCurses_filter(PyObject *self)
2166{
Victor Stinner26486ea2010-05-15 22:23:53 +00002167 /* not checking for PyCursesInitialised here since filter() must
2168 be called before initscr() */
2169 filter();
2170 Py_INCREF(Py_None);
2171 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002172}
2173
2174static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002175PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176{
Victor Stinner26486ea2010-05-15 22:23:53 +00002177 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002178
Victor Stinner26486ea2010-05-15 22:23:53 +00002179 PyCursesInitialised;
2180 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002181
Victor Stinner26486ea2010-05-15 22:23:53 +00002182 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183
Victor Stinner26486ea2010-05-15 22:23:53 +00002184 if (color_content(color, &r, &g, &b) != ERR)
2185 return Py_BuildValue("(iii)", r, g, b);
2186 else {
2187 PyErr_SetString(PyCursesError,
2188 "Argument 1 was out of range. Check value of COLORS.");
2189 return NULL;
2190 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191}
2192
2193static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002194PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002195{
Victor Stinner26486ea2010-05-15 22:23:53 +00002196 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002197
Victor Stinner26486ea2010-05-15 22:23:53 +00002198 PyCursesInitialised;
2199 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002200
Victor Stinner26486ea2010-05-15 22:23:53 +00002201 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2202 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203}
2204
2205static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002206PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207{
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 int vis,erg;
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:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 erg = curs_set(vis);
2215 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216
Victor Stinner26486ea2010-05-15 22:23:53 +00002217 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218}
2219
2220static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002221PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002222{
Victor Stinner26486ea2010-05-15 22:23:53 +00002223 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002224
Victor Stinner26486ea2010-05-15 22:23:53 +00002225 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226
Victor Stinner26486ea2010-05-15 22:23:53 +00002227 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228
Victor Stinner26486ea2010-05-15 22:23:53 +00002229 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002230}
2231
2232static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002233PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234{
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002238
Victor Stinner26486ea2010-05-15 22:23:53 +00002239 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240
Victor Stinner26486ea2010-05-15 22:23:53 +00002241 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242}
2243
2244static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002245PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246{
Victor Stinner26486ea2010-05-15 22:23:53 +00002247 int x = 0;
2248 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002249
Victor Stinner26486ea2010-05-15 22:23:53 +00002250 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002251
Victor Stinner26486ea2010-05-15 22:23:53 +00002252 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002253
Victor Stinner26486ea2010-05-15 22:23:53 +00002254 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255}
2256
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002257#ifdef NCURSES_MOUSE_VERSION
2258static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002259PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002260{
Victor Stinner26486ea2010-05-15 22:23:53 +00002261 int rtn;
2262 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002263
Victor Stinner26486ea2010-05-15 22:23:53 +00002264 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002265
Victor Stinner26486ea2010-05-15 22:23:53 +00002266 rtn = getmouse( &event );
2267 if (rtn == ERR) {
2268 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2269 return NULL;
2270 }
2271 return Py_BuildValue("(hiiil)",
2272 (short)event.id,
2273 event.x, event.y, event.z,
2274 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002275}
2276
2277static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002278PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002279{
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002281
Victor Stinner26486ea2010-05-15 22:23:53 +00002282 PyCursesInitialised;
2283 if (!PyArg_ParseTuple(args, "hiiil",
2284 &event.id,
2285 &event.x, &event.y, &event.z,
2286 (int *) &event.bstate))
2287 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002288
Victor Stinner26486ea2010-05-15 22:23:53 +00002289 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002290}
2291#endif
2292
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002293static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002294PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002295{
Victor Stinner26486ea2010-05-15 22:23:53 +00002296 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002297 int fd = -1;
2298 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002299 PyObject *data;
2300 size_t datalen;
2301 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002302 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002303 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002304
Victor Stinner26486ea2010-05-15 22:23:53 +00002305 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002306
Victor Stinner26486ea2010-05-15 22:23:53 +00002307 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2308 fd = mkstemp(fn);
2309 if (fd < 0)
2310 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002311 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2312 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 fp = fdopen(fd, "wb+");
2314 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002315 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2316 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002317 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002318
Victor Stinner3466bde2016-09-05 18:16:01 -07002319 data = _PyObject_CallMethodId(stream, &PyId_read, NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002320 if (data == NULL)
2321 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002322 if (!PyBytes_Check(data)) {
2323 PyErr_Format(PyExc_TypeError,
2324 "f.read() returned %.100s instead of bytes",
2325 data->ob_type->tp_name);
2326 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002327 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002328 }
2329 datalen = PyBytes_GET_SIZE(data);
2330 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2331 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002332 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2333 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002334 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002335 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002336
Victor Stinner26486ea2010-05-15 22:23:53 +00002337 fseek(fp, 0, 0);
2338 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002339 if (win == NULL) {
2340 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002341 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002343 res = PyCursesWindow_New(win, NULL);
2344
2345error:
2346 if (fp != NULL)
2347 fclose(fp);
2348 else if (fd != -1)
2349 close(fd);
2350 remove(fn);
2351 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002352}
2353
2354static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002355PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002356{
Victor Stinner26486ea2010-05-15 22:23:53 +00002357 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002358
Victor Stinner26486ea2010-05-15 22:23:53 +00002359 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002360
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002364}
2365
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002366#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002367/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002368static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002369{
Victor Stinner26486ea2010-05-15 22:23:53 +00002370 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002371
Victor Stinner26486ea2010-05-15 22:23:53 +00002372 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002373
Victor Stinner26486ea2010-05-15 22:23:53 +00002374 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002375
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 if (has_key(ch) == FALSE) {
2377 Py_INCREF(Py_False);
2378 return Py_False;
2379 }
2380 Py_INCREF(Py_True);
2381 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002382}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002383#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002384
2385static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002386PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002387{
Victor Stinner26486ea2010-05-15 22:23:53 +00002388 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 PyCursesInitialised;
2391 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 switch(PyTuple_Size(args)) {
2394 case 4:
2395 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2396 break;
2397 default:
2398 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2399 return NULL;
2400 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401
Victor Stinner26486ea2010-05-15 22:23:53 +00002402 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403}
2404
2405static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002406PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407{
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002409
Victor Stinner26486ea2010-05-15 22:23:53 +00002410 PyCursesInitialised;
2411 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002412
Victor Stinner26486ea2010-05-15 22:23:53 +00002413 if (PyTuple_Size(args) != 3) {
2414 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2415 return NULL;
2416 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002417
Victor Stinner26486ea2010-05-15 22:23:53 +00002418 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002419
Victor Stinner26486ea2010-05-15 22:23:53 +00002420 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421}
2422
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002423static PyObject *ModDict;
2424
Victor Stinner26486ea2010-05-15 22:23:53 +00002425static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002426PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002427{
Victor Stinner26486ea2010-05-15 22:23:53 +00002428 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002429 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002430
Victor Stinner26486ea2010-05-15 22:23:53 +00002431 if (initialised == TRUE) {
2432 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002433 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002434 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002435
Victor Stinner26486ea2010-05-15 22:23:53 +00002436 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002437
Victor Stinner26486ea2010-05-15 22:23:53 +00002438 if (win == NULL) {
2439 PyErr_SetString(PyCursesError, catchall_NULL);
2440 return NULL;
2441 }
Guido van Rossum85738471995-02-17 13:50:17 +00002442
Victor Stinner26486ea2010-05-15 22:23:53 +00002443 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002444
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002445/* This was moved from initcurses() because it core dumped on SGI,
2446 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002447#define SetDictInt(string,ch) \
2448 do { \
2449 PyObject *o = PyLong_FromLong((long) (ch)); \
2450 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2451 Py_DECREF(o); \
2452 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002453 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002454
Victor Stinner26486ea2010-05-15 22:23:53 +00002455 /* Here are some graphic symbols you can use */
2456 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2457 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2458 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2459 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2460 SetDictInt("ACS_LTEE", (ACS_LTEE));
2461 SetDictInt("ACS_RTEE", (ACS_RTEE));
2462 SetDictInt("ACS_BTEE", (ACS_BTEE));
2463 SetDictInt("ACS_TTEE", (ACS_TTEE));
2464 SetDictInt("ACS_HLINE", (ACS_HLINE));
2465 SetDictInt("ACS_VLINE", (ACS_VLINE));
2466 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002467#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002468 /* On HP/UX 11, these are of type cchar_t, which is not an
2469 integral type. If this is a problem on more platforms, a
2470 configure test should be added to determine whether ACS_S1
2471 is of integral type. */
2472 SetDictInt("ACS_S1", (ACS_S1));
2473 SetDictInt("ACS_S9", (ACS_S9));
2474 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2475 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2476 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2477 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2478 SetDictInt("ACS_BULLET", (ACS_BULLET));
2479 SetDictInt("ACS_LARROW", (ACS_LARROW));
2480 SetDictInt("ACS_RARROW", (ACS_RARROW));
2481 SetDictInt("ACS_DARROW", (ACS_DARROW));
2482 SetDictInt("ACS_UARROW", (ACS_UARROW));
2483 SetDictInt("ACS_BOARD", (ACS_BOARD));
2484 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2485 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002486#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2488 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2489 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2490 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2491 SetDictInt("ACS_SBSS", (ACS_RTEE));
2492 SetDictInt("ACS_SSSB", (ACS_LTEE));
2493 SetDictInt("ACS_SSBS", (ACS_BTEE));
2494 SetDictInt("ACS_BSSS", (ACS_TTEE));
2495 SetDictInt("ACS_BSBS", (ACS_HLINE));
2496 SetDictInt("ACS_SBSB", (ACS_VLINE));
2497 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002498
Victor Stinner26486ea2010-05-15 22:23:53 +00002499 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002500#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002501 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002502#endif
2503#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002504 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002505#endif
2506#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002507 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002508#endif
2509#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002510 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002511#endif
2512#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002513 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002514#endif
2515#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002516 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002517#endif
2518#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002519 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002520#endif
2521
Victor Stinner26486ea2010-05-15 22:23:53 +00002522 SetDictInt("LINES", LINES);
2523 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002524
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002525 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2526 screen_encoding = winobj->encoding;
2527 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002528}
2529
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002530static PyObject *
2531PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2532{
Victor Stinner26486ea2010-05-15 22:23:53 +00002533 int fd = -1;
2534 int err;
2535 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002536
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002538
Victor Stinner26486ea2010-05-15 22:23:53 +00002539 if (!PyArg_ParseTupleAndKeywords(
2540 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2541 return NULL;
2542 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002543
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 if (fd == -1) {
2545 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002546
Victor Stinnerbd303c12013-11-07 23:07:29 +01002547 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002548
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 if (sys_stdout == NULL || sys_stdout == Py_None) {
2550 PyErr_SetString(
2551 PyCursesError,
2552 "lost sys.stdout");
2553 return NULL;
2554 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002555
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002557
Victor Stinner26486ea2010-05-15 22:23:53 +00002558 if (fd == -1) {
2559 return NULL;
2560 }
2561 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002562
Matthias Klose635edd12010-07-30 21:40:57 +00002563 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002564 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002565
Victor Stinner26486ea2010-05-15 22:23:53 +00002566 if (err == 0) {
2567 s = "setupterm: could not find terminal";
2568 } else if (err == -1) {
2569 s = "setupterm: could not find terminfo database";
2570 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002571
Victor Stinner26486ea2010-05-15 22:23:53 +00002572 PyErr_SetString(PyCursesError,s);
2573 return NULL;
2574 }
2575
2576 initialised_setupterm = TRUE;
2577
2578 Py_INCREF(Py_None);
2579 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002580}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002581
2582static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002583PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002584{
Victor Stinner26486ea2010-05-15 22:23:53 +00002585 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002586
Victor Stinner26486ea2010-05-15 22:23:53 +00002587 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 switch(PyTuple_Size(args)) {
2590 case 1:
2591 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2592 break;
2593 default:
2594 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2595 return NULL;
2596 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002597
Victor Stinner26486ea2010-05-15 22:23:53 +00002598 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002599}
2600
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002601#ifdef HAVE_CURSES_IS_TERM_RESIZED
2602static PyObject *
2603PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2604{
Victor Stinner26486ea2010-05-15 22:23:53 +00002605 int lines;
2606 int columns;
2607 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2612 return NULL;
2613 result = is_term_resized(lines, columns);
2614 if (result == TRUE) {
2615 Py_INCREF(Py_True);
2616 return Py_True;
2617 } else {
2618 Py_INCREF(Py_False);
2619 return Py_False;
2620 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002621}
2622#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2623
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002624#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002626PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002627{
Victor Stinner26486ea2010-05-15 22:23:53 +00002628 const char *knp;
2629 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002630
Victor Stinner26486ea2010-05-15 22:23:53 +00002631 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002632
Victor Stinner26486ea2010-05-15 22:23:53 +00002633 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
Victor Stinner26486ea2010-05-15 22:23:53 +00002635 if (ch < 0) {
2636 PyErr_SetString(PyExc_ValueError, "invalid key number");
2637 return NULL;
2638 }
2639 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002640
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002641 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002642}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002643#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002644
Victor Stinner26486ea2010-05-15 22:23:53 +00002645static PyObject *
2646PyCurses_KillChar(PyObject *self)
2647{
2648 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002649
Victor Stinner26486ea2010-05-15 22:23:53 +00002650 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002651
Victor Stinner26486ea2010-05-15 22:23:53 +00002652 return PyBytes_FromStringAndSize(&ch, 1);
2653}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002654
2655static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002656PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002657{
Victor Stinner26486ea2010-05-15 22:23:53 +00002658 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002659
Victor Stinner26486ea2010-05-15 22:23:53 +00002660 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002661
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 switch(PyTuple_Size(args)) {
2663 case 1:
2664 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2665 break;
2666 default:
2667 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2668 return NULL;
2669 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002670
Victor Stinner26486ea2010-05-15 22:23:53 +00002671 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002672}
2673
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002674#ifdef NCURSES_MOUSE_VERSION
2675static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002676PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002677{
Victor Stinner26486ea2010-05-15 22:23:53 +00002678 int interval;
2679 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002680
Victor Stinner26486ea2010-05-15 22:23:53 +00002681 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2682 return NULL;
2683 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002684}
2685
2686static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002687PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002688{
Victor Stinner26486ea2010-05-15 22:23:53 +00002689 int newmask;
2690 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002691
Victor Stinner26486ea2010-05-15 22:23:53 +00002692 PyCursesInitialised;
2693 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2694 return NULL;
2695 availmask = mousemask(newmask, &oldmask);
2696 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002697}
2698#endif
2699
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002700static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002701PyCurses_Napms(PyObject *self, PyObject *args)
2702{
2703 int ms;
2704
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002705 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002706 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002707
2708 return Py_BuildValue("i", napms(ms));
2709}
2710
2711
2712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002713PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002714{
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 WINDOW *win;
2716 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +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 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002721
Victor Stinner26486ea2010-05-15 22:23:53 +00002722 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002723
Victor Stinner26486ea2010-05-15 22:23:53 +00002724 if (win == NULL) {
2725 PyErr_SetString(PyCursesError, catchall_NULL);
2726 return NULL;
2727 }
2728
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002729 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002730}
2731
2732static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002733PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002734{
Victor Stinner26486ea2010-05-15 22:23:53 +00002735 WINDOW *win;
2736 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002737
Victor Stinner26486ea2010-05-15 22:23:53 +00002738 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002739
Victor Stinner26486ea2010-05-15 22:23:53 +00002740 switch (PyTuple_Size(args)) {
2741 case 2:
2742 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2743 return NULL;
2744 break;
2745 case 4:
2746 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2747 &nlines,&ncols,&begin_y,&begin_x))
2748 return NULL;
2749 break;
2750 default:
2751 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2752 return NULL;
2753 }
Guido van Rossum85738471995-02-17 13:50:17 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 win = newwin(nlines,ncols,begin_y,begin_x);
2756 if (win == NULL) {
2757 PyErr_SetString(PyCursesError, catchall_NULL);
2758 return NULL;
2759 }
Guido van Rossum85738471995-02-17 13:50:17 +00002760
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002761 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002762}
2763
2764static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002765PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002766{
Victor Stinner26486ea2010-05-15 22:23:53 +00002767 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002768
Victor Stinner26486ea2010-05-15 22:23:53 +00002769 PyCursesInitialised;
2770 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002771
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 switch(PyTuple_Size(args)) {
2773 case 1:
2774 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2775 break;
2776 default:
2777 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2778 return NULL;
2779 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002780
Victor Stinner26486ea2010-05-15 22:23:53 +00002781 if (pair_content(pair, &f, &b)==ERR) {
2782 PyErr_SetString(PyCursesError,
2783 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2784 return NULL;
2785 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002786
Victor Stinner26486ea2010-05-15 22:23:53 +00002787 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002788}
2789
2790static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002791PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002792{
Victor Stinner26486ea2010-05-15 22:23:53 +00002793 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002794
Victor Stinner26486ea2010-05-15 22:23:53 +00002795 PyCursesInitialised;
2796 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002797
Victor Stinner26486ea2010-05-15 22:23:53 +00002798 switch(PyTuple_Size(args)) {
2799 case 1:
2800 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2801 break;
2802 default:
2803 PyErr_SetString(PyExc_TypeError,
2804 "pair_number requires 1 argument");
2805 return NULL;
2806 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002807
Victor Stinner26486ea2010-05-15 22:23:53 +00002808 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002809}
2810
2811static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002812PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002813{
Victor Stinner26486ea2010-05-15 22:23:53 +00002814 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002815
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002816 if (!PyArg_ParseTuple(args,"y;str", &str))
2817 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002818 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002819}
2820
2821static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002822PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002823{
Victor Stinner26486ea2010-05-15 22:23:53 +00002824 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002825
Victor Stinner26486ea2010-05-15 22:23:53 +00002826 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002827
Victor Stinner26486ea2010-05-15 22:23:53 +00002828 switch(PyTuple_Size(args)) {
2829 case 0:
2830 qiflush();
2831 Py_INCREF(Py_None);
2832 return Py_None;
2833 case 1:
2834 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2835 if (flag) qiflush();
2836 else noqiflush();
2837 Py_INCREF(Py_None);
2838 return Py_None;
2839 default:
2840 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2841 return NULL;
2842 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002843}
2844
Guido van Rossumd8faa362007-04-27 19:54:29 +00002845/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2846 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002847#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002848static int
2849update_lines_cols(void)
2850{
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 PyObject *o;
2852 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002853 _Py_IDENTIFIER(LINES);
2854 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002855
Victor Stinner26486ea2010-05-15 22:23:53 +00002856 if (!m)
2857 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002858
Victor Stinner26486ea2010-05-15 22:23:53 +00002859 o = PyLong_FromLong(LINES);
2860 if (!o) {
2861 Py_DECREF(m);
2862 return 0;
2863 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002864 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002865 Py_DECREF(m);
2866 Py_DECREF(o);
2867 return 0;
2868 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002869 /* PyId_LINES.object will be initialized here. */
2870 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 Py_DECREF(m);
2872 Py_DECREF(o);
2873 return 0;
2874 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002875 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002876 o = PyLong_FromLong(COLS);
2877 if (!o) {
2878 Py_DECREF(m);
2879 return 0;
2880 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002881 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002882 Py_DECREF(m);
2883 Py_DECREF(o);
2884 return 0;
2885 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002886 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002887 Py_DECREF(m);
2888 Py_DECREF(o);
2889 return 0;
2890 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002891 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002892 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002893 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002894}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002895
2896static PyObject *
2897PyCurses_update_lines_cols(PyObject *self)
2898{
2899 return PyLong_FromLong((long) update_lines_cols());
2900}
2901
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002902#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002903
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002904#ifdef HAVE_CURSES_RESIZETERM
2905static PyObject *
2906PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2907{
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 int lines;
2909 int columns;
2910 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002911
Victor Stinner26486ea2010-05-15 22:23:53 +00002912 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002913
Victor Stinner26486ea2010-05-15 22:23:53 +00002914 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2915 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002916
Victor Stinner26486ea2010-05-15 22:23:53 +00002917 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2918 if (!result)
2919 return NULL;
2920 if (!update_lines_cols())
2921 return NULL;
2922 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002923}
2924
2925#endif
2926
2927#ifdef HAVE_CURSES_RESIZE_TERM
2928static PyObject *
2929PyCurses_Resize_Term(PyObject *self, PyObject *args)
2930{
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 int lines;
2932 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002933
Victor Stinner26486ea2010-05-15 22:23:53 +00002934 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002935
Victor Stinner26486ea2010-05-15 22:23:53 +00002936 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002937
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2939 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002940
Victor Stinner26486ea2010-05-15 22:23:53 +00002941 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2942 if (!result)
2943 return NULL;
2944 if (!update_lines_cols())
2945 return NULL;
2946 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002947}
2948#endif /* HAVE_CURSES_RESIZE_TERM */
2949
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002950static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002951PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002952{
Victor Stinner26486ea2010-05-15 22:23:53 +00002953 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002954
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002956
Victor Stinner26486ea2010-05-15 22:23:53 +00002957 if (PyTuple_Size(args)!=2) {
2958 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2959 return NULL;
2960 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002961
Victor Stinner26486ea2010-05-15 22:23:53 +00002962 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002963
Victor Stinner26486ea2010-05-15 22:23:53 +00002964 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002965
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 Py_INCREF(Py_None);
2967 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002968}
2969
2970static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002971PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002972{
Victor Stinner26486ea2010-05-15 22:23:53 +00002973 int code;
2974 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002975
Victor Stinner26486ea2010-05-15 22:23:53 +00002976 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002977
Victor Stinner26486ea2010-05-15 22:23:53 +00002978 code = start_color();
2979 if (code != ERR) {
2980 initialisedcolors = TRUE;
2981 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002982 if (c == NULL)
2983 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002984 PyDict_SetItemString(ModDict, "COLORS", c);
2985 Py_DECREF(c);
2986 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002987 if (cp == NULL)
2988 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002989 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2990 Py_DECREF(cp);
2991 Py_INCREF(Py_None);
2992 return Py_None;
2993 } else {
2994 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2995 return NULL;
2996 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002997}
2998
2999static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003000PyCurses_tigetflag(PyObject *self, PyObject *args)
3001{
Victor Stinner26486ea2010-05-15 22:23:53 +00003002 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003003
Victor Stinner26486ea2010-05-15 22:23:53 +00003004 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003005
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 if (!PyArg_ParseTuple(args, "s", &capname))
3007 return NULL;
3008
3009 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003010}
3011
3012static PyObject *
3013PyCurses_tigetnum(PyObject *self, PyObject *args)
3014{
Victor Stinner26486ea2010-05-15 22:23:53 +00003015 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003016
Victor Stinner26486ea2010-05-15 22:23:53 +00003017 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003018
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 if (!PyArg_ParseTuple(args, "s", &capname))
3020 return NULL;
3021
3022 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003023}
3024
3025static PyObject *
3026PyCurses_tigetstr(PyObject *self, PyObject *args)
3027{
Victor Stinner26486ea2010-05-15 22:23:53 +00003028 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003029
Victor Stinner26486ea2010-05-15 22:23:53 +00003030 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003031
Victor Stinner26486ea2010-05-15 22:23:53 +00003032 if (!PyArg_ParseTuple(args, "s", &capname))
3033 return NULL;
3034
3035 capname = tigetstr( capname );
3036 if (capname == 0 || capname == (char*) -1) {
3037 Py_INCREF(Py_None);
3038 return Py_None;
3039 }
3040 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003041}
3042
3043static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003044PyCurses_tparm(PyObject *self, PyObject *args)
3045{
Victor Stinner26486ea2010-05-15 22:23:53 +00003046 char* fmt;
3047 char* result = NULL;
3048 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 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003051
Victor Stinner26621332011-11-02 23:45:29 +01003052 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003053 &fmt, &i1, &i2, &i3, &i4,
3054 &i5, &i6, &i7, &i8, &i9)) {
3055 return NULL;
3056 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003057
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3059 if (!result) {
3060 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3061 return NULL;
3062 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003063
Victor Stinner26486ea2010-05-15 22:23:53 +00003064 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003065}
3066
3067static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003068PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003069{
Victor Stinner26486ea2010-05-15 22:23:53 +00003070 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003071
Victor Stinner26486ea2010-05-15 22:23:53 +00003072 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003073
Victor Stinner26486ea2010-05-15 22:23:53 +00003074 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003077}
3078
3079static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003080PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003081{
Victor Stinner26486ea2010-05-15 22:23:53 +00003082 PyObject *temp;
3083 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003084
Victor Stinner26486ea2010-05-15 22:23:53 +00003085 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003086
Victor Stinner26486ea2010-05-15 22:23:53 +00003087 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003088
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003089 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003090 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003091
Victor Stinner26486ea2010-05-15 22:23:53 +00003092 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003093}
3094
3095static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003096PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003097{
Victor Stinner26486ea2010-05-15 22:23:53 +00003098 PyObject *temp;
3099 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003100
Victor Stinner26486ea2010-05-15 22:23:53 +00003101 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003102
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003103 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003104 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003105
3106 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3107 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003108
Victor Stinner26486ea2010-05-15 22:23:53 +00003109 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003110}
3111
Victor Stinner71e44cb2011-09-06 01:53:03 +02003112#ifdef HAVE_NCURSESW
3113/* Convert an object to a character (wchar_t):
3114
3115 - int
3116 - str of length 1
3117
3118 Return 1 on success, 0 on error. */
3119static int
3120PyCurses_ConvertToWchar_t(PyObject *obj,
3121 wchar_t *wch)
3122{
3123 if (PyUnicode_Check(obj)) {
3124 wchar_t buffer[2];
3125 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3126 PyErr_Format(PyExc_TypeError,
3127 "expect bytes or str of length 1, or int, "
3128 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003129 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003130 return 0;
3131 }
3132 *wch = buffer[0];
3133 return 2;
3134 }
3135 else if (PyLong_CheckExact(obj)) {
3136 long value;
3137 int overflow;
3138 value = PyLong_AsLongAndOverflow(obj, &overflow);
3139 if (overflow) {
3140 PyErr_SetString(PyExc_OverflowError,
3141 "int doesn't fit in long");
3142 return 0;
3143 }
3144 *wch = (wchar_t)value;
3145 if ((long)*wch != value) {
3146 PyErr_Format(PyExc_OverflowError,
3147 "character doesn't fit in wchar_t");
3148 return 0;
3149 }
3150 return 1;
3151 }
3152 else {
3153 PyErr_Format(PyExc_TypeError,
3154 "expect bytes or str of length 1, or int, got %s",
3155 Py_TYPE(obj)->tp_name);
3156 return 0;
3157 }
3158}
3159
3160static PyObject *
3161PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3162{
3163 PyObject *obj;
3164 wchar_t wch;
3165
3166 PyCursesInitialised;
3167
3168 if (!PyArg_ParseTuple(args,"O", &obj))
3169 return NULL;
3170
3171 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3172 return NULL;
3173 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3174}
3175#endif
3176
Guido van Rossumf6971e21994-08-30 12:25:20 +00003177static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003178PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003179{
Victor Stinner26486ea2010-05-15 22:23:53 +00003180 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003181
Victor Stinner26486ea2010-05-15 22:23:53 +00003182 switch(PyTuple_Size(args)) {
3183 case 1:
3184 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3185 return NULL;
3186 break;
3187 default:
3188 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3189 return NULL;
3190 }
3191 use_env(flag);
3192 Py_INCREF(Py_None);
3193 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003194}
3195
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003196#ifndef STRICT_SYSV_CURSES
3197static PyObject *
3198PyCurses_Use_Default_Colors(PyObject *self)
3199{
Victor Stinner26486ea2010-05-15 22:23:53 +00003200 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003201
Victor Stinner26486ea2010-05-15 22:23:53 +00003202 PyCursesInitialised;
3203 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003204
Victor Stinner26486ea2010-05-15 22:23:53 +00003205 code = use_default_colors();
3206 if (code != ERR) {
3207 Py_INCREF(Py_None);
3208 return Py_None;
3209 } else {
3210 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3211 return NULL;
3212 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003213}
3214#endif /* STRICT_SYSV_CURSES */
3215
Guido van Rossumf6971e21994-08-30 12:25:20 +00003216/* List of functions defined in the module */
3217
3218static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003219 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3220 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3221 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3222 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3223 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3224 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3225 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3226 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3227 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3228 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3229 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3230 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3231 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3232 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3233 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3234 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3235 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003236#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003237 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3238 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003239#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003240 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3241 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3242 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3243 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3244 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003245#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003247#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003248 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3249 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3250 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3251 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3252 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3253 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003254#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003255 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003256#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003257#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003258 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003259#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003260 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3261 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3262 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003263#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003264 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3265 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003266#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003267 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3268 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3269 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3270 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3271 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3272 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3273 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3274 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3275 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3276 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3277 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3278 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3279 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3280 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3281 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3282 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3283 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003284#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003285 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003286#endif
3287#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003288 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003289#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3291 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3292 {"setupterm", (PyCFunction)PyCurses_setupterm,
3293 METH_VARARGS|METH_KEYWORDS},
3294 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3295 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3296 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3297 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3298 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3299 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3300 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3301 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3302 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3303 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003304#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3305 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3306#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003307#ifdef HAVE_NCURSESW
3308 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3309#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003310 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003311#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003312 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003313#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003314 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003315};
3316
3317/* Initialization function for the module */
3318
Martin v. Löwis1a214512008-06-11 05:26:20 +00003319
3320static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003321 PyModuleDef_HEAD_INIT,
3322 "_curses",
3323 NULL,
3324 -1,
3325 PyCurses_methods,
3326 NULL,
3327 NULL,
3328 NULL,
3329 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003330};
3331
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003332PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003333PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003334{
Victor Stinner26486ea2010-05-15 22:23:53 +00003335 PyObject *m, *d, *v, *c_api_object;
3336 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003337
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 /* Initialize object type */
3339 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3340 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003341
Victor Stinner26486ea2010-05-15 22:23:53 +00003342 /* Initialize the C API pointer array */
3343 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3344 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3345 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3346 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003347
Victor Stinner26486ea2010-05-15 22:23:53 +00003348 /* Create the module and add the functions */
3349 m = PyModule_Create(&_cursesmodule);
3350 if (m == NULL)
3351 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003352
Victor Stinner26486ea2010-05-15 22:23:53 +00003353 /* Add some symbolic constants to the module */
3354 d = PyModule_GetDict(m);
3355 if (d == NULL)
3356 return NULL;
3357 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003358
Victor Stinner26486ea2010-05-15 22:23:53 +00003359 /* Add a capsule for the C API */
3360 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3361 PyDict_SetItemString(d, "_C_API", c_api_object);
3362 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003363
Victor Stinner26486ea2010-05-15 22:23:53 +00003364 /* For exception curses.error */
3365 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3366 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003367
Victor Stinner26486ea2010-05-15 22:23:53 +00003368 /* Make the version available */
3369 v = PyBytes_FromString(PyCursesVersion);
3370 PyDict_SetItemString(d, "version", v);
3371 PyDict_SetItemString(d, "__version__", v);
3372 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003373
Victor Stinner26486ea2010-05-15 22:23:53 +00003374 SetDictInt("ERR", ERR);
3375 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003376
Victor Stinner26486ea2010-05-15 22:23:53 +00003377 /* Here are some attributes you can add to chars to print */
3378
3379 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3380 SetDictInt("A_NORMAL", A_NORMAL);
3381 SetDictInt("A_STANDOUT", A_STANDOUT);
3382 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3383 SetDictInt("A_REVERSE", A_REVERSE);
3384 SetDictInt("A_BLINK", A_BLINK);
3385 SetDictInt("A_DIM", A_DIM);
3386 SetDictInt("A_BOLD", A_BOLD);
3387 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003388#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003389 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003390#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 SetDictInt("A_PROTECT", A_PROTECT);
3392 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3393 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003394
Victor Stinner26486ea2010-05-15 22:23:53 +00003395 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003396#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003397 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003398#endif
3399#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003400 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003401#endif
3402#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003403 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003404#endif
3405#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003406 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003407#endif
3408#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003409 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003410#endif
3411#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003412 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003413#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003414
Victor Stinner26486ea2010-05-15 22:23:53 +00003415 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3416 SetDictInt("COLOR_RED", COLOR_RED);
3417 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3418 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3419 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3420 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3421 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3422 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003423
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003424#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003425 /* Mouse-related constants */
3426 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3427 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3428 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3429 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3430 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003431
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3433 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3434 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3435 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3436 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003437
Victor Stinner26486ea2010-05-15 22:23:53 +00003438 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3439 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3440 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3441 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3442 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003443
Victor Stinner26486ea2010-05-15 22:23:53 +00003444 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3445 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3446 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3447 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3448 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003449
Victor Stinner26486ea2010-05-15 22:23:53 +00003450 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3451 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3452 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003453
Victor Stinner26486ea2010-05-15 22:23:53 +00003454 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3455 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003456#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003457 /* Now set everything up for KEY_ variables */
3458 {
3459 int key;
3460 char *key_n;
3461 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003462#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003463 for (key=KEY_MIN;key < KEY_MAX; key++) {
3464 key_n = (char *)keyname(key);
3465 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3466 continue;
3467 if (strncmp(key_n,"KEY_F(",6)==0) {
3468 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003469 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003470 if (!key_n2) {
3471 PyErr_NoMemory();
3472 break;
3473 }
3474 p1 = key_n;
3475 p2 = key_n2;
3476 while (*p1) {
3477 if (*p1 != '(' && *p1 != ')') {
3478 *p2 = *p1;
3479 p2++;
3480 }
3481 p1++;
3482 }
3483 *p2 = (char)0;
3484 } else
3485 key_n2 = key_n;
3486 SetDictInt(key_n2,key);
3487 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003488 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003489 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003490#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003491 SetDictInt("KEY_MIN", KEY_MIN);
3492 SetDictInt("KEY_MAX", KEY_MAX);
3493 }
3494 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003495}