blob: 1f192dc73c8b0611b6e520a213232d80844f6186 [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
554
555class curses.window
556
557curses.window.addch
558
559 [
560 x: int
561 X-coordinate.
562 y: int
563 Y-coordinate.
564 ]
565
566 ch: object
567 Character to add.
568
569 [
570 attr: long
571 Attributes for the character.
572 ]
573 /
574
575Paint character ch at (y, x) with attributes attr.
576
577Paint character ch at (y, x) with attributes attr,
578overwriting any character previously painted at that location.
579By default, the character position and attributes are the
580current settings for the window object.
581[clinic]*/
582
583PyDoc_STRVAR(curses_window_addch__doc__,
584"Paint character ch at (y, x) with attributes attr.\n"
585"\n"
586"curses.window.addch([x, y,] ch, [attr])\n"
587" x\n"
588" X-coordinate.\n"
589" y\n"
590" Y-coordinate.\n"
591" ch\n"
592" Character to add.\n"
593" attr\n"
594" Attributes for the character.\n"
595"\n"
596"Paint character ch at (y, x) with attributes attr,\n"
597"overwriting any character previously painted at that location.\n"
598"By default, the character position and attributes are the\n"
599"current settings for the window object.");
600
601#define CURSES_WINDOW_ADDCH_METHODDEF \
602 {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
603
Guido van Rossumf6971e21994-08-30 12:25:20 +0000604static PyObject *
Larry Hastings31826802013-10-19 00:09:25 -0700605curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
606
607static PyObject *
608curses_window_addch(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000609{
Larry Hastings31826802013-10-19 00:09:25 -0700610 PyObject *return_value = NULL;
611 int group_left_1 = 0;
612 int x;
613 int y;
614 PyObject *ch;
615 int group_right_1 = 0;
616 long attr;
617
618 switch (PyTuple_Size(args)) {
619 case 1:
620 if (!PyArg_ParseTuple(args, "O:addch", &ch))
621 return NULL;
622 break;
623 case 2:
624 if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr))
625 return NULL;
626 group_right_1 = 1;
627 break;
628 case 3:
629 if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
630 return NULL;
631 group_left_1 = 1;
632 break;
633 case 4:
634 if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
635 return NULL;
636 group_right_1 = 1;
637 group_left_1 = 1;
638 break;
639 default:
640 PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
641 return NULL;
642 }
643 return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
644
645 return return_value;
646}
647
648static PyObject *
649curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
650/*[clinic checksum: 98ade780397a48d0be48439763424b3b00c92089]*/
651{
652 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
653 int coordinates_group = group_left_1;
654 int attr_group = group_right_1;
655 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100656 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700657 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100658#ifdef HAVE_NCURSESW
659 cchar_t wch;
660#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100661 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000662
Larry Hastings31826802013-10-19 00:09:25 -0700663 if (!attr_group)
664 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000665
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100666#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700667 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100668 if (type == 2) {
669 funcname = "add_wch";
670 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700671 if (coordinates_group)
672 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100673 else {
Larry Hastings31826802013-10-19 00:09:25 -0700674 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100675 }
676 }
677 else
678#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300679 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100680#endif
681 if (type == 1) {
682 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700683 if (coordinates_group)
684 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100685 else {
Larry Hastings31826802013-10-19 00:09:25 -0700686 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100687 }
688 }
689 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000690 return NULL;
691 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100692 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000693}
694
695static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000696PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000697{
Victor Stinner26486ea2010-05-15 22:23:53 +0000698 int rtn;
699 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100700 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500701 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100702#ifdef HAVE_NCURSESW
703 wchar_t *wstr = NULL;
704#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000705 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
706 long lattr;
707 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100708 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000709
Victor Stinner26486ea2010-05-15 22:23:53 +0000710 switch (PyTuple_Size(args)) {
711 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100712 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000713 return NULL;
714 break;
715 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100716 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000717 return NULL;
718 attr = lattr;
719 use_attr = TRUE;
720 break;
721 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100722 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000723 return NULL;
724 use_xy = TRUE;
725 break;
726 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100727 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000728 return NULL;
729 attr = lattr;
730 use_xy = use_attr = TRUE;
731 break;
732 default:
733 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
734 return NULL;
735 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100736#ifdef HAVE_NCURSESW
737 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
738#else
739 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
740#endif
741 if (strtype == 0)
742 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000743 if (use_attr == TRUE) {
744 attr_old = getattrs(self->win);
745 (void)wattrset(self->win,attr);
746 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100747#ifdef HAVE_NCURSESW
748 if (strtype == 2) {
749 funcname = "addwstr";
750 if (use_xy == TRUE)
751 rtn = mvwaddwstr(self->win,y,x,wstr);
752 else
753 rtn = waddwstr(self->win,wstr);
754 PyMem_Free(wstr);
755 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000756 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100757#endif
758 {
759 char *str = PyBytes_AS_STRING(bytesobj);
760 funcname = "addstr";
761 if (use_xy == TRUE)
762 rtn = mvwaddstr(self->win,y,x,str);
763 else
764 rtn = waddstr(self->win,str);
765 Py_DECREF(bytesobj);
766 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000767 if (use_attr == TRUE)
768 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100769 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000770}
Guido van Rossum85738471995-02-17 13:50:17 +0000771
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000772static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000773PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000774{
Victor Stinner26486ea2010-05-15 22:23:53 +0000775 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100776 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500777 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100778#ifdef HAVE_NCURSESW
779 wchar_t *wstr = NULL;
780#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000781 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
782 long lattr;
783 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100784 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000785
Victor Stinner26486ea2010-05-15 22:23:53 +0000786 switch (PyTuple_Size(args)) {
787 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100788 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000789 return NULL;
790 break;
791 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100792 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000793 return NULL;
794 attr = lattr;
795 use_attr = TRUE;
796 break;
797 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100798 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000799 return NULL;
800 use_xy = TRUE;
801 break;
802 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100803 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000804 return NULL;
805 attr = lattr;
806 use_xy = use_attr = TRUE;
807 break;
808 default:
809 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
810 return NULL;
811 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100812#ifdef HAVE_NCURSESW
813 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
814#else
815 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
816#endif
817 if (strtype == 0)
818 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000819
Victor Stinner26486ea2010-05-15 22:23:53 +0000820 if (use_attr == TRUE) {
821 attr_old = getattrs(self->win);
822 (void)wattrset(self->win,attr);
823 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100824#ifdef HAVE_NCURSESW
825 if (strtype == 2) {
826 funcname = "addnwstr";
827 if (use_xy == TRUE)
828 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
829 else
830 rtn = waddnwstr(self->win,wstr,n);
831 PyMem_Free(wstr);
832 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000833 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100834#endif
835 {
836 char *str = PyBytes_AS_STRING(bytesobj);
837 funcname = "addnstr";
838 if (use_xy == TRUE)
839 rtn = mvwaddnstr(self->win,y,x,str,n);
840 else
841 rtn = waddnstr(self->win,str,n);
842 Py_DECREF(bytesobj);
843 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000844 if (use_attr == TRUE)
845 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100846 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000847}
848
849static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000850PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000851{
Victor Stinner26486ea2010-05-15 22:23:53 +0000852 PyObject *temp;
853 chtype bkgd;
854 attr_t attr = A_NORMAL;
855 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000856
Victor Stinner26486ea2010-05-15 22:23:53 +0000857 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000858 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000859 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
860 return NULL;
861 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000862 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000863 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
864 return NULL;
865 attr = lattr;
866 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000867 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000868 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
869 return NULL;
870 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000871
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100872 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000873 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874
Victor Stinner26486ea2010-05-15 22:23:53 +0000875 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000876}
877
878static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000879PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
880{
Victor Stinner26486ea2010-05-15 22:23:53 +0000881 long lattr;
882 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
883 return NULL;
884 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000885}
886
887static PyObject *
888PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
889{
Victor Stinner26486ea2010-05-15 22:23:53 +0000890 long lattr;
891 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
892 return NULL;
893 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000894}
895
896static PyObject *
897PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
898{
Victor Stinner26486ea2010-05-15 22:23:53 +0000899 long lattr;
900 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
901 return NULL;
902 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000903}
904
905static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000906PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907{
Victor Stinner26486ea2010-05-15 22:23:53 +0000908 PyObject *temp;
909 chtype bkgd;
910 attr_t attr = A_NORMAL;
911 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000912
Victor Stinner26486ea2010-05-15 22:23:53 +0000913 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000914 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000915 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
916 return NULL;
917 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000918 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000919 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
920 return NULL;
921 attr = lattr;
922 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000923 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000924 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
925 return NULL;
926 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000927
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100928 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000929 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000930
Victor Stinner26486ea2010-05-15 22:23:53 +0000931 wbkgdset(self->win, bkgd | attr);
932 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000933}
934
935static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000936PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000937{
Victor Stinner26486ea2010-05-15 22:23:53 +0000938 PyObject *temp[8];
939 chtype ch[8];
940 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000941
Victor Stinner26486ea2010-05-15 22:23:53 +0000942 /* Clear the array of parameters */
943 for(i=0; i<8; i++) {
944 temp[i] = NULL;
945 ch[i] = 0;
946 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000947
Victor Stinner26486ea2010-05-15 22:23:53 +0000948 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
949 &temp[0], &temp[1], &temp[2], &temp[3],
950 &temp[4], &temp[5], &temp[6], &temp[7]))
951 return NULL;
952
953 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100954 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000955 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000956 }
957
958 wborder(self->win,
959 ch[0], ch[1], ch[2], ch[3],
960 ch[4], ch[5], ch[6], ch[7]);
961 Py_INCREF(Py_None);
962 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000963}
964
965static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000966PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000967{
Victor Stinner26486ea2010-05-15 22:23:53 +0000968 chtype ch1=0,ch2=0;
969 switch(PyTuple_Size(args)){
970 case 0: break;
971 default:
972 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
973 return NULL;
974 }
975 box(self->win,ch1,ch2);
976 Py_INCREF(Py_None);
977 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000978}
979
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000980#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
981#define py_mvwdelch mvwdelch
982#else
983int py_mvwdelch(WINDOW *w, int y, int x)
984{
Victor Stinner26486ea2010-05-15 22:23:53 +0000985 mvwdelch(w,y,x);
986 /* On HP/UX, mvwdelch already returns. On other systems,
987 we may well run into this return statement. */
988 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000989}
990#endif
991
Guido van Rossumd8faa362007-04-27 19:54:29 +0000992/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
993
994static PyObject *
995PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
996{
Victor Stinner26486ea2010-05-15 22:23:53 +0000997 int rtn;
998 int x, y;
999 int num = -1;
1000 short color;
1001 attr_t attr = A_NORMAL;
1002 long lattr;
1003 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001004
Victor Stinner26486ea2010-05-15 22:23:53 +00001005 switch (PyTuple_Size(args)) {
1006 case 1:
1007 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1008 return NULL;
1009 attr = lattr;
1010 break;
1011 case 2:
1012 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1013 return NULL;
1014 attr = lattr;
1015 break;
1016 case 3:
1017 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1018 return NULL;
1019 attr = lattr;
1020 use_xy = TRUE;
1021 break;
1022 case 4:
1023 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1024 return NULL;
1025 attr = lattr;
1026 use_xy = TRUE;
1027 break;
1028 default:
1029 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1030 return NULL;
1031 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001032
Victor Stinner26486ea2010-05-15 22:23:53 +00001033 color = (short)((attr >> 8) & 0xff);
1034 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035
Victor Stinner26486ea2010-05-15 22:23:53 +00001036 if (use_xy == TRUE) {
1037 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1038 touchline(self->win,y,1);
1039 } else {
1040 getyx(self->win,y,x);
1041 rtn = wchgat(self->win,num,attr,color,NULL);
1042 touchline(self->win,y,1);
1043 }
1044 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001045}
1046
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001047
Guido van Rossumf6971e21994-08-30 12:25:20 +00001048static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001049PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001050{
Victor Stinner26486ea2010-05-15 22:23:53 +00001051 int rtn;
1052 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001053
Victor Stinner26486ea2010-05-15 22:23:53 +00001054 switch (PyTuple_Size(args)) {
1055 case 0:
1056 rtn = wdelch(self->win);
1057 break;
1058 case 2:
1059 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1060 return NULL;
1061 rtn = py_mvwdelch(self->win,y,x);
1062 break;
1063 default:
1064 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1065 return NULL;
1066 }
1067 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001068}
1069
1070static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001071PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001072{
Victor Stinner26486ea2010-05-15 22:23:53 +00001073 WINDOW *win;
1074 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001075
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 nlines = 0;
1077 ncols = 0;
1078 switch (PyTuple_Size(args)) {
1079 case 2:
1080 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1081 return NULL;
1082 break;
1083 case 4:
1084 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1085 &nlines,&ncols,&begin_y,&begin_x))
1086 return NULL;
1087 break;
1088 default:
1089 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1090 return NULL;
1091 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001092
Victor Stinner26486ea2010-05-15 22:23:53 +00001093 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001094
Victor Stinner26486ea2010-05-15 22:23:53 +00001095 if (win == NULL) {
1096 PyErr_SetString(PyCursesError, catchall_NULL);
1097 return NULL;
1098 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001099
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001100 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001101}
1102
1103static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001104PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001105{
Victor Stinner26486ea2010-05-15 22:23:53 +00001106 PyObject *temp;
1107 chtype ch;
1108 attr_t attr = A_NORMAL;
1109 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001110
Victor Stinner26486ea2010-05-15 22:23:53 +00001111 switch (PyTuple_Size(args)) {
1112 case 1:
1113 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1114 return NULL;
1115 break;
1116 case 2:
1117 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1118 return NULL;
1119 attr = lattr;
1120 break;
1121 default:
1122 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001123
1124
Victor Stinner26486ea2010-05-15 22:23:53 +00001125 return NULL;
1126 }
Guido van Rossum85738471995-02-17 13:50:17 +00001127
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001128 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001129 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001130
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001131#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001132 if (self->win->_flags & _ISPAD)
1133 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1134 "echochar");
1135 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001136#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001137 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1138 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001139}
1140
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001141#ifdef NCURSES_MOUSE_VERSION
1142static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001143PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001144{
Victor Stinner26486ea2010-05-15 22:23:53 +00001145 int x, y;
1146 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1147 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001148
Victor Stinner26486ea2010-05-15 22:23:53 +00001149 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001150}
1151#endif
1152
Guido van Rossumf6971e21994-08-30 12:25:20 +00001153static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001154PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001155{
Victor Stinner26486ea2010-05-15 22:23:53 +00001156 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001157}
1158
1159static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001160PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001161{
Victor Stinner26486ea2010-05-15 22:23:53 +00001162 int x, y;
1163 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001164
Victor Stinner26486ea2010-05-15 22:23:53 +00001165 switch (PyTuple_Size(args)) {
1166 case 0:
1167 Py_BEGIN_ALLOW_THREADS
1168 rtn = wgetch(self->win);
1169 Py_END_ALLOW_THREADS
1170 break;
1171 case 2:
1172 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1173 return NULL;
1174 Py_BEGIN_ALLOW_THREADS
1175 rtn = mvwgetch(self->win,y,x);
1176 Py_END_ALLOW_THREADS
1177 break;
1178 default:
1179 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1180 return NULL;
1181 }
1182 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001183}
Guido van Rossum85738471995-02-17 13:50:17 +00001184
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001185static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001186PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001187{
Victor Stinner26486ea2010-05-15 22:23:53 +00001188 int x, y;
1189 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001190
Victor Stinner26486ea2010-05-15 22:23:53 +00001191 switch (PyTuple_Size(args)) {
1192 case 0:
1193 Py_BEGIN_ALLOW_THREADS
1194 rtn = wgetch(self->win);
1195 Py_END_ALLOW_THREADS
1196 break;
1197 case 2:
1198 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1199 return NULL;
1200 Py_BEGIN_ALLOW_THREADS
1201 rtn = mvwgetch(self->win,y,x);
1202 Py_END_ALLOW_THREADS
1203 break;
1204 default:
1205 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1206 return NULL;
1207 }
1208 if (rtn == ERR) {
1209 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001210 PyErr_CheckSignals();
1211 if (!PyErr_Occurred())
1212 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001213 return NULL;
1214 } else if (rtn<=255) {
1215 return Py_BuildValue("C", rtn);
1216 } else {
1217 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001218#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001219 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001220#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001221 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001222#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001223 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1224 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001225}
1226
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001227#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001228static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001229PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1230{
1231 int x, y;
1232 int ct;
1233 wint_t rtn;
1234
1235 switch (PyTuple_Size(args)) {
1236 case 0:
1237 Py_BEGIN_ALLOW_THREADS
1238 ct = wget_wch(self->win,&rtn);
1239 Py_END_ALLOW_THREADS
1240 break;
1241 case 2:
1242 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1243 return NULL;
1244 Py_BEGIN_ALLOW_THREADS
1245 ct = mvwget_wch(self->win,y,x,&rtn);
1246 Py_END_ALLOW_THREADS
1247 break;
1248 default:
1249 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1250 return NULL;
1251 }
1252 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001253 if (PyErr_CheckSignals())
1254 return NULL;
1255
Victor Stinnera7878b72011-07-14 23:07:44 +02001256 /* get_wch() returns ERR in nodelay mode */
1257 PyErr_SetString(PyCursesError, "no input");
1258 return NULL;
1259 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001260 if (ct == KEY_CODE_YES)
1261 return PyLong_FromLong(rtn);
1262 else
1263 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001264}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001265#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001266
1267static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001268PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001269{
Victor Stinner26486ea2010-05-15 22:23:53 +00001270 int x, y, n;
1271 char rtn[1024]; /* This should be big enough.. I hope */
1272 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001273
Victor Stinner26486ea2010-05-15 22:23:53 +00001274 switch (PyTuple_Size(args)) {
1275 case 0:
1276 Py_BEGIN_ALLOW_THREADS
1277 rtn2 = wgetnstr(self->win,rtn, 1023);
1278 Py_END_ALLOW_THREADS
1279 break;
1280 case 1:
1281 if (!PyArg_ParseTuple(args,"i;n", &n))
1282 return NULL;
1283 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001284 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001285 Py_END_ALLOW_THREADS
1286 break;
1287 case 2:
1288 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1289 return NULL;
1290 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001291#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001292 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001293#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001294 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001295#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001296 Py_END_ALLOW_THREADS
1297 break;
1298 case 3:
1299 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1300 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001301#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001302 Py_BEGIN_ALLOW_THREADS
1303 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001304 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001305 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001306#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001307 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001308 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001309 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001310#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001311 break;
1312 default:
1313 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1314 return NULL;
1315 }
1316 if (rtn2 == ERR)
1317 rtn[0] = 0;
1318 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001319}
1320
1321static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001322PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001323{
Victor Stinner26486ea2010-05-15 22:23:53 +00001324 PyObject *temp;
1325 chtype ch;
1326 int n, x, y, code = OK;
1327 attr_t attr = A_NORMAL;
1328 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001329
Victor Stinner26486ea2010-05-15 22:23:53 +00001330 switch (PyTuple_Size(args)) {
1331 case 2:
1332 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1333 return NULL;
1334 break;
1335 case 3:
1336 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1337 return NULL;
1338 attr = lattr;
1339 break;
1340 case 4:
1341 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1342 return NULL;
1343 code = wmove(self->win, y, x);
1344 break;
1345 case 5:
1346 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1347 &y, &x, &temp, &n, &lattr))
1348 return NULL;
1349 attr = lattr;
1350 code = wmove(self->win, y, x);
1351 break;
1352 default:
1353 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1354 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001355 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001356
1357 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001358 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001359 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001360 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1361 } else
1362 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001363}
1364
1365static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001366PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001367{
Victor Stinner26486ea2010-05-15 22:23:53 +00001368 int rtn, x, y, use_xy = FALSE;
1369 PyObject *temp;
1370 chtype ch = 0;
1371 attr_t attr = A_NORMAL;
1372 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001373
Victor Stinner26486ea2010-05-15 22:23:53 +00001374 switch (PyTuple_Size(args)) {
1375 case 1:
1376 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1377 return NULL;
1378 break;
1379 case 2:
1380 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1381 return NULL;
1382 attr = lattr;
1383 break;
1384 case 3:
1385 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1386 return NULL;
1387 use_xy = TRUE;
1388 break;
1389 case 4:
1390 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1391 return NULL;
1392 attr = lattr;
1393 use_xy = TRUE;
1394 break;
1395 default:
1396 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1397 return NULL;
1398 }
1399
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001400 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001401 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001402
1403 if (use_xy == TRUE)
1404 rtn = mvwinsch(self->win,y,x, ch | attr);
1405 else {
1406 rtn = winsch(self->win, ch | attr);
1407 }
1408 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409}
1410
1411static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001412PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001413{
Victor Stinner26486ea2010-05-15 22:23:53 +00001414 int x, y, rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001415
Victor Stinner26486ea2010-05-15 22:23:53 +00001416 switch (PyTuple_Size(args)) {
1417 case 0:
1418 rtn = winch(self->win);
1419 break;
1420 case 2:
1421 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1422 return NULL;
1423 rtn = mvwinch(self->win,y,x);
1424 break;
1425 default:
1426 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1427 return NULL;
1428 }
1429 return PyLong_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001430}
1431
1432static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001433PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001434{
Victor Stinner26486ea2010-05-15 22:23:53 +00001435 int x, y, n;
1436 char rtn[1024]; /* This should be big enough.. I hope */
1437 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001438
Victor Stinner26486ea2010-05-15 22:23:53 +00001439 switch (PyTuple_Size(args)) {
1440 case 0:
1441 rtn2 = winnstr(self->win,rtn, 1023);
1442 break;
1443 case 1:
1444 if (!PyArg_ParseTuple(args,"i;n", &n))
1445 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001446 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001447 break;
1448 case 2:
1449 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1450 return NULL;
1451 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1452 break;
1453 case 3:
1454 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1455 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001456 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001457 break;
1458 default:
1459 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1460 return NULL;
1461 }
1462 if (rtn2 == ERR)
1463 rtn[0] = 0;
1464 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001465}
1466
1467static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001468PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001469{
Victor Stinner26486ea2010-05-15 22:23:53 +00001470 int rtn;
1471 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001472 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001473 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001474#ifdef HAVE_NCURSESW
1475 wchar_t *wstr = NULL;
1476#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001477 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1478 long lattr;
1479 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001480 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001481
Victor Stinner26486ea2010-05-15 22:23:53 +00001482 switch (PyTuple_Size(args)) {
1483 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001484 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001485 return NULL;
1486 break;
1487 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001488 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001489 return NULL;
1490 attr = lattr;
1491 use_attr = TRUE;
1492 break;
1493 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001494 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001495 return NULL;
1496 use_xy = TRUE;
1497 break;
1498 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001499 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001500 return NULL;
1501 attr = lattr;
1502 use_xy = use_attr = TRUE;
1503 break;
1504 default:
1505 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1506 return NULL;
1507 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001508
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001509#ifdef HAVE_NCURSESW
1510 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1511#else
1512 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1513#endif
1514 if (strtype == 0)
1515 return NULL;
1516
Victor Stinner26486ea2010-05-15 22:23:53 +00001517 if (use_attr == TRUE) {
1518 attr_old = getattrs(self->win);
1519 (void)wattrset(self->win,attr);
1520 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001521#ifdef HAVE_NCURSESW
1522 if (strtype == 2) {
1523 funcname = "inswstr";
1524 if (use_xy == TRUE)
1525 rtn = mvwins_wstr(self->win,y,x,wstr);
1526 else
1527 rtn = wins_wstr(self->win,wstr);
1528 PyMem_Free(wstr);
1529 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001530 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001531#endif
1532 {
1533 char *str = PyBytes_AS_STRING(bytesobj);
1534 funcname = "insstr";
1535 if (use_xy == TRUE)
1536 rtn = mvwinsstr(self->win,y,x,str);
1537 else
1538 rtn = winsstr(self->win,str);
1539 Py_DECREF(bytesobj);
1540 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001541 if (use_attr == TRUE)
1542 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001543 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001544}
1545
1546static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001547PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001548{
Victor Stinner26486ea2010-05-15 22:23:53 +00001549 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001550 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001551 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001552#ifdef HAVE_NCURSESW
1553 wchar_t *wstr = NULL;
1554#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001555 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1556 long lattr;
1557 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001558 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001559
Victor Stinner26486ea2010-05-15 22:23:53 +00001560 switch (PyTuple_Size(args)) {
1561 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001562 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001563 return NULL;
1564 break;
1565 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001566 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001567 return NULL;
1568 attr = lattr;
1569 use_attr = TRUE;
1570 break;
1571 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001572 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001573 return NULL;
1574 use_xy = TRUE;
1575 break;
1576 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001577 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001578 return NULL;
1579 attr = lattr;
1580 use_xy = use_attr = TRUE;
1581 break;
1582 default:
1583 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1584 return NULL;
1585 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001586
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001587#ifdef HAVE_NCURSESW
1588 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1589#else
1590 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1591#endif
1592 if (strtype == 0)
1593 return NULL;
1594
Victor Stinner26486ea2010-05-15 22:23:53 +00001595 if (use_attr == TRUE) {
1596 attr_old = getattrs(self->win);
1597 (void)wattrset(self->win,attr);
1598 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001599#ifdef HAVE_NCURSESW
1600 if (strtype == 2) {
1601 funcname = "insn_wstr";
1602 if (use_xy == TRUE)
1603 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1604 else
1605 rtn = wins_nwstr(self->win,wstr,n);
1606 PyMem_Free(wstr);
1607 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001608 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001609#endif
1610 {
1611 char *str = PyBytes_AS_STRING(bytesobj);
1612 funcname = "insnstr";
1613 if (use_xy == TRUE)
1614 rtn = mvwinsnstr(self->win,y,x,str,n);
1615 else
1616 rtn = winsnstr(self->win,str,n);
1617 Py_DECREF(bytesobj);
1618 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001619 if (use_attr == TRUE)
1620 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001621 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001622}
1623
1624static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001625PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001626{
Victor Stinner26486ea2010-05-15 22:23:53 +00001627 int line, erg;
1628 if (!PyArg_ParseTuple(args,"i;line", &line))
1629 return NULL;
1630 erg = is_linetouched(self->win, line);
1631 if (erg == ERR) {
1632 PyErr_SetString(PyExc_TypeError,
1633 "is_linetouched: line number outside of boundaries");
1634 return NULL;
1635 } else
1636 if (erg == FALSE) {
1637 Py_INCREF(Py_False);
1638 return Py_False;
1639 } else {
1640 Py_INCREF(Py_True);
1641 return Py_True;
1642 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001643}
1644
1645static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001646PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001647{
Victor Stinner26486ea2010-05-15 22:23:53 +00001648 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1649 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001650
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001651#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001652 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001653#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001654 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001655#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001656 {
1657 switch(PyTuple_Size(args)) {
1658 case 6:
1659 if (!PyArg_ParseTuple(args,
1660 "iiiiii;" \
1661 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1662 &pminrow, &pmincol, &sminrow,
1663 &smincol, &smaxrow, &smaxcol))
1664 return NULL;
1665 Py_BEGIN_ALLOW_THREADS
1666 rtn = pnoutrefresh(self->win,
1667 pminrow, pmincol, sminrow,
1668 smincol, smaxrow, smaxcol);
1669 Py_END_ALLOW_THREADS
1670 return PyCursesCheckERR(rtn, "pnoutrefresh");
1671 default:
1672 PyErr_SetString(PyCursesError,
1673 "noutrefresh() called for a pad "
1674 "requires 6 arguments");
1675 return NULL;
1676 }
1677 } else {
1678 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1679 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001680
Victor Stinner26486ea2010-05-15 22:23:53 +00001681 Py_BEGIN_ALLOW_THREADS
1682 rtn = wnoutrefresh(self->win);
1683 Py_END_ALLOW_THREADS
1684 return PyCursesCheckERR(rtn, "wnoutrefresh");
1685 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001686}
1687
1688static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001689PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1690{
1691 PyCursesWindowObject *temp;
1692 int use_copywin = FALSE;
1693 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1694 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001695
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001696 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001697 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001698 if (!PyArg_ParseTuple(args, "O!;window object",
1699 &PyCursesWindow_Type, &temp))
1700 return NULL;
1701 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001703 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1704 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1705 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1706 return NULL;
1707 use_copywin = TRUE;
1708 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001709 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001710 PyErr_SetString(PyExc_TypeError,
1711 "overlay requires one or seven arguments");
1712 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001713 }
1714
1715 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001716 rtn = copywin(self->win, temp->win, sminrow, smincol,
1717 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1718 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001719 }
1720 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001721 rtn = overlay(self->win, temp->win);
1722 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001723 }
1724}
1725
1726static PyObject *
1727PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1728{
1729 PyCursesWindowObject *temp;
1730 int use_copywin = FALSE;
1731 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1732 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001733
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001734 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001735 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001736 if (!PyArg_ParseTuple(args, "O!;window object",
1737 &PyCursesWindow_Type, &temp))
1738 return NULL;
1739 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001740 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001741 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1742 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1743 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1744 return NULL;
1745 use_copywin = TRUE;
1746 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001747 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001748 PyErr_SetString(PyExc_TypeError,
1749 "overwrite requires one or seven arguments");
1750 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001751 }
1752
1753 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001754 rtn = copywin(self->win, temp->win, sminrow, smincol,
1755 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001756 return PyCursesCheckERR(rtn, "copywin");
1757 }
1758 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001759 rtn = overwrite(self->win, temp->win);
1760 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001761 }
1762}
1763
1764static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001765PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001766{
Victor Stinner26486ea2010-05-15 22:23:53 +00001767 /* We have to simulate this by writing to a temporary FILE*,
1768 then reading back, then writing to the argument stream. */
1769 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001770 int fd = -1;
1771 FILE *fp = NULL;
1772 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001773
Victor Stinner26486ea2010-05-15 22:23:53 +00001774 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1775 fd = mkstemp(fn);
1776 if (fd < 0)
1777 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001778 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1779 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001780 fp = fdopen(fd, "wb+");
1781 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001782 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1783 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001784 }
1785 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001786 if (res == NULL)
1787 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001788 fseek(fp, 0, 0);
1789 while (1) {
1790 char buf[BUFSIZ];
1791 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001792 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001793
Victor Stinner26486ea2010-05-15 22:23:53 +00001794 if (n <= 0)
1795 break;
1796 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001797 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001798 if (res == NULL)
1799 break;
1800 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001801
1802exit:
1803 if (fp != NULL)
1804 fclose(fp);
1805 else if (fd != -1)
1806 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001807 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001808 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001809}
1810
1811static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001812PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001813{
Victor Stinner26486ea2010-05-15 22:23:53 +00001814 int beg, num;
1815 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1816 return NULL;
1817 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818}
1819
1820static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001821PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001822{
Victor Stinner26486ea2010-05-15 22:23:53 +00001823 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1824 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001825
Victor Stinner26486ea2010-05-15 22:23:53 +00001826#ifndef WINDOW_HAS_FLAGS
1827 if (0)
1828#else
1829 if (self->win->_flags & _ISPAD)
1830#endif
1831 {
1832 switch(PyTuple_Size(args)) {
1833 case 6:
1834 if (!PyArg_ParseTuple(args,
1835 "iiiiii;" \
1836 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1837 &pminrow, &pmincol, &sminrow,
1838 &smincol, &smaxrow, &smaxcol))
1839 return NULL;
1840
1841 Py_BEGIN_ALLOW_THREADS
1842 rtn = prefresh(self->win,
1843 pminrow, pmincol, sminrow,
1844 smincol, smaxrow, smaxcol);
1845 Py_END_ALLOW_THREADS
1846 return PyCursesCheckERR(rtn, "prefresh");
1847 default:
1848 PyErr_SetString(PyCursesError,
1849 "refresh() for a pad requires 6 arguments");
1850 return NULL;
1851 }
1852 } else {
1853 if (!PyArg_ParseTuple(args, ":refresh"))
1854 return NULL;
1855 Py_BEGIN_ALLOW_THREADS
1856 rtn = wrefresh(self->win);
1857 Py_END_ALLOW_THREADS
1858 return PyCursesCheckERR(rtn, "prefresh");
1859 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001860}
1861
1862static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001863PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001864{
Victor Stinner26486ea2010-05-15 22:23:53 +00001865 int x, y;
1866 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1867 return NULL;
1868 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001869}
1870
1871static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001872PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001873{
Victor Stinner26486ea2010-05-15 22:23:53 +00001874 WINDOW *win;
1875 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001876
Victor Stinner26486ea2010-05-15 22:23:53 +00001877 nlines = 0;
1878 ncols = 0;
1879 switch (PyTuple_Size(args)) {
1880 case 2:
1881 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1882 return NULL;
1883 break;
1884 case 4:
1885 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1886 &nlines,&ncols,&begin_y,&begin_x))
1887 return NULL;
1888 break;
1889 default:
1890 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1891 return NULL;
1892 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001893
Victor Stinner26486ea2010-05-15 22:23:53 +00001894 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001895#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001896 if (self->win->_flags & _ISPAD)
1897 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1898 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001899#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001900 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001901
Victor Stinner26486ea2010-05-15 22:23:53 +00001902 if (win == NULL) {
1903 PyErr_SetString(PyCursesError, catchall_NULL);
1904 return NULL;
1905 }
1906
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001907 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001908}
1909
1910static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001911PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001912{
Victor Stinner26486ea2010-05-15 22:23:53 +00001913 int nlines;
1914 switch(PyTuple_Size(args)) {
1915 case 0:
1916 return PyCursesCheckERR(scroll(self->win), "scroll");
1917 case 1:
1918 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1919 return NULL;
1920 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1921 default:
1922 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1923 return NULL;
1924 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001925}
1926
1927static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001928PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001929{
Victor Stinner26486ea2010-05-15 22:23:53 +00001930 int st, cnt, val;
1931 switch (PyTuple_Size(args)) {
1932 case 2:
1933 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1934 return NULL;
1935 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1936 case 3:
1937 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1938 return NULL;
1939 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1940 default:
1941 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1942 return NULL;
1943 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001944}
1945
1946static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001947PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001948{
Victor Stinner26486ea2010-05-15 22:23:53 +00001949 PyObject *temp;
1950 chtype ch;
1951 int n, x, y, code = OK;
1952 attr_t attr = A_NORMAL;
1953 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001954
Victor Stinner26486ea2010-05-15 22:23:53 +00001955 switch (PyTuple_Size(args)) {
1956 case 2:
1957 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1958 return NULL;
1959 break;
1960 case 3:
1961 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1962 return NULL;
1963 attr = lattr;
1964 break;
1965 case 4:
1966 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1967 return NULL;
1968 code = wmove(self->win, y, x);
1969 break;
1970 case 5:
1971 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1972 &y, &x, &temp, &n, &lattr))
1973 return NULL;
1974 attr = lattr;
1975 code = wmove(self->win, y, x);
1976 break;
1977 default:
1978 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1979 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001980 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001981
1982 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001983 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001984 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001985 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1986 } else
1987 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001988}
1989
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001990static PyObject *
1991PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1992{
1993 return PyUnicode_FromString(self->encoding);
1994}
1995
1996static int
1997PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1998{
1999 PyObject *ascii;
2000 char *encoding;
2001
2002 /* It is illegal to del win.encoding */
2003 if (value == NULL) {
2004 PyErr_SetString(PyExc_TypeError,
2005 "encoding may not be deleted");
2006 return -1;
2007 }
2008
2009 if (!PyUnicode_Check(value)) {
2010 PyErr_SetString(PyExc_TypeError,
2011 "setting encoding to a non-string");
2012 return -1;
2013 }
2014 ascii = PyUnicode_AsASCIIString(value);
2015 if (ascii == NULL)
2016 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002017 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002018 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002019 if (encoding == NULL) {
2020 PyErr_NoMemory();
2021 return -1;
2022 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002023 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002024 self->encoding = encoding;
2025 return 0;
2026}
2027
2028
Guido van Rossumf6971e21994-08-30 12:25:20 +00002029static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002030 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002031 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2032 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2033 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2034 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2035 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2036 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2037 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2038 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2039 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2040 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2041 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2042 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2043 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2044 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2045 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2046 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2047 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2048 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2049 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002050#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002051 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002052#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002053 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2054 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2055 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2056 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2057 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002058#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002059 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002060#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002061 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2062 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2063 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2064 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2065 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2066 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2067 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2068 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2069 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2070 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2071 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2072 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2073 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2074 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2075 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2076 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2077 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2078 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2079 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2080 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2081 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2082 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2083 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2084 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2085 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2086 /* Backward compatibility alias -- remove in Python 2.3 */
2087 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2088 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2089 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2090 METH_VARARGS},
2091 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2092 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2093 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2094 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002095#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002096 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002097#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002098 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2099 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2100 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2101 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2102 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2103 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2104 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2105 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2106 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2107 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2108 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2109 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2110 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2111 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2112 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2113 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002114};
2115
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002116static PyGetSetDef PyCursesWindow_getsets[] = {
2117 {"encoding",
2118 (getter)PyCursesWindow_get_encoding,
2119 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002120 "the typecode character used to create the array"},
2121 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002122};
2123
Guido van Rossumf6971e21994-08-30 12:25:20 +00002124/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002125
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002126PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002127 PyVarObject_HEAD_INIT(NULL, 0)
2128 "_curses.curses window", /*tp_name*/
2129 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2130 0, /*tp_itemsize*/
2131 /* methods */
2132 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2133 0, /*tp_print*/
2134 (getattrfunc)0, /*tp_getattr*/
2135 (setattrfunc)0, /*tp_setattr*/
2136 0, /*tp_reserved*/
2137 0, /*tp_repr*/
2138 0, /*tp_as_number*/
2139 0, /*tp_as_sequence*/
2140 0, /*tp_as_mapping*/
2141 0, /*tp_hash*/
2142 0, /*tp_call*/
2143 0, /*tp_str*/
2144 0, /*tp_getattro*/
2145 0, /*tp_setattro*/
2146 0, /*tp_as_buffer*/
2147 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2148 0, /*tp_doc*/
2149 0, /*tp_traverse*/
2150 0, /*tp_clear*/
2151 0, /*tp_richcompare*/
2152 0, /*tp_weaklistoffset*/
2153 0, /*tp_iter*/
2154 0, /*tp_iternext*/
2155 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002156 0, /* tp_members */
2157 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002158};
2159
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002160/*********************************************************************
2161 Global Functions
2162**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002163
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164NoArgNoReturnFunction(beep)
2165NoArgNoReturnFunction(def_prog_mode)
2166NoArgNoReturnFunction(def_shell_mode)
2167NoArgNoReturnFunction(doupdate)
2168NoArgNoReturnFunction(endwin)
2169NoArgNoReturnFunction(flash)
2170NoArgNoReturnFunction(nocbreak)
2171NoArgNoReturnFunction(noecho)
2172NoArgNoReturnFunction(nonl)
2173NoArgNoReturnFunction(noraw)
2174NoArgNoReturnFunction(reset_prog_mode)
2175NoArgNoReturnFunction(reset_shell_mode)
2176NoArgNoReturnFunction(resetty)
2177NoArgNoReturnFunction(savetty)
2178
2179NoArgOrFlagNoReturnFunction(cbreak)
2180NoArgOrFlagNoReturnFunction(echo)
2181NoArgOrFlagNoReturnFunction(nl)
2182NoArgOrFlagNoReturnFunction(raw)
2183
2184NoArgReturnIntFunction(baudrate)
2185NoArgReturnIntFunction(termattrs)
2186
2187NoArgReturnStringFunction(termname)
2188NoArgReturnStringFunction(longname)
2189
2190NoArgTrueFalseFunction(can_change_color)
2191NoArgTrueFalseFunction(has_colors)
2192NoArgTrueFalseFunction(has_ic)
2193NoArgTrueFalseFunction(has_il)
2194NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002195NoArgNoReturnVoidFunction(flushinp)
2196NoArgNoReturnVoidFunction(noqiflush)
2197
2198static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002199PyCurses_filter(PyObject *self)
2200{
Victor Stinner26486ea2010-05-15 22:23:53 +00002201 /* not checking for PyCursesInitialised here since filter() must
2202 be called before initscr() */
2203 filter();
2204 Py_INCREF(Py_None);
2205 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002206}
2207
2208static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002209PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002210{
Victor Stinner26486ea2010-05-15 22:23:53 +00002211 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002212
Victor Stinner26486ea2010-05-15 22:23:53 +00002213 PyCursesInitialised;
2214 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215
Victor Stinner26486ea2010-05-15 22:23:53 +00002216 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002217
Victor Stinner26486ea2010-05-15 22:23:53 +00002218 if (color_content(color, &r, &g, &b) != ERR)
2219 return Py_BuildValue("(iii)", r, g, b);
2220 else {
2221 PyErr_SetString(PyCursesError,
2222 "Argument 1 was out of range. Check value of COLORS.");
2223 return NULL;
2224 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002225}
2226
2227static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002228PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229{
Victor Stinner26486ea2010-05-15 22:23:53 +00002230 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231
Victor Stinner26486ea2010-05-15 22:23:53 +00002232 PyCursesInitialised;
2233 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2236 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237}
2238
2239static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002240PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002241{
Victor Stinner26486ea2010-05-15 22:23:53 +00002242 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002243
Victor Stinner26486ea2010-05-15 22:23:53 +00002244 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002245
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002247
Victor Stinner26486ea2010-05-15 22:23:53 +00002248 erg = curs_set(vis);
2249 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002252}
2253
2254static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002255PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002256{
Victor Stinner26486ea2010-05-15 22:23:53 +00002257 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002258
Victor Stinner26486ea2010-05-15 22:23:53 +00002259 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002260
Victor Stinner26486ea2010-05-15 22:23:53 +00002261 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002262
Victor Stinner26486ea2010-05-15 22:23:53 +00002263 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002264}
2265
2266static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002267PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002268{
Victor Stinner26486ea2010-05-15 22:23:53 +00002269 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002270
Victor Stinner26486ea2010-05-15 22:23:53 +00002271 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002272
Victor Stinner26486ea2010-05-15 22:23:53 +00002273 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002274
Victor Stinner26486ea2010-05-15 22:23:53 +00002275 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002276}
2277
2278static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002279PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002280{
Victor Stinner26486ea2010-05-15 22:23:53 +00002281 int x = 0;
2282 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283
Victor Stinner26486ea2010-05-15 22:23:53 +00002284 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002285
Victor Stinner26486ea2010-05-15 22:23:53 +00002286 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287
Victor Stinner26486ea2010-05-15 22:23:53 +00002288 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002289}
2290
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002291#ifdef NCURSES_MOUSE_VERSION
2292static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002293PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002294{
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 int rtn;
2296 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002297
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002299
Victor Stinner26486ea2010-05-15 22:23:53 +00002300 rtn = getmouse( &event );
2301 if (rtn == ERR) {
2302 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2303 return NULL;
2304 }
2305 return Py_BuildValue("(hiiil)",
2306 (short)event.id,
2307 event.x, event.y, event.z,
2308 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002309}
2310
2311static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002312PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002313{
Victor Stinner26486ea2010-05-15 22:23:53 +00002314 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002315
Victor Stinner26486ea2010-05-15 22:23:53 +00002316 PyCursesInitialised;
2317 if (!PyArg_ParseTuple(args, "hiiil",
2318 &event.id,
2319 &event.x, &event.y, &event.z,
2320 (int *) &event.bstate))
2321 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002322
Victor Stinner26486ea2010-05-15 22:23:53 +00002323 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002324}
2325#endif
2326
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002327static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002328PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002329{
Victor Stinner26486ea2010-05-15 22:23:53 +00002330 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002331 int fd = -1;
2332 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 PyObject *data;
2334 size_t datalen;
2335 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002336 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002337 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002338
Victor Stinner26486ea2010-05-15 22:23:53 +00002339 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002340
Victor Stinner26486ea2010-05-15 22:23:53 +00002341 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2342 fd = mkstemp(fn);
2343 if (fd < 0)
2344 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002345 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2346 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002347 fp = fdopen(fd, "wb+");
2348 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002349 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2350 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002351 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002352
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002353 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002354 if (data == NULL)
2355 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002356 if (!PyBytes_Check(data)) {
2357 PyErr_Format(PyExc_TypeError,
2358 "f.read() returned %.100s instead of bytes",
2359 data->ob_type->tp_name);
2360 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002361 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002362 }
2363 datalen = PyBytes_GET_SIZE(data);
2364 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2365 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002366 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2367 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002368 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002369 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002370
Victor Stinner26486ea2010-05-15 22:23:53 +00002371 fseek(fp, 0, 0);
2372 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 if (win == NULL) {
2374 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002375 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002377 res = PyCursesWindow_New(win, NULL);
2378
2379error:
2380 if (fp != NULL)
2381 fclose(fp);
2382 else if (fd != -1)
2383 close(fd);
2384 remove(fn);
2385 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002386}
2387
2388static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002389PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390{
Victor Stinner26486ea2010-05-15 22:23:53 +00002391 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394
Victor Stinner26486ea2010-05-15 22:23:53 +00002395 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002396
Victor Stinner26486ea2010-05-15 22:23:53 +00002397 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002398}
2399
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002400#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002401/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002402static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403{
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002405
Victor Stinner26486ea2010-05-15 22:23:53 +00002406 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002409
Victor Stinner26486ea2010-05-15 22:23:53 +00002410 if (has_key(ch) == FALSE) {
2411 Py_INCREF(Py_False);
2412 return Py_False;
2413 }
2414 Py_INCREF(Py_True);
2415 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002416}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002417#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002418
2419static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002420PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421{
Victor Stinner26486ea2010-05-15 22:23:53 +00002422 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002423
Victor Stinner26486ea2010-05-15 22:23:53 +00002424 PyCursesInitialised;
2425 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002426
Victor Stinner26486ea2010-05-15 22:23:53 +00002427 switch(PyTuple_Size(args)) {
2428 case 4:
2429 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2430 break;
2431 default:
2432 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2433 return NULL;
2434 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002435
Victor Stinner26486ea2010-05-15 22:23:53 +00002436 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002437}
2438
2439static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002440PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002441{
Victor Stinner26486ea2010-05-15 22:23:53 +00002442 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002443
Victor Stinner26486ea2010-05-15 22:23:53 +00002444 PyCursesInitialised;
2445 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002446
Victor Stinner26486ea2010-05-15 22:23:53 +00002447 if (PyTuple_Size(args) != 3) {
2448 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2449 return NULL;
2450 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002451
Victor Stinner26486ea2010-05-15 22:23:53 +00002452 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002453
Victor Stinner26486ea2010-05-15 22:23:53 +00002454 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002455}
2456
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002457static PyObject *ModDict;
2458
Victor Stinner26486ea2010-05-15 22:23:53 +00002459static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002460PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002461{
Victor Stinner26486ea2010-05-15 22:23:53 +00002462 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002463 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002464
Victor Stinner26486ea2010-05-15 22:23:53 +00002465 if (initialised == TRUE) {
2466 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002467 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002468 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002469
Victor Stinner26486ea2010-05-15 22:23:53 +00002470 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002471
Victor Stinner26486ea2010-05-15 22:23:53 +00002472 if (win == NULL) {
2473 PyErr_SetString(PyCursesError, catchall_NULL);
2474 return NULL;
2475 }
Guido van Rossum85738471995-02-17 13:50:17 +00002476
Victor Stinner26486ea2010-05-15 22:23:53 +00002477 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002478
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002479/* This was moved from initcurses() because it core dumped on SGI,
2480 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002481#define SetDictInt(string,ch) \
2482 do { \
2483 PyObject *o = PyLong_FromLong((long) (ch)); \
2484 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2485 Py_DECREF(o); \
2486 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002487 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002488
Victor Stinner26486ea2010-05-15 22:23:53 +00002489 /* Here are some graphic symbols you can use */
2490 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2491 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2492 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2493 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2494 SetDictInt("ACS_LTEE", (ACS_LTEE));
2495 SetDictInt("ACS_RTEE", (ACS_RTEE));
2496 SetDictInt("ACS_BTEE", (ACS_BTEE));
2497 SetDictInt("ACS_TTEE", (ACS_TTEE));
2498 SetDictInt("ACS_HLINE", (ACS_HLINE));
2499 SetDictInt("ACS_VLINE", (ACS_VLINE));
2500 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002501#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002502 /* On HP/UX 11, these are of type cchar_t, which is not an
2503 integral type. If this is a problem on more platforms, a
2504 configure test should be added to determine whether ACS_S1
2505 is of integral type. */
2506 SetDictInt("ACS_S1", (ACS_S1));
2507 SetDictInt("ACS_S9", (ACS_S9));
2508 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2509 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2510 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2511 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2512 SetDictInt("ACS_BULLET", (ACS_BULLET));
2513 SetDictInt("ACS_LARROW", (ACS_LARROW));
2514 SetDictInt("ACS_RARROW", (ACS_RARROW));
2515 SetDictInt("ACS_DARROW", (ACS_DARROW));
2516 SetDictInt("ACS_UARROW", (ACS_UARROW));
2517 SetDictInt("ACS_BOARD", (ACS_BOARD));
2518 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2519 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002520#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002521 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2522 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2523 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2524 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2525 SetDictInt("ACS_SBSS", (ACS_RTEE));
2526 SetDictInt("ACS_SSSB", (ACS_LTEE));
2527 SetDictInt("ACS_SSBS", (ACS_BTEE));
2528 SetDictInt("ACS_BSSS", (ACS_TTEE));
2529 SetDictInt("ACS_BSBS", (ACS_HLINE));
2530 SetDictInt("ACS_SBSB", (ACS_VLINE));
2531 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002532
Victor Stinner26486ea2010-05-15 22:23:53 +00002533 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002534#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002535 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002536#endif
2537#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002539#endif
2540#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002541 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002542#endif
2543#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002545#endif
2546#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002548#endif
2549#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002550 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002551#endif
2552#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002553 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002554#endif
2555
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 SetDictInt("LINES", LINES);
2557 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002558
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002559 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2560 screen_encoding = winobj->encoding;
2561 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002562}
2563
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002564static PyObject *
2565PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2566{
Victor Stinner26486ea2010-05-15 22:23:53 +00002567 int fd = -1;
2568 int err;
2569 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002570
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002572
Victor Stinner26486ea2010-05-15 22:23:53 +00002573 if (!PyArg_ParseTupleAndKeywords(
2574 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2575 return NULL;
2576 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002577
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 if (fd == -1) {
2579 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002580
Victor Stinner26486ea2010-05-15 22:23:53 +00002581 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002582
Victor Stinner26486ea2010-05-15 22:23:53 +00002583 if (sys_stdout == NULL || sys_stdout == Py_None) {
2584 PyErr_SetString(
2585 PyCursesError,
2586 "lost sys.stdout");
2587 return NULL;
2588 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002589
Victor Stinner26486ea2010-05-15 22:23:53 +00002590 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002591
Victor Stinner26486ea2010-05-15 22:23:53 +00002592 if (fd == -1) {
2593 return NULL;
2594 }
2595 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002596
Matthias Klose635edd12010-07-30 21:40:57 +00002597 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002598 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002599
Victor Stinner26486ea2010-05-15 22:23:53 +00002600 if (err == 0) {
2601 s = "setupterm: could not find terminal";
2602 } else if (err == -1) {
2603 s = "setupterm: could not find terminfo database";
2604 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002605
Victor Stinner26486ea2010-05-15 22:23:53 +00002606 PyErr_SetString(PyCursesError,s);
2607 return NULL;
2608 }
2609
2610 initialised_setupterm = TRUE;
2611
2612 Py_INCREF(Py_None);
2613 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002614}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002615
2616static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002617PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002618{
Victor Stinner26486ea2010-05-15 22:23:53 +00002619 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002620
Victor Stinner26486ea2010-05-15 22:23:53 +00002621 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622
Victor Stinner26486ea2010-05-15 22:23:53 +00002623 switch(PyTuple_Size(args)) {
2624 case 1:
2625 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2626 break;
2627 default:
2628 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2629 return NULL;
2630 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631
Victor Stinner26486ea2010-05-15 22:23:53 +00002632 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002633}
2634
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002635#ifdef HAVE_CURSES_IS_TERM_RESIZED
2636static PyObject *
2637PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2638{
Victor Stinner26486ea2010-05-15 22:23:53 +00002639 int lines;
2640 int columns;
2641 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002642
Victor Stinner26486ea2010-05-15 22:23:53 +00002643 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002644
Victor Stinner26486ea2010-05-15 22:23:53 +00002645 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2646 return NULL;
2647 result = is_term_resized(lines, columns);
2648 if (result == TRUE) {
2649 Py_INCREF(Py_True);
2650 return Py_True;
2651 } else {
2652 Py_INCREF(Py_False);
2653 return Py_False;
2654 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002655}
2656#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2657
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002658#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002659static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002660PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002661{
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 const char *knp;
2663 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002664
Victor Stinner26486ea2010-05-15 22:23:53 +00002665 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002666
Victor Stinner26486ea2010-05-15 22:23:53 +00002667 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002668
Victor Stinner26486ea2010-05-15 22:23:53 +00002669 if (ch < 0) {
2670 PyErr_SetString(PyExc_ValueError, "invalid key number");
2671 return NULL;
2672 }
2673 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002674
Victor Stinner26486ea2010-05-15 22:23:53 +00002675 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002676}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002677#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002678
Victor Stinner26486ea2010-05-15 22:23:53 +00002679static PyObject *
2680PyCurses_KillChar(PyObject *self)
2681{
2682 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002683
Victor Stinner26486ea2010-05-15 22:23:53 +00002684 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002685
Victor Stinner26486ea2010-05-15 22:23:53 +00002686 return PyBytes_FromStringAndSize(&ch, 1);
2687}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002688
2689static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002690PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691{
Victor Stinner26486ea2010-05-15 22:23:53 +00002692 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002693
Victor Stinner26486ea2010-05-15 22:23:53 +00002694 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002695
Victor Stinner26486ea2010-05-15 22:23:53 +00002696 switch(PyTuple_Size(args)) {
2697 case 1:
2698 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2699 break;
2700 default:
2701 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2702 return NULL;
2703 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002704
Victor Stinner26486ea2010-05-15 22:23:53 +00002705 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002706}
2707
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002708#ifdef NCURSES_MOUSE_VERSION
2709static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002710PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002711{
Victor Stinner26486ea2010-05-15 22:23:53 +00002712 int interval;
2713 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002714
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2716 return NULL;
2717 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002718}
2719
2720static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002721PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002722{
Victor Stinner26486ea2010-05-15 22:23:53 +00002723 int newmask;
2724 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002725
Victor Stinner26486ea2010-05-15 22:23:53 +00002726 PyCursesInitialised;
2727 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2728 return NULL;
2729 availmask = mousemask(newmask, &oldmask);
2730 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002731}
2732#endif
2733
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002734static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002735PyCurses_Napms(PyObject *self, PyObject *args)
2736{
2737 int ms;
2738
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002739 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002740 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002741
2742 return Py_BuildValue("i", napms(ms));
2743}
2744
2745
2746static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002747PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002748{
Victor Stinner26486ea2010-05-15 22:23:53 +00002749 WINDOW *win;
2750 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002753
Victor Stinner26486ea2010-05-15 22:23:53 +00002754 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002755
Victor Stinner26486ea2010-05-15 22:23:53 +00002756 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002757
Victor Stinner26486ea2010-05-15 22:23:53 +00002758 if (win == NULL) {
2759 PyErr_SetString(PyCursesError, catchall_NULL);
2760 return NULL;
2761 }
2762
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002763 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002764}
2765
2766static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002767PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002768{
Victor Stinner26486ea2010-05-15 22:23:53 +00002769 WINDOW *win;
2770 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002771
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002773
Victor Stinner26486ea2010-05-15 22:23:53 +00002774 switch (PyTuple_Size(args)) {
2775 case 2:
2776 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2777 return NULL;
2778 break;
2779 case 4:
2780 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2781 &nlines,&ncols,&begin_y,&begin_x))
2782 return NULL;
2783 break;
2784 default:
2785 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2786 return NULL;
2787 }
Guido van Rossum85738471995-02-17 13:50:17 +00002788
Victor Stinner26486ea2010-05-15 22:23:53 +00002789 win = newwin(nlines,ncols,begin_y,begin_x);
2790 if (win == NULL) {
2791 PyErr_SetString(PyCursesError, catchall_NULL);
2792 return NULL;
2793 }
Guido van Rossum85738471995-02-17 13:50:17 +00002794
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002795 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002796}
2797
2798static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002799PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002800{
Victor Stinner26486ea2010-05-15 22:23:53 +00002801 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002802
Victor Stinner26486ea2010-05-15 22:23:53 +00002803 PyCursesInitialised;
2804 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002805
Victor Stinner26486ea2010-05-15 22:23:53 +00002806 switch(PyTuple_Size(args)) {
2807 case 1:
2808 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2809 break;
2810 default:
2811 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2812 return NULL;
2813 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002814
Victor Stinner26486ea2010-05-15 22:23:53 +00002815 if (pair_content(pair, &f, &b)==ERR) {
2816 PyErr_SetString(PyCursesError,
2817 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2818 return NULL;
2819 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002820
Victor Stinner26486ea2010-05-15 22:23:53 +00002821 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002822}
2823
2824static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002825PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002826{
Victor Stinner26486ea2010-05-15 22:23:53 +00002827 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002828
Victor Stinner26486ea2010-05-15 22:23:53 +00002829 PyCursesInitialised;
2830 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 switch(PyTuple_Size(args)) {
2833 case 1:
2834 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2835 break;
2836 default:
2837 PyErr_SetString(PyExc_TypeError,
2838 "pair_number requires 1 argument");
2839 return NULL;
2840 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002841
Victor Stinner26486ea2010-05-15 22:23:53 +00002842 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002843}
2844
2845static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002846PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002847{
Victor Stinner26486ea2010-05-15 22:23:53 +00002848 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002849
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002850 if (!PyArg_ParseTuple(args,"y;str", &str))
2851 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002852 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002853}
2854
2855static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002856PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002857{
Victor Stinner26486ea2010-05-15 22:23:53 +00002858 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002859
Victor Stinner26486ea2010-05-15 22:23:53 +00002860 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002861
Victor Stinner26486ea2010-05-15 22:23:53 +00002862 switch(PyTuple_Size(args)) {
2863 case 0:
2864 qiflush();
2865 Py_INCREF(Py_None);
2866 return Py_None;
2867 case 1:
2868 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2869 if (flag) qiflush();
2870 else noqiflush();
2871 Py_INCREF(Py_None);
2872 return Py_None;
2873 default:
2874 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2875 return NULL;
2876 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002877}
2878
Guido van Rossumd8faa362007-04-27 19:54:29 +00002879/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2880 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002881#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002882static int
2883update_lines_cols(void)
2884{
Victor Stinner26486ea2010-05-15 22:23:53 +00002885 PyObject *o;
2886 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002887 _Py_IDENTIFIER(LINES);
2888 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002889
Victor Stinner26486ea2010-05-15 22:23:53 +00002890 if (!m)
2891 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002892
Victor Stinner26486ea2010-05-15 22:23:53 +00002893 o = PyLong_FromLong(LINES);
2894 if (!o) {
2895 Py_DECREF(m);
2896 return 0;
2897 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002898 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002899 Py_DECREF(m);
2900 Py_DECREF(o);
2901 return 0;
2902 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002903 /* PyId_LINES.object will be initialized here. */
2904 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002905 Py_DECREF(m);
2906 Py_DECREF(o);
2907 return 0;
2908 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002909 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002910 o = PyLong_FromLong(COLS);
2911 if (!o) {
2912 Py_DECREF(m);
2913 return 0;
2914 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002915 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002916 Py_DECREF(m);
2917 Py_DECREF(o);
2918 return 0;
2919 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002920 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002921 Py_DECREF(m);
2922 Py_DECREF(o);
2923 return 0;
2924 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002925 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002926 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002927 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002928}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002929#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002930
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002931#ifdef HAVE_CURSES_RESIZETERM
2932static PyObject *
2933PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2934{
Victor Stinner26486ea2010-05-15 22:23:53 +00002935 int lines;
2936 int columns;
2937 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002938
Victor Stinner26486ea2010-05-15 22:23:53 +00002939 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002940
Victor Stinner26486ea2010-05-15 22:23:53 +00002941 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2942 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002943
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2945 if (!result)
2946 return NULL;
2947 if (!update_lines_cols())
2948 return NULL;
2949 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002950}
2951
2952#endif
2953
2954#ifdef HAVE_CURSES_RESIZE_TERM
2955static PyObject *
2956PyCurses_Resize_Term(PyObject *self, PyObject *args)
2957{
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 int lines;
2959 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002960
Victor Stinner26486ea2010-05-15 22:23:53 +00002961 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002962
Victor Stinner26486ea2010-05-15 22:23:53 +00002963 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002964
Victor Stinner26486ea2010-05-15 22:23:53 +00002965 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2966 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002967
Victor Stinner26486ea2010-05-15 22:23:53 +00002968 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2969 if (!result)
2970 return NULL;
2971 if (!update_lines_cols())
2972 return NULL;
2973 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002974}
2975#endif /* HAVE_CURSES_RESIZE_TERM */
2976
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002977static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002978PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002979{
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002981
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002983
Victor Stinner26486ea2010-05-15 22:23:53 +00002984 if (PyTuple_Size(args)!=2) {
2985 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2986 return NULL;
2987 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002988
Victor Stinner26486ea2010-05-15 22:23:53 +00002989 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002990
Victor Stinner26486ea2010-05-15 22:23:53 +00002991 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 Py_INCREF(Py_None);
2994 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002995}
2996
2997static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002998PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002999{
Victor Stinner26486ea2010-05-15 22:23:53 +00003000 int code;
3001 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003002
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003004
Victor Stinner26486ea2010-05-15 22:23:53 +00003005 code = start_color();
3006 if (code != ERR) {
3007 initialisedcolors = TRUE;
3008 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003009 if (c == NULL)
3010 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003011 PyDict_SetItemString(ModDict, "COLORS", c);
3012 Py_DECREF(c);
3013 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003014 if (cp == NULL)
3015 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003016 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3017 Py_DECREF(cp);
3018 Py_INCREF(Py_None);
3019 return Py_None;
3020 } else {
3021 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3022 return NULL;
3023 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003024}
3025
3026static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003027PyCurses_tigetflag(PyObject *self, PyObject *args)
3028{
Victor Stinner26486ea2010-05-15 22:23:53 +00003029 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003030
Victor Stinner26486ea2010-05-15 22:23:53 +00003031 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003032
Victor Stinner26486ea2010-05-15 22:23:53 +00003033 if (!PyArg_ParseTuple(args, "s", &capname))
3034 return NULL;
3035
3036 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003037}
3038
3039static PyObject *
3040PyCurses_tigetnum(PyObject *self, PyObject *args)
3041{
Victor Stinner26486ea2010-05-15 22:23:53 +00003042 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003043
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003045
Victor Stinner26486ea2010-05-15 22:23:53 +00003046 if (!PyArg_ParseTuple(args, "s", &capname))
3047 return NULL;
3048
3049 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003050}
3051
3052static PyObject *
3053PyCurses_tigetstr(PyObject *self, PyObject *args)
3054{
Victor Stinner26486ea2010-05-15 22:23:53 +00003055 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003056
Victor Stinner26486ea2010-05-15 22:23:53 +00003057 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003058
Victor Stinner26486ea2010-05-15 22:23:53 +00003059 if (!PyArg_ParseTuple(args, "s", &capname))
3060 return NULL;
3061
3062 capname = tigetstr( capname );
3063 if (capname == 0 || capname == (char*) -1) {
3064 Py_INCREF(Py_None);
3065 return Py_None;
3066 }
3067 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003068}
3069
3070static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003071PyCurses_tparm(PyObject *self, PyObject *args)
3072{
Victor Stinner26486ea2010-05-15 22:23:53 +00003073 char* fmt;
3074 char* result = NULL;
3075 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 +00003076
Victor Stinner26486ea2010-05-15 22:23:53 +00003077 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003078
Victor Stinner26621332011-11-02 23:45:29 +01003079 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003080 &fmt, &i1, &i2, &i3, &i4,
3081 &i5, &i6, &i7, &i8, &i9)) {
3082 return NULL;
3083 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003084
Victor Stinner26486ea2010-05-15 22:23:53 +00003085 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3086 if (!result) {
3087 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3088 return NULL;
3089 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003090
Victor Stinner26486ea2010-05-15 22:23:53 +00003091 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003092}
3093
3094static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003095PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003096{
Victor Stinner26486ea2010-05-15 22:23:53 +00003097 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003098
Victor Stinner26486ea2010-05-15 22:23:53 +00003099 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003100
Victor Stinner26486ea2010-05-15 22:23:53 +00003101 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003102
Victor Stinner26486ea2010-05-15 22:23:53 +00003103 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003104}
3105
3106static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003107PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003108{
Victor Stinner26486ea2010-05-15 22:23:53 +00003109 PyObject *temp;
3110 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003111
Victor Stinner26486ea2010-05-15 22:23:53 +00003112 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003113
Victor Stinner26486ea2010-05-15 22:23:53 +00003114 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003115
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003116 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003117 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003118
Victor Stinner26486ea2010-05-15 22:23:53 +00003119 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003120}
3121
3122static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003123PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003124{
Victor Stinner26486ea2010-05-15 22:23:53 +00003125 PyObject *temp;
3126 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003127
Victor Stinner26486ea2010-05-15 22:23:53 +00003128 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003129
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003130 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003131 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003132
3133 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3134 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003135
Victor Stinner26486ea2010-05-15 22:23:53 +00003136 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003137}
3138
Victor Stinner71e44cb2011-09-06 01:53:03 +02003139#ifdef HAVE_NCURSESW
3140/* Convert an object to a character (wchar_t):
3141
3142 - int
3143 - str of length 1
3144
3145 Return 1 on success, 0 on error. */
3146static int
3147PyCurses_ConvertToWchar_t(PyObject *obj,
3148 wchar_t *wch)
3149{
3150 if (PyUnicode_Check(obj)) {
3151 wchar_t buffer[2];
3152 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3153 PyErr_Format(PyExc_TypeError,
3154 "expect bytes or str of length 1, or int, "
3155 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003156 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003157 return 0;
3158 }
3159 *wch = buffer[0];
3160 return 2;
3161 }
3162 else if (PyLong_CheckExact(obj)) {
3163 long value;
3164 int overflow;
3165 value = PyLong_AsLongAndOverflow(obj, &overflow);
3166 if (overflow) {
3167 PyErr_SetString(PyExc_OverflowError,
3168 "int doesn't fit in long");
3169 return 0;
3170 }
3171 *wch = (wchar_t)value;
3172 if ((long)*wch != value) {
3173 PyErr_Format(PyExc_OverflowError,
3174 "character doesn't fit in wchar_t");
3175 return 0;
3176 }
3177 return 1;
3178 }
3179 else {
3180 PyErr_Format(PyExc_TypeError,
3181 "expect bytes or str of length 1, or int, got %s",
3182 Py_TYPE(obj)->tp_name);
3183 return 0;
3184 }
3185}
3186
3187static PyObject *
3188PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3189{
3190 PyObject *obj;
3191 wchar_t wch;
3192
3193 PyCursesInitialised;
3194
3195 if (!PyArg_ParseTuple(args,"O", &obj))
3196 return NULL;
3197
3198 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3199 return NULL;
3200 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3201}
3202#endif
3203
Guido van Rossumf6971e21994-08-30 12:25:20 +00003204static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003205PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003206{
Victor Stinner26486ea2010-05-15 22:23:53 +00003207 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003208
Victor Stinner26486ea2010-05-15 22:23:53 +00003209 switch(PyTuple_Size(args)) {
3210 case 1:
3211 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3212 return NULL;
3213 break;
3214 default:
3215 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3216 return NULL;
3217 }
3218 use_env(flag);
3219 Py_INCREF(Py_None);
3220 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003221}
3222
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003223#ifndef STRICT_SYSV_CURSES
3224static PyObject *
3225PyCurses_Use_Default_Colors(PyObject *self)
3226{
Victor Stinner26486ea2010-05-15 22:23:53 +00003227 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003228
Victor Stinner26486ea2010-05-15 22:23:53 +00003229 PyCursesInitialised;
3230 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003231
Victor Stinner26486ea2010-05-15 22:23:53 +00003232 code = use_default_colors();
3233 if (code != ERR) {
3234 Py_INCREF(Py_None);
3235 return Py_None;
3236 } else {
3237 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3238 return NULL;
3239 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003240}
3241#endif /* STRICT_SYSV_CURSES */
3242
Guido van Rossumf6971e21994-08-30 12:25:20 +00003243/* List of functions defined in the module */
3244
3245static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3247 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3248 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3249 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3250 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3251 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3252 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3253 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3254 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3255 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3256 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3257 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3258 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3259 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3260 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3261 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3262 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003263#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003264 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3265 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003266#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003267 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3268 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3269 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3270 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3271 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003272#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003273 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003274#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003275 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3276 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3277 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3278 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3279 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3280 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003281#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003282 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003283#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003284#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003285 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003286#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003287 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3288 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3289 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003290#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003291 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3292 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003293#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3295 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3296 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3297 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3298 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3299 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3300 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3301 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3302 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3303 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3304 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3305 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3306 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3307 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3308 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3309 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3310 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003311#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003312 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003313#endif
3314#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003315 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003316#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003317 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3318 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3319 {"setupterm", (PyCFunction)PyCurses_setupterm,
3320 METH_VARARGS|METH_KEYWORDS},
3321 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3322 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3323 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3324 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3325 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3326 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3327 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3328 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3329 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3330 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003331#ifdef HAVE_NCURSESW
3332 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3333#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003334 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003335#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003336 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003337#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003339};
3340
3341/* Initialization function for the module */
3342
Martin v. Löwis1a214512008-06-11 05:26:20 +00003343
3344static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003345 PyModuleDef_HEAD_INIT,
3346 "_curses",
3347 NULL,
3348 -1,
3349 PyCurses_methods,
3350 NULL,
3351 NULL,
3352 NULL,
3353 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003354};
3355
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003356PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003357PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003358{
Victor Stinner26486ea2010-05-15 22:23:53 +00003359 PyObject *m, *d, *v, *c_api_object;
3360 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003361
Victor Stinner26486ea2010-05-15 22:23:53 +00003362 /* Initialize object type */
3363 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3364 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003365
Victor Stinner26486ea2010-05-15 22:23:53 +00003366 /* Initialize the C API pointer array */
3367 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3368 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3369 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3370 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003371
Victor Stinner26486ea2010-05-15 22:23:53 +00003372 /* Create the module and add the functions */
3373 m = PyModule_Create(&_cursesmodule);
3374 if (m == NULL)
3375 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003376
Victor Stinner26486ea2010-05-15 22:23:53 +00003377 /* Add some symbolic constants to the module */
3378 d = PyModule_GetDict(m);
3379 if (d == NULL)
3380 return NULL;
3381 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003382
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 /* Add a capsule for the C API */
3384 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3385 PyDict_SetItemString(d, "_C_API", c_api_object);
3386 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003387
Victor Stinner26486ea2010-05-15 22:23:53 +00003388 /* For exception curses.error */
3389 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3390 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003391
Victor Stinner26486ea2010-05-15 22:23:53 +00003392 /* Make the version available */
3393 v = PyBytes_FromString(PyCursesVersion);
3394 PyDict_SetItemString(d, "version", v);
3395 PyDict_SetItemString(d, "__version__", v);
3396 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003397
Victor Stinner26486ea2010-05-15 22:23:53 +00003398 SetDictInt("ERR", ERR);
3399 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003400
Victor Stinner26486ea2010-05-15 22:23:53 +00003401 /* Here are some attributes you can add to chars to print */
3402
3403 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3404 SetDictInt("A_NORMAL", A_NORMAL);
3405 SetDictInt("A_STANDOUT", A_STANDOUT);
3406 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3407 SetDictInt("A_REVERSE", A_REVERSE);
3408 SetDictInt("A_BLINK", A_BLINK);
3409 SetDictInt("A_DIM", A_DIM);
3410 SetDictInt("A_BOLD", A_BOLD);
3411 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003412#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003413 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003414#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003415 SetDictInt("A_PROTECT", A_PROTECT);
3416 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3417 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003418
Victor Stinner26486ea2010-05-15 22:23:53 +00003419 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003420#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003421 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003422#endif
3423#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003424 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003425#endif
3426#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003427 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003428#endif
3429#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003430 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003431#endif
3432#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003433 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003434#endif
3435#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003436 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003437#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003438
Victor Stinner26486ea2010-05-15 22:23:53 +00003439 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3440 SetDictInt("COLOR_RED", COLOR_RED);
3441 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3442 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3443 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3444 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3445 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3446 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003447
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003448#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003449 /* Mouse-related constants */
3450 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3451 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3452 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3453 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3454 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003455
Victor Stinner26486ea2010-05-15 22:23:53 +00003456 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3457 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3458 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3459 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3460 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003461
Victor Stinner26486ea2010-05-15 22:23:53 +00003462 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3463 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3464 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3465 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3466 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003467
Victor Stinner26486ea2010-05-15 22:23:53 +00003468 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3469 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3470 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3471 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3472 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003473
Victor Stinner26486ea2010-05-15 22:23:53 +00003474 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3475 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3476 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003477
Victor Stinner26486ea2010-05-15 22:23:53 +00003478 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3479 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003480#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003481 /* Now set everything up for KEY_ variables */
3482 {
3483 int key;
3484 char *key_n;
3485 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003486#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003487 for (key=KEY_MIN;key < KEY_MAX; key++) {
3488 key_n = (char *)keyname(key);
3489 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3490 continue;
3491 if (strncmp(key_n,"KEY_F(",6)==0) {
3492 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003493 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003494 if (!key_n2) {
3495 PyErr_NoMemory();
3496 break;
3497 }
3498 p1 = key_n;
3499 p2 = key_n2;
3500 while (*p1) {
3501 if (*p1 != '(' && *p1 != ')') {
3502 *p2 = *p1;
3503 p2++;
3504 }
3505 p1++;
3506 }
3507 *p2 = (char)0;
3508 } else
3509 key_n2 = key_n;
3510 SetDictInt(key_n2,key);
3511 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003512 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003513 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003514#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003515 SetDictInt("KEY_MIN", KEY_MIN);
3516 SetDictInt("KEY_MAX", KEY_MAX);
3517 }
3518 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003519}