blob: 6e4869387368772e77dadb384b2e9fa0867772d2 [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
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000137/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000138
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000139static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000140
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000141/* Tells whether setupterm() has been called to initialise terminfo. */
142static int initialised_setupterm = FALSE;
143
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000144/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000145static int initialised = FALSE;
146
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000147/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000148static int initialisedcolors = FALSE;
149
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100150static char *screen_encoding = NULL;
151
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000152/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000153#define PyCursesSetupTermCalled \
154 if (initialised_setupterm != TRUE) { \
155 PyErr_SetString(PyCursesError, \
156 "must call (at least) setupterm() first"); \
157 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000158
Victor Stinner26486ea2010-05-15 22:23:53 +0000159#define PyCursesInitialised \
160 if (initialised != TRUE) { \
161 PyErr_SetString(PyCursesError, \
162 "must call initscr() first"); \
163 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000164
Victor Stinner26486ea2010-05-15 22:23:53 +0000165#define PyCursesInitialisedColor \
166 if (initialisedcolors != TRUE) { \
167 PyErr_SetString(PyCursesError, \
168 "must call start_color() first"); \
169 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000170
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000171/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000172
Guido van Rossum85738471995-02-17 13:50:17 +0000173/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000174 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000175 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000176 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000177 */
178
179static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100180PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000181{
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 if (code != ERR) {
183 Py_INCREF(Py_None);
184 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000185 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000186 if (fname == NULL) {
187 PyErr_SetString(PyCursesError, catchall_ERR);
188 } else {
189 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
190 }
191 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000192 }
Guido van Rossum85738471995-02-17 13:50:17 +0000193}
194
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100195/* Convert an object to a byte (an integer of type chtype):
196
197 - int
198 - bytes of length 1
199 - str of length 1
200
201 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000202static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100203PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000204{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100205 long value;
206 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
207 value = (unsigned char)PyBytes_AsString(obj)[0];
208 }
209 else if (PyUnicode_Check(obj)) {
210 if (PyUnicode_GetLength(obj) != 1) {
211 PyErr_Format(PyExc_TypeError,
212 "expect bytes or str of length 1, or int, "
213 "got a str of length %zi",
214 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000215 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100216 }
217 value = PyUnicode_READ_CHAR(obj, 0);
218 if (128 < value) {
219 PyObject *bytes;
220 const char *encoding;
221 if (win)
222 encoding = win->encoding;
223 else
224 encoding = screen_encoding;
225 bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
226 if (bytes == NULL)
227 return 0;
228 if (PyBytes_GET_SIZE(bytes) == 1)
229 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
230 else
231 value = -1;
232 Py_DECREF(bytes);
233 if (value < 0)
234 goto overflow;
235 }
236 }
237 else if (PyLong_CheckExact(obj)) {
238 int long_overflow;
239 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
240 if (long_overflow)
241 goto overflow;
242 }
243 else {
244 PyErr_Format(PyExc_TypeError,
245 "expect bytes or str of length 1, or int, got %s",
246 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000247 return 0;
248 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100249 *ch = (chtype)value;
250 if ((long)*ch != value)
251 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000252 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100253
254overflow:
255 PyErr_SetString(PyExc_OverflowError,
256 "byte doesn't fit in chtype");
257 return 0;
258}
259
260/* Convert an object to a byte (chtype) or a character (cchar_t):
261
262 - int
263 - bytes of length 1
264 - str of length 1
265
266 Return:
267
268 - 2 if obj is a character (written into *wch)
269 - 1 if obj is a byte (written into *ch)
270 - 0 on error: raise an exception */
271static int
272PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
273 chtype *ch
274#ifdef HAVE_NCURSESW
275 , cchar_t *wch
276#endif
277 )
278{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100279 long value;
280#ifdef HAVE_NCURSESW
281 wchar_t buffer[2];
282#endif
283
284 if (PyUnicode_Check(obj)) {
285#ifdef HAVE_NCURSESW
286 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
287 PyErr_Format(PyExc_TypeError,
288 "expect bytes or str of length 1, or int, "
289 "got a str of length %zi",
290 PyUnicode_GET_LENGTH(obj));
291 return 0;
292 }
293 memset(wch->chars, 0, sizeof(wch->chars));
294 wch->chars[0] = buffer[0];
295 return 2;
296#else
297 return PyCurses_ConvertToChtype(win, obj, ch);
298#endif
299 }
300 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
301 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100302 }
303 else if (PyLong_CheckExact(obj)) {
304 int overflow;
305 value = PyLong_AsLongAndOverflow(obj, &overflow);
306 if (overflow) {
307 PyErr_SetString(PyExc_OverflowError,
308 "int doesn't fit in long");
309 return 0;
310 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100311 }
312 else {
313 PyErr_Format(PyExc_TypeError,
314 "expect bytes or str of length 1, or int, got %s",
315 Py_TYPE(obj)->tp_name);
316 return 0;
317 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200318
319 *ch = (chtype)value;
320 if ((long)*ch != value) {
321 PyErr_Format(PyExc_OverflowError,
322 "byte doesn't fit in chtype");
323 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100324 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200325 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100326}
327
328/* Convert an object to a byte string (char*) or a wide character string
329 (wchar_t*). Return:
330
331 - 2 if obj is a character string (written into *wch)
332 - 1 if obj is a byte string (written into *bytes)
333 - 0 on error: raise an exception */
334static int
335PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
336 PyObject **bytes, wchar_t **wstr)
337{
338 if (PyUnicode_Check(obj)) {
339#ifdef HAVE_NCURSESW
340 assert (wstr != NULL);
341 *wstr = PyUnicode_AsWideCharString(obj, NULL);
342 if (*wstr == NULL)
343 return 0;
344 return 2;
345#else
346 assert (wstr == NULL);
347 *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
348 if (*bytes == NULL)
349 return 0;
350 return 1;
351#endif
352 }
353 else if (PyBytes_Check(obj)) {
354 Py_INCREF(obj);
355 *bytes = obj;
356 return 1;
357 }
358
359 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
360 Py_TYPE(obj)->tp_name);
361 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000362}
363
Benjamin Peterson21896a32010-03-21 22:03:03 +0000364/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000365 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000366
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000367static int func_PyCursesSetupTermCalled(void)
368{
369 PyCursesSetupTermCalled;
370 return 1;
371}
372
373static int func_PyCursesInitialised(void)
374{
375 PyCursesInitialised;
376 return 1;
377}
378
379static int func_PyCursesInitialisedColor(void)
380{
381 PyCursesInitialisedColor;
382 return 1;
383}
384
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000385/*****************************************************************************
386 The Window Object
387******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000388
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000389/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000390
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000391PyTypeObject PyCursesWindow_Type;
392
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000393/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000394
395 X - function name
396 TYPE - parameter Type
397 ERGSTR - format string for construction of the return value
398 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000399*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400
Victor Stinner26486ea2010-05-15 22:23:53 +0000401#define Window_NoArgNoReturnFunction(X) \
402 static PyObject *PyCursesWindow_ ## X \
403 (PyCursesWindowObject *self, PyObject *args) \
404 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000405
Victor Stinner26486ea2010-05-15 22:23:53 +0000406#define Window_NoArgTrueFalseFunction(X) \
407 static PyObject * PyCursesWindow_ ## X \
408 (PyCursesWindowObject *self) \
409 { \
410 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
411 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000412
Victor Stinner26486ea2010-05-15 22:23:53 +0000413#define Window_NoArgNoReturnVoidFunction(X) \
414 static PyObject * PyCursesWindow_ ## X \
415 (PyCursesWindowObject *self) \
416 { \
417 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000418
Victor Stinner26486ea2010-05-15 22:23:53 +0000419#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
420 static PyObject * PyCursesWindow_ ## X \
421 (PyCursesWindowObject *self) \
422 { \
423 TYPE arg1, arg2; \
424 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000425
Victor Stinner26486ea2010-05-15 22:23:53 +0000426#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
427 static PyObject * PyCursesWindow_ ## X \
428 (PyCursesWindowObject *self, PyObject *args) \
429 { \
430 TYPE arg1; \
431 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
432 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000433
Victor Stinner26486ea2010-05-15 22:23:53 +0000434#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
435 static PyObject * PyCursesWindow_ ## X \
436 (PyCursesWindowObject *self, PyObject *args) \
437 { \
438 TYPE arg1; \
439 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
440 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
443 static PyObject * PyCursesWindow_ ## X \
444 (PyCursesWindowObject *self, PyObject *args) \
445 { \
446 TYPE arg1, arg2; \
447 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
448 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000449
Guido van Rossumf6971e21994-08-30 12:25:20 +0000450/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000451
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000452Window_NoArgNoReturnFunction(untouchwin)
453Window_NoArgNoReturnFunction(touchwin)
454Window_NoArgNoReturnFunction(redrawwin)
455Window_NoArgNoReturnFunction(winsertln)
456Window_NoArgNoReturnFunction(werase)
457Window_NoArgNoReturnFunction(wdeleteln)
458
459Window_NoArgTrueFalseFunction(is_wintouched)
460
461Window_NoArgNoReturnVoidFunction(wsyncup)
462Window_NoArgNoReturnVoidFunction(wsyncdown)
463Window_NoArgNoReturnVoidFunction(wstandend)
464Window_NoArgNoReturnVoidFunction(wstandout)
465Window_NoArgNoReturnVoidFunction(wcursyncup)
466Window_NoArgNoReturnVoidFunction(wclrtoeol)
467Window_NoArgNoReturnVoidFunction(wclrtobot)
468Window_NoArgNoReturnVoidFunction(wclear)
469
470Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
471Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000472Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000473
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000474Window_NoArg2TupleReturnFunction(getyx, int, "ii")
475Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
476Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
477Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000478
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
480Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000481#if defined(__NetBSD__)
482Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
483#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000484Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000485#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000486Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000487#if defined(__NetBSD__)
488Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
489#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000490Window_OneArgNoReturnFunction(nodelay, 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(notimeout, int, "i;True(1) or False(0)")
493Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000494Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000495Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
496
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000497Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
498Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
499Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000500#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000501Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000502#endif
503
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000504/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000505
Guido van Rossumf6971e21994-08-30 12:25:20 +0000506static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100507PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000508{
Victor Stinner26486ea2010-05-15 22:23:53 +0000509 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000510
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100511 if (encoding == NULL) {
512#if defined(MS_WINDOWS)
513 char *buffer[100];
514 UINT cp;
515 cp = GetConsoleOutputCP();
516 if (cp != 0) {
517 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
518 encoding = buffer;
519 }
520#elif defined(CODESET)
521 const char *codeset = nl_langinfo(CODESET);
522 if (codeset != NULL && codeset[0] != 0)
523 encoding = codeset;
524#endif
525 if (encoding == NULL)
526 encoding = "utf-8";
527 }
528
Victor Stinner26486ea2010-05-15 22:23:53 +0000529 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
530 if (wo == NULL) return NULL;
531 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200532 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100533 if (wo->encoding == NULL) {
534 Py_DECREF(wo);
535 PyErr_NoMemory();
536 return NULL;
537 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000538 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000539}
540
541static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000542PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000543{
Victor Stinner26486ea2010-05-15 22:23:53 +0000544 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100545 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200546 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000547 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000548}
549
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000550/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000551
Larry Hastings31826802013-10-19 00:09:25 -0700552/*[clinic]
553module curses
Larry Hastings31826802013-10-19 00:09:25 -0700554class curses.window
555
556curses.window.addch
557
558 [
559 x: int
560 X-coordinate.
561 y: int
562 Y-coordinate.
563 ]
564
565 ch: object
566 Character to add.
567
568 [
569 attr: long
570 Attributes for the character.
571 ]
572 /
573
574Paint character ch at (y, x) with attributes attr.
575
576Paint character ch at (y, x) with attributes attr,
577overwriting any character previously painted at that location.
578By default, the character position and attributes are the
579current settings for the window object.
580[clinic]*/
581
582PyDoc_STRVAR(curses_window_addch__doc__,
583"Paint character ch at (y, x) with attributes attr.\n"
584"\n"
585"curses.window.addch([x, y,] ch, [attr])\n"
586" x\n"
587" X-coordinate.\n"
588" y\n"
589" Y-coordinate.\n"
590" ch\n"
591" Character to add.\n"
592" attr\n"
593" Attributes for the character.\n"
594"\n"
595"Paint character ch at (y, x) with attributes attr,\n"
596"overwriting any character previously painted at that location.\n"
597"By default, the character position and attributes are the\n"
598"current settings for the window object.");
599
600#define CURSES_WINDOW_ADDCH_METHODDEF \
601 {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
602
Guido van Rossumf6971e21994-08-30 12:25:20 +0000603static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -0700604curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
605
606static PyObject *
607curses_window_addch(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000608{
Larry Hastings31826802013-10-19 00:09:25 -0700609 PyObject *return_value = NULL;
610 int group_left_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800611 int x = 0;
612 int y = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700613 PyObject *ch;
614 int group_right_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800615 long attr = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700616
617 switch (PyTuple_Size(args)) {
618 case 1:
619 if (!PyArg_ParseTuple(args, "O:addch", &ch))
620 return NULL;
621 break;
622 case 2:
623 if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr))
624 return NULL;
625 group_right_1 = 1;
626 break;
627 case 3:
628 if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
629 return NULL;
630 group_left_1 = 1;
631 break;
632 case 4:
633 if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
634 return NULL;
635 group_right_1 = 1;
636 group_left_1 = 1;
637 break;
638 default:
639 PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
640 return NULL;
641 }
642 return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
643
644 return return_value;
645}
646
647static PyObject *
648curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
Larry Hastingsabc716b2013-11-20 09:13:52 -0800649/*[clinic checksum: 094d012af1019387c0219a9c0bc76e90729c833f]*/
Larry Hastings31826802013-10-19 00:09:25 -0700650{
651 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
652 int coordinates_group = group_left_1;
653 int attr_group = group_right_1;
654 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100655 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700656 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100657#ifdef HAVE_NCURSESW
658 cchar_t wch;
659#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100660 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000661
Larry Hastings31826802013-10-19 00:09:25 -0700662 if (!attr_group)
663 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000664
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100665#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700666 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100667 if (type == 2) {
668 funcname = "add_wch";
669 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700670 if (coordinates_group)
671 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100672 else {
Larry Hastings31826802013-10-19 00:09:25 -0700673 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100674 }
675 }
676 else
677#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300678 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100679#endif
680 if (type == 1) {
681 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700682 if (coordinates_group)
683 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100684 else {
Larry Hastings31826802013-10-19 00:09:25 -0700685 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100686 }
687 }
688 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000689 return NULL;
690 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100691 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000692}
693
694static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000695PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000696{
Victor Stinner26486ea2010-05-15 22:23:53 +0000697 int rtn;
698 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100699 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500700 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100701#ifdef HAVE_NCURSESW
702 wchar_t *wstr = NULL;
703#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000704 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
705 long lattr;
706 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100707 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000708
Victor Stinner26486ea2010-05-15 22:23:53 +0000709 switch (PyTuple_Size(args)) {
710 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100711 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000712 return NULL;
713 break;
714 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100715 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000716 return NULL;
717 attr = lattr;
718 use_attr = TRUE;
719 break;
720 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100721 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000722 return NULL;
723 use_xy = TRUE;
724 break;
725 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100726 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000727 return NULL;
728 attr = lattr;
729 use_xy = use_attr = TRUE;
730 break;
731 default:
732 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
733 return NULL;
734 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100735#ifdef HAVE_NCURSESW
736 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
737#else
738 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
739#endif
740 if (strtype == 0)
741 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000742 if (use_attr == TRUE) {
743 attr_old = getattrs(self->win);
744 (void)wattrset(self->win,attr);
745 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100746#ifdef HAVE_NCURSESW
747 if (strtype == 2) {
748 funcname = "addwstr";
749 if (use_xy == TRUE)
750 rtn = mvwaddwstr(self->win,y,x,wstr);
751 else
752 rtn = waddwstr(self->win,wstr);
753 PyMem_Free(wstr);
754 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000755 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100756#endif
757 {
758 char *str = PyBytes_AS_STRING(bytesobj);
759 funcname = "addstr";
760 if (use_xy == TRUE)
761 rtn = mvwaddstr(self->win,y,x,str);
762 else
763 rtn = waddstr(self->win,str);
764 Py_DECREF(bytesobj);
765 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000766 if (use_attr == TRUE)
767 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100768 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000769}
Guido van Rossum85738471995-02-17 13:50:17 +0000770
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000771static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000772PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000773{
Victor Stinner26486ea2010-05-15 22:23:53 +0000774 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100775 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500776 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100777#ifdef HAVE_NCURSESW
778 wchar_t *wstr = NULL;
779#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000780 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
781 long lattr;
782 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100783 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000784
Victor Stinner26486ea2010-05-15 22:23:53 +0000785 switch (PyTuple_Size(args)) {
786 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100787 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000788 return NULL;
789 break;
790 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100791 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000792 return NULL;
793 attr = lattr;
794 use_attr = TRUE;
795 break;
796 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100797 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000798 return NULL;
799 use_xy = TRUE;
800 break;
801 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100802 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000803 return NULL;
804 attr = lattr;
805 use_xy = use_attr = TRUE;
806 break;
807 default:
808 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
809 return NULL;
810 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100811#ifdef HAVE_NCURSESW
812 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
813#else
814 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
815#endif
816 if (strtype == 0)
817 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818
Victor Stinner26486ea2010-05-15 22:23:53 +0000819 if (use_attr == TRUE) {
820 attr_old = getattrs(self->win);
821 (void)wattrset(self->win,attr);
822 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100823#ifdef HAVE_NCURSESW
824 if (strtype == 2) {
825 funcname = "addnwstr";
826 if (use_xy == TRUE)
827 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
828 else
829 rtn = waddnwstr(self->win,wstr,n);
830 PyMem_Free(wstr);
831 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000832 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100833#endif
834 {
835 char *str = PyBytes_AS_STRING(bytesobj);
836 funcname = "addnstr";
837 if (use_xy == TRUE)
838 rtn = mvwaddnstr(self->win,y,x,str,n);
839 else
840 rtn = waddnstr(self->win,str,n);
841 Py_DECREF(bytesobj);
842 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000843 if (use_attr == TRUE)
844 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100845 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000846}
847
848static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000849PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000850{
Victor Stinner26486ea2010-05-15 22:23:53 +0000851 PyObject *temp;
852 chtype bkgd;
853 attr_t attr = A_NORMAL;
854 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000855
Victor Stinner26486ea2010-05-15 22:23:53 +0000856 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000857 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000858 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
859 return NULL;
860 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000862 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
863 return NULL;
864 attr = lattr;
865 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000866 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000867 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
868 return NULL;
869 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100871 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000872 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000873
Victor Stinner26486ea2010-05-15 22:23:53 +0000874 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000875}
876
877static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000878PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
879{
Victor Stinner26486ea2010-05-15 22:23:53 +0000880 long lattr;
881 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
882 return NULL;
883 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000884}
885
886static PyObject *
887PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
888{
Victor Stinner26486ea2010-05-15 22:23:53 +0000889 long lattr;
890 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
891 return NULL;
892 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000893}
894
895static PyObject *
896PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
897{
Victor Stinner26486ea2010-05-15 22:23:53 +0000898 long lattr;
899 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
900 return NULL;
901 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000902}
903
904static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000905PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000906{
Victor Stinner26486ea2010-05-15 22:23:53 +0000907 PyObject *temp;
908 chtype bkgd;
909 attr_t attr = A_NORMAL;
910 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000911
Victor Stinner26486ea2010-05-15 22:23:53 +0000912 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000913 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000914 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
915 return NULL;
916 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000917 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000918 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
919 return NULL;
920 attr = lattr;
921 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000923 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
924 return NULL;
925 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100927 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000928 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000929
Victor Stinner26486ea2010-05-15 22:23:53 +0000930 wbkgdset(self->win, bkgd | attr);
931 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000932}
933
934static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000935PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000936{
Victor Stinner26486ea2010-05-15 22:23:53 +0000937 PyObject *temp[8];
938 chtype ch[8];
939 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000940
Victor Stinner26486ea2010-05-15 22:23:53 +0000941 /* Clear the array of parameters */
942 for(i=0; i<8; i++) {
943 temp[i] = NULL;
944 ch[i] = 0;
945 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000946
Victor Stinner26486ea2010-05-15 22:23:53 +0000947 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
948 &temp[0], &temp[1], &temp[2], &temp[3],
949 &temp[4], &temp[5], &temp[6], &temp[7]))
950 return NULL;
951
952 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100953 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000954 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000955 }
956
957 wborder(self->win,
958 ch[0], ch[1], ch[2], ch[3],
959 ch[4], ch[5], ch[6], ch[7]);
960 Py_INCREF(Py_None);
961 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000962}
963
964static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000965PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966{
Victor Stinner26486ea2010-05-15 22:23:53 +0000967 chtype ch1=0,ch2=0;
968 switch(PyTuple_Size(args)){
969 case 0: break;
970 default:
971 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
972 return NULL;
973 }
974 box(self->win,ch1,ch2);
975 Py_INCREF(Py_None);
976 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000977}
978
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000979#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
980#define py_mvwdelch mvwdelch
981#else
982int py_mvwdelch(WINDOW *w, int y, int x)
983{
Victor Stinner26486ea2010-05-15 22:23:53 +0000984 mvwdelch(w,y,x);
985 /* On HP/UX, mvwdelch already returns. On other systems,
986 we may well run into this return statement. */
987 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000988}
989#endif
990
Guido van Rossumd8faa362007-04-27 19:54:29 +0000991/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
992
993static PyObject *
994PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
995{
Victor Stinner26486ea2010-05-15 22:23:53 +0000996 int rtn;
997 int x, y;
998 int num = -1;
999 short color;
1000 attr_t attr = A_NORMAL;
1001 long lattr;
1002 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001003
Victor Stinner26486ea2010-05-15 22:23:53 +00001004 switch (PyTuple_Size(args)) {
1005 case 1:
1006 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1007 return NULL;
1008 attr = lattr;
1009 break;
1010 case 2:
1011 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1012 return NULL;
1013 attr = lattr;
1014 break;
1015 case 3:
1016 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1017 return NULL;
1018 attr = lattr;
1019 use_xy = TRUE;
1020 break;
1021 case 4:
1022 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1023 return NULL;
1024 attr = lattr;
1025 use_xy = TRUE;
1026 break;
1027 default:
1028 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1029 return NULL;
1030 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001031
Victor Stinner26486ea2010-05-15 22:23:53 +00001032 color = (short)((attr >> 8) & 0xff);
1033 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001034
Victor Stinner26486ea2010-05-15 22:23:53 +00001035 if (use_xy == TRUE) {
1036 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1037 touchline(self->win,y,1);
1038 } else {
1039 getyx(self->win,y,x);
1040 rtn = wchgat(self->win,num,attr,color,NULL);
1041 touchline(self->win,y,1);
1042 }
1043 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001044}
1045
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001046
Guido van Rossumf6971e21994-08-30 12:25:20 +00001047static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001048PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001049{
Victor Stinner26486ea2010-05-15 22:23:53 +00001050 int rtn;
1051 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001052
Victor Stinner26486ea2010-05-15 22:23:53 +00001053 switch (PyTuple_Size(args)) {
1054 case 0:
1055 rtn = wdelch(self->win);
1056 break;
1057 case 2:
1058 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1059 return NULL;
1060 rtn = py_mvwdelch(self->win,y,x);
1061 break;
1062 default:
1063 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1064 return NULL;
1065 }
1066 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001067}
1068
1069static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001070PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001071{
Victor Stinner26486ea2010-05-15 22:23:53 +00001072 WINDOW *win;
1073 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001074
Victor Stinner26486ea2010-05-15 22:23:53 +00001075 nlines = 0;
1076 ncols = 0;
1077 switch (PyTuple_Size(args)) {
1078 case 2:
1079 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1080 return NULL;
1081 break;
1082 case 4:
1083 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1084 &nlines,&ncols,&begin_y,&begin_x))
1085 return NULL;
1086 break;
1087 default:
1088 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1089 return NULL;
1090 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001091
Victor Stinner26486ea2010-05-15 22:23:53 +00001092 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001093
Victor Stinner26486ea2010-05-15 22:23:53 +00001094 if (win == NULL) {
1095 PyErr_SetString(PyCursesError, catchall_NULL);
1096 return NULL;
1097 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001098
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001099 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001100}
1101
1102static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001103PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001104{
Victor Stinner26486ea2010-05-15 22:23:53 +00001105 PyObject *temp;
1106 chtype ch;
1107 attr_t attr = A_NORMAL;
1108 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001109
Victor Stinner26486ea2010-05-15 22:23:53 +00001110 switch (PyTuple_Size(args)) {
1111 case 1:
1112 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1113 return NULL;
1114 break;
1115 case 2:
1116 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1117 return NULL;
1118 attr = lattr;
1119 break;
1120 default:
1121 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001122
1123
Victor Stinner26486ea2010-05-15 22:23:53 +00001124 return NULL;
1125 }
Guido van Rossum85738471995-02-17 13:50:17 +00001126
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001127 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001128 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001129
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001130#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001131 if (self->win->_flags & _ISPAD)
1132 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1133 "echochar");
1134 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001135#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001136 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1137 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001138}
1139
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001140#ifdef NCURSES_MOUSE_VERSION
1141static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001142PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001143{
Victor Stinner26486ea2010-05-15 22:23:53 +00001144 int x, y;
1145 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1146 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001147
Victor Stinner26486ea2010-05-15 22:23:53 +00001148 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001149}
1150#endif
1151
Guido van Rossumf6971e21994-08-30 12:25:20 +00001152static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001153PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001154{
Victor Stinner26486ea2010-05-15 22:23:53 +00001155 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001156}
1157
1158static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001159PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001160{
Victor Stinner26486ea2010-05-15 22:23:53 +00001161 int x, y;
1162 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001163
Victor Stinner26486ea2010-05-15 22:23:53 +00001164 switch (PyTuple_Size(args)) {
1165 case 0:
1166 Py_BEGIN_ALLOW_THREADS
1167 rtn = wgetch(self->win);
1168 Py_END_ALLOW_THREADS
1169 break;
1170 case 2:
1171 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1172 return NULL;
1173 Py_BEGIN_ALLOW_THREADS
1174 rtn = mvwgetch(self->win,y,x);
1175 Py_END_ALLOW_THREADS
1176 break;
1177 default:
1178 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1179 return NULL;
1180 }
1181 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001182}
Guido van Rossum85738471995-02-17 13:50:17 +00001183
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001184static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001185PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001186{
Victor Stinner26486ea2010-05-15 22:23:53 +00001187 int x, y;
1188 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001189
Victor Stinner26486ea2010-05-15 22:23:53 +00001190 switch (PyTuple_Size(args)) {
1191 case 0:
1192 Py_BEGIN_ALLOW_THREADS
1193 rtn = wgetch(self->win);
1194 Py_END_ALLOW_THREADS
1195 break;
1196 case 2:
1197 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1198 return NULL;
1199 Py_BEGIN_ALLOW_THREADS
1200 rtn = mvwgetch(self->win,y,x);
1201 Py_END_ALLOW_THREADS
1202 break;
1203 default:
1204 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1205 return NULL;
1206 }
1207 if (rtn == ERR) {
1208 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001209 PyErr_CheckSignals();
1210 if (!PyErr_Occurred())
1211 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001212 return NULL;
1213 } else if (rtn<=255) {
1214 return Py_BuildValue("C", rtn);
1215 } else {
1216 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001217#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001218 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001219#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001220 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001221#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001222 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1223 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001224}
1225
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001226#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001227static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001228PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1229{
1230 int x, y;
1231 int ct;
1232 wint_t rtn;
1233
1234 switch (PyTuple_Size(args)) {
1235 case 0:
1236 Py_BEGIN_ALLOW_THREADS
1237 ct = wget_wch(self->win,&rtn);
1238 Py_END_ALLOW_THREADS
1239 break;
1240 case 2:
1241 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1242 return NULL;
1243 Py_BEGIN_ALLOW_THREADS
1244 ct = mvwget_wch(self->win,y,x,&rtn);
1245 Py_END_ALLOW_THREADS
1246 break;
1247 default:
1248 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1249 return NULL;
1250 }
1251 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001252 if (PyErr_CheckSignals())
1253 return NULL;
1254
Victor Stinnera7878b72011-07-14 23:07:44 +02001255 /* get_wch() returns ERR in nodelay mode */
1256 PyErr_SetString(PyCursesError, "no input");
1257 return NULL;
1258 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001259 if (ct == KEY_CODE_YES)
1260 return PyLong_FromLong(rtn);
1261 else
1262 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001263}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001264#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001265
1266static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001267PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001268{
Victor Stinner26486ea2010-05-15 22:23:53 +00001269 int x, y, n;
1270 char rtn[1024]; /* This should be big enough.. I hope */
1271 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001272
Victor Stinner26486ea2010-05-15 22:23:53 +00001273 switch (PyTuple_Size(args)) {
1274 case 0:
1275 Py_BEGIN_ALLOW_THREADS
1276 rtn2 = wgetnstr(self->win,rtn, 1023);
1277 Py_END_ALLOW_THREADS
1278 break;
1279 case 1:
1280 if (!PyArg_ParseTuple(args,"i;n", &n))
1281 return NULL;
1282 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001283 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001284 Py_END_ALLOW_THREADS
1285 break;
1286 case 2:
1287 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1288 return NULL;
1289 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001290#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001291 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001292#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001293 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001294#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001295 Py_END_ALLOW_THREADS
1296 break;
1297 case 3:
1298 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1299 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001300#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001301 Py_BEGIN_ALLOW_THREADS
1302 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001303 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001304 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001305#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001306 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001307 rtn2 = mvwgetnstr(self->win, y, x, 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#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001310 break;
1311 default:
1312 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1313 return NULL;
1314 }
1315 if (rtn2 == ERR)
1316 rtn[0] = 0;
1317 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001318}
1319
1320static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001321PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322{
Victor Stinner26486ea2010-05-15 22:23:53 +00001323 PyObject *temp;
1324 chtype ch;
1325 int n, x, y, code = OK;
1326 attr_t attr = A_NORMAL;
1327 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001328
Victor Stinner26486ea2010-05-15 22:23:53 +00001329 switch (PyTuple_Size(args)) {
1330 case 2:
1331 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1332 return NULL;
1333 break;
1334 case 3:
1335 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1336 return NULL;
1337 attr = lattr;
1338 break;
1339 case 4:
1340 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1341 return NULL;
1342 code = wmove(self->win, y, x);
1343 break;
1344 case 5:
1345 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1346 &y, &x, &temp, &n, &lattr))
1347 return NULL;
1348 attr = lattr;
1349 code = wmove(self->win, y, x);
1350 break;
1351 default:
1352 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1353 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001354 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001355
1356 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001357 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001358 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001359 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1360 } else
1361 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001362}
1363
1364static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001365PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001366{
Victor Stinner26486ea2010-05-15 22:23:53 +00001367 int rtn, x, y, use_xy = FALSE;
1368 PyObject *temp;
1369 chtype ch = 0;
1370 attr_t attr = A_NORMAL;
1371 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001372
Victor Stinner26486ea2010-05-15 22:23:53 +00001373 switch (PyTuple_Size(args)) {
1374 case 1:
1375 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1376 return NULL;
1377 break;
1378 case 2:
1379 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1380 return NULL;
1381 attr = lattr;
1382 break;
1383 case 3:
1384 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1385 return NULL;
1386 use_xy = TRUE;
1387 break;
1388 case 4:
1389 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1390 return NULL;
1391 attr = lattr;
1392 use_xy = TRUE;
1393 break;
1394 default:
1395 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1396 return NULL;
1397 }
1398
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001399 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001400 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001401
1402 if (use_xy == TRUE)
1403 rtn = mvwinsch(self->win,y,x, ch | attr);
1404 else {
1405 rtn = winsch(self->win, ch | attr);
1406 }
1407 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001408}
1409
1410static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001411PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001412{
Victor Stinner26486ea2010-05-15 22:23:53 +00001413 int x, y, rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001414
Victor Stinner26486ea2010-05-15 22:23:53 +00001415 switch (PyTuple_Size(args)) {
1416 case 0:
1417 rtn = winch(self->win);
1418 break;
1419 case 2:
1420 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1421 return NULL;
1422 rtn = mvwinch(self->win,y,x);
1423 break;
1424 default:
1425 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1426 return NULL;
1427 }
1428 return PyLong_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001429}
1430
1431static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001432PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001433{
Victor Stinner26486ea2010-05-15 22:23:53 +00001434 int x, y, n;
1435 char rtn[1024]; /* This should be big enough.. I hope */
1436 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001437
Victor Stinner26486ea2010-05-15 22:23:53 +00001438 switch (PyTuple_Size(args)) {
1439 case 0:
1440 rtn2 = winnstr(self->win,rtn, 1023);
1441 break;
1442 case 1:
1443 if (!PyArg_ParseTuple(args,"i;n", &n))
1444 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001445 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001446 break;
1447 case 2:
1448 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1449 return NULL;
1450 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1451 break;
1452 case 3:
1453 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1454 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001455 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001456 break;
1457 default:
1458 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1459 return NULL;
1460 }
1461 if (rtn2 == ERR)
1462 rtn[0] = 0;
1463 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001464}
1465
1466static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001467PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001468{
Victor Stinner26486ea2010-05-15 22:23:53 +00001469 int rtn;
1470 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001471 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001472 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001473#ifdef HAVE_NCURSESW
1474 wchar_t *wstr = NULL;
1475#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001476 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1477 long lattr;
1478 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001479 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001480
Victor Stinner26486ea2010-05-15 22:23:53 +00001481 switch (PyTuple_Size(args)) {
1482 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001483 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001484 return NULL;
1485 break;
1486 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001487 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001488 return NULL;
1489 attr = lattr;
1490 use_attr = TRUE;
1491 break;
1492 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001493 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001494 return NULL;
1495 use_xy = TRUE;
1496 break;
1497 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001498 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001499 return NULL;
1500 attr = lattr;
1501 use_xy = use_attr = TRUE;
1502 break;
1503 default:
1504 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1505 return NULL;
1506 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001507
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001508#ifdef HAVE_NCURSESW
1509 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1510#else
1511 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1512#endif
1513 if (strtype == 0)
1514 return NULL;
1515
Victor Stinner26486ea2010-05-15 22:23:53 +00001516 if (use_attr == TRUE) {
1517 attr_old = getattrs(self->win);
1518 (void)wattrset(self->win,attr);
1519 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001520#ifdef HAVE_NCURSESW
1521 if (strtype == 2) {
1522 funcname = "inswstr";
1523 if (use_xy == TRUE)
1524 rtn = mvwins_wstr(self->win,y,x,wstr);
1525 else
1526 rtn = wins_wstr(self->win,wstr);
1527 PyMem_Free(wstr);
1528 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001529 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001530#endif
1531 {
1532 char *str = PyBytes_AS_STRING(bytesobj);
1533 funcname = "insstr";
1534 if (use_xy == TRUE)
1535 rtn = mvwinsstr(self->win,y,x,str);
1536 else
1537 rtn = winsstr(self->win,str);
1538 Py_DECREF(bytesobj);
1539 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001540 if (use_attr == TRUE)
1541 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001542 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001543}
1544
1545static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001546PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001547{
Victor Stinner26486ea2010-05-15 22:23:53 +00001548 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001549 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001550 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001551#ifdef HAVE_NCURSESW
1552 wchar_t *wstr = NULL;
1553#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001554 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1555 long lattr;
1556 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001557 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001558
Victor Stinner26486ea2010-05-15 22:23:53 +00001559 switch (PyTuple_Size(args)) {
1560 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001561 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001562 return NULL;
1563 break;
1564 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001565 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001566 return NULL;
1567 attr = lattr;
1568 use_attr = TRUE;
1569 break;
1570 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001571 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001572 return NULL;
1573 use_xy = TRUE;
1574 break;
1575 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001576 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001577 return NULL;
1578 attr = lattr;
1579 use_xy = use_attr = TRUE;
1580 break;
1581 default:
1582 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1583 return NULL;
1584 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001585
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001586#ifdef HAVE_NCURSESW
1587 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1588#else
1589 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1590#endif
1591 if (strtype == 0)
1592 return NULL;
1593
Victor Stinner26486ea2010-05-15 22:23:53 +00001594 if (use_attr == TRUE) {
1595 attr_old = getattrs(self->win);
1596 (void)wattrset(self->win,attr);
1597 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001598#ifdef HAVE_NCURSESW
1599 if (strtype == 2) {
1600 funcname = "insn_wstr";
1601 if (use_xy == TRUE)
1602 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1603 else
1604 rtn = wins_nwstr(self->win,wstr,n);
1605 PyMem_Free(wstr);
1606 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001607 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001608#endif
1609 {
1610 char *str = PyBytes_AS_STRING(bytesobj);
1611 funcname = "insnstr";
1612 if (use_xy == TRUE)
1613 rtn = mvwinsnstr(self->win,y,x,str,n);
1614 else
1615 rtn = winsnstr(self->win,str,n);
1616 Py_DECREF(bytesobj);
1617 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001618 if (use_attr == TRUE)
1619 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001620 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001621}
1622
1623static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001624PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001625{
Victor Stinner26486ea2010-05-15 22:23:53 +00001626 int line, erg;
1627 if (!PyArg_ParseTuple(args,"i;line", &line))
1628 return NULL;
1629 erg = is_linetouched(self->win, line);
1630 if (erg == ERR) {
1631 PyErr_SetString(PyExc_TypeError,
1632 "is_linetouched: line number outside of boundaries");
1633 return NULL;
1634 } else
1635 if (erg == FALSE) {
1636 Py_INCREF(Py_False);
1637 return Py_False;
1638 } else {
1639 Py_INCREF(Py_True);
1640 return Py_True;
1641 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001642}
1643
1644static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001645PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001646{
Victor Stinner26486ea2010-05-15 22:23:53 +00001647 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1648 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001649
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001650#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001651 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001652#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001653 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001654#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001655 {
1656 switch(PyTuple_Size(args)) {
1657 case 6:
1658 if (!PyArg_ParseTuple(args,
1659 "iiiiii;" \
1660 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1661 &pminrow, &pmincol, &sminrow,
1662 &smincol, &smaxrow, &smaxcol))
1663 return NULL;
1664 Py_BEGIN_ALLOW_THREADS
1665 rtn = pnoutrefresh(self->win,
1666 pminrow, pmincol, sminrow,
1667 smincol, smaxrow, smaxcol);
1668 Py_END_ALLOW_THREADS
1669 return PyCursesCheckERR(rtn, "pnoutrefresh");
1670 default:
1671 PyErr_SetString(PyCursesError,
1672 "noutrefresh() called for a pad "
1673 "requires 6 arguments");
1674 return NULL;
1675 }
1676 } else {
1677 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1678 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001679
Victor Stinner26486ea2010-05-15 22:23:53 +00001680 Py_BEGIN_ALLOW_THREADS
1681 rtn = wnoutrefresh(self->win);
1682 Py_END_ALLOW_THREADS
1683 return PyCursesCheckERR(rtn, "wnoutrefresh");
1684 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001685}
1686
1687static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001688PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1689{
1690 PyCursesWindowObject *temp;
1691 int use_copywin = FALSE;
1692 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1693 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001694
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001695 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001696 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001697 if (!PyArg_ParseTuple(args, "O!;window object",
1698 &PyCursesWindow_Type, &temp))
1699 return NULL;
1700 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001701 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001702 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1703 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1704 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1705 return NULL;
1706 use_copywin = TRUE;
1707 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001708 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001709 PyErr_SetString(PyExc_TypeError,
1710 "overlay requires one or seven arguments");
1711 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001712 }
1713
1714 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001715 rtn = copywin(self->win, temp->win, sminrow, smincol,
1716 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1717 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001718 }
1719 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001720 rtn = overlay(self->win, temp->win);
1721 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001722 }
1723}
1724
1725static PyObject *
1726PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1727{
1728 PyCursesWindowObject *temp;
1729 int use_copywin = FALSE;
1730 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1731 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001732
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001733 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001734 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001735 if (!PyArg_ParseTuple(args, "O!;window object",
1736 &PyCursesWindow_Type, &temp))
1737 return NULL;
1738 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001739 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001740 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1741 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1742 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1743 return NULL;
1744 use_copywin = TRUE;
1745 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001746 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001747 PyErr_SetString(PyExc_TypeError,
1748 "overwrite requires one or seven arguments");
1749 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001750 }
1751
1752 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001753 rtn = copywin(self->win, temp->win, sminrow, smincol,
1754 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001755 return PyCursesCheckERR(rtn, "copywin");
1756 }
1757 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001758 rtn = overwrite(self->win, temp->win);
1759 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001760 }
1761}
1762
1763static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001764PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001765{
Victor Stinner26486ea2010-05-15 22:23:53 +00001766 /* We have to simulate this by writing to a temporary FILE*,
1767 then reading back, then writing to the argument stream. */
1768 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001769 int fd = -1;
1770 FILE *fp = NULL;
1771 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001772
Victor Stinner26486ea2010-05-15 22:23:53 +00001773 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1774 fd = mkstemp(fn);
1775 if (fd < 0)
1776 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001777 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1778 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001779 fp = fdopen(fd, "wb+");
1780 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001781 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1782 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001783 }
1784 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001785 if (res == NULL)
1786 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001787 fseek(fp, 0, 0);
1788 while (1) {
1789 char buf[BUFSIZ];
1790 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001791 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001792
Victor Stinner26486ea2010-05-15 22:23:53 +00001793 if (n <= 0)
1794 break;
1795 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001796 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001797 if (res == NULL)
1798 break;
1799 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001800
1801exit:
1802 if (fp != NULL)
1803 fclose(fp);
1804 else if (fd != -1)
1805 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001806 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001807 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001808}
1809
1810static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001811PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001812{
Victor Stinner26486ea2010-05-15 22:23:53 +00001813 int beg, num;
1814 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1815 return NULL;
1816 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001817}
1818
1819static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001820PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001821{
Victor Stinner26486ea2010-05-15 22:23:53 +00001822 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1823 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001824
Victor Stinner26486ea2010-05-15 22:23:53 +00001825#ifndef WINDOW_HAS_FLAGS
1826 if (0)
1827#else
1828 if (self->win->_flags & _ISPAD)
1829#endif
1830 {
1831 switch(PyTuple_Size(args)) {
1832 case 6:
1833 if (!PyArg_ParseTuple(args,
1834 "iiiiii;" \
1835 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1836 &pminrow, &pmincol, &sminrow,
1837 &smincol, &smaxrow, &smaxcol))
1838 return NULL;
1839
1840 Py_BEGIN_ALLOW_THREADS
1841 rtn = prefresh(self->win,
1842 pminrow, pmincol, sminrow,
1843 smincol, smaxrow, smaxcol);
1844 Py_END_ALLOW_THREADS
1845 return PyCursesCheckERR(rtn, "prefresh");
1846 default:
1847 PyErr_SetString(PyCursesError,
1848 "refresh() for a pad requires 6 arguments");
1849 return NULL;
1850 }
1851 } else {
1852 if (!PyArg_ParseTuple(args, ":refresh"))
1853 return NULL;
1854 Py_BEGIN_ALLOW_THREADS
1855 rtn = wrefresh(self->win);
1856 Py_END_ALLOW_THREADS
1857 return PyCursesCheckERR(rtn, "prefresh");
1858 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001859}
1860
1861static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001862PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001863{
Victor Stinner26486ea2010-05-15 22:23:53 +00001864 int x, y;
1865 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1866 return NULL;
1867 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001868}
1869
1870static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001871PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001872{
Victor Stinner26486ea2010-05-15 22:23:53 +00001873 WINDOW *win;
1874 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001875
Victor Stinner26486ea2010-05-15 22:23:53 +00001876 nlines = 0;
1877 ncols = 0;
1878 switch (PyTuple_Size(args)) {
1879 case 2:
1880 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1881 return NULL;
1882 break;
1883 case 4:
1884 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1885 &nlines,&ncols,&begin_y,&begin_x))
1886 return NULL;
1887 break;
1888 default:
1889 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1890 return NULL;
1891 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001892
Victor Stinner26486ea2010-05-15 22:23:53 +00001893 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001894#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001895 if (self->win->_flags & _ISPAD)
1896 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1897 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001898#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001899 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001900
Victor Stinner26486ea2010-05-15 22:23:53 +00001901 if (win == NULL) {
1902 PyErr_SetString(PyCursesError, catchall_NULL);
1903 return NULL;
1904 }
1905
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001906 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001907}
1908
1909static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001910PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001911{
Victor Stinner26486ea2010-05-15 22:23:53 +00001912 int nlines;
1913 switch(PyTuple_Size(args)) {
1914 case 0:
1915 return PyCursesCheckERR(scroll(self->win), "scroll");
1916 case 1:
1917 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1918 return NULL;
1919 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1920 default:
1921 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1922 return NULL;
1923 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001924}
1925
1926static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001927PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001928{
Victor Stinner26486ea2010-05-15 22:23:53 +00001929 int st, cnt, val;
1930 switch (PyTuple_Size(args)) {
1931 case 2:
1932 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1933 return NULL;
1934 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1935 case 3:
1936 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1937 return NULL;
1938 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1939 default:
1940 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1941 return NULL;
1942 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001943}
1944
1945static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001946PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001947{
Victor Stinner26486ea2010-05-15 22:23:53 +00001948 PyObject *temp;
1949 chtype ch;
1950 int n, x, y, code = OK;
1951 attr_t attr = A_NORMAL;
1952 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001953
Victor Stinner26486ea2010-05-15 22:23:53 +00001954 switch (PyTuple_Size(args)) {
1955 case 2:
1956 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1957 return NULL;
1958 break;
1959 case 3:
1960 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1961 return NULL;
1962 attr = lattr;
1963 break;
1964 case 4:
1965 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1966 return NULL;
1967 code = wmove(self->win, y, x);
1968 break;
1969 case 5:
1970 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1971 &y, &x, &temp, &n, &lattr))
1972 return NULL;
1973 attr = lattr;
1974 code = wmove(self->win, y, x);
1975 break;
1976 default:
1977 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1978 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001979 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001980
1981 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001982 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001983 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001984 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1985 } else
1986 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001987}
1988
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001989static PyObject *
1990PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1991{
1992 return PyUnicode_FromString(self->encoding);
1993}
1994
1995static int
1996PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1997{
1998 PyObject *ascii;
1999 char *encoding;
2000
2001 /* It is illegal to del win.encoding */
2002 if (value == NULL) {
2003 PyErr_SetString(PyExc_TypeError,
2004 "encoding may not be deleted");
2005 return -1;
2006 }
2007
2008 if (!PyUnicode_Check(value)) {
2009 PyErr_SetString(PyExc_TypeError,
2010 "setting encoding to a non-string");
2011 return -1;
2012 }
2013 ascii = PyUnicode_AsASCIIString(value);
2014 if (ascii == NULL)
2015 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002016 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002017 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002018 if (encoding == NULL) {
2019 PyErr_NoMemory();
2020 return -1;
2021 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002022 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002023 self->encoding = encoding;
2024 return 0;
2025}
2026
2027
Guido van Rossumf6971e21994-08-30 12:25:20 +00002028static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002029 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002030 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2031 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2032 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2033 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2034 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2035 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2036 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2037 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2038 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2039 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2040 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2041 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2042 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2043 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2044 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2045 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2046 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2047 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2048 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002049#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002050 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002051#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002052 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2053 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2054 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2055 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2056 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002057#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002058 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002059#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002060 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2061 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2062 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2063 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2064 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2065 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2066 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2067 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2068 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2069 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2070 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2071 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2072 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2073 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2074 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2075 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2076 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2077 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2078 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2079 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2080 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2081 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2082 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2083 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2084 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2085 /* Backward compatibility alias -- remove in Python 2.3 */
2086 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2087 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2088 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2089 METH_VARARGS},
2090 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2091 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2092 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2093 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002094#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002095 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002096#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002097 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2098 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2099 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2100 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2101 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2102 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2103 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2104 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2105 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2106 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2107 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2108 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2109 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2110 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2111 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2112 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002113};
2114
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002115static PyGetSetDef PyCursesWindow_getsets[] = {
2116 {"encoding",
2117 (getter)PyCursesWindow_get_encoding,
2118 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002119 "the typecode character used to create the array"},
2120 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002121};
2122
Guido van Rossumf6971e21994-08-30 12:25:20 +00002123/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002124
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002125PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002126 PyVarObject_HEAD_INIT(NULL, 0)
2127 "_curses.curses window", /*tp_name*/
2128 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2129 0, /*tp_itemsize*/
2130 /* methods */
2131 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2132 0, /*tp_print*/
2133 (getattrfunc)0, /*tp_getattr*/
2134 (setattrfunc)0, /*tp_setattr*/
2135 0, /*tp_reserved*/
2136 0, /*tp_repr*/
2137 0, /*tp_as_number*/
2138 0, /*tp_as_sequence*/
2139 0, /*tp_as_mapping*/
2140 0, /*tp_hash*/
2141 0, /*tp_call*/
2142 0, /*tp_str*/
2143 0, /*tp_getattro*/
2144 0, /*tp_setattro*/
2145 0, /*tp_as_buffer*/
2146 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2147 0, /*tp_doc*/
2148 0, /*tp_traverse*/
2149 0, /*tp_clear*/
2150 0, /*tp_richcompare*/
2151 0, /*tp_weaklistoffset*/
2152 0, /*tp_iter*/
2153 0, /*tp_iternext*/
2154 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002155 0, /* tp_members */
2156 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002157};
2158
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002159/*********************************************************************
2160 Global Functions
2161**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002162
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163NoArgNoReturnFunction(beep)
2164NoArgNoReturnFunction(def_prog_mode)
2165NoArgNoReturnFunction(def_shell_mode)
2166NoArgNoReturnFunction(doupdate)
2167NoArgNoReturnFunction(endwin)
2168NoArgNoReturnFunction(flash)
2169NoArgNoReturnFunction(nocbreak)
2170NoArgNoReturnFunction(noecho)
2171NoArgNoReturnFunction(nonl)
2172NoArgNoReturnFunction(noraw)
2173NoArgNoReturnFunction(reset_prog_mode)
2174NoArgNoReturnFunction(reset_shell_mode)
2175NoArgNoReturnFunction(resetty)
2176NoArgNoReturnFunction(savetty)
2177
2178NoArgOrFlagNoReturnFunction(cbreak)
2179NoArgOrFlagNoReturnFunction(echo)
2180NoArgOrFlagNoReturnFunction(nl)
2181NoArgOrFlagNoReturnFunction(raw)
2182
2183NoArgReturnIntFunction(baudrate)
2184NoArgReturnIntFunction(termattrs)
2185
2186NoArgReturnStringFunction(termname)
2187NoArgReturnStringFunction(longname)
2188
2189NoArgTrueFalseFunction(can_change_color)
2190NoArgTrueFalseFunction(has_colors)
2191NoArgTrueFalseFunction(has_ic)
2192NoArgTrueFalseFunction(has_il)
2193NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002194NoArgNoReturnVoidFunction(flushinp)
2195NoArgNoReturnVoidFunction(noqiflush)
2196
2197static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002198PyCurses_filter(PyObject *self)
2199{
Victor Stinner26486ea2010-05-15 22:23:53 +00002200 /* not checking for PyCursesInitialised here since filter() must
2201 be called before initscr() */
2202 filter();
2203 Py_INCREF(Py_None);
2204 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002205}
2206
2207static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002208PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002209{
Victor Stinner26486ea2010-05-15 22:23:53 +00002210 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002211
Victor Stinner26486ea2010-05-15 22:23:53 +00002212 PyCursesInitialised;
2213 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214
Victor Stinner26486ea2010-05-15 22:23:53 +00002215 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216
Victor Stinner26486ea2010-05-15 22:23:53 +00002217 if (color_content(color, &r, &g, &b) != ERR)
2218 return Py_BuildValue("(iii)", r, g, b);
2219 else {
2220 PyErr_SetString(PyCursesError,
2221 "Argument 1 was out of range. Check value of COLORS.");
2222 return NULL;
2223 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002224}
2225
2226static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002227PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228{
Victor Stinner26486ea2010-05-15 22:23:53 +00002229 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002230
Victor Stinner26486ea2010-05-15 22:23:53 +00002231 PyCursesInitialised;
2232 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233
Victor Stinner26486ea2010-05-15 22:23:53 +00002234 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2235 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236}
2237
2238static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002239PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240{
Victor Stinner26486ea2010-05-15 22:23:53 +00002241 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244
Victor Stinner26486ea2010-05-15 22:23:53 +00002245 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246
Victor Stinner26486ea2010-05-15 22:23:53 +00002247 erg = curs_set(vis);
2248 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002249
Victor Stinner26486ea2010-05-15 22:23:53 +00002250 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002251}
2252
2253static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002254PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255{
Victor Stinner26486ea2010-05-15 22:23:53 +00002256 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002257
Victor Stinner26486ea2010-05-15 22:23:53 +00002258 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002259
Victor Stinner26486ea2010-05-15 22:23:53 +00002260 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263}
2264
2265static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002266PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002267{
Victor Stinner26486ea2010-05-15 22:23:53 +00002268 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002269
Victor Stinner26486ea2010-05-15 22:23:53 +00002270 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275}
2276
2277static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002278PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279{
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 int x = 0;
2281 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002282
Victor Stinner26486ea2010-05-15 22:23:53 +00002283 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002284
Victor Stinner26486ea2010-05-15 22:23:53 +00002285 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002288}
2289
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002290#ifdef NCURSES_MOUSE_VERSION
2291static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002292PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002293{
Victor Stinner26486ea2010-05-15 22:23:53 +00002294 int rtn;
2295 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002296
Victor Stinner26486ea2010-05-15 22:23:53 +00002297 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002298
Victor Stinner26486ea2010-05-15 22:23:53 +00002299 rtn = getmouse( &event );
2300 if (rtn == ERR) {
2301 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2302 return NULL;
2303 }
2304 return Py_BuildValue("(hiiil)",
2305 (short)event.id,
2306 event.x, event.y, event.z,
2307 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002308}
2309
2310static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002311PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002312{
Victor Stinner26486ea2010-05-15 22:23:53 +00002313 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002314
Victor Stinner26486ea2010-05-15 22:23:53 +00002315 PyCursesInitialised;
2316 if (!PyArg_ParseTuple(args, "hiiil",
2317 &event.id,
2318 &event.x, &event.y, &event.z,
2319 (int *) &event.bstate))
2320 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002321
Victor Stinner26486ea2010-05-15 22:23:53 +00002322 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002323}
2324#endif
2325
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002326static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002327PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002328{
Victor Stinner26486ea2010-05-15 22:23:53 +00002329 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002330 int fd = -1;
2331 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002332 PyObject *data;
2333 size_t datalen;
2334 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002335 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002336 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002337
Victor Stinner26486ea2010-05-15 22:23:53 +00002338 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002339
Victor Stinner26486ea2010-05-15 22:23:53 +00002340 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2341 fd = mkstemp(fn);
2342 if (fd < 0)
2343 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002344 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2345 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002346 fp = fdopen(fd, "wb+");
2347 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002348 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2349 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002351
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002352 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002353 if (data == NULL)
2354 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002355 if (!PyBytes_Check(data)) {
2356 PyErr_Format(PyExc_TypeError,
2357 "f.read() returned %.100s instead of bytes",
2358 data->ob_type->tp_name);
2359 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002360 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 }
2362 datalen = PyBytes_GET_SIZE(data);
2363 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2364 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002365 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2366 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002367 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002368 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002369
Victor Stinner26486ea2010-05-15 22:23:53 +00002370 fseek(fp, 0, 0);
2371 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002372 if (win == NULL) {
2373 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002374 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002375 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002376 res = PyCursesWindow_New(win, NULL);
2377
2378error:
2379 if (fp != NULL)
2380 fclose(fp);
2381 else if (fd != -1)
2382 close(fd);
2383 remove(fn);
2384 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002385}
2386
2387static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002388PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389{
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002391
Victor Stinner26486ea2010-05-15 22:23:53 +00002392 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393
Victor Stinner26486ea2010-05-15 22:23:53 +00002394 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395
Victor Stinner26486ea2010-05-15 22:23:53 +00002396 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397}
2398
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002399#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002400/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002401static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002402{
Victor Stinner26486ea2010-05-15 22:23:53 +00002403 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002404
Victor Stinner26486ea2010-05-15 22:23:53 +00002405 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002406
Victor Stinner26486ea2010-05-15 22:23:53 +00002407 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 if (has_key(ch) == FALSE) {
2410 Py_INCREF(Py_False);
2411 return Py_False;
2412 }
2413 Py_INCREF(Py_True);
2414 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002415}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002416#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002417
2418static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002419PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002420{
Victor Stinner26486ea2010-05-15 22:23:53 +00002421 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422
Victor Stinner26486ea2010-05-15 22:23:53 +00002423 PyCursesInitialised;
2424 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002425
Victor Stinner26486ea2010-05-15 22:23:53 +00002426 switch(PyTuple_Size(args)) {
2427 case 4:
2428 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2429 break;
2430 default:
2431 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2432 return NULL;
2433 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002434
Victor Stinner26486ea2010-05-15 22:23:53 +00002435 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002436}
2437
2438static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002439PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002440{
Victor Stinner26486ea2010-05-15 22:23:53 +00002441 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002442
Victor Stinner26486ea2010-05-15 22:23:53 +00002443 PyCursesInitialised;
2444 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002445
Victor Stinner26486ea2010-05-15 22:23:53 +00002446 if (PyTuple_Size(args) != 3) {
2447 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2448 return NULL;
2449 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002450
Victor Stinner26486ea2010-05-15 22:23:53 +00002451 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002452
Victor Stinner26486ea2010-05-15 22:23:53 +00002453 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002454}
2455
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002456static PyObject *ModDict;
2457
Victor Stinner26486ea2010-05-15 22:23:53 +00002458static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002459PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002460{
Victor Stinner26486ea2010-05-15 22:23:53 +00002461 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002462 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002463
Victor Stinner26486ea2010-05-15 22:23:53 +00002464 if (initialised == TRUE) {
2465 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002466 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002467 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002468
Victor Stinner26486ea2010-05-15 22:23:53 +00002469 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002470
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 if (win == NULL) {
2472 PyErr_SetString(PyCursesError, catchall_NULL);
2473 return NULL;
2474 }
Guido van Rossum85738471995-02-17 13:50:17 +00002475
Victor Stinner26486ea2010-05-15 22:23:53 +00002476 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002477
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002478/* This was moved from initcurses() because it core dumped on SGI,
2479 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002480#define SetDictInt(string,ch) \
2481 do { \
2482 PyObject *o = PyLong_FromLong((long) (ch)); \
2483 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2484 Py_DECREF(o); \
2485 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002486 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002487
Victor Stinner26486ea2010-05-15 22:23:53 +00002488 /* Here are some graphic symbols you can use */
2489 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2490 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2491 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2492 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2493 SetDictInt("ACS_LTEE", (ACS_LTEE));
2494 SetDictInt("ACS_RTEE", (ACS_RTEE));
2495 SetDictInt("ACS_BTEE", (ACS_BTEE));
2496 SetDictInt("ACS_TTEE", (ACS_TTEE));
2497 SetDictInt("ACS_HLINE", (ACS_HLINE));
2498 SetDictInt("ACS_VLINE", (ACS_VLINE));
2499 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002500#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002501 /* On HP/UX 11, these are of type cchar_t, which is not an
2502 integral type. If this is a problem on more platforms, a
2503 configure test should be added to determine whether ACS_S1
2504 is of integral type. */
2505 SetDictInt("ACS_S1", (ACS_S1));
2506 SetDictInt("ACS_S9", (ACS_S9));
2507 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2508 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2509 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2510 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2511 SetDictInt("ACS_BULLET", (ACS_BULLET));
2512 SetDictInt("ACS_LARROW", (ACS_LARROW));
2513 SetDictInt("ACS_RARROW", (ACS_RARROW));
2514 SetDictInt("ACS_DARROW", (ACS_DARROW));
2515 SetDictInt("ACS_UARROW", (ACS_UARROW));
2516 SetDictInt("ACS_BOARD", (ACS_BOARD));
2517 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2518 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002519#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002520 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2521 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2522 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2523 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2524 SetDictInt("ACS_SBSS", (ACS_RTEE));
2525 SetDictInt("ACS_SSSB", (ACS_LTEE));
2526 SetDictInt("ACS_SSBS", (ACS_BTEE));
2527 SetDictInt("ACS_BSSS", (ACS_TTEE));
2528 SetDictInt("ACS_BSBS", (ACS_HLINE));
2529 SetDictInt("ACS_SBSB", (ACS_VLINE));
2530 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002531
Victor Stinner26486ea2010-05-15 22:23:53 +00002532 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002533#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002534 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002535#endif
2536#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002538#endif
2539#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002541#endif
2542#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002543 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002544#endif
2545#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002546 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002547#endif
2548#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002550#endif
2551#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002552 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002553#endif
2554
Victor Stinner26486ea2010-05-15 22:23:53 +00002555 SetDictInt("LINES", LINES);
2556 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002557
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002558 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2559 screen_encoding = winobj->encoding;
2560 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002561}
2562
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002563static PyObject *
2564PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2565{
Victor Stinner26486ea2010-05-15 22:23:53 +00002566 int fd = -1;
2567 int err;
2568 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002569
Victor Stinner26486ea2010-05-15 22:23:53 +00002570 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002571
Victor Stinner26486ea2010-05-15 22:23:53 +00002572 if (!PyArg_ParseTupleAndKeywords(
2573 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2574 return NULL;
2575 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002576
Victor Stinner26486ea2010-05-15 22:23:53 +00002577 if (fd == -1) {
2578 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002579
Victor Stinnerbd303c12013-11-07 23:07:29 +01002580 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002581
Victor Stinner26486ea2010-05-15 22:23:53 +00002582 if (sys_stdout == NULL || sys_stdout == Py_None) {
2583 PyErr_SetString(
2584 PyCursesError,
2585 "lost sys.stdout");
2586 return NULL;
2587 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002590
Victor Stinner26486ea2010-05-15 22:23:53 +00002591 if (fd == -1) {
2592 return NULL;
2593 }
2594 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002595
Matthias Klose635edd12010-07-30 21:40:57 +00002596 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002597 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002598
Victor Stinner26486ea2010-05-15 22:23:53 +00002599 if (err == 0) {
2600 s = "setupterm: could not find terminal";
2601 } else if (err == -1) {
2602 s = "setupterm: could not find terminfo database";
2603 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002604
Victor Stinner26486ea2010-05-15 22:23:53 +00002605 PyErr_SetString(PyCursesError,s);
2606 return NULL;
2607 }
2608
2609 initialised_setupterm = TRUE;
2610
2611 Py_INCREF(Py_None);
2612 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002613}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002614
2615static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002616PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002617{
Victor Stinner26486ea2010-05-15 22:23:53 +00002618 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002619
Victor Stinner26486ea2010-05-15 22:23:53 +00002620 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002621
Victor Stinner26486ea2010-05-15 22:23:53 +00002622 switch(PyTuple_Size(args)) {
2623 case 1:
2624 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2625 break;
2626 default:
2627 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2628 return NULL;
2629 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002630
Victor Stinner26486ea2010-05-15 22:23:53 +00002631 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002632}
2633
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002634#ifdef HAVE_CURSES_IS_TERM_RESIZED
2635static PyObject *
2636PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2637{
Victor Stinner26486ea2010-05-15 22:23:53 +00002638 int lines;
2639 int columns;
2640 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002641
Victor Stinner26486ea2010-05-15 22:23:53 +00002642 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002643
Victor Stinner26486ea2010-05-15 22:23:53 +00002644 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2645 return NULL;
2646 result = is_term_resized(lines, columns);
2647 if (result == TRUE) {
2648 Py_INCREF(Py_True);
2649 return Py_True;
2650 } else {
2651 Py_INCREF(Py_False);
2652 return Py_False;
2653 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002654}
2655#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2656
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002657#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002658static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002659PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002660{
Victor Stinner26486ea2010-05-15 22:23:53 +00002661 const char *knp;
2662 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002663
Victor Stinner26486ea2010-05-15 22:23:53 +00002664 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002665
Victor Stinner26486ea2010-05-15 22:23:53 +00002666 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002667
Victor Stinner26486ea2010-05-15 22:23:53 +00002668 if (ch < 0) {
2669 PyErr_SetString(PyExc_ValueError, "invalid key number");
2670 return NULL;
2671 }
2672 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002673
Victor Stinner26486ea2010-05-15 22:23:53 +00002674 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002675}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002676#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002677
Victor Stinner26486ea2010-05-15 22:23:53 +00002678static PyObject *
2679PyCurses_KillChar(PyObject *self)
2680{
2681 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002682
Victor Stinner26486ea2010-05-15 22:23:53 +00002683 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002684
Victor Stinner26486ea2010-05-15 22:23:53 +00002685 return PyBytes_FromStringAndSize(&ch, 1);
2686}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687
2688static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002689PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002690{
Victor Stinner26486ea2010-05-15 22:23:53 +00002691 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002692
Victor Stinner26486ea2010-05-15 22:23:53 +00002693 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 switch(PyTuple_Size(args)) {
2696 case 1:
2697 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2698 break;
2699 default:
2700 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2701 return NULL;
2702 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002703
Victor Stinner26486ea2010-05-15 22:23:53 +00002704 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002705}
2706
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002707#ifdef NCURSES_MOUSE_VERSION
2708static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002709PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002710{
Victor Stinner26486ea2010-05-15 22:23:53 +00002711 int interval;
2712 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002713
Victor Stinner26486ea2010-05-15 22:23:53 +00002714 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2715 return NULL;
2716 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002717}
2718
2719static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002720PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002721{
Victor Stinner26486ea2010-05-15 22:23:53 +00002722 int newmask;
2723 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002724
Victor Stinner26486ea2010-05-15 22:23:53 +00002725 PyCursesInitialised;
2726 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2727 return NULL;
2728 availmask = mousemask(newmask, &oldmask);
2729 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002730}
2731#endif
2732
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002733static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002734PyCurses_Napms(PyObject *self, PyObject *args)
2735{
2736 int ms;
2737
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002738 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002739 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002740
2741 return Py_BuildValue("i", napms(ms));
2742}
2743
2744
2745static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002746PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002747{
Victor Stinner26486ea2010-05-15 22:23:53 +00002748 WINDOW *win;
2749 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002750
Victor Stinner26486ea2010-05-15 22:23:53 +00002751 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002752
Victor Stinner26486ea2010-05-15 22:23:53 +00002753 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756
Victor Stinner26486ea2010-05-15 22:23:53 +00002757 if (win == NULL) {
2758 PyErr_SetString(PyCursesError, catchall_NULL);
2759 return NULL;
2760 }
2761
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002762 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002763}
2764
2765static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002766PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002767{
Victor Stinner26486ea2010-05-15 22:23:53 +00002768 WINDOW *win;
2769 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002770
Victor Stinner26486ea2010-05-15 22:23:53 +00002771 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 switch (PyTuple_Size(args)) {
2774 case 2:
2775 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2776 return NULL;
2777 break;
2778 case 4:
2779 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2780 &nlines,&ncols,&begin_y,&begin_x))
2781 return NULL;
2782 break;
2783 default:
2784 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2785 return NULL;
2786 }
Guido van Rossum85738471995-02-17 13:50:17 +00002787
Victor Stinner26486ea2010-05-15 22:23:53 +00002788 win = newwin(nlines,ncols,begin_y,begin_x);
2789 if (win == NULL) {
2790 PyErr_SetString(PyCursesError, catchall_NULL);
2791 return NULL;
2792 }
Guido van Rossum85738471995-02-17 13:50:17 +00002793
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002794 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002795}
2796
2797static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002798PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002799{
Victor Stinner26486ea2010-05-15 22:23:53 +00002800 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002801
Victor Stinner26486ea2010-05-15 22:23:53 +00002802 PyCursesInitialised;
2803 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002804
Victor Stinner26486ea2010-05-15 22:23:53 +00002805 switch(PyTuple_Size(args)) {
2806 case 1:
2807 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2808 break;
2809 default:
2810 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2811 return NULL;
2812 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002813
Victor Stinner26486ea2010-05-15 22:23:53 +00002814 if (pair_content(pair, &f, &b)==ERR) {
2815 PyErr_SetString(PyCursesError,
2816 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2817 return NULL;
2818 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002819
Victor Stinner26486ea2010-05-15 22:23:53 +00002820 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002821}
2822
2823static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002824PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002825{
Victor Stinner26486ea2010-05-15 22:23:53 +00002826 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002827
Victor Stinner26486ea2010-05-15 22:23:53 +00002828 PyCursesInitialised;
2829 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002830
Victor Stinner26486ea2010-05-15 22:23:53 +00002831 switch(PyTuple_Size(args)) {
2832 case 1:
2833 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2834 break;
2835 default:
2836 PyErr_SetString(PyExc_TypeError,
2837 "pair_number requires 1 argument");
2838 return NULL;
2839 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002840
Victor Stinner26486ea2010-05-15 22:23:53 +00002841 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002842}
2843
2844static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002845PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002846{
Victor Stinner26486ea2010-05-15 22:23:53 +00002847 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002848
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002849 if (!PyArg_ParseTuple(args,"y;str", &str))
2850 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002852}
2853
2854static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002855PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002856{
Victor Stinner26486ea2010-05-15 22:23:53 +00002857 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002858
Victor Stinner26486ea2010-05-15 22:23:53 +00002859 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860
Victor Stinner26486ea2010-05-15 22:23:53 +00002861 switch(PyTuple_Size(args)) {
2862 case 0:
2863 qiflush();
2864 Py_INCREF(Py_None);
2865 return Py_None;
2866 case 1:
2867 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2868 if (flag) qiflush();
2869 else noqiflush();
2870 Py_INCREF(Py_None);
2871 return Py_None;
2872 default:
2873 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2874 return NULL;
2875 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002876}
2877
Guido van Rossumd8faa362007-04-27 19:54:29 +00002878/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2879 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002880#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002881static int
2882update_lines_cols(void)
2883{
Victor Stinner26486ea2010-05-15 22:23:53 +00002884 PyObject *o;
2885 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002886 _Py_IDENTIFIER(LINES);
2887 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002888
Victor Stinner26486ea2010-05-15 22:23:53 +00002889 if (!m)
2890 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002891
Victor Stinner26486ea2010-05-15 22:23:53 +00002892 o = PyLong_FromLong(LINES);
2893 if (!o) {
2894 Py_DECREF(m);
2895 return 0;
2896 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002897 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002898 Py_DECREF(m);
2899 Py_DECREF(o);
2900 return 0;
2901 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002902 /* PyId_LINES.object will be initialized here. */
2903 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 Py_DECREF(m);
2905 Py_DECREF(o);
2906 return 0;
2907 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002908 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 o = PyLong_FromLong(COLS);
2910 if (!o) {
2911 Py_DECREF(m);
2912 return 0;
2913 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002914 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002915 Py_DECREF(m);
2916 Py_DECREF(o);
2917 return 0;
2918 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002919 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002920 Py_DECREF(m);
2921 Py_DECREF(o);
2922 return 0;
2923 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002924 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002925 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002926 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002927}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002928#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002929
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002930#ifdef HAVE_CURSES_RESIZETERM
2931static PyObject *
2932PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2933{
Victor Stinner26486ea2010-05-15 22:23:53 +00002934 int lines;
2935 int columns;
2936 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002937
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002939
Victor Stinner26486ea2010-05-15 22:23:53 +00002940 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2941 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002942
Victor Stinner26486ea2010-05-15 22:23:53 +00002943 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2944 if (!result)
2945 return NULL;
2946 if (!update_lines_cols())
2947 return NULL;
2948 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002949}
2950
2951#endif
2952
2953#ifdef HAVE_CURSES_RESIZE_TERM
2954static PyObject *
2955PyCurses_Resize_Term(PyObject *self, PyObject *args)
2956{
Victor Stinner26486ea2010-05-15 22:23:53 +00002957 int lines;
2958 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002959
Victor Stinner26486ea2010-05-15 22:23:53 +00002960 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002961
Victor Stinner26486ea2010-05-15 22:23:53 +00002962 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002963
Victor Stinner26486ea2010-05-15 22:23:53 +00002964 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2965 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002966
Victor Stinner26486ea2010-05-15 22:23:53 +00002967 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2968 if (!result)
2969 return NULL;
2970 if (!update_lines_cols())
2971 return NULL;
2972 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002973}
2974#endif /* HAVE_CURSES_RESIZE_TERM */
2975
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002976static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002977PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002978{
Victor Stinner26486ea2010-05-15 22:23:53 +00002979 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002980
Victor Stinner26486ea2010-05-15 22:23:53 +00002981 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002982
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 if (PyTuple_Size(args)!=2) {
2984 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2985 return NULL;
2986 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002987
Victor Stinner26486ea2010-05-15 22:23:53 +00002988 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002989
Victor Stinner26486ea2010-05-15 22:23:53 +00002990 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002991
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 Py_INCREF(Py_None);
2993 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002994}
2995
2996static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002997PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002998{
Victor Stinner26486ea2010-05-15 22:23:53 +00002999 int code;
3000 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003001
Victor Stinner26486ea2010-05-15 22:23:53 +00003002 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003003
Victor Stinner26486ea2010-05-15 22:23:53 +00003004 code = start_color();
3005 if (code != ERR) {
3006 initialisedcolors = TRUE;
3007 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003008 if (c == NULL)
3009 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003010 PyDict_SetItemString(ModDict, "COLORS", c);
3011 Py_DECREF(c);
3012 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003013 if (cp == NULL)
3014 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003015 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3016 Py_DECREF(cp);
3017 Py_INCREF(Py_None);
3018 return Py_None;
3019 } else {
3020 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3021 return NULL;
3022 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003023}
3024
3025static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003026PyCurses_tigetflag(PyObject *self, PyObject *args)
3027{
Victor Stinner26486ea2010-05-15 22:23:53 +00003028 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003029
Victor Stinner26486ea2010-05-15 22:23:53 +00003030 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003031
Victor Stinner26486ea2010-05-15 22:23:53 +00003032 if (!PyArg_ParseTuple(args, "s", &capname))
3033 return NULL;
3034
3035 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003036}
3037
3038static PyObject *
3039PyCurses_tigetnum(PyObject *self, PyObject *args)
3040{
Victor Stinner26486ea2010-05-15 22:23:53 +00003041 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003042
Victor Stinner26486ea2010-05-15 22:23:53 +00003043 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003044
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 if (!PyArg_ParseTuple(args, "s", &capname))
3046 return NULL;
3047
3048 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003049}
3050
3051static PyObject *
3052PyCurses_tigetstr(PyObject *self, PyObject *args)
3053{
Victor Stinner26486ea2010-05-15 22:23:53 +00003054 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003055
Victor Stinner26486ea2010-05-15 22:23:53 +00003056 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003057
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 if (!PyArg_ParseTuple(args, "s", &capname))
3059 return NULL;
3060
3061 capname = tigetstr( capname );
3062 if (capname == 0 || capname == (char*) -1) {
3063 Py_INCREF(Py_None);
3064 return Py_None;
3065 }
3066 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003067}
3068
3069static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003070PyCurses_tparm(PyObject *self, PyObject *args)
3071{
Victor Stinner26486ea2010-05-15 22:23:53 +00003072 char* fmt;
3073 char* result = NULL;
3074 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 +00003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003077
Victor Stinner26621332011-11-02 23:45:29 +01003078 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003079 &fmt, &i1, &i2, &i3, &i4,
3080 &i5, &i6, &i7, &i8, &i9)) {
3081 return NULL;
3082 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003083
Victor Stinner26486ea2010-05-15 22:23:53 +00003084 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3085 if (!result) {
3086 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3087 return NULL;
3088 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003089
Victor Stinner26486ea2010-05-15 22:23:53 +00003090 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003091}
3092
3093static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003094PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003095{
Victor Stinner26486ea2010-05-15 22:23:53 +00003096 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003097
Victor Stinner26486ea2010-05-15 22:23:53 +00003098 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003099
Victor Stinner26486ea2010-05-15 22:23:53 +00003100 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003101
Victor Stinner26486ea2010-05-15 22:23:53 +00003102 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003103}
3104
3105static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003106PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003107{
Victor Stinner26486ea2010-05-15 22:23:53 +00003108 PyObject *temp;
3109 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003110
Victor Stinner26486ea2010-05-15 22:23:53 +00003111 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003112
Victor Stinner26486ea2010-05-15 22:23:53 +00003113 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003114
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003115 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003116 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003117
Victor Stinner26486ea2010-05-15 22:23:53 +00003118 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003119}
3120
3121static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003122PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003123{
Victor Stinner26486ea2010-05-15 22:23:53 +00003124 PyObject *temp;
3125 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003126
Victor Stinner26486ea2010-05-15 22:23:53 +00003127 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003128
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003129 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003130 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003131
3132 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3133 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003134
Victor Stinner26486ea2010-05-15 22:23:53 +00003135 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003136}
3137
Victor Stinner71e44cb2011-09-06 01:53:03 +02003138#ifdef HAVE_NCURSESW
3139/* Convert an object to a character (wchar_t):
3140
3141 - int
3142 - str of length 1
3143
3144 Return 1 on success, 0 on error. */
3145static int
3146PyCurses_ConvertToWchar_t(PyObject *obj,
3147 wchar_t *wch)
3148{
3149 if (PyUnicode_Check(obj)) {
3150 wchar_t buffer[2];
3151 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3152 PyErr_Format(PyExc_TypeError,
3153 "expect bytes or str of length 1, or int, "
3154 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003155 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003156 return 0;
3157 }
3158 *wch = buffer[0];
3159 return 2;
3160 }
3161 else if (PyLong_CheckExact(obj)) {
3162 long value;
3163 int overflow;
3164 value = PyLong_AsLongAndOverflow(obj, &overflow);
3165 if (overflow) {
3166 PyErr_SetString(PyExc_OverflowError,
3167 "int doesn't fit in long");
3168 return 0;
3169 }
3170 *wch = (wchar_t)value;
3171 if ((long)*wch != value) {
3172 PyErr_Format(PyExc_OverflowError,
3173 "character doesn't fit in wchar_t");
3174 return 0;
3175 }
3176 return 1;
3177 }
3178 else {
3179 PyErr_Format(PyExc_TypeError,
3180 "expect bytes or str of length 1, or int, got %s",
3181 Py_TYPE(obj)->tp_name);
3182 return 0;
3183 }
3184}
3185
3186static PyObject *
3187PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3188{
3189 PyObject *obj;
3190 wchar_t wch;
3191
3192 PyCursesInitialised;
3193
3194 if (!PyArg_ParseTuple(args,"O", &obj))
3195 return NULL;
3196
3197 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3198 return NULL;
3199 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3200}
3201#endif
3202
Guido van Rossumf6971e21994-08-30 12:25:20 +00003203static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003204PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003205{
Victor Stinner26486ea2010-05-15 22:23:53 +00003206 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003207
Victor Stinner26486ea2010-05-15 22:23:53 +00003208 switch(PyTuple_Size(args)) {
3209 case 1:
3210 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3211 return NULL;
3212 break;
3213 default:
3214 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3215 return NULL;
3216 }
3217 use_env(flag);
3218 Py_INCREF(Py_None);
3219 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003220}
3221
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003222#ifndef STRICT_SYSV_CURSES
3223static PyObject *
3224PyCurses_Use_Default_Colors(PyObject *self)
3225{
Victor Stinner26486ea2010-05-15 22:23:53 +00003226 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003227
Victor Stinner26486ea2010-05-15 22:23:53 +00003228 PyCursesInitialised;
3229 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003230
Victor Stinner26486ea2010-05-15 22:23:53 +00003231 code = use_default_colors();
3232 if (code != ERR) {
3233 Py_INCREF(Py_None);
3234 return Py_None;
3235 } else {
3236 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3237 return NULL;
3238 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003239}
3240#endif /* STRICT_SYSV_CURSES */
3241
Guido van Rossumf6971e21994-08-30 12:25:20 +00003242/* List of functions defined in the module */
3243
3244static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003245 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3246 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3247 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3248 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3249 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3250 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3251 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3252 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3253 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3254 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3255 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3256 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3257 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3258 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3259 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3260 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3261 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003262#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003263 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3264 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003265#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003266 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3267 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3268 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3269 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3270 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003271#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003272 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003273#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003274 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3275 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3276 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3277 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3278 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3279 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003280#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003281 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003282#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003283#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003284 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003285#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3287 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3288 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003289#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3291 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003292#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003293 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3294 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3295 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3296 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3297 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3298 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3299 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3300 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3301 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3302 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3303 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3304 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3305 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3306 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3307 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3308 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3309 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003310#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003311 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312#endif
3313#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003314 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3317 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3318 {"setupterm", (PyCFunction)PyCurses_setupterm,
3319 METH_VARARGS|METH_KEYWORDS},
3320 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3321 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3322 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3323 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3324 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3325 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3326 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3327 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3328 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3329 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003330#ifdef HAVE_NCURSESW
3331 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3332#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003333 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003334#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003335 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003336#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003337 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003338};
3339
3340/* Initialization function for the module */
3341
Martin v. Löwis1a214512008-06-11 05:26:20 +00003342
3343static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003344 PyModuleDef_HEAD_INIT,
3345 "_curses",
3346 NULL,
3347 -1,
3348 PyCurses_methods,
3349 NULL,
3350 NULL,
3351 NULL,
3352 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003353};
3354
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003355PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003356PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003357{
Victor Stinner26486ea2010-05-15 22:23:53 +00003358 PyObject *m, *d, *v, *c_api_object;
3359 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003360
Victor Stinner26486ea2010-05-15 22:23:53 +00003361 /* Initialize object type */
3362 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3363 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003364
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 /* Initialize the C API pointer array */
3366 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3367 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3368 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3369 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003370
Victor Stinner26486ea2010-05-15 22:23:53 +00003371 /* Create the module and add the functions */
3372 m = PyModule_Create(&_cursesmodule);
3373 if (m == NULL)
3374 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003375
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 /* Add some symbolic constants to the module */
3377 d = PyModule_GetDict(m);
3378 if (d == NULL)
3379 return NULL;
3380 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003381
Victor Stinner26486ea2010-05-15 22:23:53 +00003382 /* Add a capsule for the C API */
3383 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3384 PyDict_SetItemString(d, "_C_API", c_api_object);
3385 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003386
Victor Stinner26486ea2010-05-15 22:23:53 +00003387 /* For exception curses.error */
3388 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3389 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003390
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 /* Make the version available */
3392 v = PyBytes_FromString(PyCursesVersion);
3393 PyDict_SetItemString(d, "version", v);
3394 PyDict_SetItemString(d, "__version__", v);
3395 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003396
Victor Stinner26486ea2010-05-15 22:23:53 +00003397 SetDictInt("ERR", ERR);
3398 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003399
Victor Stinner26486ea2010-05-15 22:23:53 +00003400 /* Here are some attributes you can add to chars to print */
3401
3402 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3403 SetDictInt("A_NORMAL", A_NORMAL);
3404 SetDictInt("A_STANDOUT", A_STANDOUT);
3405 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3406 SetDictInt("A_REVERSE", A_REVERSE);
3407 SetDictInt("A_BLINK", A_BLINK);
3408 SetDictInt("A_DIM", A_DIM);
3409 SetDictInt("A_BOLD", A_BOLD);
3410 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003411#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003412 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003413#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003414 SetDictInt("A_PROTECT", A_PROTECT);
3415 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3416 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003417
Victor Stinner26486ea2010-05-15 22:23:53 +00003418 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003419#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003420 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003421#endif
3422#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003424#endif
3425#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003426 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003427#endif
3428#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003429 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003430#endif
3431#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003433#endif
3434#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003435 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003436#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003437
Victor Stinner26486ea2010-05-15 22:23:53 +00003438 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3439 SetDictInt("COLOR_RED", COLOR_RED);
3440 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3441 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3442 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3443 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3444 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3445 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003446
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003447#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003448 /* Mouse-related constants */
3449 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3450 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3451 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3452 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3453 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003454
Victor Stinner26486ea2010-05-15 22:23:53 +00003455 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3456 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3457 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3458 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3459 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003460
Victor Stinner26486ea2010-05-15 22:23:53 +00003461 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3462 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3463 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3464 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3465 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003466
Victor Stinner26486ea2010-05-15 22:23:53 +00003467 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3468 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3469 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3470 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3471 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003472
Victor Stinner26486ea2010-05-15 22:23:53 +00003473 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3474 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3475 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003476
Victor Stinner26486ea2010-05-15 22:23:53 +00003477 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3478 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003479#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003480 /* Now set everything up for KEY_ variables */
3481 {
3482 int key;
3483 char *key_n;
3484 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003485#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003486 for (key=KEY_MIN;key < KEY_MAX; key++) {
3487 key_n = (char *)keyname(key);
3488 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3489 continue;
3490 if (strncmp(key_n,"KEY_F(",6)==0) {
3491 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003492 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003493 if (!key_n2) {
3494 PyErr_NoMemory();
3495 break;
3496 }
3497 p1 = key_n;
3498 p2 = key_n2;
3499 while (*p1) {
3500 if (*p1 != '(' && *p1 != ')') {
3501 *p2 = *p1;
3502 p2++;
3503 }
3504 p1++;
3505 }
3506 *p2 = (char)0;
3507 } else
3508 key_n2 = key_n;
3509 SetDictInt(key_n2,key);
3510 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003511 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003512 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003513#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003514 SetDictInt("KEY_MIN", KEY_MIN);
3515 SetDictInt("KEY_MAX", KEY_MAX);
3516 }
3517 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003518}