blob: 98b81fef6e227cb2c96fc3218486160864d6417b [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 Hastings44e2eaa2013-11-23 15:37:55 -0800137/*[clinic]
138module curses
139class curses.window
140[clinic]*/
141/*[clinic checksum: da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
142
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000143/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000147/* Tells whether setupterm() has been called to initialise terminfo. */
148static int initialised_setupterm = FALSE;
149
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000150/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000151static int initialised = FALSE;
152
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000153/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000154static int initialisedcolors = FALSE;
155
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100156static char *screen_encoding = NULL;
157
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000158/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000159#define PyCursesSetupTermCalled \
160 if (initialised_setupterm != TRUE) { \
161 PyErr_SetString(PyCursesError, \
162 "must call (at least) setupterm() first"); \
163 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000164
Victor Stinner26486ea2010-05-15 22:23:53 +0000165#define PyCursesInitialised \
166 if (initialised != TRUE) { \
167 PyErr_SetString(PyCursesError, \
168 "must call initscr() first"); \
169 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000170
Victor Stinner26486ea2010-05-15 22:23:53 +0000171#define PyCursesInitialisedColor \
172 if (initialisedcolors != TRUE) { \
173 PyErr_SetString(PyCursesError, \
174 "must call start_color() first"); \
175 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000176
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000177/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000178
Guido van Rossum85738471995-02-17 13:50:17 +0000179/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000180 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000181 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000183 */
184
185static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100186PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000187{
Victor Stinner26486ea2010-05-15 22:23:53 +0000188 if (code != ERR) {
189 Py_INCREF(Py_None);
190 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000191 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000192 if (fname == NULL) {
193 PyErr_SetString(PyCursesError, catchall_ERR);
194 } else {
195 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
196 }
197 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000198 }
Guido van Rossum85738471995-02-17 13:50:17 +0000199}
200
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100201/* Convert an object to a byte (an integer of type chtype):
202
203 - int
204 - bytes of length 1
205 - str of length 1
206
207 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000208static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100209PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000210{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100211 long value;
212 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
213 value = (unsigned char)PyBytes_AsString(obj)[0];
214 }
215 else if (PyUnicode_Check(obj)) {
216 if (PyUnicode_GetLength(obj) != 1) {
217 PyErr_Format(PyExc_TypeError,
218 "expect bytes or str of length 1, or int, "
219 "got a str of length %zi",
220 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000221 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100222 }
223 value = PyUnicode_READ_CHAR(obj, 0);
224 if (128 < value) {
225 PyObject *bytes;
226 const char *encoding;
227 if (win)
228 encoding = win->encoding;
229 else
230 encoding = screen_encoding;
231 bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
232 if (bytes == NULL)
233 return 0;
234 if (PyBytes_GET_SIZE(bytes) == 1)
235 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
236 else
237 value = -1;
238 Py_DECREF(bytes);
239 if (value < 0)
240 goto overflow;
241 }
242 }
243 else if (PyLong_CheckExact(obj)) {
244 int long_overflow;
245 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
246 if (long_overflow)
247 goto overflow;
248 }
249 else {
250 PyErr_Format(PyExc_TypeError,
251 "expect bytes or str of length 1, or int, got %s",
252 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000253 return 0;
254 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100255 *ch = (chtype)value;
256 if ((long)*ch != value)
257 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000258 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100259
260overflow:
261 PyErr_SetString(PyExc_OverflowError,
262 "byte doesn't fit in chtype");
263 return 0;
264}
265
266/* Convert an object to a byte (chtype) or a character (cchar_t):
267
268 - int
269 - bytes of length 1
270 - str of length 1
271
272 Return:
273
274 - 2 if obj is a character (written into *wch)
275 - 1 if obj is a byte (written into *ch)
276 - 0 on error: raise an exception */
277static int
278PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
279 chtype *ch
280#ifdef HAVE_NCURSESW
281 , cchar_t *wch
282#endif
283 )
284{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100285 long value;
286#ifdef HAVE_NCURSESW
287 wchar_t buffer[2];
288#endif
289
290 if (PyUnicode_Check(obj)) {
291#ifdef HAVE_NCURSESW
292 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
293 PyErr_Format(PyExc_TypeError,
294 "expect bytes or str of length 1, or int, "
295 "got a str of length %zi",
296 PyUnicode_GET_LENGTH(obj));
297 return 0;
298 }
299 memset(wch->chars, 0, sizeof(wch->chars));
300 wch->chars[0] = buffer[0];
301 return 2;
302#else
303 return PyCurses_ConvertToChtype(win, obj, ch);
304#endif
305 }
306 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
307 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100308 }
309 else if (PyLong_CheckExact(obj)) {
310 int overflow;
311 value = PyLong_AsLongAndOverflow(obj, &overflow);
312 if (overflow) {
313 PyErr_SetString(PyExc_OverflowError,
314 "int doesn't fit in long");
315 return 0;
316 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100317 }
318 else {
319 PyErr_Format(PyExc_TypeError,
320 "expect bytes or str of length 1, or int, got %s",
321 Py_TYPE(obj)->tp_name);
322 return 0;
323 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200324
325 *ch = (chtype)value;
326 if ((long)*ch != value) {
327 PyErr_Format(PyExc_OverflowError,
328 "byte doesn't fit in chtype");
329 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100330 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200331 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332}
333
334/* Convert an object to a byte string (char*) or a wide character string
335 (wchar_t*). Return:
336
337 - 2 if obj is a character string (written into *wch)
338 - 1 if obj is a byte string (written into *bytes)
339 - 0 on error: raise an exception */
340static int
341PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
342 PyObject **bytes, wchar_t **wstr)
343{
344 if (PyUnicode_Check(obj)) {
345#ifdef HAVE_NCURSESW
346 assert (wstr != NULL);
347 *wstr = PyUnicode_AsWideCharString(obj, NULL);
348 if (*wstr == NULL)
349 return 0;
350 return 2;
351#else
352 assert (wstr == NULL);
353 *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
354 if (*bytes == NULL)
355 return 0;
356 return 1;
357#endif
358 }
359 else if (PyBytes_Check(obj)) {
360 Py_INCREF(obj);
361 *bytes = obj;
362 return 1;
363 }
364
365 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
366 Py_TYPE(obj)->tp_name);
367 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000368}
369
Benjamin Peterson21896a32010-03-21 22:03:03 +0000370/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000371 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000372
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000373static int func_PyCursesSetupTermCalled(void)
374{
375 PyCursesSetupTermCalled;
376 return 1;
377}
378
379static int func_PyCursesInitialised(void)
380{
381 PyCursesInitialised;
382 return 1;
383}
384
385static int func_PyCursesInitialisedColor(void)
386{
387 PyCursesInitialisedColor;
388 return 1;
389}
390
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000391/*****************************************************************************
392 The Window Object
393******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000394
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000395/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000396
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000397PyTypeObject PyCursesWindow_Type;
398
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000399/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400
401 X - function name
402 TYPE - parameter Type
403 ERGSTR - format string for construction of the return value
404 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000405*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000406
Victor Stinner26486ea2010-05-15 22:23:53 +0000407#define Window_NoArgNoReturnFunction(X) \
408 static PyObject *PyCursesWindow_ ## X \
409 (PyCursesWindowObject *self, PyObject *args) \
410 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000411
Victor Stinner26486ea2010-05-15 22:23:53 +0000412#define Window_NoArgTrueFalseFunction(X) \
413 static PyObject * PyCursesWindow_ ## X \
414 (PyCursesWindowObject *self) \
415 { \
416 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
417 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000418
Victor Stinner26486ea2010-05-15 22:23:53 +0000419#define Window_NoArgNoReturnVoidFunction(X) \
420 static PyObject * PyCursesWindow_ ## X \
421 (PyCursesWindowObject *self) \
422 { \
423 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000424
Victor Stinner26486ea2010-05-15 22:23:53 +0000425#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
426 static PyObject * PyCursesWindow_ ## X \
427 (PyCursesWindowObject *self) \
428 { \
429 TYPE arg1, arg2; \
430 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000431
Victor Stinner26486ea2010-05-15 22:23:53 +0000432#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
433 static PyObject * PyCursesWindow_ ## X \
434 (PyCursesWindowObject *self, PyObject *args) \
435 { \
436 TYPE arg1; \
437 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
438 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000439
Victor Stinner26486ea2010-05-15 22:23:53 +0000440#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
441 static PyObject * PyCursesWindow_ ## X \
442 (PyCursesWindowObject *self, PyObject *args) \
443 { \
444 TYPE arg1; \
445 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
446 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000447
Victor Stinner26486ea2010-05-15 22:23:53 +0000448#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
449 static PyObject * PyCursesWindow_ ## X \
450 (PyCursesWindowObject *self, PyObject *args) \
451 { \
452 TYPE arg1, arg2; \
453 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
454 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000455
Guido van Rossumf6971e21994-08-30 12:25:20 +0000456/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458Window_NoArgNoReturnFunction(untouchwin)
459Window_NoArgNoReturnFunction(touchwin)
460Window_NoArgNoReturnFunction(redrawwin)
461Window_NoArgNoReturnFunction(winsertln)
462Window_NoArgNoReturnFunction(werase)
463Window_NoArgNoReturnFunction(wdeleteln)
464
465Window_NoArgTrueFalseFunction(is_wintouched)
466
467Window_NoArgNoReturnVoidFunction(wsyncup)
468Window_NoArgNoReturnVoidFunction(wsyncdown)
469Window_NoArgNoReturnVoidFunction(wstandend)
470Window_NoArgNoReturnVoidFunction(wstandout)
471Window_NoArgNoReturnVoidFunction(wcursyncup)
472Window_NoArgNoReturnVoidFunction(wclrtoeol)
473Window_NoArgNoReturnVoidFunction(wclrtobot)
474Window_NoArgNoReturnVoidFunction(wclear)
475
476Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
477Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000478Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000480Window_NoArg2TupleReturnFunction(getyx, int, "ii")
481Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
482Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000484
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000485Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
486Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000487#if defined(__NetBSD__)
488Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
489#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000490Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000491#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000493#if defined(__NetBSD__)
494Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
495#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000496Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000497#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
499Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000500Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000501Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
502
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000503Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
504Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
505Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000506#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000507Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508#endif
509
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000510/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511
Guido van Rossumf6971e21994-08-30 12:25:20 +0000512static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100513PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000514{
Victor Stinner26486ea2010-05-15 22:23:53 +0000515 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000516
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100517 if (encoding == NULL) {
518#if defined(MS_WINDOWS)
519 char *buffer[100];
520 UINT cp;
521 cp = GetConsoleOutputCP();
522 if (cp != 0) {
523 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
524 encoding = buffer;
525 }
526#elif defined(CODESET)
527 const char *codeset = nl_langinfo(CODESET);
528 if (codeset != NULL && codeset[0] != 0)
529 encoding = codeset;
530#endif
531 if (encoding == NULL)
532 encoding = "utf-8";
533 }
534
Victor Stinner26486ea2010-05-15 22:23:53 +0000535 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
536 if (wo == NULL) return NULL;
537 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200538 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100539 if (wo->encoding == NULL) {
540 Py_DECREF(wo);
541 PyErr_NoMemory();
542 return NULL;
543 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000544 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000545}
546
547static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000548PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000549{
Victor Stinner26486ea2010-05-15 22:23:53 +0000550 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100551 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200552 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000553 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000554}
555
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000556/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000557
Larry Hastings31826802013-10-19 00:09:25 -0700558/*[clinic]
Larry Hastings31826802013-10-19 00:09:25 -0700559
560curses.window.addch
561
562 [
563 x: int
564 X-coordinate.
565 y: int
566 Y-coordinate.
567 ]
568
569 ch: object
570 Character to add.
571
572 [
573 attr: long
574 Attributes for the character.
575 ]
576 /
577
578Paint character ch at (y, x) with attributes attr.
579
580Paint character ch at (y, x) with attributes attr,
581overwriting any character previously painted at that location.
582By default, the character position and attributes are the
583current settings for the window object.
584[clinic]*/
585
586PyDoc_STRVAR(curses_window_addch__doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800587"addch([x, y,] ch, [attr])\n"
Larry Hastings31826802013-10-19 00:09:25 -0700588"Paint character ch at (y, x) with attributes attr.\n"
589"\n"
Larry Hastings31826802013-10-19 00:09:25 -0700590" x\n"
591" X-coordinate.\n"
592" y\n"
593" Y-coordinate.\n"
594" ch\n"
595" Character to add.\n"
596" attr\n"
597" Attributes for the character.\n"
598"\n"
599"Paint character ch at (y, x) with attributes attr,\n"
600"overwriting any character previously painted at that location.\n"
601"By default, the character position and attributes are the\n"
602"current settings for the window object.");
603
604#define CURSES_WINDOW_ADDCH_METHODDEF \
605 {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
606
Guido van Rossumf6971e21994-08-30 12:25:20 +0000607static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -0700608curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
609
610static PyObject *
611curses_window_addch(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000612{
Larry Hastings31826802013-10-19 00:09:25 -0700613 PyObject *return_value = NULL;
614 int group_left_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800615 int x = 0;
616 int y = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700617 PyObject *ch;
618 int group_right_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800619 long attr = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700620
621 switch (PyTuple_Size(args)) {
622 case 1:
623 if (!PyArg_ParseTuple(args, "O:addch", &ch))
624 return NULL;
625 break;
626 case 2:
627 if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr))
628 return NULL;
629 group_right_1 = 1;
630 break;
631 case 3:
632 if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
633 return NULL;
634 group_left_1 = 1;
635 break;
636 case 4:
637 if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
638 return NULL;
639 group_right_1 = 1;
640 group_left_1 = 1;
641 break;
642 default:
643 PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
644 return NULL;
645 }
646 return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
647
648 return return_value;
649}
650
651static PyObject *
652curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800653/*[clinic checksum: 44ed958b891cde91205e584c766e048f3999714f]*/
Larry Hastings31826802013-10-19 00:09:25 -0700654{
655 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
656 int coordinates_group = group_left_1;
657 int attr_group = group_right_1;
658 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700660 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100661#ifdef HAVE_NCURSESW
662 cchar_t wch;
663#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100664 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000665
Larry Hastings31826802013-10-19 00:09:25 -0700666 if (!attr_group)
667 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000668
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700670 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100671 if (type == 2) {
672 funcname = "add_wch";
673 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700674 if (coordinates_group)
675 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100676 else {
Larry Hastings31826802013-10-19 00:09:25 -0700677 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100678 }
679 }
680 else
681#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300682 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100683#endif
684 if (type == 1) {
685 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700686 if (coordinates_group)
687 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100688 else {
Larry Hastings31826802013-10-19 00:09:25 -0700689 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100690 }
691 }
692 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000693 return NULL;
694 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100695 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000696}
697
698static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000699PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000700{
Victor Stinner26486ea2010-05-15 22:23:53 +0000701 int rtn;
702 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100703 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500704 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100705#ifdef HAVE_NCURSESW
706 wchar_t *wstr = NULL;
707#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000708 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
709 long lattr;
710 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100711 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000712
Victor Stinner26486ea2010-05-15 22:23:53 +0000713 switch (PyTuple_Size(args)) {
714 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100715 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000716 return NULL;
717 break;
718 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100719 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000720 return NULL;
721 attr = lattr;
722 use_attr = TRUE;
723 break;
724 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000726 return NULL;
727 use_xy = TRUE;
728 break;
729 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100730 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000731 return NULL;
732 attr = lattr;
733 use_xy = use_attr = TRUE;
734 break;
735 default:
736 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
737 return NULL;
738 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739#ifdef HAVE_NCURSESW
740 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
741#else
742 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
743#endif
744 if (strtype == 0)
745 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000746 if (use_attr == TRUE) {
747 attr_old = getattrs(self->win);
748 (void)wattrset(self->win,attr);
749 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100750#ifdef HAVE_NCURSESW
751 if (strtype == 2) {
752 funcname = "addwstr";
753 if (use_xy == TRUE)
754 rtn = mvwaddwstr(self->win,y,x,wstr);
755 else
756 rtn = waddwstr(self->win,wstr);
757 PyMem_Free(wstr);
758 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000759 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100760#endif
761 {
762 char *str = PyBytes_AS_STRING(bytesobj);
763 funcname = "addstr";
764 if (use_xy == TRUE)
765 rtn = mvwaddstr(self->win,y,x,str);
766 else
767 rtn = waddstr(self->win,str);
768 Py_DECREF(bytesobj);
769 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000770 if (use_attr == TRUE)
771 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100772 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000773}
Guido van Rossum85738471995-02-17 13:50:17 +0000774
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000775static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000776PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000777{
Victor Stinner26486ea2010-05-15 22:23:53 +0000778 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100779 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500780 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100781#ifdef HAVE_NCURSESW
782 wchar_t *wstr = NULL;
783#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000784 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
785 long lattr;
786 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100787 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000788
Victor Stinner26486ea2010-05-15 22:23:53 +0000789 switch (PyTuple_Size(args)) {
790 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100791 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000792 return NULL;
793 break;
794 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100795 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000796 return NULL;
797 attr = lattr;
798 use_attr = TRUE;
799 break;
800 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100801 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000802 return NULL;
803 use_xy = TRUE;
804 break;
805 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100806 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000807 return NULL;
808 attr = lattr;
809 use_xy = use_attr = TRUE;
810 break;
811 default:
812 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
813 return NULL;
814 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100815#ifdef HAVE_NCURSESW
816 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
817#else
818 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
819#endif
820 if (strtype == 0)
821 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000822
Victor Stinner26486ea2010-05-15 22:23:53 +0000823 if (use_attr == TRUE) {
824 attr_old = getattrs(self->win);
825 (void)wattrset(self->win,attr);
826 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100827#ifdef HAVE_NCURSESW
828 if (strtype == 2) {
829 funcname = "addnwstr";
830 if (use_xy == TRUE)
831 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
832 else
833 rtn = waddnwstr(self->win,wstr,n);
834 PyMem_Free(wstr);
835 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000836 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100837#endif
838 {
839 char *str = PyBytes_AS_STRING(bytesobj);
840 funcname = "addnstr";
841 if (use_xy == TRUE)
842 rtn = mvwaddnstr(self->win,y,x,str,n);
843 else
844 rtn = waddnstr(self->win,str,n);
845 Py_DECREF(bytesobj);
846 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000847 if (use_attr == TRUE)
848 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100849 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000850}
851
852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854{
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 PyObject *temp;
856 chtype bkgd;
857 attr_t attr = A_NORMAL;
858 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000862 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
863 return NULL;
864 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
867 return NULL;
868 attr = lattr;
869 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
872 return NULL;
873 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100875 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000876 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877
Victor Stinner26486ea2010-05-15 22:23:53 +0000878 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000879}
880
881static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000882PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
883{
Victor Stinner26486ea2010-05-15 22:23:53 +0000884 long lattr;
885 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
886 return NULL;
887 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000888}
889
890static PyObject *
891PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
892{
Victor Stinner26486ea2010-05-15 22:23:53 +0000893 long lattr;
894 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
895 return NULL;
896 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000897}
898
899static PyObject *
900PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
901{
Victor Stinner26486ea2010-05-15 22:23:53 +0000902 long lattr;
903 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
904 return NULL;
905 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000906}
907
908static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000909PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000910{
Victor Stinner26486ea2010-05-15 22:23:53 +0000911 PyObject *temp;
912 chtype bkgd;
913 attr_t attr = A_NORMAL;
914 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000915
Victor Stinner26486ea2010-05-15 22:23:53 +0000916 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000917 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000918 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
919 return NULL;
920 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000921 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000922 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
923 return NULL;
924 attr = lattr;
925 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000927 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
928 return NULL;
929 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000930
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100931 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000932 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000933
Victor Stinner26486ea2010-05-15 22:23:53 +0000934 wbkgdset(self->win, bkgd | attr);
935 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000936}
937
938static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000939PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000940{
Victor Stinner26486ea2010-05-15 22:23:53 +0000941 PyObject *temp[8];
942 chtype ch[8];
943 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000944
Victor Stinner26486ea2010-05-15 22:23:53 +0000945 /* Clear the array of parameters */
946 for(i=0; i<8; i++) {
947 temp[i] = NULL;
948 ch[i] = 0;
949 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000950
Victor Stinner26486ea2010-05-15 22:23:53 +0000951 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
952 &temp[0], &temp[1], &temp[2], &temp[3],
953 &temp[4], &temp[5], &temp[6], &temp[7]))
954 return NULL;
955
956 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100957 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000958 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000959 }
960
961 wborder(self->win,
962 ch[0], ch[1], ch[2], ch[3],
963 ch[4], ch[5], ch[6], ch[7]);
964 Py_INCREF(Py_None);
965 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966}
967
968static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000969PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000970{
Victor Stinner26486ea2010-05-15 22:23:53 +0000971 chtype ch1=0,ch2=0;
972 switch(PyTuple_Size(args)){
973 case 0: break;
974 default:
975 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
976 return NULL;
977 }
978 box(self->win,ch1,ch2);
979 Py_INCREF(Py_None);
980 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000981}
982
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000983#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
984#define py_mvwdelch mvwdelch
985#else
986int py_mvwdelch(WINDOW *w, int y, int x)
987{
Victor Stinner26486ea2010-05-15 22:23:53 +0000988 mvwdelch(w,y,x);
989 /* On HP/UX, mvwdelch already returns. On other systems,
990 we may well run into this return statement. */
991 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000992}
993#endif
994
Guido van Rossumd8faa362007-04-27 19:54:29 +0000995/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
996
997static PyObject *
998PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
999{
Victor Stinner26486ea2010-05-15 22:23:53 +00001000 int rtn;
1001 int x, y;
1002 int num = -1;
1003 short color;
1004 attr_t attr = A_NORMAL;
1005 long lattr;
1006 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001007
Victor Stinner26486ea2010-05-15 22:23:53 +00001008 switch (PyTuple_Size(args)) {
1009 case 1:
1010 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1011 return NULL;
1012 attr = lattr;
1013 break;
1014 case 2:
1015 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1016 return NULL;
1017 attr = lattr;
1018 break;
1019 case 3:
1020 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1021 return NULL;
1022 attr = lattr;
1023 use_xy = TRUE;
1024 break;
1025 case 4:
1026 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1027 return NULL;
1028 attr = lattr;
1029 use_xy = TRUE;
1030 break;
1031 default:
1032 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1033 return NULL;
1034 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035
Victor Stinner26486ea2010-05-15 22:23:53 +00001036 color = (short)((attr >> 8) & 0xff);
1037 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038
Victor Stinner26486ea2010-05-15 22:23:53 +00001039 if (use_xy == TRUE) {
1040 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1041 touchline(self->win,y,1);
1042 } else {
1043 getyx(self->win,y,x);
1044 rtn = wchgat(self->win,num,attr,color,NULL);
1045 touchline(self->win,y,1);
1046 }
1047 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001048}
1049
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001050
Guido van Rossumf6971e21994-08-30 12:25:20 +00001051static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001052PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001053{
Victor Stinner26486ea2010-05-15 22:23:53 +00001054 int rtn;
1055 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001056
Victor Stinner26486ea2010-05-15 22:23:53 +00001057 switch (PyTuple_Size(args)) {
1058 case 0:
1059 rtn = wdelch(self->win);
1060 break;
1061 case 2:
1062 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1063 return NULL;
1064 rtn = py_mvwdelch(self->win,y,x);
1065 break;
1066 default:
1067 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1068 return NULL;
1069 }
1070 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001071}
1072
1073static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001074PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001075{
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 WINDOW *win;
1077 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001078
Victor Stinner26486ea2010-05-15 22:23:53 +00001079 nlines = 0;
1080 ncols = 0;
1081 switch (PyTuple_Size(args)) {
1082 case 2:
1083 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1084 return NULL;
1085 break;
1086 case 4:
1087 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1088 &nlines,&ncols,&begin_y,&begin_x))
1089 return NULL;
1090 break;
1091 default:
1092 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1093 return NULL;
1094 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001095
Victor Stinner26486ea2010-05-15 22:23:53 +00001096 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001097
Victor Stinner26486ea2010-05-15 22:23:53 +00001098 if (win == NULL) {
1099 PyErr_SetString(PyCursesError, catchall_NULL);
1100 return NULL;
1101 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001102
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001103 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001104}
1105
1106static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001107PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001108{
Victor Stinner26486ea2010-05-15 22:23:53 +00001109 PyObject *temp;
1110 chtype ch;
1111 attr_t attr = A_NORMAL;
1112 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001113
Victor Stinner26486ea2010-05-15 22:23:53 +00001114 switch (PyTuple_Size(args)) {
1115 case 1:
1116 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1117 return NULL;
1118 break;
1119 case 2:
1120 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1121 return NULL;
1122 attr = lattr;
1123 break;
1124 default:
1125 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001126
1127
Victor Stinner26486ea2010-05-15 22:23:53 +00001128 return NULL;
1129 }
Guido van Rossum85738471995-02-17 13:50:17 +00001130
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001131 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001132 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001133
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001134#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001135 if (self->win->_flags & _ISPAD)
1136 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1137 "echochar");
1138 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001139#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001140 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1141 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001142}
1143
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001144#ifdef NCURSES_MOUSE_VERSION
1145static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001146PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001147{
Victor Stinner26486ea2010-05-15 22:23:53 +00001148 int x, y;
1149 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1150 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001151
Victor Stinner26486ea2010-05-15 22:23:53 +00001152 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001153}
1154#endif
1155
Guido van Rossumf6971e21994-08-30 12:25:20 +00001156static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001157PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001158{
Victor Stinner26486ea2010-05-15 22:23:53 +00001159 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001160}
1161
1162static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001163PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001164{
Victor Stinner26486ea2010-05-15 22:23:53 +00001165 int x, y;
1166 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001167
Victor Stinner26486ea2010-05-15 22:23:53 +00001168 switch (PyTuple_Size(args)) {
1169 case 0:
1170 Py_BEGIN_ALLOW_THREADS
1171 rtn = wgetch(self->win);
1172 Py_END_ALLOW_THREADS
1173 break;
1174 case 2:
1175 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1176 return NULL;
1177 Py_BEGIN_ALLOW_THREADS
1178 rtn = mvwgetch(self->win,y,x);
1179 Py_END_ALLOW_THREADS
1180 break;
1181 default:
1182 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1183 return NULL;
1184 }
1185 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001186}
Guido van Rossum85738471995-02-17 13:50:17 +00001187
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001188static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001189PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001190{
Victor Stinner26486ea2010-05-15 22:23:53 +00001191 int x, y;
1192 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001193
Victor Stinner26486ea2010-05-15 22:23:53 +00001194 switch (PyTuple_Size(args)) {
1195 case 0:
1196 Py_BEGIN_ALLOW_THREADS
1197 rtn = wgetch(self->win);
1198 Py_END_ALLOW_THREADS
1199 break;
1200 case 2:
1201 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1202 return NULL;
1203 Py_BEGIN_ALLOW_THREADS
1204 rtn = mvwgetch(self->win,y,x);
1205 Py_END_ALLOW_THREADS
1206 break;
1207 default:
1208 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1209 return NULL;
1210 }
1211 if (rtn == ERR) {
1212 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001213 PyErr_CheckSignals();
1214 if (!PyErr_Occurred())
1215 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001216 return NULL;
1217 } else if (rtn<=255) {
1218 return Py_BuildValue("C", rtn);
1219 } else {
1220 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001221#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001222 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001223#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001224 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001225#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001226 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1227 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001228}
1229
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001230#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001231static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001232PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1233{
1234 int x, y;
1235 int ct;
1236 wint_t rtn;
1237
1238 switch (PyTuple_Size(args)) {
1239 case 0:
1240 Py_BEGIN_ALLOW_THREADS
1241 ct = wget_wch(self->win,&rtn);
1242 Py_END_ALLOW_THREADS
1243 break;
1244 case 2:
1245 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1246 return NULL;
1247 Py_BEGIN_ALLOW_THREADS
1248 ct = mvwget_wch(self->win,y,x,&rtn);
1249 Py_END_ALLOW_THREADS
1250 break;
1251 default:
1252 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1253 return NULL;
1254 }
1255 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001256 if (PyErr_CheckSignals())
1257 return NULL;
1258
Victor Stinnera7878b72011-07-14 23:07:44 +02001259 /* get_wch() returns ERR in nodelay mode */
1260 PyErr_SetString(PyCursesError, "no input");
1261 return NULL;
1262 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001263 if (ct == KEY_CODE_YES)
1264 return PyLong_FromLong(rtn);
1265 else
1266 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001267}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001268#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001269
1270static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001271PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001272{
Victor Stinner26486ea2010-05-15 22:23:53 +00001273 int x, y, n;
1274 char rtn[1024]; /* This should be big enough.. I hope */
1275 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001276
Victor Stinner26486ea2010-05-15 22:23:53 +00001277 switch (PyTuple_Size(args)) {
1278 case 0:
1279 Py_BEGIN_ALLOW_THREADS
1280 rtn2 = wgetnstr(self->win,rtn, 1023);
1281 Py_END_ALLOW_THREADS
1282 break;
1283 case 1:
1284 if (!PyArg_ParseTuple(args,"i;n", &n))
1285 return NULL;
1286 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001287 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001288 Py_END_ALLOW_THREADS
1289 break;
1290 case 2:
1291 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1292 return NULL;
1293 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001294#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001295 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001296#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001297 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001298#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001299 Py_END_ALLOW_THREADS
1300 break;
1301 case 3:
1302 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1303 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001304#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001305 Py_BEGIN_ALLOW_THREADS
1306 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001307 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001308 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001309#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001310 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001311 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001312 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001313#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001314 break;
1315 default:
1316 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1317 return NULL;
1318 }
1319 if (rtn2 == ERR)
1320 rtn[0] = 0;
1321 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001322}
1323
1324static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001325PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001326{
Victor Stinner26486ea2010-05-15 22:23:53 +00001327 PyObject *temp;
1328 chtype ch;
1329 int n, x, y, code = OK;
1330 attr_t attr = A_NORMAL;
1331 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001332
Victor Stinner26486ea2010-05-15 22:23:53 +00001333 switch (PyTuple_Size(args)) {
1334 case 2:
1335 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1336 return NULL;
1337 break;
1338 case 3:
1339 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1340 return NULL;
1341 attr = lattr;
1342 break;
1343 case 4:
1344 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1345 return NULL;
1346 code = wmove(self->win, y, x);
1347 break;
1348 case 5:
1349 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1350 &y, &x, &temp, &n, &lattr))
1351 return NULL;
1352 attr = lattr;
1353 code = wmove(self->win, y, x);
1354 break;
1355 default:
1356 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1357 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001358 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001359
1360 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001361 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001362 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001363 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1364 } else
1365 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001366}
1367
1368static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001369PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001370{
Victor Stinner26486ea2010-05-15 22:23:53 +00001371 int rtn, x, y, use_xy = FALSE;
1372 PyObject *temp;
1373 chtype ch = 0;
1374 attr_t attr = A_NORMAL;
1375 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001376
Victor Stinner26486ea2010-05-15 22:23:53 +00001377 switch (PyTuple_Size(args)) {
1378 case 1:
1379 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1380 return NULL;
1381 break;
1382 case 2:
1383 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1384 return NULL;
1385 attr = lattr;
1386 break;
1387 case 3:
1388 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1389 return NULL;
1390 use_xy = TRUE;
1391 break;
1392 case 4:
1393 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1394 return NULL;
1395 attr = lattr;
1396 use_xy = TRUE;
1397 break;
1398 default:
1399 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1400 return NULL;
1401 }
1402
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001403 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001404 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001405
1406 if (use_xy == TRUE)
1407 rtn = mvwinsch(self->win,y,x, ch | attr);
1408 else {
1409 rtn = winsch(self->win, ch | attr);
1410 }
1411 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001412}
1413
1414static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001415PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001416{
Victor Stinner26486ea2010-05-15 22:23:53 +00001417 int x, y, rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001418
Victor Stinner26486ea2010-05-15 22:23:53 +00001419 switch (PyTuple_Size(args)) {
1420 case 0:
1421 rtn = winch(self->win);
1422 break;
1423 case 2:
1424 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1425 return NULL;
1426 rtn = mvwinch(self->win,y,x);
1427 break;
1428 default:
1429 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1430 return NULL;
1431 }
1432 return PyLong_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001433}
1434
1435static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001436PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001437{
Victor Stinner26486ea2010-05-15 22:23:53 +00001438 int x, y, n;
1439 char rtn[1024]; /* This should be big enough.. I hope */
1440 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001441
Victor Stinner26486ea2010-05-15 22:23:53 +00001442 switch (PyTuple_Size(args)) {
1443 case 0:
1444 rtn2 = winnstr(self->win,rtn, 1023);
1445 break;
1446 case 1:
1447 if (!PyArg_ParseTuple(args,"i;n", &n))
1448 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001449 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001450 break;
1451 case 2:
1452 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1453 return NULL;
1454 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1455 break;
1456 case 3:
1457 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1458 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001459 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001460 break;
1461 default:
1462 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1463 return NULL;
1464 }
1465 if (rtn2 == ERR)
1466 rtn[0] = 0;
1467 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001468}
1469
1470static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001471PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001472{
Victor Stinner26486ea2010-05-15 22:23:53 +00001473 int rtn;
1474 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001475 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001476 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001477#ifdef HAVE_NCURSESW
1478 wchar_t *wstr = NULL;
1479#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001480 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1481 long lattr;
1482 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001483 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001484
Victor Stinner26486ea2010-05-15 22:23:53 +00001485 switch (PyTuple_Size(args)) {
1486 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001487 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001488 return NULL;
1489 break;
1490 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001491 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001492 return NULL;
1493 attr = lattr;
1494 use_attr = TRUE;
1495 break;
1496 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001497 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001498 return NULL;
1499 use_xy = TRUE;
1500 break;
1501 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001502 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001503 return NULL;
1504 attr = lattr;
1505 use_xy = use_attr = TRUE;
1506 break;
1507 default:
1508 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1509 return NULL;
1510 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001511
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001512#ifdef HAVE_NCURSESW
1513 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1514#else
1515 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1516#endif
1517 if (strtype == 0)
1518 return NULL;
1519
Victor Stinner26486ea2010-05-15 22:23:53 +00001520 if (use_attr == TRUE) {
1521 attr_old = getattrs(self->win);
1522 (void)wattrset(self->win,attr);
1523 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001524#ifdef HAVE_NCURSESW
1525 if (strtype == 2) {
1526 funcname = "inswstr";
1527 if (use_xy == TRUE)
1528 rtn = mvwins_wstr(self->win,y,x,wstr);
1529 else
1530 rtn = wins_wstr(self->win,wstr);
1531 PyMem_Free(wstr);
1532 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001533 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001534#endif
1535 {
1536 char *str = PyBytes_AS_STRING(bytesobj);
1537 funcname = "insstr";
1538 if (use_xy == TRUE)
1539 rtn = mvwinsstr(self->win,y,x,str);
1540 else
1541 rtn = winsstr(self->win,str);
1542 Py_DECREF(bytesobj);
1543 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001544 if (use_attr == TRUE)
1545 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001546 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001547}
1548
1549static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001550PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001551{
Victor Stinner26486ea2010-05-15 22:23:53 +00001552 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001553 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001554 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001555#ifdef HAVE_NCURSESW
1556 wchar_t *wstr = NULL;
1557#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001558 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1559 long lattr;
1560 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001561 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001562
Victor Stinner26486ea2010-05-15 22:23:53 +00001563 switch (PyTuple_Size(args)) {
1564 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001565 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001566 return NULL;
1567 break;
1568 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001569 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001570 return NULL;
1571 attr = lattr;
1572 use_attr = TRUE;
1573 break;
1574 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001575 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001576 return NULL;
1577 use_xy = TRUE;
1578 break;
1579 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001580 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001581 return NULL;
1582 attr = lattr;
1583 use_xy = use_attr = TRUE;
1584 break;
1585 default:
1586 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1587 return NULL;
1588 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001589
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001590#ifdef HAVE_NCURSESW
1591 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1592#else
1593 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1594#endif
1595 if (strtype == 0)
1596 return NULL;
1597
Victor Stinner26486ea2010-05-15 22:23:53 +00001598 if (use_attr == TRUE) {
1599 attr_old = getattrs(self->win);
1600 (void)wattrset(self->win,attr);
1601 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001602#ifdef HAVE_NCURSESW
1603 if (strtype == 2) {
1604 funcname = "insn_wstr";
1605 if (use_xy == TRUE)
1606 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1607 else
1608 rtn = wins_nwstr(self->win,wstr,n);
1609 PyMem_Free(wstr);
1610 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001611 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001612#endif
1613 {
1614 char *str = PyBytes_AS_STRING(bytesobj);
1615 funcname = "insnstr";
1616 if (use_xy == TRUE)
1617 rtn = mvwinsnstr(self->win,y,x,str,n);
1618 else
1619 rtn = winsnstr(self->win,str,n);
1620 Py_DECREF(bytesobj);
1621 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001622 if (use_attr == TRUE)
1623 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001624 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001625}
1626
1627static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001628PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001629{
Victor Stinner26486ea2010-05-15 22:23:53 +00001630 int line, erg;
1631 if (!PyArg_ParseTuple(args,"i;line", &line))
1632 return NULL;
1633 erg = is_linetouched(self->win, line);
1634 if (erg == ERR) {
1635 PyErr_SetString(PyExc_TypeError,
1636 "is_linetouched: line number outside of boundaries");
1637 return NULL;
1638 } else
1639 if (erg == FALSE) {
1640 Py_INCREF(Py_False);
1641 return Py_False;
1642 } else {
1643 Py_INCREF(Py_True);
1644 return Py_True;
1645 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001646}
1647
1648static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001649PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001650{
Victor Stinner26486ea2010-05-15 22:23:53 +00001651 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1652 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001653
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001654#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001655 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001656#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001657 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001658#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001659 {
1660 switch(PyTuple_Size(args)) {
1661 case 6:
1662 if (!PyArg_ParseTuple(args,
1663 "iiiiii;" \
1664 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1665 &pminrow, &pmincol, &sminrow,
1666 &smincol, &smaxrow, &smaxcol))
1667 return NULL;
1668 Py_BEGIN_ALLOW_THREADS
1669 rtn = pnoutrefresh(self->win,
1670 pminrow, pmincol, sminrow,
1671 smincol, smaxrow, smaxcol);
1672 Py_END_ALLOW_THREADS
1673 return PyCursesCheckERR(rtn, "pnoutrefresh");
1674 default:
1675 PyErr_SetString(PyCursesError,
1676 "noutrefresh() called for a pad "
1677 "requires 6 arguments");
1678 return NULL;
1679 }
1680 } else {
1681 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1682 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001683
Victor Stinner26486ea2010-05-15 22:23:53 +00001684 Py_BEGIN_ALLOW_THREADS
1685 rtn = wnoutrefresh(self->win);
1686 Py_END_ALLOW_THREADS
1687 return PyCursesCheckERR(rtn, "wnoutrefresh");
1688 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001689}
1690
1691static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001692PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1693{
1694 PyCursesWindowObject *temp;
1695 int use_copywin = FALSE;
1696 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1697 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001698
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001699 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001700 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001701 if (!PyArg_ParseTuple(args, "O!;window object",
1702 &PyCursesWindow_Type, &temp))
1703 return NULL;
1704 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001705 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001706 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1707 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1708 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1709 return NULL;
1710 use_copywin = TRUE;
1711 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001712 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001713 PyErr_SetString(PyExc_TypeError,
1714 "overlay requires one or seven arguments");
1715 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001716 }
1717
1718 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001719 rtn = copywin(self->win, temp->win, sminrow, smincol,
1720 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1721 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001722 }
1723 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001724 rtn = overlay(self->win, temp->win);
1725 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001726 }
1727}
1728
1729static PyObject *
1730PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1731{
1732 PyCursesWindowObject *temp;
1733 int use_copywin = FALSE;
1734 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1735 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001736
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001737 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001738 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001739 if (!PyArg_ParseTuple(args, "O!;window object",
1740 &PyCursesWindow_Type, &temp))
1741 return NULL;
1742 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001743 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001744 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1745 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1746 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1747 return NULL;
1748 use_copywin = TRUE;
1749 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001750 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001751 PyErr_SetString(PyExc_TypeError,
1752 "overwrite requires one or seven arguments");
1753 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001754 }
1755
1756 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001757 rtn = copywin(self->win, temp->win, sminrow, smincol,
1758 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001759 return PyCursesCheckERR(rtn, "copywin");
1760 }
1761 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001762 rtn = overwrite(self->win, temp->win);
1763 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001764 }
1765}
1766
1767static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001768PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001769{
Victor Stinner26486ea2010-05-15 22:23:53 +00001770 /* We have to simulate this by writing to a temporary FILE*,
1771 then reading back, then writing to the argument stream. */
1772 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001773 int fd = -1;
1774 FILE *fp = NULL;
1775 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001776
Victor Stinner26486ea2010-05-15 22:23:53 +00001777 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1778 fd = mkstemp(fn);
1779 if (fd < 0)
1780 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001781 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1782 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001783 fp = fdopen(fd, "wb+");
1784 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001785 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1786 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001787 }
1788 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001789 if (res == NULL)
1790 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001791 fseek(fp, 0, 0);
1792 while (1) {
1793 char buf[BUFSIZ];
1794 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001795 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001796
Victor Stinner26486ea2010-05-15 22:23:53 +00001797 if (n <= 0)
1798 break;
1799 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001800 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001801 if (res == NULL)
1802 break;
1803 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001804
1805exit:
1806 if (fp != NULL)
1807 fclose(fp);
1808 else if (fd != -1)
1809 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001810 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001811 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001812}
1813
1814static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001815PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001816{
Victor Stinner26486ea2010-05-15 22:23:53 +00001817 int beg, num;
1818 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1819 return NULL;
1820 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001821}
1822
1823static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001824PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001825{
Victor Stinner26486ea2010-05-15 22:23:53 +00001826 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1827 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001828
Victor Stinner26486ea2010-05-15 22:23:53 +00001829#ifndef WINDOW_HAS_FLAGS
1830 if (0)
1831#else
1832 if (self->win->_flags & _ISPAD)
1833#endif
1834 {
1835 switch(PyTuple_Size(args)) {
1836 case 6:
1837 if (!PyArg_ParseTuple(args,
1838 "iiiiii;" \
1839 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1840 &pminrow, &pmincol, &sminrow,
1841 &smincol, &smaxrow, &smaxcol))
1842 return NULL;
1843
1844 Py_BEGIN_ALLOW_THREADS
1845 rtn = prefresh(self->win,
1846 pminrow, pmincol, sminrow,
1847 smincol, smaxrow, smaxcol);
1848 Py_END_ALLOW_THREADS
1849 return PyCursesCheckERR(rtn, "prefresh");
1850 default:
1851 PyErr_SetString(PyCursesError,
1852 "refresh() for a pad requires 6 arguments");
1853 return NULL;
1854 }
1855 } else {
1856 if (!PyArg_ParseTuple(args, ":refresh"))
1857 return NULL;
1858 Py_BEGIN_ALLOW_THREADS
1859 rtn = wrefresh(self->win);
1860 Py_END_ALLOW_THREADS
1861 return PyCursesCheckERR(rtn, "prefresh");
1862 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001863}
1864
1865static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001866PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001867{
Victor Stinner26486ea2010-05-15 22:23:53 +00001868 int x, y;
1869 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1870 return NULL;
1871 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001872}
1873
1874static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001875PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001876{
Victor Stinner26486ea2010-05-15 22:23:53 +00001877 WINDOW *win;
1878 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001879
Victor Stinner26486ea2010-05-15 22:23:53 +00001880 nlines = 0;
1881 ncols = 0;
1882 switch (PyTuple_Size(args)) {
1883 case 2:
1884 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1885 return NULL;
1886 break;
1887 case 4:
1888 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1889 &nlines,&ncols,&begin_y,&begin_x))
1890 return NULL;
1891 break;
1892 default:
1893 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1894 return NULL;
1895 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001896
Victor Stinner26486ea2010-05-15 22:23:53 +00001897 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001898#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001899 if (self->win->_flags & _ISPAD)
1900 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1901 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001902#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001903 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001904
Victor Stinner26486ea2010-05-15 22:23:53 +00001905 if (win == NULL) {
1906 PyErr_SetString(PyCursesError, catchall_NULL);
1907 return NULL;
1908 }
1909
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001910 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001911}
1912
1913static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001914PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001915{
Victor Stinner26486ea2010-05-15 22:23:53 +00001916 int nlines;
1917 switch(PyTuple_Size(args)) {
1918 case 0:
1919 return PyCursesCheckERR(scroll(self->win), "scroll");
1920 case 1:
1921 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1922 return NULL;
1923 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1924 default:
1925 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1926 return NULL;
1927 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001928}
1929
1930static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001931PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001932{
Victor Stinner26486ea2010-05-15 22:23:53 +00001933 int st, cnt, val;
1934 switch (PyTuple_Size(args)) {
1935 case 2:
1936 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1937 return NULL;
1938 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1939 case 3:
1940 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1941 return NULL;
1942 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1943 default:
1944 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1945 return NULL;
1946 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001947}
1948
1949static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001950PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001951{
Victor Stinner26486ea2010-05-15 22:23:53 +00001952 PyObject *temp;
1953 chtype ch;
1954 int n, x, y, code = OK;
1955 attr_t attr = A_NORMAL;
1956 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001957
Victor Stinner26486ea2010-05-15 22:23:53 +00001958 switch (PyTuple_Size(args)) {
1959 case 2:
1960 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1961 return NULL;
1962 break;
1963 case 3:
1964 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1965 return NULL;
1966 attr = lattr;
1967 break;
1968 case 4:
1969 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1970 return NULL;
1971 code = wmove(self->win, y, x);
1972 break;
1973 case 5:
1974 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1975 &y, &x, &temp, &n, &lattr))
1976 return NULL;
1977 attr = lattr;
1978 code = wmove(self->win, y, x);
1979 break;
1980 default:
1981 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1982 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001983 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001984
1985 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001986 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001987 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001988 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1989 } else
1990 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001991}
1992
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001993static PyObject *
1994PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1995{
1996 return PyUnicode_FromString(self->encoding);
1997}
1998
1999static int
2000PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
2001{
2002 PyObject *ascii;
2003 char *encoding;
2004
2005 /* It is illegal to del win.encoding */
2006 if (value == NULL) {
2007 PyErr_SetString(PyExc_TypeError,
2008 "encoding may not be deleted");
2009 return -1;
2010 }
2011
2012 if (!PyUnicode_Check(value)) {
2013 PyErr_SetString(PyExc_TypeError,
2014 "setting encoding to a non-string");
2015 return -1;
2016 }
2017 ascii = PyUnicode_AsASCIIString(value);
2018 if (ascii == NULL)
2019 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002020 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002021 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002022 if (encoding == NULL) {
2023 PyErr_NoMemory();
2024 return -1;
2025 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002026 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002027 self->encoding = encoding;
2028 return 0;
2029}
2030
2031
Guido van Rossumf6971e21994-08-30 12:25:20 +00002032static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002033 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002034 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2035 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2036 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2037 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2038 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2039 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2040 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2041 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2042 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2043 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2044 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2045 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2046 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2047 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2048 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2049 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2050 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2051 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2052 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002053#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002054 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002055#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002056 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2057 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2058 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2059 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2060 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002061#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002062 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002063#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002064 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2065 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2066 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2067 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2068 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2069 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2070 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2071 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2072 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2073 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2074 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2075 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2076 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2077 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2078 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2079 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2080 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2081 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2082 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2083 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2084 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2085 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2086 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2087 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2088 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2089 /* Backward compatibility alias -- remove in Python 2.3 */
2090 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2091 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2092 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2093 METH_VARARGS},
2094 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2095 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2096 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2097 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002098#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002099 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002100#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002101 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2102 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2103 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2104 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2105 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2106 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2107 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2108 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2109 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2110 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2111 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2112 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2113 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2114 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2115 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2116 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002117};
2118
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002119static PyGetSetDef PyCursesWindow_getsets[] = {
2120 {"encoding",
2121 (getter)PyCursesWindow_get_encoding,
2122 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002123 "the typecode character used to create the array"},
2124 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002125};
2126
Guido van Rossumf6971e21994-08-30 12:25:20 +00002127/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002128
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002129PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002130 PyVarObject_HEAD_INIT(NULL, 0)
2131 "_curses.curses window", /*tp_name*/
2132 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2133 0, /*tp_itemsize*/
2134 /* methods */
2135 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2136 0, /*tp_print*/
2137 (getattrfunc)0, /*tp_getattr*/
2138 (setattrfunc)0, /*tp_setattr*/
2139 0, /*tp_reserved*/
2140 0, /*tp_repr*/
2141 0, /*tp_as_number*/
2142 0, /*tp_as_sequence*/
2143 0, /*tp_as_mapping*/
2144 0, /*tp_hash*/
2145 0, /*tp_call*/
2146 0, /*tp_str*/
2147 0, /*tp_getattro*/
2148 0, /*tp_setattro*/
2149 0, /*tp_as_buffer*/
2150 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2151 0, /*tp_doc*/
2152 0, /*tp_traverse*/
2153 0, /*tp_clear*/
2154 0, /*tp_richcompare*/
2155 0, /*tp_weaklistoffset*/
2156 0, /*tp_iter*/
2157 0, /*tp_iternext*/
2158 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002159 0, /* tp_members */
2160 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002161};
2162
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163/*********************************************************************
2164 Global Functions
2165**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002166
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002167NoArgNoReturnFunction(beep)
2168NoArgNoReturnFunction(def_prog_mode)
2169NoArgNoReturnFunction(def_shell_mode)
2170NoArgNoReturnFunction(doupdate)
2171NoArgNoReturnFunction(endwin)
2172NoArgNoReturnFunction(flash)
2173NoArgNoReturnFunction(nocbreak)
2174NoArgNoReturnFunction(noecho)
2175NoArgNoReturnFunction(nonl)
2176NoArgNoReturnFunction(noraw)
2177NoArgNoReturnFunction(reset_prog_mode)
2178NoArgNoReturnFunction(reset_shell_mode)
2179NoArgNoReturnFunction(resetty)
2180NoArgNoReturnFunction(savetty)
2181
2182NoArgOrFlagNoReturnFunction(cbreak)
2183NoArgOrFlagNoReturnFunction(echo)
2184NoArgOrFlagNoReturnFunction(nl)
2185NoArgOrFlagNoReturnFunction(raw)
2186
2187NoArgReturnIntFunction(baudrate)
2188NoArgReturnIntFunction(termattrs)
2189
2190NoArgReturnStringFunction(termname)
2191NoArgReturnStringFunction(longname)
2192
2193NoArgTrueFalseFunction(can_change_color)
2194NoArgTrueFalseFunction(has_colors)
2195NoArgTrueFalseFunction(has_ic)
2196NoArgTrueFalseFunction(has_il)
2197NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198NoArgNoReturnVoidFunction(flushinp)
2199NoArgNoReturnVoidFunction(noqiflush)
2200
2201static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002202PyCurses_filter(PyObject *self)
2203{
Victor Stinner26486ea2010-05-15 22:23:53 +00002204 /* not checking for PyCursesInitialised here since filter() must
2205 be called before initscr() */
2206 filter();
2207 Py_INCREF(Py_None);
2208 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002209}
2210
2211static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002212PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213{
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215
Victor Stinner26486ea2010-05-15 22:23:53 +00002216 PyCursesInitialised;
2217 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218
Victor Stinner26486ea2010-05-15 22:23:53 +00002219 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002220
Victor Stinner26486ea2010-05-15 22:23:53 +00002221 if (color_content(color, &r, &g, &b) != ERR)
2222 return Py_BuildValue("(iii)", r, g, b);
2223 else {
2224 PyErr_SetString(PyCursesError,
2225 "Argument 1 was out of range. Check value of COLORS.");
2226 return NULL;
2227 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228}
2229
2230static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002231PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232{
Victor Stinner26486ea2010-05-15 22:23:53 +00002233 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 PyCursesInitialised;
2236 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237
Victor Stinner26486ea2010-05-15 22:23:53 +00002238 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2239 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240}
2241
2242static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002243PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244{
Victor Stinner26486ea2010-05-15 22:23:53 +00002245 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246
Victor Stinner26486ea2010-05-15 22:23:53 +00002247 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002248
Victor Stinner26486ea2010-05-15 22:23:53 +00002249 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 erg = curs_set(vis);
2252 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002253
Victor Stinner26486ea2010-05-15 22:23:53 +00002254 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255}
2256
2257static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002258PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002259{
Victor Stinner26486ea2010-05-15 22:23:53 +00002260 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263
Victor Stinner26486ea2010-05-15 22:23:53 +00002264 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002265
Victor Stinner26486ea2010-05-15 22:23:53 +00002266 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002267}
2268
2269static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002270PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271{
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275
Victor Stinner26486ea2010-05-15 22:23:53 +00002276 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277
Victor Stinner26486ea2010-05-15 22:23:53 +00002278 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279}
2280
2281static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002282PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283{
Victor Stinner26486ea2010-05-15 22:23:53 +00002284 int x = 0;
2285 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002288
Victor Stinner26486ea2010-05-15 22:23:53 +00002289 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002290
Victor Stinner26486ea2010-05-15 22:23:53 +00002291 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292}
2293
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002294#ifdef NCURSES_MOUSE_VERSION
2295static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002296PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002297{
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 int rtn;
2299 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002300
Victor Stinner26486ea2010-05-15 22:23:53 +00002301 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002302
Victor Stinner26486ea2010-05-15 22:23:53 +00002303 rtn = getmouse( &event );
2304 if (rtn == ERR) {
2305 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2306 return NULL;
2307 }
2308 return Py_BuildValue("(hiiil)",
2309 (short)event.id,
2310 event.x, event.y, event.z,
2311 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002312}
2313
2314static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002315PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002316{
Victor Stinner26486ea2010-05-15 22:23:53 +00002317 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002318
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 PyCursesInitialised;
2320 if (!PyArg_ParseTuple(args, "hiiil",
2321 &event.id,
2322 &event.x, &event.y, &event.z,
2323 (int *) &event.bstate))
2324 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002325
Victor Stinner26486ea2010-05-15 22:23:53 +00002326 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002327}
2328#endif
2329
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002330static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002331PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002332{
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002334 int fd = -1;
2335 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002336 PyObject *data;
2337 size_t datalen;
2338 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002339 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002340 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002341
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2345 fd = mkstemp(fn);
2346 if (fd < 0)
2347 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002348 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2349 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 fp = fdopen(fd, "wb+");
2351 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002352 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2353 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002354 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002355
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002356 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002357 if (data == NULL)
2358 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002359 if (!PyBytes_Check(data)) {
2360 PyErr_Format(PyExc_TypeError,
2361 "f.read() returned %.100s instead of bytes",
2362 data->ob_type->tp_name);
2363 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002364 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002365 }
2366 datalen = PyBytes_GET_SIZE(data);
2367 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2368 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002369 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2370 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002371 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002372 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002373
Victor Stinner26486ea2010-05-15 22:23:53 +00002374 fseek(fp, 0, 0);
2375 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 if (win == NULL) {
2377 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002378 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002380 res = PyCursesWindow_New(win, NULL);
2381
2382error:
2383 if (fp != NULL)
2384 fclose(fp);
2385 else if (fd != -1)
2386 close(fd);
2387 remove(fn);
2388 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389}
2390
2391static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002392PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393{
Victor Stinner26486ea2010-05-15 22:23:53 +00002394 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395
Victor Stinner26486ea2010-05-15 22:23:53 +00002396 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397
Victor Stinner26486ea2010-05-15 22:23:53 +00002398 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002399
Victor Stinner26486ea2010-05-15 22:23:53 +00002400 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401}
2402
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002403#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002404/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002405static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002406{
Victor Stinner26486ea2010-05-15 22:23:53 +00002407 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002412
Victor Stinner26486ea2010-05-15 22:23:53 +00002413 if (has_key(ch) == FALSE) {
2414 Py_INCREF(Py_False);
2415 return Py_False;
2416 }
2417 Py_INCREF(Py_True);
2418 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002419}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002420#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421
2422static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002423PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002424{
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002426
Victor Stinner26486ea2010-05-15 22:23:53 +00002427 PyCursesInitialised;
2428 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002429
Victor Stinner26486ea2010-05-15 22:23:53 +00002430 switch(PyTuple_Size(args)) {
2431 case 4:
2432 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2433 break;
2434 default:
2435 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2436 return NULL;
2437 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002438
Victor Stinner26486ea2010-05-15 22:23:53 +00002439 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002440}
2441
2442static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002443PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002444{
Victor Stinner26486ea2010-05-15 22:23:53 +00002445 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002446
Victor Stinner26486ea2010-05-15 22:23:53 +00002447 PyCursesInitialised;
2448 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002449
Victor Stinner26486ea2010-05-15 22:23:53 +00002450 if (PyTuple_Size(args) != 3) {
2451 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2452 return NULL;
2453 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002454
Victor Stinner26486ea2010-05-15 22:23:53 +00002455 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002456
Victor Stinner26486ea2010-05-15 22:23:53 +00002457 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002458}
2459
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002460static PyObject *ModDict;
2461
Victor Stinner26486ea2010-05-15 22:23:53 +00002462static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002463PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002464{
Victor Stinner26486ea2010-05-15 22:23:53 +00002465 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002466 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002467
Victor Stinner26486ea2010-05-15 22:23:53 +00002468 if (initialised == TRUE) {
2469 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002470 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002472
Victor Stinner26486ea2010-05-15 22:23:53 +00002473 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002474
Victor Stinner26486ea2010-05-15 22:23:53 +00002475 if (win == NULL) {
2476 PyErr_SetString(PyCursesError, catchall_NULL);
2477 return NULL;
2478 }
Guido van Rossum85738471995-02-17 13:50:17 +00002479
Victor Stinner26486ea2010-05-15 22:23:53 +00002480 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002481
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002482/* This was moved from initcurses() because it core dumped on SGI,
2483 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002484#define SetDictInt(string,ch) \
2485 do { \
2486 PyObject *o = PyLong_FromLong((long) (ch)); \
2487 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2488 Py_DECREF(o); \
2489 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002490 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002491
Victor Stinner26486ea2010-05-15 22:23:53 +00002492 /* Here are some graphic symbols you can use */
2493 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2494 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2495 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2496 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2497 SetDictInt("ACS_LTEE", (ACS_LTEE));
2498 SetDictInt("ACS_RTEE", (ACS_RTEE));
2499 SetDictInt("ACS_BTEE", (ACS_BTEE));
2500 SetDictInt("ACS_TTEE", (ACS_TTEE));
2501 SetDictInt("ACS_HLINE", (ACS_HLINE));
2502 SetDictInt("ACS_VLINE", (ACS_VLINE));
2503 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002504#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002505 /* On HP/UX 11, these are of type cchar_t, which is not an
2506 integral type. If this is a problem on more platforms, a
2507 configure test should be added to determine whether ACS_S1
2508 is of integral type. */
2509 SetDictInt("ACS_S1", (ACS_S1));
2510 SetDictInt("ACS_S9", (ACS_S9));
2511 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2512 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2513 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2514 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2515 SetDictInt("ACS_BULLET", (ACS_BULLET));
2516 SetDictInt("ACS_LARROW", (ACS_LARROW));
2517 SetDictInt("ACS_RARROW", (ACS_RARROW));
2518 SetDictInt("ACS_DARROW", (ACS_DARROW));
2519 SetDictInt("ACS_UARROW", (ACS_UARROW));
2520 SetDictInt("ACS_BOARD", (ACS_BOARD));
2521 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2522 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002523#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002524 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2525 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2526 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2527 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2528 SetDictInt("ACS_SBSS", (ACS_RTEE));
2529 SetDictInt("ACS_SSSB", (ACS_LTEE));
2530 SetDictInt("ACS_SSBS", (ACS_BTEE));
2531 SetDictInt("ACS_BSSS", (ACS_TTEE));
2532 SetDictInt("ACS_BSBS", (ACS_HLINE));
2533 SetDictInt("ACS_SBSB", (ACS_VLINE));
2534 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002535
Victor Stinner26486ea2010-05-15 22:23:53 +00002536 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002537#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002539#endif
2540#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002541 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002542#endif
2543#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002545#endif
2546#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002548#endif
2549#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002550 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002551#endif
2552#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002553 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002554#endif
2555#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002557#endif
2558
Victor Stinner26486ea2010-05-15 22:23:53 +00002559 SetDictInt("LINES", LINES);
2560 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002561
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002562 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2563 screen_encoding = winobj->encoding;
2564 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002565}
2566
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002567static PyObject *
2568PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2569{
Victor Stinner26486ea2010-05-15 22:23:53 +00002570 int fd = -1;
2571 int err;
2572 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002573
Victor Stinner26486ea2010-05-15 22:23:53 +00002574 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002575
Victor Stinner26486ea2010-05-15 22:23:53 +00002576 if (!PyArg_ParseTupleAndKeywords(
2577 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2578 return NULL;
2579 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002580
Victor Stinner26486ea2010-05-15 22:23:53 +00002581 if (fd == -1) {
2582 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002583
Victor Stinnerbd303c12013-11-07 23:07:29 +01002584 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002585
Victor Stinner26486ea2010-05-15 22:23:53 +00002586 if (sys_stdout == NULL || sys_stdout == Py_None) {
2587 PyErr_SetString(
2588 PyCursesError,
2589 "lost sys.stdout");
2590 return NULL;
2591 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002592
Victor Stinner26486ea2010-05-15 22:23:53 +00002593 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002594
Victor Stinner26486ea2010-05-15 22:23:53 +00002595 if (fd == -1) {
2596 return NULL;
2597 }
2598 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002599
Matthias Klose635edd12010-07-30 21:40:57 +00002600 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002602
Victor Stinner26486ea2010-05-15 22:23:53 +00002603 if (err == 0) {
2604 s = "setupterm: could not find terminal";
2605 } else if (err == -1) {
2606 s = "setupterm: could not find terminfo database";
2607 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 PyErr_SetString(PyCursesError,s);
2610 return NULL;
2611 }
2612
2613 initialised_setupterm = TRUE;
2614
2615 Py_INCREF(Py_None);
2616 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002617}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002618
2619static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002620PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002621{
Victor Stinner26486ea2010-05-15 22:23:53 +00002622 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002623
Victor Stinner26486ea2010-05-15 22:23:53 +00002624 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625
Victor Stinner26486ea2010-05-15 22:23:53 +00002626 switch(PyTuple_Size(args)) {
2627 case 1:
2628 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2629 break;
2630 default:
2631 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2632 return NULL;
2633 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
Victor Stinner26486ea2010-05-15 22:23:53 +00002635 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002636}
2637
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002638#ifdef HAVE_CURSES_IS_TERM_RESIZED
2639static PyObject *
2640PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2641{
Victor Stinner26486ea2010-05-15 22:23:53 +00002642 int lines;
2643 int columns;
2644 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002645
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002647
Victor Stinner26486ea2010-05-15 22:23:53 +00002648 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2649 return NULL;
2650 result = is_term_resized(lines, columns);
2651 if (result == TRUE) {
2652 Py_INCREF(Py_True);
2653 return Py_True;
2654 } else {
2655 Py_INCREF(Py_False);
2656 return Py_False;
2657 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002658}
2659#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2660
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002661#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002662static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002663PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002664{
Victor Stinner26486ea2010-05-15 22:23:53 +00002665 const char *knp;
2666 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002667
Victor Stinner26486ea2010-05-15 22:23:53 +00002668 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002669
Victor Stinner26486ea2010-05-15 22:23:53 +00002670 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002671
Victor Stinner26486ea2010-05-15 22:23:53 +00002672 if (ch < 0) {
2673 PyErr_SetString(PyExc_ValueError, "invalid key number");
2674 return NULL;
2675 }
2676 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002677
Victor Stinner26486ea2010-05-15 22:23:53 +00002678 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002679}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002680#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002681
Victor Stinner26486ea2010-05-15 22:23:53 +00002682static PyObject *
2683PyCurses_KillChar(PyObject *self)
2684{
2685 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002686
Victor Stinner26486ea2010-05-15 22:23:53 +00002687 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002688
Victor Stinner26486ea2010-05-15 22:23:53 +00002689 return PyBytes_FromStringAndSize(&ch, 1);
2690}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691
2692static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002693PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694{
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002696
Victor Stinner26486ea2010-05-15 22:23:53 +00002697 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002698
Victor Stinner26486ea2010-05-15 22:23:53 +00002699 switch(PyTuple_Size(args)) {
2700 case 1:
2701 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2702 break;
2703 default:
2704 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2705 return NULL;
2706 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002707
Victor Stinner26486ea2010-05-15 22:23:53 +00002708 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002709}
2710
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002711#ifdef NCURSES_MOUSE_VERSION
2712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002713PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002714{
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 int interval;
2716 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002717
Victor Stinner26486ea2010-05-15 22:23:53 +00002718 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2719 return NULL;
2720 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002721}
2722
2723static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002724PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002725{
Victor Stinner26486ea2010-05-15 22:23:53 +00002726 int newmask;
2727 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002728
Victor Stinner26486ea2010-05-15 22:23:53 +00002729 PyCursesInitialised;
2730 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2731 return NULL;
2732 availmask = mousemask(newmask, &oldmask);
2733 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002734}
2735#endif
2736
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002737static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002738PyCurses_Napms(PyObject *self, PyObject *args)
2739{
2740 int ms;
2741
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002742 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002743 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002744
2745 return Py_BuildValue("i", napms(ms));
2746}
2747
2748
2749static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002750PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751{
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 WINDOW *win;
2753 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756
Victor Stinner26486ea2010-05-15 22:23:53 +00002757 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002758
Victor Stinner26486ea2010-05-15 22:23:53 +00002759 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002760
Victor Stinner26486ea2010-05-15 22:23:53 +00002761 if (win == NULL) {
2762 PyErr_SetString(PyCursesError, catchall_NULL);
2763 return NULL;
2764 }
2765
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002766 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002767}
2768
2769static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002770PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002771{
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 WINDOW *win;
2773 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002774
Victor Stinner26486ea2010-05-15 22:23:53 +00002775 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002776
Victor Stinner26486ea2010-05-15 22:23:53 +00002777 switch (PyTuple_Size(args)) {
2778 case 2:
2779 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2780 return NULL;
2781 break;
2782 case 4:
2783 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2784 &nlines,&ncols,&begin_y,&begin_x))
2785 return NULL;
2786 break;
2787 default:
2788 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2789 return NULL;
2790 }
Guido van Rossum85738471995-02-17 13:50:17 +00002791
Victor Stinner26486ea2010-05-15 22:23:53 +00002792 win = newwin(nlines,ncols,begin_y,begin_x);
2793 if (win == NULL) {
2794 PyErr_SetString(PyCursesError, catchall_NULL);
2795 return NULL;
2796 }
Guido van Rossum85738471995-02-17 13:50:17 +00002797
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002798 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002799}
2800
2801static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002802PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002803{
Victor Stinner26486ea2010-05-15 22:23:53 +00002804 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002805
Victor Stinner26486ea2010-05-15 22:23:53 +00002806 PyCursesInitialised;
2807 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002808
Victor Stinner26486ea2010-05-15 22:23:53 +00002809 switch(PyTuple_Size(args)) {
2810 case 1:
2811 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2812 break;
2813 default:
2814 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2815 return NULL;
2816 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002817
Victor Stinner26486ea2010-05-15 22:23:53 +00002818 if (pair_content(pair, &f, &b)==ERR) {
2819 PyErr_SetString(PyCursesError,
2820 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2821 return NULL;
2822 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002823
Victor Stinner26486ea2010-05-15 22:23:53 +00002824 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002825}
2826
2827static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002828PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002829{
Victor Stinner26486ea2010-05-15 22:23:53 +00002830 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 PyCursesInitialised;
2833 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002834
Victor Stinner26486ea2010-05-15 22:23:53 +00002835 switch(PyTuple_Size(args)) {
2836 case 1:
2837 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2838 break;
2839 default:
2840 PyErr_SetString(PyExc_TypeError,
2841 "pair_number requires 1 argument");
2842 return NULL;
2843 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002844
Victor Stinner26486ea2010-05-15 22:23:53 +00002845 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002846}
2847
2848static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002849PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002850{
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002852
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002853 if (!PyArg_ParseTuple(args,"y;str", &str))
2854 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002855 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002856}
2857
2858static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002859PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860{
Victor Stinner26486ea2010-05-15 22:23:53 +00002861 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002862
Victor Stinner26486ea2010-05-15 22:23:53 +00002863 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002864
Victor Stinner26486ea2010-05-15 22:23:53 +00002865 switch(PyTuple_Size(args)) {
2866 case 0:
2867 qiflush();
2868 Py_INCREF(Py_None);
2869 return Py_None;
2870 case 1:
2871 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2872 if (flag) qiflush();
2873 else noqiflush();
2874 Py_INCREF(Py_None);
2875 return Py_None;
2876 default:
2877 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2878 return NULL;
2879 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002880}
2881
Guido van Rossumd8faa362007-04-27 19:54:29 +00002882/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2883 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002884#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002885static int
2886update_lines_cols(void)
2887{
Victor Stinner26486ea2010-05-15 22:23:53 +00002888 PyObject *o;
2889 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002890 _Py_IDENTIFIER(LINES);
2891 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002892
Victor Stinner26486ea2010-05-15 22:23:53 +00002893 if (!m)
2894 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002895
Victor Stinner26486ea2010-05-15 22:23:53 +00002896 o = PyLong_FromLong(LINES);
2897 if (!o) {
2898 Py_DECREF(m);
2899 return 0;
2900 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002901 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002902 Py_DECREF(m);
2903 Py_DECREF(o);
2904 return 0;
2905 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002906 /* PyId_LINES.object will be initialized here. */
2907 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 Py_DECREF(m);
2909 Py_DECREF(o);
2910 return 0;
2911 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002912 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002913 o = PyLong_FromLong(COLS);
2914 if (!o) {
2915 Py_DECREF(m);
2916 return 0;
2917 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002918 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 Py_DECREF(m);
2920 Py_DECREF(o);
2921 return 0;
2922 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002923 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002924 Py_DECREF(m);
2925 Py_DECREF(o);
2926 return 0;
2927 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002928 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002929 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002930 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002931}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002932#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002933
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002934#ifdef HAVE_CURSES_RESIZETERM
2935static PyObject *
2936PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2937{
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 int lines;
2939 int columns;
2940 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002941
Victor Stinner26486ea2010-05-15 22:23:53 +00002942 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002943
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2945 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002946
Victor Stinner26486ea2010-05-15 22:23:53 +00002947 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2948 if (!result)
2949 return NULL;
2950 if (!update_lines_cols())
2951 return NULL;
2952 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002953}
2954
2955#endif
2956
2957#ifdef HAVE_CURSES_RESIZE_TERM
2958static PyObject *
2959PyCurses_Resize_Term(PyObject *self, PyObject *args)
2960{
Victor Stinner26486ea2010-05-15 22:23:53 +00002961 int lines;
2962 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002963
Victor Stinner26486ea2010-05-15 22:23:53 +00002964 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002965
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002967
Victor Stinner26486ea2010-05-15 22:23:53 +00002968 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2969 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002970
Victor Stinner26486ea2010-05-15 22:23:53 +00002971 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2972 if (!result)
2973 return NULL;
2974 if (!update_lines_cols())
2975 return NULL;
2976 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002977}
2978#endif /* HAVE_CURSES_RESIZE_TERM */
2979
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002980static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002981PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002982{
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002984
Victor Stinner26486ea2010-05-15 22:23:53 +00002985 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002986
Victor Stinner26486ea2010-05-15 22:23:53 +00002987 if (PyTuple_Size(args)!=2) {
2988 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2989 return NULL;
2990 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002991
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002993
Victor Stinner26486ea2010-05-15 22:23:53 +00002994 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002995
Victor Stinner26486ea2010-05-15 22:23:53 +00002996 Py_INCREF(Py_None);
2997 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002998}
2999
3000static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00003001PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003002{
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 int code;
3004 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003005
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003007
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 code = start_color();
3009 if (code != ERR) {
3010 initialisedcolors = TRUE;
3011 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003012 if (c == NULL)
3013 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 PyDict_SetItemString(ModDict, "COLORS", c);
3015 Py_DECREF(c);
3016 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003017 if (cp == NULL)
3018 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3020 Py_DECREF(cp);
3021 Py_INCREF(Py_None);
3022 return Py_None;
3023 } else {
3024 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3025 return NULL;
3026 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003027}
3028
3029static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003030PyCurses_tigetflag(PyObject *self, PyObject *args)
3031{
Victor Stinner26486ea2010-05-15 22:23:53 +00003032 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003033
Victor Stinner26486ea2010-05-15 22:23:53 +00003034 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003035
Victor Stinner26486ea2010-05-15 22:23:53 +00003036 if (!PyArg_ParseTuple(args, "s", &capname))
3037 return NULL;
3038
3039 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003040}
3041
3042static PyObject *
3043PyCurses_tigetnum(PyObject *self, PyObject *args)
3044{
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003046
Victor Stinner26486ea2010-05-15 22:23:53 +00003047 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 if (!PyArg_ParseTuple(args, "s", &capname))
3050 return NULL;
3051
3052 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003053}
3054
3055static PyObject *
3056PyCurses_tigetstr(PyObject *self, PyObject *args)
3057{
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003059
Victor Stinner26486ea2010-05-15 22:23:53 +00003060 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003061
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 if (!PyArg_ParseTuple(args, "s", &capname))
3063 return NULL;
3064
3065 capname = tigetstr( capname );
3066 if (capname == 0 || capname == (char*) -1) {
3067 Py_INCREF(Py_None);
3068 return Py_None;
3069 }
3070 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003071}
3072
3073static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003074PyCurses_tparm(PyObject *self, PyObject *args)
3075{
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 char* fmt;
3077 char* result = NULL;
3078 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 +00003079
Victor Stinner26486ea2010-05-15 22:23:53 +00003080 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003081
Victor Stinner26621332011-11-02 23:45:29 +01003082 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 &fmt, &i1, &i2, &i3, &i4,
3084 &i5, &i6, &i7, &i8, &i9)) {
3085 return NULL;
3086 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003087
Victor Stinner26486ea2010-05-15 22:23:53 +00003088 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3089 if (!result) {
3090 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3091 return NULL;
3092 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003093
Victor Stinner26486ea2010-05-15 22:23:53 +00003094 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003095}
3096
3097static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003098PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003099{
Victor Stinner26486ea2010-05-15 22:23:53 +00003100 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003101
Victor Stinner26486ea2010-05-15 22:23:53 +00003102 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003103
Victor Stinner26486ea2010-05-15 22:23:53 +00003104 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003105
Victor Stinner26486ea2010-05-15 22:23:53 +00003106 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003107}
3108
3109static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003110PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003111{
Victor Stinner26486ea2010-05-15 22:23:53 +00003112 PyObject *temp;
3113 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003114
Victor Stinner26486ea2010-05-15 22:23:53 +00003115 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003116
Victor Stinner26486ea2010-05-15 22:23:53 +00003117 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003118
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003119 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003120 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003121
Victor Stinner26486ea2010-05-15 22:23:53 +00003122 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003123}
3124
3125static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003126PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003127{
Victor Stinner26486ea2010-05-15 22:23:53 +00003128 PyObject *temp;
3129 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003130
Victor Stinner26486ea2010-05-15 22:23:53 +00003131 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003132
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003133 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003134 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003135
3136 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3137 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003138
Victor Stinner26486ea2010-05-15 22:23:53 +00003139 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003140}
3141
Victor Stinner71e44cb2011-09-06 01:53:03 +02003142#ifdef HAVE_NCURSESW
3143/* Convert an object to a character (wchar_t):
3144
3145 - int
3146 - str of length 1
3147
3148 Return 1 on success, 0 on error. */
3149static int
3150PyCurses_ConvertToWchar_t(PyObject *obj,
3151 wchar_t *wch)
3152{
3153 if (PyUnicode_Check(obj)) {
3154 wchar_t buffer[2];
3155 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3156 PyErr_Format(PyExc_TypeError,
3157 "expect bytes or str of length 1, or int, "
3158 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003159 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003160 return 0;
3161 }
3162 *wch = buffer[0];
3163 return 2;
3164 }
3165 else if (PyLong_CheckExact(obj)) {
3166 long value;
3167 int overflow;
3168 value = PyLong_AsLongAndOverflow(obj, &overflow);
3169 if (overflow) {
3170 PyErr_SetString(PyExc_OverflowError,
3171 "int doesn't fit in long");
3172 return 0;
3173 }
3174 *wch = (wchar_t)value;
3175 if ((long)*wch != value) {
3176 PyErr_Format(PyExc_OverflowError,
3177 "character doesn't fit in wchar_t");
3178 return 0;
3179 }
3180 return 1;
3181 }
3182 else {
3183 PyErr_Format(PyExc_TypeError,
3184 "expect bytes or str of length 1, or int, got %s",
3185 Py_TYPE(obj)->tp_name);
3186 return 0;
3187 }
3188}
3189
3190static PyObject *
3191PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3192{
3193 PyObject *obj;
3194 wchar_t wch;
3195
3196 PyCursesInitialised;
3197
3198 if (!PyArg_ParseTuple(args,"O", &obj))
3199 return NULL;
3200
3201 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3202 return NULL;
3203 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3204}
3205#endif
3206
Guido van Rossumf6971e21994-08-30 12:25:20 +00003207static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003208PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003209{
Victor Stinner26486ea2010-05-15 22:23:53 +00003210 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003211
Victor Stinner26486ea2010-05-15 22:23:53 +00003212 switch(PyTuple_Size(args)) {
3213 case 1:
3214 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3215 return NULL;
3216 break;
3217 default:
3218 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3219 return NULL;
3220 }
3221 use_env(flag);
3222 Py_INCREF(Py_None);
3223 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003224}
3225
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003226#ifndef STRICT_SYSV_CURSES
3227static PyObject *
3228PyCurses_Use_Default_Colors(PyObject *self)
3229{
Victor Stinner26486ea2010-05-15 22:23:53 +00003230 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003231
Victor Stinner26486ea2010-05-15 22:23:53 +00003232 PyCursesInitialised;
3233 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003234
Victor Stinner26486ea2010-05-15 22:23:53 +00003235 code = use_default_colors();
3236 if (code != ERR) {
3237 Py_INCREF(Py_None);
3238 return Py_None;
3239 } else {
3240 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3241 return NULL;
3242 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003243}
3244#endif /* STRICT_SYSV_CURSES */
3245
Guido van Rossumf6971e21994-08-30 12:25:20 +00003246/* List of functions defined in the module */
3247
3248static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003249 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3250 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3251 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3252 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3253 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3254 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3255 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3256 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3257 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3258 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3259 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3260 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3261 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3262 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3263 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3264 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3265 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003266#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003267 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3268 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003269#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003270 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3271 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3272 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3273 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3274 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003275#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003276 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003277#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003278 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3279 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3280 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3281 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3282 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3283 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003284#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003285 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003286#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003287#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003288 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003289#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3291 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3292 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003293#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3295 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003296#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003297 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3298 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3299 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3300 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3301 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3302 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3303 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3304 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3305 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3306 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3307 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3308 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3309 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3310 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3311 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3312 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3313 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003314#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003315 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003316#endif
3317#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003318 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003320 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3321 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3322 {"setupterm", (PyCFunction)PyCurses_setupterm,
3323 METH_VARARGS|METH_KEYWORDS},
3324 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3325 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3326 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3327 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3328 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3329 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3330 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3331 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3332 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3333 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003334#ifdef HAVE_NCURSESW
3335 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3336#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003337 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003338#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003339 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003340#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003341 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003342};
3343
3344/* Initialization function for the module */
3345
Martin v. Löwis1a214512008-06-11 05:26:20 +00003346
3347static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003348 PyModuleDef_HEAD_INIT,
3349 "_curses",
3350 NULL,
3351 -1,
3352 PyCurses_methods,
3353 NULL,
3354 NULL,
3355 NULL,
3356 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003357};
3358
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003359PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003360PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003361{
Victor Stinner26486ea2010-05-15 22:23:53 +00003362 PyObject *m, *d, *v, *c_api_object;
3363 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003364
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 /* Initialize object type */
3366 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3367 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003368
Victor Stinner26486ea2010-05-15 22:23:53 +00003369 /* Initialize the C API pointer array */
3370 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3371 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3372 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3373 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003374
Victor Stinner26486ea2010-05-15 22:23:53 +00003375 /* Create the module and add the functions */
3376 m = PyModule_Create(&_cursesmodule);
3377 if (m == NULL)
3378 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003379
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 /* Add some symbolic constants to the module */
3381 d = PyModule_GetDict(m);
3382 if (d == NULL)
3383 return NULL;
3384 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003385
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 /* Add a capsule for the C API */
3387 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3388 PyDict_SetItemString(d, "_C_API", c_api_object);
3389 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003390
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 /* For exception curses.error */
3392 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3393 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003394
Victor Stinner26486ea2010-05-15 22:23:53 +00003395 /* Make the version available */
3396 v = PyBytes_FromString(PyCursesVersion);
3397 PyDict_SetItemString(d, "version", v);
3398 PyDict_SetItemString(d, "__version__", v);
3399 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003400
Victor Stinner26486ea2010-05-15 22:23:53 +00003401 SetDictInt("ERR", ERR);
3402 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003403
Victor Stinner26486ea2010-05-15 22:23:53 +00003404 /* Here are some attributes you can add to chars to print */
3405
3406 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3407 SetDictInt("A_NORMAL", A_NORMAL);
3408 SetDictInt("A_STANDOUT", A_STANDOUT);
3409 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3410 SetDictInt("A_REVERSE", A_REVERSE);
3411 SetDictInt("A_BLINK", A_BLINK);
3412 SetDictInt("A_DIM", A_DIM);
3413 SetDictInt("A_BOLD", A_BOLD);
3414 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003415#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003416 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003417#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003418 SetDictInt("A_PROTECT", A_PROTECT);
3419 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3420 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003421
Victor Stinner26486ea2010-05-15 22:23:53 +00003422 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003423#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003424 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003425#endif
3426#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003427 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003428#endif
3429#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003430 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003431#endif
3432#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003433 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003434#endif
3435#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003436 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003437#endif
3438#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003439 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003440#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003441
Victor Stinner26486ea2010-05-15 22:23:53 +00003442 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3443 SetDictInt("COLOR_RED", COLOR_RED);
3444 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3445 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3446 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3447 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3448 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3449 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003450
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003451#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003452 /* Mouse-related constants */
3453 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3454 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3455 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3456 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3457 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003458
Victor Stinner26486ea2010-05-15 22:23:53 +00003459 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3460 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3461 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3462 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3463 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003464
Victor Stinner26486ea2010-05-15 22:23:53 +00003465 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3466 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3467 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3468 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3469 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003470
Victor Stinner26486ea2010-05-15 22:23:53 +00003471 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3472 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3473 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3474 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3475 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003476
Victor Stinner26486ea2010-05-15 22:23:53 +00003477 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3478 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3479 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003480
Victor Stinner26486ea2010-05-15 22:23:53 +00003481 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3482 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003483#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003484 /* Now set everything up for KEY_ variables */
3485 {
3486 int key;
3487 char *key_n;
3488 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003489#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003490 for (key=KEY_MIN;key < KEY_MAX; key++) {
3491 key_n = (char *)keyname(key);
3492 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3493 continue;
3494 if (strncmp(key_n,"KEY_F(",6)==0) {
3495 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003496 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003497 if (!key_n2) {
3498 PyErr_NoMemory();
3499 break;
3500 }
3501 p1 = key_n;
3502 p2 = key_n2;
3503 while (*p1) {
3504 if (*p1 != '(' && *p1 != ')') {
3505 *p2 = *p1;
3506 p2++;
3507 }
3508 p1++;
3509 }
3510 *p2 = (char)0;
3511 } else
3512 key_n2 = key_n;
3513 SetDictInt(key_n2,key);
3514 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003515 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003516 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003517#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003518 SetDictInt("KEY_MIN", KEY_MIN);
3519 SetDictInt("KEY_MAX", KEY_MAX);
3520 }
3521 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003522}