blob: d64bdc74e916a5292749babddf3244ecb2d91c40 [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;
233 bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
234 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
283 , cchar_t *wch
284#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 }
301 memset(wch->chars, 0, sizeof(wch->chars));
302 wch->chars[0] = buffer[0];
303 return 2;
304#else
305 return PyCurses_ConvertToChtype(win, obj, ch);
306#endif
307 }
308 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
309 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100310 }
311 else if (PyLong_CheckExact(obj)) {
312 int overflow;
313 value = PyLong_AsLongAndOverflow(obj, &overflow);
314 if (overflow) {
315 PyErr_SetString(PyExc_OverflowError,
316 "int doesn't fit in long");
317 return 0;
318 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100319 }
320 else {
321 PyErr_Format(PyExc_TypeError,
322 "expect bytes or str of length 1, or int, got %s",
323 Py_TYPE(obj)->tp_name);
324 return 0;
325 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200326
327 *ch = (chtype)value;
328 if ((long)*ch != value) {
329 PyErr_Format(PyExc_OverflowError,
330 "byte doesn't fit in chtype");
331 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200333 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100334}
335
336/* Convert an object to a byte string (char*) or a wide character string
337 (wchar_t*). Return:
338
339 - 2 if obj is a character string (written into *wch)
340 - 1 if obj is a byte string (written into *bytes)
341 - 0 on error: raise an exception */
342static int
343PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
344 PyObject **bytes, wchar_t **wstr)
345{
346 if (PyUnicode_Check(obj)) {
347#ifdef HAVE_NCURSESW
348 assert (wstr != NULL);
349 *wstr = PyUnicode_AsWideCharString(obj, NULL);
350 if (*wstr == NULL)
351 return 0;
352 return 2;
353#else
354 assert (wstr == NULL);
355 *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
356 if (*bytes == NULL)
357 return 0;
358 return 1;
359#endif
360 }
361 else if (PyBytes_Check(obj)) {
362 Py_INCREF(obj);
363 *bytes = obj;
364 return 1;
365 }
366
367 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
368 Py_TYPE(obj)->tp_name);
369 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000370}
371
Benjamin Peterson21896a32010-03-21 22:03:03 +0000372/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000373 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000374
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000375static int func_PyCursesSetupTermCalled(void)
376{
377 PyCursesSetupTermCalled;
378 return 1;
379}
380
381static int func_PyCursesInitialised(void)
382{
383 PyCursesInitialised;
384 return 1;
385}
386
387static int func_PyCursesInitialisedColor(void)
388{
389 PyCursesInitialisedColor;
390 return 1;
391}
392
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000393/*****************************************************************************
394 The Window Object
395******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000396
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000397/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000398
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000399PyTypeObject PyCursesWindow_Type;
400
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000401/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000402
403 X - function name
404 TYPE - parameter Type
405 ERGSTR - format string for construction of the return value
406 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000407*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000408
Victor Stinner26486ea2010-05-15 22:23:53 +0000409#define Window_NoArgNoReturnFunction(X) \
410 static PyObject *PyCursesWindow_ ## X \
411 (PyCursesWindowObject *self, PyObject *args) \
412 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000413
Victor Stinner26486ea2010-05-15 22:23:53 +0000414#define Window_NoArgTrueFalseFunction(X) \
415 static PyObject * PyCursesWindow_ ## X \
416 (PyCursesWindowObject *self) \
417 { \
418 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
419 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000420
Victor Stinner26486ea2010-05-15 22:23:53 +0000421#define Window_NoArgNoReturnVoidFunction(X) \
422 static PyObject * PyCursesWindow_ ## X \
423 (PyCursesWindowObject *self) \
424 { \
425 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000426
Victor Stinner26486ea2010-05-15 22:23:53 +0000427#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
428 static PyObject * PyCursesWindow_ ## X \
429 (PyCursesWindowObject *self) \
430 { \
431 TYPE arg1, arg2; \
432 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000433
Victor Stinner26486ea2010-05-15 22:23:53 +0000434#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
435 static PyObject * PyCursesWindow_ ## X \
436 (PyCursesWindowObject *self, PyObject *args) \
437 { \
438 TYPE arg1; \
439 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
440 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_OneArgNoReturnFunction(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 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449
Victor Stinner26486ea2010-05-15 22:23:53 +0000450#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
451 static PyObject * PyCursesWindow_ ## X \
452 (PyCursesWindowObject *self, PyObject *args) \
453 { \
454 TYPE arg1, arg2; \
455 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
456 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Guido van Rossumf6971e21994-08-30 12:25:20 +0000458/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000459
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000460Window_NoArgNoReturnFunction(untouchwin)
461Window_NoArgNoReturnFunction(touchwin)
462Window_NoArgNoReturnFunction(redrawwin)
463Window_NoArgNoReturnFunction(winsertln)
464Window_NoArgNoReturnFunction(werase)
465Window_NoArgNoReturnFunction(wdeleteln)
466
467Window_NoArgTrueFalseFunction(is_wintouched)
468
469Window_NoArgNoReturnVoidFunction(wsyncup)
470Window_NoArgNoReturnVoidFunction(wsyncdown)
471Window_NoArgNoReturnVoidFunction(wstandend)
472Window_NoArgNoReturnVoidFunction(wstandout)
473Window_NoArgNoReturnVoidFunction(wcursyncup)
474Window_NoArgNoReturnVoidFunction(wclrtoeol)
475Window_NoArgNoReturnVoidFunction(wclrtobot)
476Window_NoArgNoReturnVoidFunction(wclear)
477
478Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
479Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000480Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000481
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000482Window_NoArg2TupleReturnFunction(getyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
484Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
485Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000486
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000487Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
488Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000489#if defined(__NetBSD__)
490Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
491#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000493#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000494Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000495#if defined(__NetBSD__)
496Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
497#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000499#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000500Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
501Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000502Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000503Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
504
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000505Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
506Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
507Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000508#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000509Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000510#endif
511
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000512/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000513
Guido van Rossumf6971e21994-08-30 12:25:20 +0000514static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100515PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000516{
Victor Stinner26486ea2010-05-15 22:23:53 +0000517 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000518
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100519 if (encoding == NULL) {
520#if defined(MS_WINDOWS)
521 char *buffer[100];
522 UINT cp;
523 cp = GetConsoleOutputCP();
524 if (cp != 0) {
525 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
526 encoding = buffer;
527 }
528#elif defined(CODESET)
529 const char *codeset = nl_langinfo(CODESET);
530 if (codeset != NULL && codeset[0] != 0)
531 encoding = codeset;
532#endif
533 if (encoding == NULL)
534 encoding = "utf-8";
535 }
536
Victor Stinner26486ea2010-05-15 22:23:53 +0000537 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
538 if (wo == NULL) return NULL;
539 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200540 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100541 if (wo->encoding == NULL) {
542 Py_DECREF(wo);
543 PyErr_NoMemory();
544 return NULL;
545 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000546 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000547}
548
549static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000550PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000551{
Victor Stinner26486ea2010-05-15 22:23:53 +0000552 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100553 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200554 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000555 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000556}
557
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000558/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000559
Larry Hastings61272b72014-01-07 12:41:53 -0800560/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700561
562curses.window.addch
563
564 [
Larry Hastings31826802013-10-19 00:09:25 -0700565 y: int
566 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700567 x: int
568 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700569 ]
570
571 ch: object
572 Character to add.
573
574 [
575 attr: long
576 Attributes for the character.
577 ]
578 /
579
580Paint character ch at (y, x) with attributes attr.
581
582Paint character ch at (y, x) with attributes attr,
583overwriting any character previously painted at that location.
584By default, the character position and attributes are the
585current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800586[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700587
Larry Hastings31826802013-10-19 00:09:25 -0700588static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400589curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y,
590 int x, PyObject *ch, int group_right_1, long attr)
591/*[clinic end generated code: output=99f7f85078ec06c3 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700592{
593 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
594 int coordinates_group = group_left_1;
595 int attr_group = group_right_1;
596 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100597 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700598 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100599#ifdef HAVE_NCURSESW
600 cchar_t wch;
601#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100602 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000603
Larry Hastings31826802013-10-19 00:09:25 -0700604 if (!attr_group)
605 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000606
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100607#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700608 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100609 if (type == 2) {
610 funcname = "add_wch";
611 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700612 if (coordinates_group)
613 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100614 else {
Larry Hastings31826802013-10-19 00:09:25 -0700615 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100616 }
617 }
618 else
619#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300620 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100621#endif
622 if (type == 1) {
623 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700624 if (coordinates_group)
625 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100626 else {
Larry Hastings31826802013-10-19 00:09:25 -0700627 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100628 }
629 }
630 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000631 return NULL;
632 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100633 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000634}
635
636static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000637PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000638{
Victor Stinner26486ea2010-05-15 22:23:53 +0000639 int rtn;
640 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100641 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500642 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100643#ifdef HAVE_NCURSESW
644 wchar_t *wstr = NULL;
645#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000646 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
647 long lattr;
648 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100649 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000650
Victor Stinner26486ea2010-05-15 22:23:53 +0000651 switch (PyTuple_Size(args)) {
652 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100653 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000654 return NULL;
655 break;
656 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100657 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000658 return NULL;
659 attr = lattr;
660 use_attr = TRUE;
661 break;
662 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100663 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000664 return NULL;
665 use_xy = TRUE;
666 break;
667 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100668 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000669 return NULL;
670 attr = lattr;
671 use_xy = use_attr = TRUE;
672 break;
673 default:
674 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
675 return NULL;
676 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100677#ifdef HAVE_NCURSESW
678 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
679#else
680 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
681#endif
682 if (strtype == 0)
683 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000684 if (use_attr == TRUE) {
685 attr_old = getattrs(self->win);
686 (void)wattrset(self->win,attr);
687 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100688#ifdef HAVE_NCURSESW
689 if (strtype == 2) {
690 funcname = "addwstr";
691 if (use_xy == TRUE)
692 rtn = mvwaddwstr(self->win,y,x,wstr);
693 else
694 rtn = waddwstr(self->win,wstr);
695 PyMem_Free(wstr);
696 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000697 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100698#endif
699 {
700 char *str = PyBytes_AS_STRING(bytesobj);
701 funcname = "addstr";
702 if (use_xy == TRUE)
703 rtn = mvwaddstr(self->win,y,x,str);
704 else
705 rtn = waddstr(self->win,str);
706 Py_DECREF(bytesobj);
707 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000708 if (use_attr == TRUE)
709 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100710 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000711}
Guido van Rossum85738471995-02-17 13:50:17 +0000712
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000713static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000714PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000715{
Victor Stinner26486ea2010-05-15 22:23:53 +0000716 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100717 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500718 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100719#ifdef HAVE_NCURSESW
720 wchar_t *wstr = NULL;
721#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000722 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
723 long lattr;
724 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000726
Victor Stinner26486ea2010-05-15 22:23:53 +0000727 switch (PyTuple_Size(args)) {
728 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100729 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000730 return NULL;
731 break;
732 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100733 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000734 return NULL;
735 attr = lattr;
736 use_attr = TRUE;
737 break;
738 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000740 return NULL;
741 use_xy = TRUE;
742 break;
743 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100744 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000745 return NULL;
746 attr = lattr;
747 use_xy = use_attr = TRUE;
748 break;
749 default:
750 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
751 return NULL;
752 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100753#ifdef HAVE_NCURSESW
754 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
755#else
756 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
757#endif
758 if (strtype == 0)
759 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000760
Victor Stinner26486ea2010-05-15 22:23:53 +0000761 if (use_attr == TRUE) {
762 attr_old = getattrs(self->win);
763 (void)wattrset(self->win,attr);
764 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100765#ifdef HAVE_NCURSESW
766 if (strtype == 2) {
767 funcname = "addnwstr";
768 if (use_xy == TRUE)
769 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
770 else
771 rtn = waddnwstr(self->win,wstr,n);
772 PyMem_Free(wstr);
773 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000774 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775#endif
776 {
777 char *str = PyBytes_AS_STRING(bytesobj);
778 funcname = "addnstr";
779 if (use_xy == TRUE)
780 rtn = mvwaddnstr(self->win,y,x,str,n);
781 else
782 rtn = waddnstr(self->win,str,n);
783 Py_DECREF(bytesobj);
784 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000785 if (use_attr == TRUE)
786 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100787 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000788}
789
790static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000791PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000792{
Victor Stinner26486ea2010-05-15 22:23:53 +0000793 PyObject *temp;
794 chtype bkgd;
795 attr_t attr = A_NORMAL;
796 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000797
Victor Stinner26486ea2010-05-15 22:23:53 +0000798 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000799 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000800 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
801 return NULL;
802 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000803 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000804 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
805 return NULL;
806 attr = lattr;
807 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000808 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000809 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
810 return NULL;
811 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000812
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100813 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000814 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000815
Victor Stinner26486ea2010-05-15 22:23:53 +0000816 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000817}
818
819static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000820PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
821{
Victor Stinner26486ea2010-05-15 22:23:53 +0000822 long lattr;
823 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
824 return NULL;
825 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000826}
827
828static PyObject *
829PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
830{
Victor Stinner26486ea2010-05-15 22:23:53 +0000831 long lattr;
832 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
833 return NULL;
834 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000835}
836
837static PyObject *
838PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
839{
Victor Stinner26486ea2010-05-15 22:23:53 +0000840 long lattr;
841 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
842 return NULL;
843 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000844}
845
846static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000847PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000848{
Victor Stinner26486ea2010-05-15 22:23:53 +0000849 PyObject *temp;
850 chtype bkgd;
851 attr_t attr = A_NORMAL;
852 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000853
Victor Stinner26486ea2010-05-15 22:23:53 +0000854 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000855 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000856 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
857 return NULL;
858 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
861 return NULL;
862 attr = lattr;
863 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000864 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000865 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
866 return NULL;
867 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000868
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100869 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000870 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000871
Victor Stinner26486ea2010-05-15 22:23:53 +0000872 wbkgdset(self->win, bkgd | attr);
873 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874}
875
876static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000877PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878{
Victor Stinner26486ea2010-05-15 22:23:53 +0000879 PyObject *temp[8];
880 chtype ch[8];
881 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000882
Victor Stinner26486ea2010-05-15 22:23:53 +0000883 /* Clear the array of parameters */
884 for(i=0; i<8; i++) {
885 temp[i] = NULL;
886 ch[i] = 0;
887 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000888
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
890 &temp[0], &temp[1], &temp[2], &temp[3],
891 &temp[4], &temp[5], &temp[6], &temp[7]))
892 return NULL;
893
894 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100895 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000896 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000897 }
898
899 wborder(self->win,
900 ch[0], ch[1], ch[2], ch[3],
901 ch[4], ch[5], ch[6], ch[7]);
902 Py_INCREF(Py_None);
903 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000904}
905
906static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000907PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000908{
Victor Stinner26486ea2010-05-15 22:23:53 +0000909 chtype ch1=0,ch2=0;
910 switch(PyTuple_Size(args)){
911 case 0: break;
912 default:
913 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
914 return NULL;
915 }
916 box(self->win,ch1,ch2);
917 Py_INCREF(Py_None);
918 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000919}
920
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000921#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
922#define py_mvwdelch mvwdelch
923#else
924int py_mvwdelch(WINDOW *w, int y, int x)
925{
Victor Stinner26486ea2010-05-15 22:23:53 +0000926 mvwdelch(w,y,x);
927 /* On HP/UX, mvwdelch already returns. On other systems,
928 we may well run into this return statement. */
929 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000930}
931#endif
932
Guido van Rossumd8faa362007-04-27 19:54:29 +0000933/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
934
935static PyObject *
936PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
937{
Victor Stinner26486ea2010-05-15 22:23:53 +0000938 int rtn;
939 int x, y;
940 int num = -1;
941 short color;
942 attr_t attr = A_NORMAL;
943 long lattr;
944 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000945
Victor Stinner26486ea2010-05-15 22:23:53 +0000946 switch (PyTuple_Size(args)) {
947 case 1:
948 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
949 return NULL;
950 attr = lattr;
951 break;
952 case 2:
953 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
954 return NULL;
955 attr = lattr;
956 break;
957 case 3:
958 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
959 return NULL;
960 attr = lattr;
961 use_xy = TRUE;
962 break;
963 case 4:
964 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
965 return NULL;
966 attr = lattr;
967 use_xy = TRUE;
968 break;
969 default:
970 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
971 return NULL;
972 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000973
Victor Stinner26486ea2010-05-15 22:23:53 +0000974 color = (short)((attr >> 8) & 0xff);
975 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000976
Victor Stinner26486ea2010-05-15 22:23:53 +0000977 if (use_xy == TRUE) {
978 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
979 touchline(self->win,y,1);
980 } else {
981 getyx(self->win,y,x);
982 rtn = wchgat(self->win,num,attr,color,NULL);
983 touchline(self->win,y,1);
984 }
985 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000986}
987
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000988
Guido van Rossumf6971e21994-08-30 12:25:20 +0000989static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000990PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000991{
Victor Stinner26486ea2010-05-15 22:23:53 +0000992 int rtn;
993 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000994
Victor Stinner26486ea2010-05-15 22:23:53 +0000995 switch (PyTuple_Size(args)) {
996 case 0:
997 rtn = wdelch(self->win);
998 break;
999 case 2:
1000 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1001 return NULL;
1002 rtn = py_mvwdelch(self->win,y,x);
1003 break;
1004 default:
1005 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1006 return NULL;
1007 }
1008 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001009}
1010
1011static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001012PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001013{
Victor Stinner26486ea2010-05-15 22:23:53 +00001014 WINDOW *win;
1015 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001016
Victor Stinner26486ea2010-05-15 22:23:53 +00001017 nlines = 0;
1018 ncols = 0;
1019 switch (PyTuple_Size(args)) {
1020 case 2:
1021 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1022 return NULL;
1023 break;
1024 case 4:
1025 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1026 &nlines,&ncols,&begin_y,&begin_x))
1027 return NULL;
1028 break;
1029 default:
1030 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1031 return NULL;
1032 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001033
Victor Stinner26486ea2010-05-15 22:23:53 +00001034 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001035
Victor Stinner26486ea2010-05-15 22:23:53 +00001036 if (win == NULL) {
1037 PyErr_SetString(PyCursesError, catchall_NULL);
1038 return NULL;
1039 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001040
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001041 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001042}
1043
1044static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001045PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001046{
Victor Stinner26486ea2010-05-15 22:23:53 +00001047 PyObject *temp;
1048 chtype ch;
1049 attr_t attr = A_NORMAL;
1050 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001051
Victor Stinner26486ea2010-05-15 22:23:53 +00001052 switch (PyTuple_Size(args)) {
1053 case 1:
1054 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1055 return NULL;
1056 break;
1057 case 2:
1058 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1059 return NULL;
1060 attr = lattr;
1061 break;
1062 default:
1063 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001064
1065
Victor Stinner26486ea2010-05-15 22:23:53 +00001066 return NULL;
1067 }
Guido van Rossum85738471995-02-17 13:50:17 +00001068
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001069 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001070 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001071
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001072#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001073 if (self->win->_flags & _ISPAD)
1074 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1075 "echochar");
1076 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001077#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001078 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1079 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001080}
1081
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001082#ifdef NCURSES_MOUSE_VERSION
1083static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001084PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001085{
Victor Stinner26486ea2010-05-15 22:23:53 +00001086 int x, y;
1087 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1088 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001089
Victor Stinner26486ea2010-05-15 22:23:53 +00001090 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001091}
1092#endif
1093
Guido van Rossumf6971e21994-08-30 12:25:20 +00001094static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001095PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001096{
Victor Stinner26486ea2010-05-15 22:23:53 +00001097 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001098}
1099
1100static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001101PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001102{
Victor Stinner26486ea2010-05-15 22:23:53 +00001103 int x, y;
1104 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001105
Victor Stinner26486ea2010-05-15 22:23:53 +00001106 switch (PyTuple_Size(args)) {
1107 case 0:
1108 Py_BEGIN_ALLOW_THREADS
1109 rtn = wgetch(self->win);
1110 Py_END_ALLOW_THREADS
1111 break;
1112 case 2:
1113 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1114 return NULL;
1115 Py_BEGIN_ALLOW_THREADS
1116 rtn = mvwgetch(self->win,y,x);
1117 Py_END_ALLOW_THREADS
1118 break;
1119 default:
1120 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1121 return NULL;
1122 }
1123 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001124}
Guido van Rossum85738471995-02-17 13:50:17 +00001125
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001126static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001127PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001128{
Victor Stinner26486ea2010-05-15 22:23:53 +00001129 int x, y;
1130 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001131
Victor Stinner26486ea2010-05-15 22:23:53 +00001132 switch (PyTuple_Size(args)) {
1133 case 0:
1134 Py_BEGIN_ALLOW_THREADS
1135 rtn = wgetch(self->win);
1136 Py_END_ALLOW_THREADS
1137 break;
1138 case 2:
1139 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1140 return NULL;
1141 Py_BEGIN_ALLOW_THREADS
1142 rtn = mvwgetch(self->win,y,x);
1143 Py_END_ALLOW_THREADS
1144 break;
1145 default:
1146 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1147 return NULL;
1148 }
1149 if (rtn == ERR) {
1150 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001151 PyErr_CheckSignals();
1152 if (!PyErr_Occurred())
1153 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001154 return NULL;
1155 } else if (rtn<=255) {
1156 return Py_BuildValue("C", rtn);
1157 } else {
1158 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001159#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001160 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001161#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001162 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001163#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001164 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1165 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001166}
1167
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001168#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001169static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001170PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1171{
1172 int x, y;
1173 int ct;
1174 wint_t rtn;
1175
1176 switch (PyTuple_Size(args)) {
1177 case 0:
1178 Py_BEGIN_ALLOW_THREADS
1179 ct = wget_wch(self->win,&rtn);
1180 Py_END_ALLOW_THREADS
1181 break;
1182 case 2:
1183 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1184 return NULL;
1185 Py_BEGIN_ALLOW_THREADS
1186 ct = mvwget_wch(self->win,y,x,&rtn);
1187 Py_END_ALLOW_THREADS
1188 break;
1189 default:
1190 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1191 return NULL;
1192 }
1193 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001194 if (PyErr_CheckSignals())
1195 return NULL;
1196
Victor Stinnera7878b72011-07-14 23:07:44 +02001197 /* get_wch() returns ERR in nodelay mode */
1198 PyErr_SetString(PyCursesError, "no input");
1199 return NULL;
1200 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001201 if (ct == KEY_CODE_YES)
1202 return PyLong_FromLong(rtn);
1203 else
1204 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001205}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001206#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001207
1208static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001209PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001210{
Victor Stinner26486ea2010-05-15 22:23:53 +00001211 int x, y, n;
1212 char rtn[1024]; /* This should be big enough.. I hope */
1213 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001214
Victor Stinner26486ea2010-05-15 22:23:53 +00001215 switch (PyTuple_Size(args)) {
1216 case 0:
1217 Py_BEGIN_ALLOW_THREADS
1218 rtn2 = wgetnstr(self->win,rtn, 1023);
1219 Py_END_ALLOW_THREADS
1220 break;
1221 case 1:
1222 if (!PyArg_ParseTuple(args,"i;n", &n))
1223 return NULL;
1224 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001225 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001226 Py_END_ALLOW_THREADS
1227 break;
1228 case 2:
1229 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1230 return NULL;
1231 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001232#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001233 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001234#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001235 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001236#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001237 Py_END_ALLOW_THREADS
1238 break;
1239 case 3:
1240 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1241 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001242#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001243 Py_BEGIN_ALLOW_THREADS
1244 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001245 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001246 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001247#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001248 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001249 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001250 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001251#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001252 break;
1253 default:
1254 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1255 return NULL;
1256 }
1257 if (rtn2 == ERR)
1258 rtn[0] = 0;
1259 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001260}
1261
1262static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001263PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001264{
Victor Stinner26486ea2010-05-15 22:23:53 +00001265 PyObject *temp;
1266 chtype ch;
1267 int n, x, y, code = OK;
1268 attr_t attr = A_NORMAL;
1269 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001270
Victor Stinner26486ea2010-05-15 22:23:53 +00001271 switch (PyTuple_Size(args)) {
1272 case 2:
1273 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1274 return NULL;
1275 break;
1276 case 3:
1277 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1278 return NULL;
1279 attr = lattr;
1280 break;
1281 case 4:
1282 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1283 return NULL;
1284 code = wmove(self->win, y, x);
1285 break;
1286 case 5:
1287 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1288 &y, &x, &temp, &n, &lattr))
1289 return NULL;
1290 attr = lattr;
1291 code = wmove(self->win, y, x);
1292 break;
1293 default:
1294 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1295 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001296 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001297
1298 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001299 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001301 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1302 } else
1303 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001304}
1305
1306static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001307PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001308{
Victor Stinner26486ea2010-05-15 22:23:53 +00001309 int rtn, x, y, use_xy = FALSE;
1310 PyObject *temp;
1311 chtype ch = 0;
1312 attr_t attr = A_NORMAL;
1313 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001314
Victor Stinner26486ea2010-05-15 22:23:53 +00001315 switch (PyTuple_Size(args)) {
1316 case 1:
1317 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1318 return NULL;
1319 break;
1320 case 2:
1321 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1322 return NULL;
1323 attr = lattr;
1324 break;
1325 case 3:
1326 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1327 return NULL;
1328 use_xy = TRUE;
1329 break;
1330 case 4:
1331 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1332 return NULL;
1333 attr = lattr;
1334 use_xy = TRUE;
1335 break;
1336 default:
1337 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1338 return NULL;
1339 }
1340
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001341 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001342 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001343
1344 if (use_xy == TRUE)
1345 rtn = mvwinsch(self->win,y,x, ch | attr);
1346 else {
1347 rtn = winsch(self->win, ch | attr);
1348 }
1349 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001350}
1351
1352static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001353PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001354{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001355 int x, y;
1356 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001357
Victor Stinner26486ea2010-05-15 22:23:53 +00001358 switch (PyTuple_Size(args)) {
1359 case 0:
1360 rtn = winch(self->win);
1361 break;
1362 case 2:
1363 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1364 return NULL;
1365 rtn = mvwinch(self->win,y,x);
1366 break;
1367 default:
1368 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1369 return NULL;
1370 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001371 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001372}
1373
1374static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001375PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001376{
Victor Stinner26486ea2010-05-15 22:23:53 +00001377 int x, y, n;
1378 char rtn[1024]; /* This should be big enough.. I hope */
1379 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001380
Victor Stinner26486ea2010-05-15 22:23:53 +00001381 switch (PyTuple_Size(args)) {
1382 case 0:
1383 rtn2 = winnstr(self->win,rtn, 1023);
1384 break;
1385 case 1:
1386 if (!PyArg_ParseTuple(args,"i;n", &n))
1387 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001388 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001389 break;
1390 case 2:
1391 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1392 return NULL;
1393 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1394 break;
1395 case 3:
1396 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1397 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001398 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001399 break;
1400 default:
1401 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1402 return NULL;
1403 }
1404 if (rtn2 == ERR)
1405 rtn[0] = 0;
1406 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001407}
1408
1409static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001410PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001411{
Victor Stinner26486ea2010-05-15 22:23:53 +00001412 int rtn;
1413 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001414 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001415 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001416#ifdef HAVE_NCURSESW
1417 wchar_t *wstr = NULL;
1418#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001419 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1420 long lattr;
1421 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001422 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001423
Victor Stinner26486ea2010-05-15 22:23:53 +00001424 switch (PyTuple_Size(args)) {
1425 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001426 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001427 return NULL;
1428 break;
1429 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001430 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001431 return NULL;
1432 attr = lattr;
1433 use_attr = TRUE;
1434 break;
1435 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001436 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001437 return NULL;
1438 use_xy = TRUE;
1439 break;
1440 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001441 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001442 return NULL;
1443 attr = lattr;
1444 use_xy = use_attr = TRUE;
1445 break;
1446 default:
1447 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1448 return NULL;
1449 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001450
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001451#ifdef HAVE_NCURSESW
1452 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1453#else
1454 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1455#endif
1456 if (strtype == 0)
1457 return NULL;
1458
Victor Stinner26486ea2010-05-15 22:23:53 +00001459 if (use_attr == TRUE) {
1460 attr_old = getattrs(self->win);
1461 (void)wattrset(self->win,attr);
1462 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001463#ifdef HAVE_NCURSESW
1464 if (strtype == 2) {
1465 funcname = "inswstr";
1466 if (use_xy == TRUE)
1467 rtn = mvwins_wstr(self->win,y,x,wstr);
1468 else
1469 rtn = wins_wstr(self->win,wstr);
1470 PyMem_Free(wstr);
1471 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001472 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001473#endif
1474 {
1475 char *str = PyBytes_AS_STRING(bytesobj);
1476 funcname = "insstr";
1477 if (use_xy == TRUE)
1478 rtn = mvwinsstr(self->win,y,x,str);
1479 else
1480 rtn = winsstr(self->win,str);
1481 Py_DECREF(bytesobj);
1482 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001483 if (use_attr == TRUE)
1484 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001485 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001486}
1487
1488static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001489PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001490{
Victor Stinner26486ea2010-05-15 22:23:53 +00001491 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001492 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001493 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001494#ifdef HAVE_NCURSESW
1495 wchar_t *wstr = NULL;
1496#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001497 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1498 long lattr;
1499 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001500 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001501
Victor Stinner26486ea2010-05-15 22:23:53 +00001502 switch (PyTuple_Size(args)) {
1503 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001504 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001505 return NULL;
1506 break;
1507 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001508 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001509 return NULL;
1510 attr = lattr;
1511 use_attr = TRUE;
1512 break;
1513 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001514 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001515 return NULL;
1516 use_xy = TRUE;
1517 break;
1518 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001519 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001520 return NULL;
1521 attr = lattr;
1522 use_xy = use_attr = TRUE;
1523 break;
1524 default:
1525 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1526 return NULL;
1527 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001528
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001529#ifdef HAVE_NCURSESW
1530 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1531#else
1532 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1533#endif
1534 if (strtype == 0)
1535 return NULL;
1536
Victor Stinner26486ea2010-05-15 22:23:53 +00001537 if (use_attr == TRUE) {
1538 attr_old = getattrs(self->win);
1539 (void)wattrset(self->win,attr);
1540 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001541#ifdef HAVE_NCURSESW
1542 if (strtype == 2) {
1543 funcname = "insn_wstr";
1544 if (use_xy == TRUE)
1545 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1546 else
1547 rtn = wins_nwstr(self->win,wstr,n);
1548 PyMem_Free(wstr);
1549 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001550 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001551#endif
1552 {
1553 char *str = PyBytes_AS_STRING(bytesobj);
1554 funcname = "insnstr";
1555 if (use_xy == TRUE)
1556 rtn = mvwinsnstr(self->win,y,x,str,n);
1557 else
1558 rtn = winsnstr(self->win,str,n);
1559 Py_DECREF(bytesobj);
1560 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001561 if (use_attr == TRUE)
1562 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001563 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001564}
1565
1566static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001567PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001568{
Victor Stinner26486ea2010-05-15 22:23:53 +00001569 int line, erg;
1570 if (!PyArg_ParseTuple(args,"i;line", &line))
1571 return NULL;
1572 erg = is_linetouched(self->win, line);
1573 if (erg == ERR) {
1574 PyErr_SetString(PyExc_TypeError,
1575 "is_linetouched: line number outside of boundaries");
1576 return NULL;
1577 } else
1578 if (erg == FALSE) {
1579 Py_INCREF(Py_False);
1580 return Py_False;
1581 } else {
1582 Py_INCREF(Py_True);
1583 return Py_True;
1584 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001585}
1586
1587static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001588PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001589{
Victor Stinner26486ea2010-05-15 22:23:53 +00001590 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1591 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001592
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001593#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001594 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001595#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001596 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001597#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001598 {
1599 switch(PyTuple_Size(args)) {
1600 case 6:
1601 if (!PyArg_ParseTuple(args,
1602 "iiiiii;" \
1603 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1604 &pminrow, &pmincol, &sminrow,
1605 &smincol, &smaxrow, &smaxcol))
1606 return NULL;
1607 Py_BEGIN_ALLOW_THREADS
1608 rtn = pnoutrefresh(self->win,
1609 pminrow, pmincol, sminrow,
1610 smincol, smaxrow, smaxcol);
1611 Py_END_ALLOW_THREADS
1612 return PyCursesCheckERR(rtn, "pnoutrefresh");
1613 default:
1614 PyErr_SetString(PyCursesError,
1615 "noutrefresh() called for a pad "
1616 "requires 6 arguments");
1617 return NULL;
1618 }
1619 } else {
1620 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1621 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001622
Victor Stinner26486ea2010-05-15 22:23:53 +00001623 Py_BEGIN_ALLOW_THREADS
1624 rtn = wnoutrefresh(self->win);
1625 Py_END_ALLOW_THREADS
1626 return PyCursesCheckERR(rtn, "wnoutrefresh");
1627 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001628}
1629
1630static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001631PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1632{
1633 PyCursesWindowObject *temp;
1634 int use_copywin = FALSE;
1635 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1636 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001637
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001638 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001639 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001640 if (!PyArg_ParseTuple(args, "O!;window object",
1641 &PyCursesWindow_Type, &temp))
1642 return NULL;
1643 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001644 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001645 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1646 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1647 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1648 return NULL;
1649 use_copywin = TRUE;
1650 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001651 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001652 PyErr_SetString(PyExc_TypeError,
1653 "overlay requires one or seven arguments");
1654 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001655 }
1656
1657 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001658 rtn = copywin(self->win, temp->win, sminrow, smincol,
1659 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1660 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001661 }
1662 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001663 rtn = overlay(self->win, temp->win);
1664 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001665 }
1666}
1667
1668static PyObject *
1669PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1670{
1671 PyCursesWindowObject *temp;
1672 int use_copywin = FALSE;
1673 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1674 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001675
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001676 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001677 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001678 if (!PyArg_ParseTuple(args, "O!;window object",
1679 &PyCursesWindow_Type, &temp))
1680 return NULL;
1681 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001682 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001683 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1684 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1685 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1686 return NULL;
1687 use_copywin = TRUE;
1688 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001689 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001690 PyErr_SetString(PyExc_TypeError,
1691 "overwrite requires one or seven arguments");
1692 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001693 }
1694
1695 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001696 rtn = copywin(self->win, temp->win, sminrow, smincol,
1697 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001698 return PyCursesCheckERR(rtn, "copywin");
1699 }
1700 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001701 rtn = overwrite(self->win, temp->win);
1702 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001703 }
1704}
1705
1706static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001707PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001708{
Victor Stinner26486ea2010-05-15 22:23:53 +00001709 /* We have to simulate this by writing to a temporary FILE*,
1710 then reading back, then writing to the argument stream. */
1711 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001712 int fd = -1;
1713 FILE *fp = NULL;
1714 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001715
Victor Stinner26486ea2010-05-15 22:23:53 +00001716 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1717 fd = mkstemp(fn);
1718 if (fd < 0)
1719 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001720 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1721 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001722 fp = fdopen(fd, "wb+");
1723 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001724 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1725 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001726 }
1727 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001728 if (res == NULL)
1729 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001730 fseek(fp, 0, 0);
1731 while (1) {
1732 char buf[BUFSIZ];
1733 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001734 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001735
Victor Stinner26486ea2010-05-15 22:23:53 +00001736 if (n <= 0)
1737 break;
1738 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001739 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001740 if (res == NULL)
1741 break;
1742 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001743
1744exit:
1745 if (fp != NULL)
1746 fclose(fp);
1747 else if (fd != -1)
1748 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001749 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001750 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001751}
1752
1753static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001754PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001755{
Victor Stinner26486ea2010-05-15 22:23:53 +00001756 int beg, num;
1757 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1758 return NULL;
1759 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001760}
1761
1762static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001763PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001764{
Victor Stinner26486ea2010-05-15 22:23:53 +00001765 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1766 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001767
Victor Stinner26486ea2010-05-15 22:23:53 +00001768#ifndef WINDOW_HAS_FLAGS
1769 if (0)
1770#else
1771 if (self->win->_flags & _ISPAD)
1772#endif
1773 {
1774 switch(PyTuple_Size(args)) {
1775 case 6:
1776 if (!PyArg_ParseTuple(args,
1777 "iiiiii;" \
1778 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1779 &pminrow, &pmincol, &sminrow,
1780 &smincol, &smaxrow, &smaxcol))
1781 return NULL;
1782
1783 Py_BEGIN_ALLOW_THREADS
1784 rtn = prefresh(self->win,
1785 pminrow, pmincol, sminrow,
1786 smincol, smaxrow, smaxcol);
1787 Py_END_ALLOW_THREADS
1788 return PyCursesCheckERR(rtn, "prefresh");
1789 default:
1790 PyErr_SetString(PyCursesError,
1791 "refresh() for a pad requires 6 arguments");
1792 return NULL;
1793 }
1794 } else {
1795 if (!PyArg_ParseTuple(args, ":refresh"))
1796 return NULL;
1797 Py_BEGIN_ALLOW_THREADS
1798 rtn = wrefresh(self->win);
1799 Py_END_ALLOW_THREADS
1800 return PyCursesCheckERR(rtn, "prefresh");
1801 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001802}
1803
1804static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001805PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001806{
Victor Stinner26486ea2010-05-15 22:23:53 +00001807 int x, y;
1808 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1809 return NULL;
1810 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001811}
1812
1813static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001814PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001815{
Victor Stinner26486ea2010-05-15 22:23:53 +00001816 WINDOW *win;
1817 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818
Victor Stinner26486ea2010-05-15 22:23:53 +00001819 nlines = 0;
1820 ncols = 0;
1821 switch (PyTuple_Size(args)) {
1822 case 2:
1823 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1824 return NULL;
1825 break;
1826 case 4:
1827 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1828 &nlines,&ncols,&begin_y,&begin_x))
1829 return NULL;
1830 break;
1831 default:
1832 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1833 return NULL;
1834 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001835
Victor Stinner26486ea2010-05-15 22:23:53 +00001836 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001837#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001838 if (self->win->_flags & _ISPAD)
1839 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1840 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001841#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001842 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001843
Victor Stinner26486ea2010-05-15 22:23:53 +00001844 if (win == NULL) {
1845 PyErr_SetString(PyCursesError, catchall_NULL);
1846 return NULL;
1847 }
1848
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001849 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001850}
1851
1852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001853PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001854{
Victor Stinner26486ea2010-05-15 22:23:53 +00001855 int nlines;
1856 switch(PyTuple_Size(args)) {
1857 case 0:
1858 return PyCursesCheckERR(scroll(self->win), "scroll");
1859 case 1:
1860 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1861 return NULL;
1862 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1863 default:
1864 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1865 return NULL;
1866 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001867}
1868
1869static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001870PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001871{
Victor Stinner26486ea2010-05-15 22:23:53 +00001872 int st, cnt, val;
1873 switch (PyTuple_Size(args)) {
1874 case 2:
1875 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1876 return NULL;
1877 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1878 case 3:
1879 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1880 return NULL;
1881 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1882 default:
1883 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1884 return NULL;
1885 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001886}
1887
1888static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001889PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001890{
Victor Stinner26486ea2010-05-15 22:23:53 +00001891 PyObject *temp;
1892 chtype ch;
1893 int n, x, y, code = OK;
1894 attr_t attr = A_NORMAL;
1895 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896
Victor Stinner26486ea2010-05-15 22:23:53 +00001897 switch (PyTuple_Size(args)) {
1898 case 2:
1899 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1900 return NULL;
1901 break;
1902 case 3:
1903 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1904 return NULL;
1905 attr = lattr;
1906 break;
1907 case 4:
1908 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1909 return NULL;
1910 code = wmove(self->win, y, x);
1911 break;
1912 case 5:
1913 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1914 &y, &x, &temp, &n, &lattr))
1915 return NULL;
1916 attr = lattr;
1917 code = wmove(self->win, y, x);
1918 break;
1919 default:
1920 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1921 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001922 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001923
1924 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001925 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001926 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001927 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1928 } else
1929 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001930}
1931
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001932static PyObject *
1933PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1934{
1935 return PyUnicode_FromString(self->encoding);
1936}
1937
1938static int
1939PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1940{
1941 PyObject *ascii;
1942 char *encoding;
1943
1944 /* It is illegal to del win.encoding */
1945 if (value == NULL) {
1946 PyErr_SetString(PyExc_TypeError,
1947 "encoding may not be deleted");
1948 return -1;
1949 }
1950
1951 if (!PyUnicode_Check(value)) {
1952 PyErr_SetString(PyExc_TypeError,
1953 "setting encoding to a non-string");
1954 return -1;
1955 }
1956 ascii = PyUnicode_AsASCIIString(value);
1957 if (ascii == NULL)
1958 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001959 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001960 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001961 if (encoding == NULL) {
1962 PyErr_NoMemory();
1963 return -1;
1964 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001965 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001966 self->encoding = encoding;
1967 return 0;
1968}
1969
1970
Guido van Rossumf6971e21994-08-30 12:25:20 +00001971static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001972 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001973 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1974 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1975 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1976 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1977 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1978 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1979 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1980 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1981 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1982 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1983 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1984 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1985 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1986 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1987 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1988 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1989 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1990 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1991 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001992#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00001993 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001994#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001995 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1996 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1997 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1998 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1999 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002000#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002001 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002002#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002003 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2004 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2005 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2006 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2007 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2008 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2009 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2010 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2011 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2012 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2013 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2014 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2015 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2016 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2017 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2018 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2019 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2020 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2021 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2022 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2023 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2024 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2025 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2026 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2027 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002028 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2029 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2030 METH_VARARGS},
2031 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2032 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2033 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2034 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002035#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002036 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002037#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002038 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2039 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2040 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2041 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2042 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2043 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2044 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2045 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2046 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2047 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2048 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2049 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2050 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2051 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2052 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2053 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002054};
2055
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002056static PyGetSetDef PyCursesWindow_getsets[] = {
2057 {"encoding",
2058 (getter)PyCursesWindow_get_encoding,
2059 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002060 "the typecode character used to create the array"},
2061 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002062};
2063
Guido van Rossumf6971e21994-08-30 12:25:20 +00002064/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002065
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002066PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002067 PyVarObject_HEAD_INIT(NULL, 0)
2068 "_curses.curses window", /*tp_name*/
2069 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2070 0, /*tp_itemsize*/
2071 /* methods */
2072 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2073 0, /*tp_print*/
2074 (getattrfunc)0, /*tp_getattr*/
2075 (setattrfunc)0, /*tp_setattr*/
2076 0, /*tp_reserved*/
2077 0, /*tp_repr*/
2078 0, /*tp_as_number*/
2079 0, /*tp_as_sequence*/
2080 0, /*tp_as_mapping*/
2081 0, /*tp_hash*/
2082 0, /*tp_call*/
2083 0, /*tp_str*/
2084 0, /*tp_getattro*/
2085 0, /*tp_setattro*/
2086 0, /*tp_as_buffer*/
2087 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2088 0, /*tp_doc*/
2089 0, /*tp_traverse*/
2090 0, /*tp_clear*/
2091 0, /*tp_richcompare*/
2092 0, /*tp_weaklistoffset*/
2093 0, /*tp_iter*/
2094 0, /*tp_iternext*/
2095 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002096 0, /* tp_members */
2097 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002098};
2099
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002100/*********************************************************************
2101 Global Functions
2102**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002103
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002104NoArgNoReturnFunction(beep)
2105NoArgNoReturnFunction(def_prog_mode)
2106NoArgNoReturnFunction(def_shell_mode)
2107NoArgNoReturnFunction(doupdate)
2108NoArgNoReturnFunction(endwin)
2109NoArgNoReturnFunction(flash)
2110NoArgNoReturnFunction(nocbreak)
2111NoArgNoReturnFunction(noecho)
2112NoArgNoReturnFunction(nonl)
2113NoArgNoReturnFunction(noraw)
2114NoArgNoReturnFunction(reset_prog_mode)
2115NoArgNoReturnFunction(reset_shell_mode)
2116NoArgNoReturnFunction(resetty)
2117NoArgNoReturnFunction(savetty)
2118
2119NoArgOrFlagNoReturnFunction(cbreak)
2120NoArgOrFlagNoReturnFunction(echo)
2121NoArgOrFlagNoReturnFunction(nl)
2122NoArgOrFlagNoReturnFunction(raw)
2123
2124NoArgReturnIntFunction(baudrate)
2125NoArgReturnIntFunction(termattrs)
2126
2127NoArgReturnStringFunction(termname)
2128NoArgReturnStringFunction(longname)
2129
2130NoArgTrueFalseFunction(can_change_color)
2131NoArgTrueFalseFunction(has_colors)
2132NoArgTrueFalseFunction(has_ic)
2133NoArgTrueFalseFunction(has_il)
2134NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002135NoArgNoReturnVoidFunction(flushinp)
2136NoArgNoReturnVoidFunction(noqiflush)
2137
2138static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002139PyCurses_filter(PyObject *self)
2140{
Victor Stinner26486ea2010-05-15 22:23:53 +00002141 /* not checking for PyCursesInitialised here since filter() must
2142 be called before initscr() */
2143 filter();
2144 Py_INCREF(Py_None);
2145 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002146}
2147
2148static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002149PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002150{
Victor Stinner26486ea2010-05-15 22:23:53 +00002151 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002152
Victor Stinner26486ea2010-05-15 22:23:53 +00002153 PyCursesInitialised;
2154 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002155
Victor Stinner26486ea2010-05-15 22:23:53 +00002156 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002157
Victor Stinner26486ea2010-05-15 22:23:53 +00002158 if (color_content(color, &r, &g, &b) != ERR)
2159 return Py_BuildValue("(iii)", r, g, b);
2160 else {
2161 PyErr_SetString(PyCursesError,
2162 "Argument 1 was out of range. Check value of COLORS.");
2163 return NULL;
2164 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002165}
2166
2167static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002168PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002169{
Victor Stinner26486ea2010-05-15 22:23:53 +00002170 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002171
Victor Stinner26486ea2010-05-15 22:23:53 +00002172 PyCursesInitialised;
2173 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002174
Victor Stinner26486ea2010-05-15 22:23:53 +00002175 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2176 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002177}
2178
2179static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002180PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002181{
Victor Stinner26486ea2010-05-15 22:23:53 +00002182 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183
Victor Stinner26486ea2010-05-15 22:23:53 +00002184 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185
Victor Stinner26486ea2010-05-15 22:23:53 +00002186 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002187
Victor Stinner26486ea2010-05-15 22:23:53 +00002188 erg = curs_set(vis);
2189 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002190
Victor Stinner26486ea2010-05-15 22:23:53 +00002191 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002192}
2193
2194static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002195PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002196{
Victor Stinner26486ea2010-05-15 22:23:53 +00002197 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198
Victor Stinner26486ea2010-05-15 22:23:53 +00002199 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002200
Victor Stinner26486ea2010-05-15 22:23:53 +00002201 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002202
Victor Stinner26486ea2010-05-15 22:23:53 +00002203 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002204}
2205
2206static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002207PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002208{
Victor Stinner26486ea2010-05-15 22:23:53 +00002209 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002210
Victor Stinner26486ea2010-05-15 22:23:53 +00002211 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002212
Victor Stinner26486ea2010-05-15 22:23:53 +00002213 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214
Victor Stinner26486ea2010-05-15 22:23:53 +00002215 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216}
2217
2218static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002219PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002220{
Victor Stinner26486ea2010-05-15 22:23:53 +00002221 int x = 0;
2222 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223
Victor Stinner26486ea2010-05-15 22:23:53 +00002224 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225
Victor Stinner26486ea2010-05-15 22:23:53 +00002226 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002227
Victor Stinner26486ea2010-05-15 22:23:53 +00002228 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229}
2230
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002231#ifdef NCURSES_MOUSE_VERSION
2232static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002233PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002234{
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 int rtn;
2236 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002237
Victor Stinner26486ea2010-05-15 22:23:53 +00002238 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002239
Victor Stinner26486ea2010-05-15 22:23:53 +00002240 rtn = getmouse( &event );
2241 if (rtn == ERR) {
2242 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2243 return NULL;
2244 }
2245 return Py_BuildValue("(hiiil)",
2246 (short)event.id,
2247 event.x, event.y, event.z,
2248 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002249}
2250
2251static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002252PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002253{
Victor Stinner26486ea2010-05-15 22:23:53 +00002254 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002255
Victor Stinner26486ea2010-05-15 22:23:53 +00002256 PyCursesInitialised;
2257 if (!PyArg_ParseTuple(args, "hiiil",
2258 &event.id,
2259 &event.x, &event.y, &event.z,
2260 (int *) &event.bstate))
2261 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002262
Victor Stinner26486ea2010-05-15 22:23:53 +00002263 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002264}
2265#endif
2266
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002267static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002268PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002269{
Victor Stinner26486ea2010-05-15 22:23:53 +00002270 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002271 int fd = -1;
2272 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002273 PyObject *data;
2274 size_t datalen;
2275 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002276 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002277 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002278
Victor Stinner26486ea2010-05-15 22:23:53 +00002279 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002280
Victor Stinner26486ea2010-05-15 22:23:53 +00002281 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2282 fd = mkstemp(fn);
2283 if (fd < 0)
2284 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002285 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2286 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 fp = fdopen(fd, "wb+");
2288 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002289 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2290 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002291 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002292
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002293 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002294 if (data == NULL)
2295 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002296 if (!PyBytes_Check(data)) {
2297 PyErr_Format(PyExc_TypeError,
2298 "f.read() returned %.100s instead of bytes",
2299 data->ob_type->tp_name);
2300 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002301 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002302 }
2303 datalen = PyBytes_GET_SIZE(data);
2304 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2305 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002306 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2307 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002308 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002309 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002310
Victor Stinner26486ea2010-05-15 22:23:53 +00002311 fseek(fp, 0, 0);
2312 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 if (win == NULL) {
2314 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002315 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002316 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002317 res = PyCursesWindow_New(win, NULL);
2318
2319error:
2320 if (fp != NULL)
2321 fclose(fp);
2322 else if (fd != -1)
2323 close(fd);
2324 remove(fn);
2325 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002326}
2327
2328static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002329PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002330{
Victor Stinner26486ea2010-05-15 22:23:53 +00002331 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002332
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002334
Victor Stinner26486ea2010-05-15 22:23:53 +00002335 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002336
Victor Stinner26486ea2010-05-15 22:23:53 +00002337 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002338}
2339
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002340#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002341/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002342static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343{
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002345
Victor Stinner26486ea2010-05-15 22:23:53 +00002346 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002347
Victor Stinner26486ea2010-05-15 22:23:53 +00002348 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002349
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 if (has_key(ch) == FALSE) {
2351 Py_INCREF(Py_False);
2352 return Py_False;
2353 }
2354 Py_INCREF(Py_True);
2355 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002356}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002357#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002358
2359static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002360PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002361{
Victor Stinner26486ea2010-05-15 22:23:53 +00002362 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002363
Victor Stinner26486ea2010-05-15 22:23:53 +00002364 PyCursesInitialised;
2365 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002366
Victor Stinner26486ea2010-05-15 22:23:53 +00002367 switch(PyTuple_Size(args)) {
2368 case 4:
2369 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2370 break;
2371 default:
2372 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2373 return NULL;
2374 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002375
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002377}
2378
2379static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002380PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002381{
Victor Stinner26486ea2010-05-15 22:23:53 +00002382 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383
Victor Stinner26486ea2010-05-15 22:23:53 +00002384 PyCursesInitialised;
2385 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002386
Victor Stinner26486ea2010-05-15 22:23:53 +00002387 if (PyTuple_Size(args) != 3) {
2388 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2389 return NULL;
2390 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002391
Victor Stinner26486ea2010-05-15 22:23:53 +00002392 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393
Victor Stinner26486ea2010-05-15 22:23:53 +00002394 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395}
2396
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002397static PyObject *ModDict;
2398
Victor Stinner26486ea2010-05-15 22:23:53 +00002399static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002400PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002401{
Victor Stinner26486ea2010-05-15 22:23:53 +00002402 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002403 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002404
Victor Stinner26486ea2010-05-15 22:23:53 +00002405 if (initialised == TRUE) {
2406 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002407 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002409
Victor Stinner26486ea2010-05-15 22:23:53 +00002410 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002411
Victor Stinner26486ea2010-05-15 22:23:53 +00002412 if (win == NULL) {
2413 PyErr_SetString(PyCursesError, catchall_NULL);
2414 return NULL;
2415 }
Guido van Rossum85738471995-02-17 13:50:17 +00002416
Victor Stinner26486ea2010-05-15 22:23:53 +00002417 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002418
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002419/* This was moved from initcurses() because it core dumped on SGI,
2420 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002421#define SetDictInt(string,ch) \
2422 do { \
2423 PyObject *o = PyLong_FromLong((long) (ch)); \
2424 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2425 Py_DECREF(o); \
2426 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002427 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002428
Victor Stinner26486ea2010-05-15 22:23:53 +00002429 /* Here are some graphic symbols you can use */
2430 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2431 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2432 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2433 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2434 SetDictInt("ACS_LTEE", (ACS_LTEE));
2435 SetDictInt("ACS_RTEE", (ACS_RTEE));
2436 SetDictInt("ACS_BTEE", (ACS_BTEE));
2437 SetDictInt("ACS_TTEE", (ACS_TTEE));
2438 SetDictInt("ACS_HLINE", (ACS_HLINE));
2439 SetDictInt("ACS_VLINE", (ACS_VLINE));
2440 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002441#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002442 /* On HP/UX 11, these are of type cchar_t, which is not an
2443 integral type. If this is a problem on more platforms, a
2444 configure test should be added to determine whether ACS_S1
2445 is of integral type. */
2446 SetDictInt("ACS_S1", (ACS_S1));
2447 SetDictInt("ACS_S9", (ACS_S9));
2448 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2449 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2450 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2451 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2452 SetDictInt("ACS_BULLET", (ACS_BULLET));
2453 SetDictInt("ACS_LARROW", (ACS_LARROW));
2454 SetDictInt("ACS_RARROW", (ACS_RARROW));
2455 SetDictInt("ACS_DARROW", (ACS_DARROW));
2456 SetDictInt("ACS_UARROW", (ACS_UARROW));
2457 SetDictInt("ACS_BOARD", (ACS_BOARD));
2458 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2459 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002460#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002461 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2462 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2463 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2464 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2465 SetDictInt("ACS_SBSS", (ACS_RTEE));
2466 SetDictInt("ACS_SSSB", (ACS_LTEE));
2467 SetDictInt("ACS_SSBS", (ACS_BTEE));
2468 SetDictInt("ACS_BSSS", (ACS_TTEE));
2469 SetDictInt("ACS_BSBS", (ACS_HLINE));
2470 SetDictInt("ACS_SBSB", (ACS_VLINE));
2471 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002472
Victor Stinner26486ea2010-05-15 22:23:53 +00002473 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002474#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002475 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002476#endif
2477#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002478 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002479#endif
2480#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002482#endif
2483#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002484 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002485#endif
2486#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002488#endif
2489#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002490 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002491#endif
2492#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002494#endif
2495
Victor Stinner26486ea2010-05-15 22:23:53 +00002496 SetDictInt("LINES", LINES);
2497 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002498
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002499 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2500 screen_encoding = winobj->encoding;
2501 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002502}
2503
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002504static PyObject *
2505PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2506{
Victor Stinner26486ea2010-05-15 22:23:53 +00002507 int fd = -1;
2508 int err;
2509 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002510
Victor Stinner26486ea2010-05-15 22:23:53 +00002511 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002512
Victor Stinner26486ea2010-05-15 22:23:53 +00002513 if (!PyArg_ParseTupleAndKeywords(
2514 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2515 return NULL;
2516 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002517
Victor Stinner26486ea2010-05-15 22:23:53 +00002518 if (fd == -1) {
2519 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002520
Victor Stinnerbd303c12013-11-07 23:07:29 +01002521 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002522
Victor Stinner26486ea2010-05-15 22:23:53 +00002523 if (sys_stdout == NULL || sys_stdout == Py_None) {
2524 PyErr_SetString(
2525 PyCursesError,
2526 "lost sys.stdout");
2527 return NULL;
2528 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002529
Victor Stinner26486ea2010-05-15 22:23:53 +00002530 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002531
Victor Stinner26486ea2010-05-15 22:23:53 +00002532 if (fd == -1) {
2533 return NULL;
2534 }
2535 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002536
Matthias Klose635edd12010-07-30 21:40:57 +00002537 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002539
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 if (err == 0) {
2541 s = "setupterm: could not find terminal";
2542 } else if (err == -1) {
2543 s = "setupterm: could not find terminfo database";
2544 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002545
Victor Stinner26486ea2010-05-15 22:23:53 +00002546 PyErr_SetString(PyCursesError,s);
2547 return NULL;
2548 }
2549
2550 initialised_setupterm = TRUE;
2551
2552 Py_INCREF(Py_None);
2553 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002554}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002555
2556static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002557PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002558{
Victor Stinner26486ea2010-05-15 22:23:53 +00002559 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002560
Victor Stinner26486ea2010-05-15 22:23:53 +00002561 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002562
Victor Stinner26486ea2010-05-15 22:23:53 +00002563 switch(PyTuple_Size(args)) {
2564 case 1:
2565 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2566 break;
2567 default:
2568 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2569 return NULL;
2570 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002571
Victor Stinner26486ea2010-05-15 22:23:53 +00002572 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002573}
2574
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002575#ifdef HAVE_CURSES_IS_TERM_RESIZED
2576static PyObject *
2577PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2578{
Victor Stinner26486ea2010-05-15 22:23:53 +00002579 int lines;
2580 int columns;
2581 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002582
Victor Stinner26486ea2010-05-15 22:23:53 +00002583 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002584
Victor Stinner26486ea2010-05-15 22:23:53 +00002585 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2586 return NULL;
2587 result = is_term_resized(lines, columns);
2588 if (result == TRUE) {
2589 Py_INCREF(Py_True);
2590 return Py_True;
2591 } else {
2592 Py_INCREF(Py_False);
2593 return Py_False;
2594 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002595}
2596#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2597
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002598#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002599static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002600PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002601{
Victor Stinner26486ea2010-05-15 22:23:53 +00002602 const char *knp;
2603 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002604
Victor Stinner26486ea2010-05-15 22:23:53 +00002605 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002606
Victor Stinner26486ea2010-05-15 22:23:53 +00002607 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 if (ch < 0) {
2610 PyErr_SetString(PyExc_ValueError, "invalid key number");
2611 return NULL;
2612 }
2613 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002614
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002615 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002616}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002617#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002618
Victor Stinner26486ea2010-05-15 22:23:53 +00002619static PyObject *
2620PyCurses_KillChar(PyObject *self)
2621{
2622 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002623
Victor Stinner26486ea2010-05-15 22:23:53 +00002624 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625
Victor Stinner26486ea2010-05-15 22:23:53 +00002626 return PyBytes_FromStringAndSize(&ch, 1);
2627}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002628
2629static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002630PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631{
Victor Stinner26486ea2010-05-15 22:23:53 +00002632 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002633
Victor Stinner26486ea2010-05-15 22:23:53 +00002634 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002635
Victor Stinner26486ea2010-05-15 22:23:53 +00002636 switch(PyTuple_Size(args)) {
2637 case 1:
2638 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2639 break;
2640 default:
2641 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2642 return NULL;
2643 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002644
Victor Stinner26486ea2010-05-15 22:23:53 +00002645 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002646}
2647
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002648#ifdef NCURSES_MOUSE_VERSION
2649static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002650PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002651{
Victor Stinner26486ea2010-05-15 22:23:53 +00002652 int interval;
2653 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002654
Victor Stinner26486ea2010-05-15 22:23:53 +00002655 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2656 return NULL;
2657 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002658}
2659
2660static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002661PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002662{
Victor Stinner26486ea2010-05-15 22:23:53 +00002663 int newmask;
2664 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002665
Victor Stinner26486ea2010-05-15 22:23:53 +00002666 PyCursesInitialised;
2667 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2668 return NULL;
2669 availmask = mousemask(newmask, &oldmask);
2670 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002671}
2672#endif
2673
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002674static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002675PyCurses_Napms(PyObject *self, PyObject *args)
2676{
2677 int ms;
2678
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002679 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002680 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002681
2682 return Py_BuildValue("i", napms(ms));
2683}
2684
2685
2686static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002687PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002688{
Victor Stinner26486ea2010-05-15 22:23:53 +00002689 WINDOW *win;
2690 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691
Victor Stinner26486ea2010-05-15 22:23:53 +00002692 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002693
Victor Stinner26486ea2010-05-15 22:23:53 +00002694 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002695
Victor Stinner26486ea2010-05-15 22:23:53 +00002696 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697
Victor Stinner26486ea2010-05-15 22:23:53 +00002698 if (win == NULL) {
2699 PyErr_SetString(PyCursesError, catchall_NULL);
2700 return NULL;
2701 }
2702
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002703 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002704}
2705
2706static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002707PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002708{
Victor Stinner26486ea2010-05-15 22:23:53 +00002709 WINDOW *win;
2710 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002711
Victor Stinner26486ea2010-05-15 22:23:53 +00002712 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002713
Victor Stinner26486ea2010-05-15 22:23:53 +00002714 switch (PyTuple_Size(args)) {
2715 case 2:
2716 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2717 return NULL;
2718 break;
2719 case 4:
2720 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2721 &nlines,&ncols,&begin_y,&begin_x))
2722 return NULL;
2723 break;
2724 default:
2725 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2726 return NULL;
2727 }
Guido van Rossum85738471995-02-17 13:50:17 +00002728
Victor Stinner26486ea2010-05-15 22:23:53 +00002729 win = newwin(nlines,ncols,begin_y,begin_x);
2730 if (win == NULL) {
2731 PyErr_SetString(PyCursesError, catchall_NULL);
2732 return NULL;
2733 }
Guido van Rossum85738471995-02-17 13:50:17 +00002734
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002735 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002736}
2737
2738static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002739PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002740{
Victor Stinner26486ea2010-05-15 22:23:53 +00002741 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002742
Victor Stinner26486ea2010-05-15 22:23:53 +00002743 PyCursesInitialised;
2744 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002745
Victor Stinner26486ea2010-05-15 22:23:53 +00002746 switch(PyTuple_Size(args)) {
2747 case 1:
2748 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2749 break;
2750 default:
2751 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2752 return NULL;
2753 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 if (pair_content(pair, &f, &b)==ERR) {
2756 PyErr_SetString(PyCursesError,
2757 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2758 return NULL;
2759 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002760
Victor Stinner26486ea2010-05-15 22:23:53 +00002761 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002762}
2763
2764static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002765PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002766{
Victor Stinner26486ea2010-05-15 22:23:53 +00002767 int n;
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, "i;pairvalue", &n)) return NULL;
2775 break;
2776 default:
2777 PyErr_SetString(PyExc_TypeError,
2778 "pair_number requires 1 argument");
2779 return NULL;
2780 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002781
Victor Stinner26486ea2010-05-15 22:23:53 +00002782 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002783}
2784
2785static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002786PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002787{
Victor Stinner26486ea2010-05-15 22:23:53 +00002788 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002789
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002790 if (!PyArg_ParseTuple(args,"y;str", &str))
2791 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002792 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002793}
2794
2795static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002796PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002797{
Victor Stinner26486ea2010-05-15 22:23:53 +00002798 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002799
Victor Stinner26486ea2010-05-15 22:23:53 +00002800 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002801
Victor Stinner26486ea2010-05-15 22:23:53 +00002802 switch(PyTuple_Size(args)) {
2803 case 0:
2804 qiflush();
2805 Py_INCREF(Py_None);
2806 return Py_None;
2807 case 1:
2808 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2809 if (flag) qiflush();
2810 else noqiflush();
2811 Py_INCREF(Py_None);
2812 return Py_None;
2813 default:
2814 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2815 return NULL;
2816 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002817}
2818
Guido van Rossumd8faa362007-04-27 19:54:29 +00002819/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2820 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002821#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002822static int
2823update_lines_cols(void)
2824{
Victor Stinner26486ea2010-05-15 22:23:53 +00002825 PyObject *o;
2826 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002827 _Py_IDENTIFIER(LINES);
2828 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002829
Victor Stinner26486ea2010-05-15 22:23:53 +00002830 if (!m)
2831 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002832
Victor Stinner26486ea2010-05-15 22:23:53 +00002833 o = PyLong_FromLong(LINES);
2834 if (!o) {
2835 Py_DECREF(m);
2836 return 0;
2837 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002838 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002839 Py_DECREF(m);
2840 Py_DECREF(o);
2841 return 0;
2842 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002843 /* PyId_LINES.object will be initialized here. */
2844 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002845 Py_DECREF(m);
2846 Py_DECREF(o);
2847 return 0;
2848 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002849 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002850 o = PyLong_FromLong(COLS);
2851 if (!o) {
2852 Py_DECREF(m);
2853 return 0;
2854 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002855 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002856 Py_DECREF(m);
2857 Py_DECREF(o);
2858 return 0;
2859 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002860 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002861 Py_DECREF(m);
2862 Py_DECREF(o);
2863 return 0;
2864 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002865 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002866 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002867 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002868}
Steve Dowerd2bc3892015-04-15 18:06:05 -04002869
2870static PyObject *
2871PyCurses_update_lines_cols(PyObject *self)
2872{
2873 return PyLong_FromLong((long) update_lines_cols());
2874}
2875
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002876#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002877
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002878#ifdef HAVE_CURSES_RESIZETERM
2879static PyObject *
2880PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2881{
Victor Stinner26486ea2010-05-15 22:23:53 +00002882 int lines;
2883 int columns;
2884 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002885
Victor Stinner26486ea2010-05-15 22:23:53 +00002886 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002887
Victor Stinner26486ea2010-05-15 22:23:53 +00002888 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2889 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002890
Victor Stinner26486ea2010-05-15 22:23:53 +00002891 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2892 if (!result)
2893 return NULL;
2894 if (!update_lines_cols())
2895 return NULL;
2896 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002897}
2898
2899#endif
2900
2901#ifdef HAVE_CURSES_RESIZE_TERM
2902static PyObject *
2903PyCurses_Resize_Term(PyObject *self, PyObject *args)
2904{
Victor Stinner26486ea2010-05-15 22:23:53 +00002905 int lines;
2906 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002907
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002909
Victor Stinner26486ea2010-05-15 22:23:53 +00002910 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002911
Victor Stinner26486ea2010-05-15 22:23:53 +00002912 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2913 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002914
Victor Stinner26486ea2010-05-15 22:23:53 +00002915 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2916 if (!result)
2917 return NULL;
2918 if (!update_lines_cols())
2919 return NULL;
2920 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002921}
2922#endif /* HAVE_CURSES_RESIZE_TERM */
2923
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002924static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002925PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002926{
Victor Stinner26486ea2010-05-15 22:23:53 +00002927 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002928
Victor Stinner26486ea2010-05-15 22:23:53 +00002929 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002930
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 if (PyTuple_Size(args)!=2) {
2932 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2933 return NULL;
2934 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002935
Victor Stinner26486ea2010-05-15 22:23:53 +00002936 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002937
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002939
Victor Stinner26486ea2010-05-15 22:23:53 +00002940 Py_INCREF(Py_None);
2941 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002942}
2943
2944static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002945PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002946{
Victor Stinner26486ea2010-05-15 22:23:53 +00002947 int code;
2948 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002949
Victor Stinner26486ea2010-05-15 22:23:53 +00002950 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002951
Victor Stinner26486ea2010-05-15 22:23:53 +00002952 code = start_color();
2953 if (code != ERR) {
2954 initialisedcolors = TRUE;
2955 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002956 if (c == NULL)
2957 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 PyDict_SetItemString(ModDict, "COLORS", c);
2959 Py_DECREF(c);
2960 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002961 if (cp == NULL)
2962 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002963 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2964 Py_DECREF(cp);
2965 Py_INCREF(Py_None);
2966 return Py_None;
2967 } else {
2968 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2969 return NULL;
2970 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002971}
2972
2973static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002974PyCurses_tigetflag(PyObject *self, PyObject *args)
2975{
Victor Stinner26486ea2010-05-15 22:23:53 +00002976 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002977
Victor Stinner26486ea2010-05-15 22:23:53 +00002978 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002979
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 if (!PyArg_ParseTuple(args, "s", &capname))
2981 return NULL;
2982
2983 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002984}
2985
2986static PyObject *
2987PyCurses_tigetnum(PyObject *self, PyObject *args)
2988{
Victor Stinner26486ea2010-05-15 22:23:53 +00002989 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002990
Victor Stinner26486ea2010-05-15 22:23:53 +00002991 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 if (!PyArg_ParseTuple(args, "s", &capname))
2994 return NULL;
2995
2996 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002997}
2998
2999static PyObject *
3000PyCurses_tigetstr(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 capname = tigetstr( capname );
3010 if (capname == 0 || capname == (char*) -1) {
3011 Py_INCREF(Py_None);
3012 return Py_None;
3013 }
3014 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003015}
3016
3017static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003018PyCurses_tparm(PyObject *self, PyObject *args)
3019{
Victor Stinner26486ea2010-05-15 22:23:53 +00003020 char* fmt;
3021 char* result = NULL;
3022 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 +00003023
Victor Stinner26486ea2010-05-15 22:23:53 +00003024 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003025
Victor Stinner26621332011-11-02 23:45:29 +01003026 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003027 &fmt, &i1, &i2, &i3, &i4,
3028 &i5, &i6, &i7, &i8, &i9)) {
3029 return NULL;
3030 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003031
Victor Stinner26486ea2010-05-15 22:23:53 +00003032 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3033 if (!result) {
3034 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3035 return NULL;
3036 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003037
Victor Stinner26486ea2010-05-15 22:23:53 +00003038 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003039}
3040
3041static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003042PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003043{
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003045
Victor Stinner26486ea2010-05-15 22:23:53 +00003046 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003047
Victor Stinner26486ea2010-05-15 22:23:53 +00003048 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003051}
3052
3053static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003054PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003055{
Victor Stinner26486ea2010-05-15 22:23:53 +00003056 PyObject *temp;
3057 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003058
Victor Stinner26486ea2010-05-15 22:23:53 +00003059 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003060
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003062
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003063 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003064 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003065
Victor Stinner26486ea2010-05-15 22:23:53 +00003066 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003067}
3068
3069static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003070PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003071{
Victor Stinner26486ea2010-05-15 22:23:53 +00003072 PyObject *temp;
3073 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003074
Victor Stinner26486ea2010-05-15 22:23:53 +00003075 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003076
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003077 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003079
3080 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3081 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003082
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003084}
3085
Victor Stinner71e44cb2011-09-06 01:53:03 +02003086#ifdef HAVE_NCURSESW
3087/* Convert an object to a character (wchar_t):
3088
3089 - int
3090 - str of length 1
3091
3092 Return 1 on success, 0 on error. */
3093static int
3094PyCurses_ConvertToWchar_t(PyObject *obj,
3095 wchar_t *wch)
3096{
3097 if (PyUnicode_Check(obj)) {
3098 wchar_t buffer[2];
3099 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3100 PyErr_Format(PyExc_TypeError,
3101 "expect bytes or str of length 1, or int, "
3102 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003103 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003104 return 0;
3105 }
3106 *wch = buffer[0];
3107 return 2;
3108 }
3109 else if (PyLong_CheckExact(obj)) {
3110 long value;
3111 int overflow;
3112 value = PyLong_AsLongAndOverflow(obj, &overflow);
3113 if (overflow) {
3114 PyErr_SetString(PyExc_OverflowError,
3115 "int doesn't fit in long");
3116 return 0;
3117 }
3118 *wch = (wchar_t)value;
3119 if ((long)*wch != value) {
3120 PyErr_Format(PyExc_OverflowError,
3121 "character doesn't fit in wchar_t");
3122 return 0;
3123 }
3124 return 1;
3125 }
3126 else {
3127 PyErr_Format(PyExc_TypeError,
3128 "expect bytes or str of length 1, or int, got %s",
3129 Py_TYPE(obj)->tp_name);
3130 return 0;
3131 }
3132}
3133
3134static PyObject *
3135PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3136{
3137 PyObject *obj;
3138 wchar_t wch;
3139
3140 PyCursesInitialised;
3141
3142 if (!PyArg_ParseTuple(args,"O", &obj))
3143 return NULL;
3144
3145 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3146 return NULL;
3147 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3148}
3149#endif
3150
Guido van Rossumf6971e21994-08-30 12:25:20 +00003151static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003152PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003153{
Victor Stinner26486ea2010-05-15 22:23:53 +00003154 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003155
Victor Stinner26486ea2010-05-15 22:23:53 +00003156 switch(PyTuple_Size(args)) {
3157 case 1:
3158 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3159 return NULL;
3160 break;
3161 default:
3162 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3163 return NULL;
3164 }
3165 use_env(flag);
3166 Py_INCREF(Py_None);
3167 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003168}
3169
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003170#ifndef STRICT_SYSV_CURSES
3171static PyObject *
3172PyCurses_Use_Default_Colors(PyObject *self)
3173{
Victor Stinner26486ea2010-05-15 22:23:53 +00003174 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003175
Victor Stinner26486ea2010-05-15 22:23:53 +00003176 PyCursesInitialised;
3177 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003178
Victor Stinner26486ea2010-05-15 22:23:53 +00003179 code = use_default_colors();
3180 if (code != ERR) {
3181 Py_INCREF(Py_None);
3182 return Py_None;
3183 } else {
3184 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3185 return NULL;
3186 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003187}
3188#endif /* STRICT_SYSV_CURSES */
3189
Guido van Rossumf6971e21994-08-30 12:25:20 +00003190/* List of functions defined in the module */
3191
3192static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003193 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3194 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3195 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3196 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3197 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3198 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3199 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3200 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3201 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3202 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3203 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3204 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3205 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3206 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3207 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3208 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3209 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003210#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003211 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3212 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003213#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003214 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3215 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3216 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3217 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3218 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003219#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003220 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003221#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003222 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3223 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3224 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3225 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3226 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3227 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003228#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003229 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003230#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003231#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003232 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003233#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003234 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3235 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3236 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003237#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003238 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3239 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003240#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003241 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3242 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3243 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3244 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3245 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3246 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3247 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3248 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3249 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3250 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3251 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3252 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3253 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3254 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3255 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3256 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3257 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003258#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003259 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003260#endif
3261#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003262 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003263#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003264 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3265 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3266 {"setupterm", (PyCFunction)PyCurses_setupterm,
3267 METH_VARARGS|METH_KEYWORDS},
3268 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3269 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3270 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3271 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3272 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3273 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3274 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3275 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3276 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3277 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Steve Dowerd2bc3892015-04-15 18:06:05 -04003278#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
3279 {"update_lines_cols", (PyCFunction)PyCurses_update_lines_cols, METH_NOARGS},
3280#endif
Victor Stinner71e44cb2011-09-06 01:53:03 +02003281#ifdef HAVE_NCURSESW
3282 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3283#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003284 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003285#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003287#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003288 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003289};
3290
3291/* Initialization function for the module */
3292
Martin v. Löwis1a214512008-06-11 05:26:20 +00003293
3294static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003295 PyModuleDef_HEAD_INIT,
3296 "_curses",
3297 NULL,
3298 -1,
3299 PyCurses_methods,
3300 NULL,
3301 NULL,
3302 NULL,
3303 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003304};
3305
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003306PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003307PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003308{
Victor Stinner26486ea2010-05-15 22:23:53 +00003309 PyObject *m, *d, *v, *c_api_object;
3310 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003311
Victor Stinner26486ea2010-05-15 22:23:53 +00003312 /* Initialize object type */
3313 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3314 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003315
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 /* Initialize the C API pointer array */
3317 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3318 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3319 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3320 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003321
Victor Stinner26486ea2010-05-15 22:23:53 +00003322 /* Create the module and add the functions */
3323 m = PyModule_Create(&_cursesmodule);
3324 if (m == NULL)
3325 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003326
Victor Stinner26486ea2010-05-15 22:23:53 +00003327 /* Add some symbolic constants to the module */
3328 d = PyModule_GetDict(m);
3329 if (d == NULL)
3330 return NULL;
3331 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003332
Victor Stinner26486ea2010-05-15 22:23:53 +00003333 /* Add a capsule for the C API */
3334 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3335 PyDict_SetItemString(d, "_C_API", c_api_object);
3336 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003337
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 /* For exception curses.error */
3339 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3340 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003341
Victor Stinner26486ea2010-05-15 22:23:53 +00003342 /* Make the version available */
3343 v = PyBytes_FromString(PyCursesVersion);
3344 PyDict_SetItemString(d, "version", v);
3345 PyDict_SetItemString(d, "__version__", v);
3346 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003347
Victor Stinner26486ea2010-05-15 22:23:53 +00003348 SetDictInt("ERR", ERR);
3349 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003350
Victor Stinner26486ea2010-05-15 22:23:53 +00003351 /* Here are some attributes you can add to chars to print */
3352
3353 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3354 SetDictInt("A_NORMAL", A_NORMAL);
3355 SetDictInt("A_STANDOUT", A_STANDOUT);
3356 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3357 SetDictInt("A_REVERSE", A_REVERSE);
3358 SetDictInt("A_BLINK", A_BLINK);
3359 SetDictInt("A_DIM", A_DIM);
3360 SetDictInt("A_BOLD", A_BOLD);
3361 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003362#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003364#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 SetDictInt("A_PROTECT", A_PROTECT);
3366 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3367 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003368
Victor Stinner26486ea2010-05-15 22:23:53 +00003369 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003370#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003371 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003372#endif
3373#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003374 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003375#endif
3376#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003377 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003378#endif
3379#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003381#endif
3382#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003384#endif
3385#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003387#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003388
Victor Stinner26486ea2010-05-15 22:23:53 +00003389 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3390 SetDictInt("COLOR_RED", COLOR_RED);
3391 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3392 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3393 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3394 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3395 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3396 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003397
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003398#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003399 /* Mouse-related constants */
3400 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3401 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3402 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3403 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3404 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003405
Victor Stinner26486ea2010-05-15 22:23:53 +00003406 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3407 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3408 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3409 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3410 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003411
Victor Stinner26486ea2010-05-15 22:23:53 +00003412 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3413 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3414 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3415 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3416 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003417
Victor Stinner26486ea2010-05-15 22:23:53 +00003418 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3419 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3420 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3421 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3422 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003423
Victor Stinner26486ea2010-05-15 22:23:53 +00003424 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3425 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3426 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003427
Victor Stinner26486ea2010-05-15 22:23:53 +00003428 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3429 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003430#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003431 /* Now set everything up for KEY_ variables */
3432 {
3433 int key;
3434 char *key_n;
3435 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003436#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003437 for (key=KEY_MIN;key < KEY_MAX; key++) {
3438 key_n = (char *)keyname(key);
3439 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3440 continue;
3441 if (strncmp(key_n,"KEY_F(",6)==0) {
3442 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003443 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003444 if (!key_n2) {
3445 PyErr_NoMemory();
3446 break;
3447 }
3448 p1 = key_n;
3449 p2 = key_n2;
3450 while (*p1) {
3451 if (*p1 != '(' && *p1 != ')') {
3452 *p2 = *p1;
3453 p2++;
3454 }
3455 p1++;
3456 }
3457 *p2 = (char)0;
3458 } else
3459 key_n2 = key_n;
3460 SetDictInt(key_n2,key);
3461 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003462 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003463 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003464#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003465 SetDictInt("KEY_MIN", KEY_MIN);
3466 SetDictInt("KEY_MAX", KEY_MAX);
3467 }
3468 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003469}