blob: 209f87e8b0db980b82f4d1efa20a3b75eadd6c93 [file] [log] [blame]
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001/*
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002 * This is a curses module for Python.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00004 * Based on prior work by Lance Ellinghaus and Oliver Andrich
5 * Version 1.2 of this module: Copyright 1994 by Lance Ellinghouse,
6 * Cathedral City, California Republic, United States of America.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00007 *
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00008 * Version 1.5b1, heavily extended for ncurses by Oliver Andrich:
9 * Copyright 1996,1997 by Oliver Andrich, Koblenz, Germany.
10 *
Andrew M. Kuchling3adefcc2002-10-30 21:08:34 +000011 * Tidied for Python 1.6, and currently maintained by <amk@amk.ca>.
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000012 *
13 * Permission is hereby granted, free of charge, to any person obtaining
14 * a copy of this source file to use, copy, modify, merge, or publish it
15 * subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or in any new file that contains a substantial portion of
19 * this file.
20 *
21 * THE AUTHOR MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF
22 * THE SOFTWARE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
23 * EXPRESS OR IMPLIED WARRANTY. THE AUTHOR DISCLAIMS ALL WARRANTIES
24 * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
25 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NON-INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
27 * AUTHOR BE LIABLE TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL,
28 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
29 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, STRICT LIABILITY OR
30 * ANY OTHER ACTION ARISING OUT OF OR IN CONNECTION WITH THE USE OR
31 * PERFORMANCE OF THIS SOFTWARE.
32 */
Guido van Rossumf6971e21994-08-30 12:25:20 +000033
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000034/*
35
Victor Stinner26486ea2010-05-15 22:23:53 +000036 A number of SysV or ncurses functions don't have wrappers yet; if you
37 need a given function, add it and send a patch. See
38 http://www.python.org/dev/patches/ for instructions on how to submit
39 patches to Python.
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000040
Victor Stinner26486ea2010-05-15 22:23:53 +000041 Here's a list of currently unsupported functions:
Guido van Rossumd8faa362007-04-27 19:54:29 +000042
Victor Stinner26486ea2010-05-15 22:23:53 +000043 addchnstr addchstr color_set define_key
44 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
45 mcprint mvaddchnstr mvaddchstr mvcur mvinchnstr
46 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr
47 mvwinchnstr mvwinchstr mvwinnstr newterm
48 restartterm ripoffline scr_dump
49 scr_init scr_restore scr_set scrl set_curterm set_term setterm
50 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
51 vidattr vidputs waddchnstr waddchstr
52 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000053
Victor Stinner26486ea2010-05-15 22:23:53 +000054 Low-priority:
55 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
56 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
57 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000058
Victor Stinner26486ea2010-05-15 22:23:53 +000059 Menu extension (ncurses and probably SYSV):
60 current_item free_item free_menu item_count item_description
61 item_index item_init item_name item_opts item_opts_off
62 item_opts_on item_term item_userptr item_value item_visible
63 menu_back menu_driver menu_fore menu_format menu_grey
64 menu_init menu_items menu_mark menu_opts menu_opts_off
65 menu_opts_on menu_pad menu_pattern menu_request_by_name
66 menu_request_name menu_spacing menu_sub menu_term menu_userptr
67 menu_win new_item new_menu pos_menu_cursor post_menu
68 scale_menu set_current_item set_item_init set_item_opts
69 set_item_term set_item_userptr set_item_value set_menu_back
70 set_menu_fore set_menu_format set_menu_grey set_menu_init
71 set_menu_items set_menu_mark set_menu_opts set_menu_pad
72 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
73 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000074
Victor Stinner26486ea2010-05-15 22:23:53 +000075 Form extension (ncurses and probably SYSV):
76 current_field data_ahead data_behind dup_field
77 dynamic_fieldinfo field_arg field_back field_buffer
78 field_count field_fore field_index field_info field_init
79 field_just field_opts field_opts_off field_opts_on field_pad
80 field_status field_term field_type field_userptr form_driver
81 form_fields form_init form_opts form_opts_off form_opts_on
82 form_page form_request_by_name form_request_name form_sub
83 form_term form_userptr form_win free_field free_form
84 link_field link_fieldtype move_field new_field new_form
85 new_page pos_form_cursor post_form scale_form
86 set_current_field set_field_back set_field_buffer
87 set_field_fore set_field_init set_field_just set_field_opts
88 set_field_pad set_field_status set_field_term set_field_type
89 set_field_userptr set_fieldtype_arg set_fieldtype_choice
90 set_form_fields set_form_init set_form_opts set_form_page
91 set_form_sub set_form_term set_form_userptr set_form_win
92 set_max_field set_new_page unpost_form
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000093
94
Victor Stinner26486ea2010-05-15 22:23:53 +000095*/
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000096
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000097/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000098
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +000099char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +0000100
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000101/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000102
Mark Dickinsone047cfa2010-05-11 17:57:09 +0000103#define PY_SSIZE_T_CLEAN
104
Guido van Rossum602099a1994-09-14 13:32:22 +0000105#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000106
Benjamin Petersonb173f782009-05-05 22:31:58 +0000107
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000108#ifdef __hpux
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000109#define STRICT_SYSV_CURSES
110#endif
111
Guido van Rossum858ca0f2001-04-10 19:53:37 +0000112#define CURSES_MODULE
113#include "py_curses.h"
114
Victor Stinner26486ea2010-05-15 22:23:53 +0000115/* These prototypes are in <term.h>, but including this header
116 #defines many common symbols (such as "lines") which breaks the
117 curses module in other ways. So the code will just specify
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000118 explicit prototypes here. */
119extern int setupterm(char *,int,int *);
Fred Drake0368bc42001-07-19 20:48:32 +0000120#ifdef __sgi
121#include <term.h>
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +0000122#endif
123
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100124#ifdef HAVE_LANGINFO_H
125#include <langinfo.h>
126#endif
127
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000128#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000129#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000130typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000131#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000132
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000133#if defined(_AIX)
134#define STRICT_SYSV_CURSES
135#endif
136
Larry Hastings61272b72014-01-07 12:41:53 -0800137/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800138module curses
Larry Hastingsc2047262014-01-25 20:43:29 -0800139class curses.window "PyCursesWindowObject *" "&PyCursesWindow_Type"
Larry Hastings61272b72014-01-07 12:41:53 -0800140[clinic start generated code]*/
Larry Hastings581ee362014-01-28 05:00:08 -0800141/*[clinic end generated code: output=da39a3ee5e6b4b0d input=88c860abdbb50e0c]*/
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800142
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300143#include "clinic/_cursesmodule.c.h"
144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000147static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000148
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000149/* Tells whether setupterm() has been called to initialise terminfo. */
150static int initialised_setupterm = FALSE;
151
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000152/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000153static int initialised = FALSE;
154
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000155/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000156static int initialisedcolors = FALSE;
157
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100158static char *screen_encoding = NULL;
159
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000160/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000161#define PyCursesSetupTermCalled \
162 if (initialised_setupterm != TRUE) { \
163 PyErr_SetString(PyCursesError, \
164 "must call (at least) setupterm() first"); \
165 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000166
Victor Stinner26486ea2010-05-15 22:23:53 +0000167#define PyCursesInitialised \
168 if (initialised != TRUE) { \
169 PyErr_SetString(PyCursesError, \
170 "must call initscr() first"); \
171 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000172
Victor Stinner26486ea2010-05-15 22:23:53 +0000173#define PyCursesInitialisedColor \
174 if (initialisedcolors != TRUE) { \
175 PyErr_SetString(PyCursesError, \
176 "must call start_color() first"); \
177 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000178
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000179/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000180
Guido van Rossum85738471995-02-17 13:50:17 +0000181/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000183 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000184 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000185 */
186
187static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100188PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000189{
Victor Stinner26486ea2010-05-15 22:23:53 +0000190 if (code != ERR) {
191 Py_INCREF(Py_None);
192 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000193 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000194 if (fname == NULL) {
195 PyErr_SetString(PyCursesError, catchall_ERR);
196 } else {
197 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
198 }
199 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000200 }
Guido van Rossum85738471995-02-17 13:50:17 +0000201}
202
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100203/* Convert an object to a byte (an integer of type chtype):
204
205 - int
206 - bytes of length 1
207 - str of length 1
208
209 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000210static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100211PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000212{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100213 long value;
214 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
215 value = (unsigned char)PyBytes_AsString(obj)[0];
216 }
217 else if (PyUnicode_Check(obj)) {
218 if (PyUnicode_GetLength(obj) != 1) {
219 PyErr_Format(PyExc_TypeError,
220 "expect bytes or str of length 1, or int, "
221 "got a str of length %zi",
222 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000223 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100224 }
225 value = PyUnicode_READ_CHAR(obj, 0);
226 if (128 < value) {
227 PyObject *bytes;
228 const char *encoding;
229 if (win)
230 encoding = win->encoding;
231 else
232 encoding = screen_encoding;
233 bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
234 if (bytes == NULL)
235 return 0;
236 if (PyBytes_GET_SIZE(bytes) == 1)
237 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
238 else
239 value = -1;
240 Py_DECREF(bytes);
241 if (value < 0)
242 goto overflow;
243 }
244 }
245 else if (PyLong_CheckExact(obj)) {
246 int long_overflow;
247 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
248 if (long_overflow)
249 goto overflow;
250 }
251 else {
252 PyErr_Format(PyExc_TypeError,
253 "expect bytes or str of length 1, or int, got %s",
254 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000255 return 0;
256 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100257 *ch = (chtype)value;
258 if ((long)*ch != value)
259 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000260 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100261
262overflow:
263 PyErr_SetString(PyExc_OverflowError,
264 "byte doesn't fit in chtype");
265 return 0;
266}
267
268/* Convert an object to a byte (chtype) or a character (cchar_t):
269
270 - int
271 - bytes of length 1
272 - str of length 1
273
274 Return:
275
276 - 2 if obj is a character (written into *wch)
277 - 1 if obj is a byte (written into *ch)
278 - 0 on error: raise an exception */
279static int
280PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
281 chtype *ch
282#ifdef HAVE_NCURSESW
283 , cchar_t *wch
284#endif
285 )
286{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100287 long value;
288#ifdef HAVE_NCURSESW
289 wchar_t buffer[2];
290#endif
291
292 if (PyUnicode_Check(obj)) {
293#ifdef HAVE_NCURSESW
294 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
295 PyErr_Format(PyExc_TypeError,
296 "expect bytes or str of length 1, or int, "
297 "got a str of length %zi",
298 PyUnicode_GET_LENGTH(obj));
299 return 0;
300 }
301 memset(wch->chars, 0, sizeof(wch->chars));
302 wch->chars[0] = buffer[0];
303 return 2;
304#else
305 return PyCurses_ConvertToChtype(win, obj, ch);
306#endif
307 }
308 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
309 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100310 }
311 else if (PyLong_CheckExact(obj)) {
312 int overflow;
313 value = PyLong_AsLongAndOverflow(obj, &overflow);
314 if (overflow) {
315 PyErr_SetString(PyExc_OverflowError,
316 "int doesn't fit in long");
317 return 0;
318 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100319 }
320 else {
321 PyErr_Format(PyExc_TypeError,
322 "expect bytes or str of length 1, or int, got %s",
323 Py_TYPE(obj)->tp_name);
324 return 0;
325 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200326
327 *ch = (chtype)value;
328 if ((long)*ch != value) {
329 PyErr_Format(PyExc_OverflowError,
330 "byte doesn't fit in chtype");
331 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200333 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100334}
335
336/* Convert an object to a byte string (char*) or a wide character string
337 (wchar_t*). Return:
338
339 - 2 if obj is a character string (written into *wch)
340 - 1 if obj is a byte string (written into *bytes)
341 - 0 on error: raise an exception */
342static int
343PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
344 PyObject **bytes, wchar_t **wstr)
345{
346 if (PyUnicode_Check(obj)) {
347#ifdef HAVE_NCURSESW
348 assert (wstr != NULL);
349 *wstr = PyUnicode_AsWideCharString(obj, NULL);
350 if (*wstr == NULL)
351 return 0;
352 return 2;
353#else
354 assert (wstr == NULL);
355 *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
356 if (*bytes == NULL)
357 return 0;
358 return 1;
359#endif
360 }
361 else if (PyBytes_Check(obj)) {
362 Py_INCREF(obj);
363 *bytes = obj;
364 return 1;
365 }
366
367 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
368 Py_TYPE(obj)->tp_name);
369 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000370}
371
Benjamin Peterson21896a32010-03-21 22:03:03 +0000372/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000373 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000374
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000375static int func_PyCursesSetupTermCalled(void)
376{
377 PyCursesSetupTermCalled;
378 return 1;
379}
380
381static int func_PyCursesInitialised(void)
382{
383 PyCursesInitialised;
384 return 1;
385}
386
387static int func_PyCursesInitialisedColor(void)
388{
389 PyCursesInitialisedColor;
390 return 1;
391}
392
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000393/*****************************************************************************
394 The Window Object
395******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000396
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000397/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000398
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000399PyTypeObject PyCursesWindow_Type;
400
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000401/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000402
403 X - function name
404 TYPE - parameter Type
405 ERGSTR - format string for construction of the return value
406 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000407*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000408
Victor Stinner26486ea2010-05-15 22:23:53 +0000409#define Window_NoArgNoReturnFunction(X) \
410 static PyObject *PyCursesWindow_ ## X \
411 (PyCursesWindowObject *self, PyObject *args) \
412 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000413
Victor Stinner26486ea2010-05-15 22:23:53 +0000414#define Window_NoArgTrueFalseFunction(X) \
415 static PyObject * PyCursesWindow_ ## X \
416 (PyCursesWindowObject *self) \
417 { \
418 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
419 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000420
Victor Stinner26486ea2010-05-15 22:23:53 +0000421#define Window_NoArgNoReturnVoidFunction(X) \
422 static PyObject * PyCursesWindow_ ## X \
423 (PyCursesWindowObject *self) \
424 { \
425 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000426
Victor Stinner26486ea2010-05-15 22:23:53 +0000427#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
428 static PyObject * PyCursesWindow_ ## X \
429 (PyCursesWindowObject *self) \
430 { \
431 TYPE arg1, arg2; \
432 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000433
Victor Stinner26486ea2010-05-15 22:23:53 +0000434#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
435 static PyObject * PyCursesWindow_ ## X \
436 (PyCursesWindowObject *self, PyObject *args) \
437 { \
438 TYPE arg1; \
439 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
440 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441
Victor Stinner26486ea2010-05-15 22:23:53 +0000442#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
443 static PyObject * PyCursesWindow_ ## X \
444 (PyCursesWindowObject *self, PyObject *args) \
445 { \
446 TYPE arg1; \
447 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
448 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000449
Victor Stinner26486ea2010-05-15 22:23:53 +0000450#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
451 static PyObject * PyCursesWindow_ ## X \
452 (PyCursesWindowObject *self, PyObject *args) \
453 { \
454 TYPE arg1, arg2; \
455 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
456 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Guido van Rossumf6971e21994-08-30 12:25:20 +0000458/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000459
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000460Window_NoArgNoReturnFunction(untouchwin)
461Window_NoArgNoReturnFunction(touchwin)
462Window_NoArgNoReturnFunction(redrawwin)
463Window_NoArgNoReturnFunction(winsertln)
464Window_NoArgNoReturnFunction(werase)
465Window_NoArgNoReturnFunction(wdeleteln)
466
467Window_NoArgTrueFalseFunction(is_wintouched)
468
469Window_NoArgNoReturnVoidFunction(wsyncup)
470Window_NoArgNoReturnVoidFunction(wsyncdown)
471Window_NoArgNoReturnVoidFunction(wstandend)
472Window_NoArgNoReturnVoidFunction(wstandout)
473Window_NoArgNoReturnVoidFunction(wcursyncup)
474Window_NoArgNoReturnVoidFunction(wclrtoeol)
475Window_NoArgNoReturnVoidFunction(wclrtobot)
476Window_NoArgNoReturnVoidFunction(wclear)
477
478Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
479Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000480Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000481
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000482Window_NoArg2TupleReturnFunction(getyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
484Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
485Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000486
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000487Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
488Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000489#if defined(__NetBSD__)
490Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
491#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000493#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000494Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000495#if defined(__NetBSD__)
496Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
497#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000499#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000500Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
501Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000502Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000503Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
504
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000505Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
506Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
507Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000508#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000509Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000510#endif
511
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000512/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000513
Guido van Rossumf6971e21994-08-30 12:25:20 +0000514static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100515PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000516{
Victor Stinner26486ea2010-05-15 22:23:53 +0000517 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000518
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100519 if (encoding == NULL) {
520#if defined(MS_WINDOWS)
521 char *buffer[100];
522 UINT cp;
523 cp = GetConsoleOutputCP();
524 if (cp != 0) {
525 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
526 encoding = buffer;
527 }
528#elif defined(CODESET)
529 const char *codeset = nl_langinfo(CODESET);
530 if (codeset != NULL && codeset[0] != 0)
531 encoding = codeset;
532#endif
533 if (encoding == NULL)
534 encoding = "utf-8";
535 }
536
Victor Stinner26486ea2010-05-15 22:23:53 +0000537 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
538 if (wo == NULL) return NULL;
539 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200540 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100541 if (wo->encoding == NULL) {
542 Py_DECREF(wo);
543 PyErr_NoMemory();
544 return NULL;
545 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000546 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000547}
548
549static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000550PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000551{
Victor Stinner26486ea2010-05-15 22:23:53 +0000552 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100553 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200554 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000555 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000556}
557
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000558/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000559
Larry Hastings61272b72014-01-07 12:41:53 -0800560/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700561
562curses.window.addch
563
564 [
Larry Hastings31826802013-10-19 00:09:25 -0700565 y: int
566 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700567 x: int
568 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700569 ]
570
571 ch: object
572 Character to add.
573
574 [
575 attr: long
576 Attributes for the character.
577 ]
578 /
579
580Paint character ch at (y, x) with attributes attr.
581
582Paint character ch at (y, x) with attributes attr,
583overwriting any character previously painted at that location.
584By default, the character position and attributes are the
585current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800586[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700587
Larry Hastings31826802013-10-19 00:09:25 -0700588static PyObject *
Larry Hastings9147a962014-05-04 04:41:18 -0700589curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300590/*[clinic end generated code: output=9fa34a5d80151f1a input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700591{
592 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
593 int coordinates_group = group_left_1;
594 int attr_group = group_right_1;
595 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100596 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700597 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100598#ifdef HAVE_NCURSESW
599 cchar_t wch;
600#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100601 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000602
Larry Hastings31826802013-10-19 00:09:25 -0700603 if (!attr_group)
604 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000605
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100606#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700607 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100608 if (type == 2) {
609 funcname = "add_wch";
610 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700611 if (coordinates_group)
612 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100613 else {
Larry Hastings31826802013-10-19 00:09:25 -0700614 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100615 }
616 }
617 else
618#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300619 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100620#endif
621 if (type == 1) {
622 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700623 if (coordinates_group)
624 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100625 else {
Larry Hastings31826802013-10-19 00:09:25 -0700626 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100627 }
628 }
629 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000630 return NULL;
631 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100632 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000633}
634
635static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000636PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000637{
Victor Stinner26486ea2010-05-15 22:23:53 +0000638 int rtn;
639 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100640 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500641 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100642#ifdef HAVE_NCURSESW
643 wchar_t *wstr = NULL;
644#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000645 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
646 long lattr;
647 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100648 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000649
Victor Stinner26486ea2010-05-15 22:23:53 +0000650 switch (PyTuple_Size(args)) {
651 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100652 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000653 return NULL;
654 break;
655 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100656 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000657 return NULL;
658 attr = lattr;
659 use_attr = TRUE;
660 break;
661 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100662 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000663 return NULL;
664 use_xy = TRUE;
665 break;
666 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100667 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000668 return NULL;
669 attr = lattr;
670 use_xy = use_attr = TRUE;
671 break;
672 default:
673 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
674 return NULL;
675 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100676#ifdef HAVE_NCURSESW
677 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
678#else
679 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
680#endif
681 if (strtype == 0)
682 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000683 if (use_attr == TRUE) {
684 attr_old = getattrs(self->win);
685 (void)wattrset(self->win,attr);
686 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100687#ifdef HAVE_NCURSESW
688 if (strtype == 2) {
689 funcname = "addwstr";
690 if (use_xy == TRUE)
691 rtn = mvwaddwstr(self->win,y,x,wstr);
692 else
693 rtn = waddwstr(self->win,wstr);
694 PyMem_Free(wstr);
695 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000696 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100697#endif
698 {
699 char *str = PyBytes_AS_STRING(bytesobj);
700 funcname = "addstr";
701 if (use_xy == TRUE)
702 rtn = mvwaddstr(self->win,y,x,str);
703 else
704 rtn = waddstr(self->win,str);
705 Py_DECREF(bytesobj);
706 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000707 if (use_attr == TRUE)
708 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100709 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000710}
Guido van Rossum85738471995-02-17 13:50:17 +0000711
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000713PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000714{
Victor Stinner26486ea2010-05-15 22:23:53 +0000715 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100716 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500717 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100718#ifdef HAVE_NCURSESW
719 wchar_t *wstr = NULL;
720#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000721 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
722 long lattr;
723 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100724 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000725
Victor Stinner26486ea2010-05-15 22:23:53 +0000726 switch (PyTuple_Size(args)) {
727 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100728 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000729 return NULL;
730 break;
731 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100732 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000733 return NULL;
734 attr = lattr;
735 use_attr = TRUE;
736 break;
737 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100738 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000739 return NULL;
740 use_xy = TRUE;
741 break;
742 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100743 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000744 return NULL;
745 attr = lattr;
746 use_xy = use_attr = TRUE;
747 break;
748 default:
749 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
750 return NULL;
751 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100752#ifdef HAVE_NCURSESW
753 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
754#else
755 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
756#endif
757 if (strtype == 0)
758 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000759
Victor Stinner26486ea2010-05-15 22:23:53 +0000760 if (use_attr == TRUE) {
761 attr_old = getattrs(self->win);
762 (void)wattrset(self->win,attr);
763 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100764#ifdef HAVE_NCURSESW
765 if (strtype == 2) {
766 funcname = "addnwstr";
767 if (use_xy == TRUE)
768 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
769 else
770 rtn = waddnwstr(self->win,wstr,n);
771 PyMem_Free(wstr);
772 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000773 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100774#endif
775 {
776 char *str = PyBytes_AS_STRING(bytesobj);
777 funcname = "addnstr";
778 if (use_xy == TRUE)
779 rtn = mvwaddnstr(self->win,y,x,str,n);
780 else
781 rtn = waddnstr(self->win,str,n);
782 Py_DECREF(bytesobj);
783 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000784 if (use_attr == TRUE)
785 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100786 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000787}
788
789static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000790PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000791{
Victor Stinner26486ea2010-05-15 22:23:53 +0000792 PyObject *temp;
793 chtype bkgd;
794 attr_t attr = A_NORMAL;
795 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000796
Victor Stinner26486ea2010-05-15 22:23:53 +0000797 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000799 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
800 return NULL;
801 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000802 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000803 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
804 return NULL;
805 attr = lattr;
806 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000807 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000808 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
809 return NULL;
810 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000811
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100812 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000813 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000814
Victor Stinner26486ea2010-05-15 22:23:53 +0000815 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000816}
817
818static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000819PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
820{
Victor Stinner26486ea2010-05-15 22:23:53 +0000821 long lattr;
822 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
823 return NULL;
824 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000825}
826
827static PyObject *
828PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
829{
Victor Stinner26486ea2010-05-15 22:23:53 +0000830 long lattr;
831 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
832 return NULL;
833 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000834}
835
836static PyObject *
837PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
838{
Victor Stinner26486ea2010-05-15 22:23:53 +0000839 long lattr;
840 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
841 return NULL;
842 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000843}
844
845static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000846PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000847{
Victor Stinner26486ea2010-05-15 22:23:53 +0000848 PyObject *temp;
849 chtype bkgd;
850 attr_t attr = A_NORMAL;
851 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000852
Victor Stinner26486ea2010-05-15 22:23:53 +0000853 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
856 return NULL;
857 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000858 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000859 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
860 return NULL;
861 attr = lattr;
862 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000864 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
865 return NULL;
866 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000867
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100868 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000869 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 wbkgdset(self->win, bkgd | attr);
872 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000873}
874
875static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000876PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877{
Victor Stinner26486ea2010-05-15 22:23:53 +0000878 PyObject *temp[8];
879 chtype ch[8];
880 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000881
Victor Stinner26486ea2010-05-15 22:23:53 +0000882 /* Clear the array of parameters */
883 for(i=0; i<8; i++) {
884 temp[i] = NULL;
885 ch[i] = 0;
886 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000887
Victor Stinner26486ea2010-05-15 22:23:53 +0000888 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
889 &temp[0], &temp[1], &temp[2], &temp[3],
890 &temp[4], &temp[5], &temp[6], &temp[7]))
891 return NULL;
892
893 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100894 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000895 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000896 }
897
898 wborder(self->win,
899 ch[0], ch[1], ch[2], ch[3],
900 ch[4], ch[5], ch[6], ch[7]);
901 Py_INCREF(Py_None);
902 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000903}
904
905static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000906PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907{
Victor Stinner26486ea2010-05-15 22:23:53 +0000908 chtype ch1=0,ch2=0;
909 switch(PyTuple_Size(args)){
910 case 0: break;
911 default:
912 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
913 return NULL;
914 }
915 box(self->win,ch1,ch2);
916 Py_INCREF(Py_None);
917 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000918}
919
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000920#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
921#define py_mvwdelch mvwdelch
922#else
923int py_mvwdelch(WINDOW *w, int y, int x)
924{
Victor Stinner26486ea2010-05-15 22:23:53 +0000925 mvwdelch(w,y,x);
926 /* On HP/UX, mvwdelch already returns. On other systems,
927 we may well run into this return statement. */
928 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000929}
930#endif
931
Guido van Rossumd8faa362007-04-27 19:54:29 +0000932/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
933
934static PyObject *
935PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
936{
Victor Stinner26486ea2010-05-15 22:23:53 +0000937 int rtn;
938 int x, y;
939 int num = -1;
940 short color;
941 attr_t attr = A_NORMAL;
942 long lattr;
943 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000944
Victor Stinner26486ea2010-05-15 22:23:53 +0000945 switch (PyTuple_Size(args)) {
946 case 1:
947 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
948 return NULL;
949 attr = lattr;
950 break;
951 case 2:
952 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
953 return NULL;
954 attr = lattr;
955 break;
956 case 3:
957 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
958 return NULL;
959 attr = lattr;
960 use_xy = TRUE;
961 break;
962 case 4:
963 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
964 return NULL;
965 attr = lattr;
966 use_xy = TRUE;
967 break;
968 default:
969 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
970 return NULL;
971 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000972
Victor Stinner26486ea2010-05-15 22:23:53 +0000973 color = (short)((attr >> 8) & 0xff);
974 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +0000975
Victor Stinner26486ea2010-05-15 22:23:53 +0000976 if (use_xy == TRUE) {
977 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
978 touchline(self->win,y,1);
979 } else {
980 getyx(self->win,y,x);
981 rtn = wchgat(self->win,num,attr,color,NULL);
982 touchline(self->win,y,1);
983 }
984 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000985}
986
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000987
Guido van Rossumf6971e21994-08-30 12:25:20 +0000988static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000989PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000990{
Victor Stinner26486ea2010-05-15 22:23:53 +0000991 int rtn;
992 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000993
Victor Stinner26486ea2010-05-15 22:23:53 +0000994 switch (PyTuple_Size(args)) {
995 case 0:
996 rtn = wdelch(self->win);
997 break;
998 case 2:
999 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1000 return NULL;
1001 rtn = py_mvwdelch(self->win,y,x);
1002 break;
1003 default:
1004 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1005 return NULL;
1006 }
1007 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001008}
1009
1010static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001011PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001012{
Victor Stinner26486ea2010-05-15 22:23:53 +00001013 WINDOW *win;
1014 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001015
Victor Stinner26486ea2010-05-15 22:23:53 +00001016 nlines = 0;
1017 ncols = 0;
1018 switch (PyTuple_Size(args)) {
1019 case 2:
1020 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1021 return NULL;
1022 break;
1023 case 4:
1024 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1025 &nlines,&ncols,&begin_y,&begin_x))
1026 return NULL;
1027 break;
1028 default:
1029 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1030 return NULL;
1031 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001032
Victor Stinner26486ea2010-05-15 22:23:53 +00001033 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001034
Victor Stinner26486ea2010-05-15 22:23:53 +00001035 if (win == NULL) {
1036 PyErr_SetString(PyCursesError, catchall_NULL);
1037 return NULL;
1038 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001039
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001040 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001041}
1042
1043static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001044PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001045{
Victor Stinner26486ea2010-05-15 22:23:53 +00001046 PyObject *temp;
1047 chtype ch;
1048 attr_t attr = A_NORMAL;
1049 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001050
Victor Stinner26486ea2010-05-15 22:23:53 +00001051 switch (PyTuple_Size(args)) {
1052 case 1:
1053 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1054 return NULL;
1055 break;
1056 case 2:
1057 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1058 return NULL;
1059 attr = lattr;
1060 break;
1061 default:
1062 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001063
1064
Victor Stinner26486ea2010-05-15 22:23:53 +00001065 return NULL;
1066 }
Guido van Rossum85738471995-02-17 13:50:17 +00001067
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001068 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001069 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001070
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001071#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001072 if (self->win->_flags & _ISPAD)
1073 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1074 "echochar");
1075 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001076#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001077 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1078 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001079}
1080
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001081#ifdef NCURSES_MOUSE_VERSION
1082static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001083PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001084{
Victor Stinner26486ea2010-05-15 22:23:53 +00001085 int x, y;
1086 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1087 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001088
Victor Stinner26486ea2010-05-15 22:23:53 +00001089 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001090}
1091#endif
1092
Guido van Rossumf6971e21994-08-30 12:25:20 +00001093static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001094PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001095{
Victor Stinner26486ea2010-05-15 22:23:53 +00001096 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001097}
1098
1099static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001100PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001101{
Victor Stinner26486ea2010-05-15 22:23:53 +00001102 int x, y;
1103 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001104
Victor Stinner26486ea2010-05-15 22:23:53 +00001105 switch (PyTuple_Size(args)) {
1106 case 0:
1107 Py_BEGIN_ALLOW_THREADS
1108 rtn = wgetch(self->win);
1109 Py_END_ALLOW_THREADS
1110 break;
1111 case 2:
1112 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1113 return NULL;
1114 Py_BEGIN_ALLOW_THREADS
1115 rtn = mvwgetch(self->win,y,x);
1116 Py_END_ALLOW_THREADS
1117 break;
1118 default:
1119 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1120 return NULL;
1121 }
1122 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001123}
Guido van Rossum85738471995-02-17 13:50:17 +00001124
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001125static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001126PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001127{
Victor Stinner26486ea2010-05-15 22:23:53 +00001128 int x, y;
1129 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001130
Victor Stinner26486ea2010-05-15 22:23:53 +00001131 switch (PyTuple_Size(args)) {
1132 case 0:
1133 Py_BEGIN_ALLOW_THREADS
1134 rtn = wgetch(self->win);
1135 Py_END_ALLOW_THREADS
1136 break;
1137 case 2:
1138 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1139 return NULL;
1140 Py_BEGIN_ALLOW_THREADS
1141 rtn = mvwgetch(self->win,y,x);
1142 Py_END_ALLOW_THREADS
1143 break;
1144 default:
1145 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1146 return NULL;
1147 }
1148 if (rtn == ERR) {
1149 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001150 PyErr_CheckSignals();
1151 if (!PyErr_Occurred())
1152 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001153 return NULL;
1154 } else if (rtn<=255) {
1155 return Py_BuildValue("C", rtn);
1156 } else {
1157 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001158#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001159 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001160#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001161 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001162#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001163 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1164 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001165}
1166
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001167#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001168static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001169PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1170{
1171 int x, y;
1172 int ct;
1173 wint_t rtn;
1174
1175 switch (PyTuple_Size(args)) {
1176 case 0:
1177 Py_BEGIN_ALLOW_THREADS
1178 ct = wget_wch(self->win,&rtn);
1179 Py_END_ALLOW_THREADS
1180 break;
1181 case 2:
1182 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1183 return NULL;
1184 Py_BEGIN_ALLOW_THREADS
1185 ct = mvwget_wch(self->win,y,x,&rtn);
1186 Py_END_ALLOW_THREADS
1187 break;
1188 default:
1189 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1190 return NULL;
1191 }
1192 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001193 if (PyErr_CheckSignals())
1194 return NULL;
1195
Victor Stinnera7878b72011-07-14 23:07:44 +02001196 /* get_wch() returns ERR in nodelay mode */
1197 PyErr_SetString(PyCursesError, "no input");
1198 return NULL;
1199 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001200 if (ct == KEY_CODE_YES)
1201 return PyLong_FromLong(rtn);
1202 else
1203 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001204}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001205#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001206
1207static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001208PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001209{
Victor Stinner26486ea2010-05-15 22:23:53 +00001210 int x, y, n;
1211 char rtn[1024]; /* This should be big enough.. I hope */
1212 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001213
Victor Stinner26486ea2010-05-15 22:23:53 +00001214 switch (PyTuple_Size(args)) {
1215 case 0:
1216 Py_BEGIN_ALLOW_THREADS
1217 rtn2 = wgetnstr(self->win,rtn, 1023);
1218 Py_END_ALLOW_THREADS
1219 break;
1220 case 1:
1221 if (!PyArg_ParseTuple(args,"i;n", &n))
1222 return NULL;
1223 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001224 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001225 Py_END_ALLOW_THREADS
1226 break;
1227 case 2:
1228 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1229 return NULL;
1230 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001231#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001232 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001233#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001234 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001235#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001236 Py_END_ALLOW_THREADS
1237 break;
1238 case 3:
1239 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1240 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001241#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001242 Py_BEGIN_ALLOW_THREADS
1243 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001244 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001245 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001246#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001247 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001248 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001249 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001250#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001251 break;
1252 default:
1253 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1254 return NULL;
1255 }
1256 if (rtn2 == ERR)
1257 rtn[0] = 0;
1258 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001259}
1260
1261static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001262PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001263{
Victor Stinner26486ea2010-05-15 22:23:53 +00001264 PyObject *temp;
1265 chtype ch;
1266 int n, x, y, code = OK;
1267 attr_t attr = A_NORMAL;
1268 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001269
Victor Stinner26486ea2010-05-15 22:23:53 +00001270 switch (PyTuple_Size(args)) {
1271 case 2:
1272 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1273 return NULL;
1274 break;
1275 case 3:
1276 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1277 return NULL;
1278 attr = lattr;
1279 break;
1280 case 4:
1281 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1282 return NULL;
1283 code = wmove(self->win, y, x);
1284 break;
1285 case 5:
1286 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1287 &y, &x, &temp, &n, &lattr))
1288 return NULL;
1289 attr = lattr;
1290 code = wmove(self->win, y, x);
1291 break;
1292 default:
1293 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1294 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001295 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001296
1297 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001298 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001299 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1301 } else
1302 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001303}
1304
1305static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001306PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001307{
Victor Stinner26486ea2010-05-15 22:23:53 +00001308 int rtn, x, y, use_xy = FALSE;
1309 PyObject *temp;
1310 chtype ch = 0;
1311 attr_t attr = A_NORMAL;
1312 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001313
Victor Stinner26486ea2010-05-15 22:23:53 +00001314 switch (PyTuple_Size(args)) {
1315 case 1:
1316 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1317 return NULL;
1318 break;
1319 case 2:
1320 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1321 return NULL;
1322 attr = lattr;
1323 break;
1324 case 3:
1325 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1326 return NULL;
1327 use_xy = TRUE;
1328 break;
1329 case 4:
1330 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1331 return NULL;
1332 attr = lattr;
1333 use_xy = TRUE;
1334 break;
1335 default:
1336 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1337 return NULL;
1338 }
1339
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001340 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001341 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001342
1343 if (use_xy == TRUE)
1344 rtn = mvwinsch(self->win,y,x, ch | attr);
1345 else {
1346 rtn = winsch(self->win, ch | attr);
1347 }
1348 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001349}
1350
1351static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001352PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001353{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001354 int x, y;
1355 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001356
Victor Stinner26486ea2010-05-15 22:23:53 +00001357 switch (PyTuple_Size(args)) {
1358 case 0:
1359 rtn = winch(self->win);
1360 break;
1361 case 2:
1362 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1363 return NULL;
1364 rtn = mvwinch(self->win,y,x);
1365 break;
1366 default:
1367 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1368 return NULL;
1369 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001370 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001371}
1372
1373static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001374PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001375{
Victor Stinner26486ea2010-05-15 22:23:53 +00001376 int x, y, n;
1377 char rtn[1024]; /* This should be big enough.. I hope */
1378 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001379
Victor Stinner26486ea2010-05-15 22:23:53 +00001380 switch (PyTuple_Size(args)) {
1381 case 0:
1382 rtn2 = winnstr(self->win,rtn, 1023);
1383 break;
1384 case 1:
1385 if (!PyArg_ParseTuple(args,"i;n", &n))
1386 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001387 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001388 break;
1389 case 2:
1390 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1391 return NULL;
1392 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1393 break;
1394 case 3:
1395 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1396 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001397 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001398 break;
1399 default:
1400 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1401 return NULL;
1402 }
1403 if (rtn2 == ERR)
1404 rtn[0] = 0;
1405 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001406}
1407
1408static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001409PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001410{
Victor Stinner26486ea2010-05-15 22:23:53 +00001411 int rtn;
1412 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001413 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001414 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001415#ifdef HAVE_NCURSESW
1416 wchar_t *wstr = NULL;
1417#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001418 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1419 long lattr;
1420 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001421 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001422
Victor Stinner26486ea2010-05-15 22:23:53 +00001423 switch (PyTuple_Size(args)) {
1424 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001425 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001426 return NULL;
1427 break;
1428 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001429 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001430 return NULL;
1431 attr = lattr;
1432 use_attr = TRUE;
1433 break;
1434 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001435 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001436 return NULL;
1437 use_xy = TRUE;
1438 break;
1439 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001440 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001441 return NULL;
1442 attr = lattr;
1443 use_xy = use_attr = TRUE;
1444 break;
1445 default:
1446 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1447 return NULL;
1448 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001449
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001450#ifdef HAVE_NCURSESW
1451 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1452#else
1453 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1454#endif
1455 if (strtype == 0)
1456 return NULL;
1457
Victor Stinner26486ea2010-05-15 22:23:53 +00001458 if (use_attr == TRUE) {
1459 attr_old = getattrs(self->win);
1460 (void)wattrset(self->win,attr);
1461 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001462#ifdef HAVE_NCURSESW
1463 if (strtype == 2) {
1464 funcname = "inswstr";
1465 if (use_xy == TRUE)
1466 rtn = mvwins_wstr(self->win,y,x,wstr);
1467 else
1468 rtn = wins_wstr(self->win,wstr);
1469 PyMem_Free(wstr);
1470 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001471 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001472#endif
1473 {
1474 char *str = PyBytes_AS_STRING(bytesobj);
1475 funcname = "insstr";
1476 if (use_xy == TRUE)
1477 rtn = mvwinsstr(self->win,y,x,str);
1478 else
1479 rtn = winsstr(self->win,str);
1480 Py_DECREF(bytesobj);
1481 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001482 if (use_attr == TRUE)
1483 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001484 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001485}
1486
1487static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001488PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001489{
Victor Stinner26486ea2010-05-15 22:23:53 +00001490 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001491 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001492 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001493#ifdef HAVE_NCURSESW
1494 wchar_t *wstr = NULL;
1495#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001496 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1497 long lattr;
1498 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001499 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001500
Victor Stinner26486ea2010-05-15 22:23:53 +00001501 switch (PyTuple_Size(args)) {
1502 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001503 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001504 return NULL;
1505 break;
1506 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001507 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001508 return NULL;
1509 attr = lattr;
1510 use_attr = TRUE;
1511 break;
1512 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001513 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001514 return NULL;
1515 use_xy = TRUE;
1516 break;
1517 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001518 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001519 return NULL;
1520 attr = lattr;
1521 use_xy = use_attr = TRUE;
1522 break;
1523 default:
1524 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1525 return NULL;
1526 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001527
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001528#ifdef HAVE_NCURSESW
1529 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1530#else
1531 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1532#endif
1533 if (strtype == 0)
1534 return NULL;
1535
Victor Stinner26486ea2010-05-15 22:23:53 +00001536 if (use_attr == TRUE) {
1537 attr_old = getattrs(self->win);
1538 (void)wattrset(self->win,attr);
1539 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001540#ifdef HAVE_NCURSESW
1541 if (strtype == 2) {
1542 funcname = "insn_wstr";
1543 if (use_xy == TRUE)
1544 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1545 else
1546 rtn = wins_nwstr(self->win,wstr,n);
1547 PyMem_Free(wstr);
1548 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001549 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001550#endif
1551 {
1552 char *str = PyBytes_AS_STRING(bytesobj);
1553 funcname = "insnstr";
1554 if (use_xy == TRUE)
1555 rtn = mvwinsnstr(self->win,y,x,str,n);
1556 else
1557 rtn = winsnstr(self->win,str,n);
1558 Py_DECREF(bytesobj);
1559 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001560 if (use_attr == TRUE)
1561 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001562 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001563}
1564
1565static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001566PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001567{
Victor Stinner26486ea2010-05-15 22:23:53 +00001568 int line, erg;
1569 if (!PyArg_ParseTuple(args,"i;line", &line))
1570 return NULL;
1571 erg = is_linetouched(self->win, line);
1572 if (erg == ERR) {
1573 PyErr_SetString(PyExc_TypeError,
1574 "is_linetouched: line number outside of boundaries");
1575 return NULL;
1576 } else
1577 if (erg == FALSE) {
1578 Py_INCREF(Py_False);
1579 return Py_False;
1580 } else {
1581 Py_INCREF(Py_True);
1582 return Py_True;
1583 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001584}
1585
1586static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001587PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001588{
Victor Stinner26486ea2010-05-15 22:23:53 +00001589 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1590 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001591
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001592#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001593 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001594#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001595 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001596#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001597 {
1598 switch(PyTuple_Size(args)) {
1599 case 6:
1600 if (!PyArg_ParseTuple(args,
1601 "iiiiii;" \
1602 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1603 &pminrow, &pmincol, &sminrow,
1604 &smincol, &smaxrow, &smaxcol))
1605 return NULL;
1606 Py_BEGIN_ALLOW_THREADS
1607 rtn = pnoutrefresh(self->win,
1608 pminrow, pmincol, sminrow,
1609 smincol, smaxrow, smaxcol);
1610 Py_END_ALLOW_THREADS
1611 return PyCursesCheckERR(rtn, "pnoutrefresh");
1612 default:
1613 PyErr_SetString(PyCursesError,
1614 "noutrefresh() called for a pad "
1615 "requires 6 arguments");
1616 return NULL;
1617 }
1618 } else {
1619 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1620 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001621
Victor Stinner26486ea2010-05-15 22:23:53 +00001622 Py_BEGIN_ALLOW_THREADS
1623 rtn = wnoutrefresh(self->win);
1624 Py_END_ALLOW_THREADS
1625 return PyCursesCheckERR(rtn, "wnoutrefresh");
1626 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001627}
1628
1629static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001630PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1631{
1632 PyCursesWindowObject *temp;
1633 int use_copywin = FALSE;
1634 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1635 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001636
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001637 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001638 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001639 if (!PyArg_ParseTuple(args, "O!;window object",
1640 &PyCursesWindow_Type, &temp))
1641 return NULL;
1642 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001643 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001644 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1645 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1646 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1647 return NULL;
1648 use_copywin = TRUE;
1649 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001650 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001651 PyErr_SetString(PyExc_TypeError,
1652 "overlay requires one or seven arguments");
1653 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001654 }
1655
1656 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001657 rtn = copywin(self->win, temp->win, sminrow, smincol,
1658 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1659 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001660 }
1661 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001662 rtn = overlay(self->win, temp->win);
1663 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001664 }
1665}
1666
1667static PyObject *
1668PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1669{
1670 PyCursesWindowObject *temp;
1671 int use_copywin = FALSE;
1672 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1673 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001674
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001675 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001676 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001677 if (!PyArg_ParseTuple(args, "O!;window object",
1678 &PyCursesWindow_Type, &temp))
1679 return NULL;
1680 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001681 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001682 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1683 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1684 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1685 return NULL;
1686 use_copywin = TRUE;
1687 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001688 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001689 PyErr_SetString(PyExc_TypeError,
1690 "overwrite requires one or seven arguments");
1691 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001692 }
1693
1694 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001695 rtn = copywin(self->win, temp->win, sminrow, smincol,
1696 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001697 return PyCursesCheckERR(rtn, "copywin");
1698 }
1699 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001700 rtn = overwrite(self->win, temp->win);
1701 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702 }
1703}
1704
1705static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001706PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001707{
Victor Stinner26486ea2010-05-15 22:23:53 +00001708 /* We have to simulate this by writing to a temporary FILE*,
1709 then reading back, then writing to the argument stream. */
1710 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001711 int fd = -1;
1712 FILE *fp = NULL;
1713 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001714
Victor Stinner26486ea2010-05-15 22:23:53 +00001715 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1716 fd = mkstemp(fn);
1717 if (fd < 0)
1718 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001719 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1720 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001721 fp = fdopen(fd, "wb+");
1722 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001723 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1724 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001725 }
1726 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001727 if (res == NULL)
1728 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001729 fseek(fp, 0, 0);
1730 while (1) {
1731 char buf[BUFSIZ];
1732 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001733 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001734
Victor Stinner26486ea2010-05-15 22:23:53 +00001735 if (n <= 0)
1736 break;
1737 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001738 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001739 if (res == NULL)
1740 break;
1741 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001742
1743exit:
1744 if (fp != NULL)
1745 fclose(fp);
1746 else if (fd != -1)
1747 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001748 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001749 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001750}
1751
1752static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001753PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001754{
Victor Stinner26486ea2010-05-15 22:23:53 +00001755 int beg, num;
1756 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1757 return NULL;
1758 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001759}
1760
1761static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001762PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001763{
Victor Stinner26486ea2010-05-15 22:23:53 +00001764 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1765 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001766
Victor Stinner26486ea2010-05-15 22:23:53 +00001767#ifndef WINDOW_HAS_FLAGS
1768 if (0)
1769#else
1770 if (self->win->_flags & _ISPAD)
1771#endif
1772 {
1773 switch(PyTuple_Size(args)) {
1774 case 6:
1775 if (!PyArg_ParseTuple(args,
1776 "iiiiii;" \
1777 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1778 &pminrow, &pmincol, &sminrow,
1779 &smincol, &smaxrow, &smaxcol))
1780 return NULL;
1781
1782 Py_BEGIN_ALLOW_THREADS
1783 rtn = prefresh(self->win,
1784 pminrow, pmincol, sminrow,
1785 smincol, smaxrow, smaxcol);
1786 Py_END_ALLOW_THREADS
1787 return PyCursesCheckERR(rtn, "prefresh");
1788 default:
1789 PyErr_SetString(PyCursesError,
1790 "refresh() for a pad requires 6 arguments");
1791 return NULL;
1792 }
1793 } else {
1794 if (!PyArg_ParseTuple(args, ":refresh"))
1795 return NULL;
1796 Py_BEGIN_ALLOW_THREADS
1797 rtn = wrefresh(self->win);
1798 Py_END_ALLOW_THREADS
1799 return PyCursesCheckERR(rtn, "prefresh");
1800 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001801}
1802
1803static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001804PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001805{
Victor Stinner26486ea2010-05-15 22:23:53 +00001806 int x, y;
1807 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1808 return NULL;
1809 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001810}
1811
1812static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001813PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001814{
Victor Stinner26486ea2010-05-15 22:23:53 +00001815 WINDOW *win;
1816 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001817
Victor Stinner26486ea2010-05-15 22:23:53 +00001818 nlines = 0;
1819 ncols = 0;
1820 switch (PyTuple_Size(args)) {
1821 case 2:
1822 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1823 return NULL;
1824 break;
1825 case 4:
1826 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1827 &nlines,&ncols,&begin_y,&begin_x))
1828 return NULL;
1829 break;
1830 default:
1831 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1832 return NULL;
1833 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001834
Victor Stinner26486ea2010-05-15 22:23:53 +00001835 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001836#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001837 if (self->win->_flags & _ISPAD)
1838 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1839 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001840#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001841 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001842
Victor Stinner26486ea2010-05-15 22:23:53 +00001843 if (win == NULL) {
1844 PyErr_SetString(PyCursesError, catchall_NULL);
1845 return NULL;
1846 }
1847
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001848 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001849}
1850
1851static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001852PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001853{
Victor Stinner26486ea2010-05-15 22:23:53 +00001854 int nlines;
1855 switch(PyTuple_Size(args)) {
1856 case 0:
1857 return PyCursesCheckERR(scroll(self->win), "scroll");
1858 case 1:
1859 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1860 return NULL;
1861 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1862 default:
1863 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1864 return NULL;
1865 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001866}
1867
1868static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001869PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001870{
Victor Stinner26486ea2010-05-15 22:23:53 +00001871 int st, cnt, val;
1872 switch (PyTuple_Size(args)) {
1873 case 2:
1874 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1875 return NULL;
1876 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1877 case 3:
1878 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1879 return NULL;
1880 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1881 default:
1882 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1883 return NULL;
1884 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001885}
1886
1887static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001888PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001889{
Victor Stinner26486ea2010-05-15 22:23:53 +00001890 PyObject *temp;
1891 chtype ch;
1892 int n, x, y, code = OK;
1893 attr_t attr = A_NORMAL;
1894 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001895
Victor Stinner26486ea2010-05-15 22:23:53 +00001896 switch (PyTuple_Size(args)) {
1897 case 2:
1898 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1899 return NULL;
1900 break;
1901 case 3:
1902 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1903 return NULL;
1904 attr = lattr;
1905 break;
1906 case 4:
1907 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1908 return NULL;
1909 code = wmove(self->win, y, x);
1910 break;
1911 case 5:
1912 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1913 &y, &x, &temp, &n, &lattr))
1914 return NULL;
1915 attr = lattr;
1916 code = wmove(self->win, y, x);
1917 break;
1918 default:
1919 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1920 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001921 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001922
1923 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001924 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001925 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001926 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1927 } else
1928 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001929}
1930
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001931static PyObject *
1932PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1933{
1934 return PyUnicode_FromString(self->encoding);
1935}
1936
1937static int
1938PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
1939{
1940 PyObject *ascii;
1941 char *encoding;
1942
1943 /* It is illegal to del win.encoding */
1944 if (value == NULL) {
1945 PyErr_SetString(PyExc_TypeError,
1946 "encoding may not be deleted");
1947 return -1;
1948 }
1949
1950 if (!PyUnicode_Check(value)) {
1951 PyErr_SetString(PyExc_TypeError,
1952 "setting encoding to a non-string");
1953 return -1;
1954 }
1955 ascii = PyUnicode_AsASCIIString(value);
1956 if (ascii == NULL)
1957 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001958 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02001959 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001960 if (encoding == NULL) {
1961 PyErr_NoMemory();
1962 return -1;
1963 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02001964 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001965 self->encoding = encoding;
1966 return 0;
1967}
1968
1969
Guido van Rossumf6971e21994-08-30 12:25:20 +00001970static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07001971 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00001972 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1973 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1974 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1975 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1976 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
1977 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1978 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
1979 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
1980 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
1981 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1982 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1983 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1984 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1985 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1986 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1987 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1988 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1989 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1990 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001991#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00001992 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001993#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001994 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1995 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1996 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1997 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1998 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001999#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002000 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002001#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002002 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2003 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2004 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2005 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2006 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2007 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2008 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2009 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2010 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2011 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2012 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2013 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2014 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2015 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2016 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2017 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2018 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2019 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2020 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2021 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2022 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2023 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2024 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2025 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2026 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002027 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2028 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2029 METH_VARARGS},
2030 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2031 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2032 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2033 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002034#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002035 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002036#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002037 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2038 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2039 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2040 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2041 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2042 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2043 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2044 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2045 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2046 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2047 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2048 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2049 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2050 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2051 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2052 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002053};
2054
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002055static PyGetSetDef PyCursesWindow_getsets[] = {
2056 {"encoding",
2057 (getter)PyCursesWindow_get_encoding,
2058 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002059 "the typecode character used to create the array"},
2060 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002061};
2062
Guido van Rossumf6971e21994-08-30 12:25:20 +00002063/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002064
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002065PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002066 PyVarObject_HEAD_INIT(NULL, 0)
2067 "_curses.curses window", /*tp_name*/
2068 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2069 0, /*tp_itemsize*/
2070 /* methods */
2071 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2072 0, /*tp_print*/
2073 (getattrfunc)0, /*tp_getattr*/
2074 (setattrfunc)0, /*tp_setattr*/
2075 0, /*tp_reserved*/
2076 0, /*tp_repr*/
2077 0, /*tp_as_number*/
2078 0, /*tp_as_sequence*/
2079 0, /*tp_as_mapping*/
2080 0, /*tp_hash*/
2081 0, /*tp_call*/
2082 0, /*tp_str*/
2083 0, /*tp_getattro*/
2084 0, /*tp_setattro*/
2085 0, /*tp_as_buffer*/
2086 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2087 0, /*tp_doc*/
2088 0, /*tp_traverse*/
2089 0, /*tp_clear*/
2090 0, /*tp_richcompare*/
2091 0, /*tp_weaklistoffset*/
2092 0, /*tp_iter*/
2093 0, /*tp_iternext*/
2094 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002095 0, /* tp_members */
2096 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002097};
2098
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002099/*********************************************************************
2100 Global Functions
2101**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002102
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002103NoArgNoReturnFunction(beep)
2104NoArgNoReturnFunction(def_prog_mode)
2105NoArgNoReturnFunction(def_shell_mode)
2106NoArgNoReturnFunction(doupdate)
2107NoArgNoReturnFunction(endwin)
2108NoArgNoReturnFunction(flash)
2109NoArgNoReturnFunction(nocbreak)
2110NoArgNoReturnFunction(noecho)
2111NoArgNoReturnFunction(nonl)
2112NoArgNoReturnFunction(noraw)
2113NoArgNoReturnFunction(reset_prog_mode)
2114NoArgNoReturnFunction(reset_shell_mode)
2115NoArgNoReturnFunction(resetty)
2116NoArgNoReturnFunction(savetty)
2117
2118NoArgOrFlagNoReturnFunction(cbreak)
2119NoArgOrFlagNoReturnFunction(echo)
2120NoArgOrFlagNoReturnFunction(nl)
2121NoArgOrFlagNoReturnFunction(raw)
2122
2123NoArgReturnIntFunction(baudrate)
2124NoArgReturnIntFunction(termattrs)
2125
2126NoArgReturnStringFunction(termname)
2127NoArgReturnStringFunction(longname)
2128
2129NoArgTrueFalseFunction(can_change_color)
2130NoArgTrueFalseFunction(has_colors)
2131NoArgTrueFalseFunction(has_ic)
2132NoArgTrueFalseFunction(has_il)
2133NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002134NoArgNoReturnVoidFunction(flushinp)
2135NoArgNoReturnVoidFunction(noqiflush)
2136
2137static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002138PyCurses_filter(PyObject *self)
2139{
Victor Stinner26486ea2010-05-15 22:23:53 +00002140 /* not checking for PyCursesInitialised here since filter() must
2141 be called before initscr() */
2142 filter();
2143 Py_INCREF(Py_None);
2144 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002145}
2146
2147static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002148PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002149{
Victor Stinner26486ea2010-05-15 22:23:53 +00002150 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002151
Victor Stinner26486ea2010-05-15 22:23:53 +00002152 PyCursesInitialised;
2153 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002154
Victor Stinner26486ea2010-05-15 22:23:53 +00002155 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002156
Victor Stinner26486ea2010-05-15 22:23:53 +00002157 if (color_content(color, &r, &g, &b) != ERR)
2158 return Py_BuildValue("(iii)", r, g, b);
2159 else {
2160 PyErr_SetString(PyCursesError,
2161 "Argument 1 was out of range. Check value of COLORS.");
2162 return NULL;
2163 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164}
2165
2166static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002167PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168{
Victor Stinner26486ea2010-05-15 22:23:53 +00002169 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002170
Victor Stinner26486ea2010-05-15 22:23:53 +00002171 PyCursesInitialised;
2172 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002173
Victor Stinner26486ea2010-05-15 22:23:53 +00002174 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2175 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002176}
2177
2178static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002179PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002180{
Victor Stinner26486ea2010-05-15 22:23:53 +00002181 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002182
Victor Stinner26486ea2010-05-15 22:23:53 +00002183 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002184
Victor Stinner26486ea2010-05-15 22:23:53 +00002185 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002186
Victor Stinner26486ea2010-05-15 22:23:53 +00002187 erg = curs_set(vis);
2188 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002189
Victor Stinner26486ea2010-05-15 22:23:53 +00002190 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191}
2192
2193static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002194PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002195{
Victor Stinner26486ea2010-05-15 22:23:53 +00002196 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002197
Victor Stinner26486ea2010-05-15 22:23:53 +00002198 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002199
Victor Stinner26486ea2010-05-15 22:23:53 +00002200 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002201
Victor Stinner26486ea2010-05-15 22:23:53 +00002202 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002203}
2204
2205static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002206PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002207{
Victor Stinner26486ea2010-05-15 22:23:53 +00002208 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002209
Victor Stinner26486ea2010-05-15 22:23:53 +00002210 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002211
Victor Stinner26486ea2010-05-15 22:23:53 +00002212 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215}
2216
2217static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002218PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219{
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 int x = 0;
2221 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002222
Victor Stinner26486ea2010-05-15 22:23:53 +00002223 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002224
Victor Stinner26486ea2010-05-15 22:23:53 +00002225 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226
Victor Stinner26486ea2010-05-15 22:23:53 +00002227 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228}
2229
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002230#ifdef NCURSES_MOUSE_VERSION
2231static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002232PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002233{
Victor Stinner26486ea2010-05-15 22:23:53 +00002234 int rtn;
2235 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002238
Victor Stinner26486ea2010-05-15 22:23:53 +00002239 rtn = getmouse( &event );
2240 if (rtn == ERR) {
2241 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2242 return NULL;
2243 }
2244 return Py_BuildValue("(hiiil)",
2245 (short)event.id,
2246 event.x, event.y, event.z,
2247 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002248}
2249
2250static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002251PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002252{
Victor Stinner26486ea2010-05-15 22:23:53 +00002253 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002254
Victor Stinner26486ea2010-05-15 22:23:53 +00002255 PyCursesInitialised;
2256 if (!PyArg_ParseTuple(args, "hiiil",
2257 &event.id,
2258 &event.x, &event.y, &event.z,
2259 (int *) &event.bstate))
2260 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002263}
2264#endif
2265
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002266static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002267PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002268{
Victor Stinner26486ea2010-05-15 22:23:53 +00002269 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002270 int fd = -1;
2271 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 PyObject *data;
2273 size_t datalen;
2274 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002275 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002276 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277
Victor Stinner26486ea2010-05-15 22:23:53 +00002278 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2281 fd = mkstemp(fn);
2282 if (fd < 0)
2283 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002284 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2285 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002286 fp = fdopen(fd, "wb+");
2287 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002288 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2289 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002290 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002291
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002292 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002293 if (data == NULL)
2294 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 if (!PyBytes_Check(data)) {
2296 PyErr_Format(PyExc_TypeError,
2297 "f.read() returned %.100s instead of bytes",
2298 data->ob_type->tp_name);
2299 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002300 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002301 }
2302 datalen = PyBytes_GET_SIZE(data);
2303 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2304 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002305 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2306 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002307 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002308 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002309
Victor Stinner26486ea2010-05-15 22:23:53 +00002310 fseek(fp, 0, 0);
2311 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002312 if (win == NULL) {
2313 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002314 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002315 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002316 res = PyCursesWindow_New(win, NULL);
2317
2318error:
2319 if (fp != NULL)
2320 fclose(fp);
2321 else if (fd != -1)
2322 close(fd);
2323 remove(fn);
2324 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002325}
2326
2327static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002328PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002329{
Victor Stinner26486ea2010-05-15 22:23:53 +00002330 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002331
Victor Stinner26486ea2010-05-15 22:23:53 +00002332 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002333
Victor Stinner26486ea2010-05-15 22:23:53 +00002334 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002335
Victor Stinner26486ea2010-05-15 22:23:53 +00002336 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002337}
2338
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002339#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002340/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002341static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002342{
Victor Stinner26486ea2010-05-15 22:23:53 +00002343 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002344
Victor Stinner26486ea2010-05-15 22:23:53 +00002345 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346
Victor Stinner26486ea2010-05-15 22:23:53 +00002347 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002348
Victor Stinner26486ea2010-05-15 22:23:53 +00002349 if (has_key(ch) == FALSE) {
2350 Py_INCREF(Py_False);
2351 return Py_False;
2352 }
2353 Py_INCREF(Py_True);
2354 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002356#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002357
2358static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002359PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002360{
Victor Stinner26486ea2010-05-15 22:23:53 +00002361 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
Victor Stinner26486ea2010-05-15 22:23:53 +00002363 PyCursesInitialised;
2364 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002365
Victor Stinner26486ea2010-05-15 22:23:53 +00002366 switch(PyTuple_Size(args)) {
2367 case 4:
2368 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2369 break;
2370 default:
2371 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2372 return NULL;
2373 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002374
Victor Stinner26486ea2010-05-15 22:23:53 +00002375 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002376}
2377
2378static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002379PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002380{
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002382
Victor Stinner26486ea2010-05-15 22:23:53 +00002383 PyCursesInitialised;
2384 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002385
Victor Stinner26486ea2010-05-15 22:23:53 +00002386 if (PyTuple_Size(args) != 3) {
2387 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2388 return NULL;
2389 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390
Victor Stinner26486ea2010-05-15 22:23:53 +00002391 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392
Victor Stinner26486ea2010-05-15 22:23:53 +00002393 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394}
2395
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002396static PyObject *ModDict;
2397
Victor Stinner26486ea2010-05-15 22:23:53 +00002398static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002399PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002400{
Victor Stinner26486ea2010-05-15 22:23:53 +00002401 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002402 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 if (initialised == TRUE) {
2405 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002406 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002407 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 if (win == NULL) {
2412 PyErr_SetString(PyCursesError, catchall_NULL);
2413 return NULL;
2414 }
Guido van Rossum85738471995-02-17 13:50:17 +00002415
Victor Stinner26486ea2010-05-15 22:23:53 +00002416 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002417
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002418/* This was moved from initcurses() because it core dumped on SGI,
2419 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002420#define SetDictInt(string,ch) \
2421 do { \
2422 PyObject *o = PyLong_FromLong((long) (ch)); \
2423 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2424 Py_DECREF(o); \
2425 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002426 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002427
Victor Stinner26486ea2010-05-15 22:23:53 +00002428 /* Here are some graphic symbols you can use */
2429 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2430 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2431 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2432 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2433 SetDictInt("ACS_LTEE", (ACS_LTEE));
2434 SetDictInt("ACS_RTEE", (ACS_RTEE));
2435 SetDictInt("ACS_BTEE", (ACS_BTEE));
2436 SetDictInt("ACS_TTEE", (ACS_TTEE));
2437 SetDictInt("ACS_HLINE", (ACS_HLINE));
2438 SetDictInt("ACS_VLINE", (ACS_VLINE));
2439 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002440#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002441 /* On HP/UX 11, these are of type cchar_t, which is not an
2442 integral type. If this is a problem on more platforms, a
2443 configure test should be added to determine whether ACS_S1
2444 is of integral type. */
2445 SetDictInt("ACS_S1", (ACS_S1));
2446 SetDictInt("ACS_S9", (ACS_S9));
2447 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2448 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2449 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2450 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2451 SetDictInt("ACS_BULLET", (ACS_BULLET));
2452 SetDictInt("ACS_LARROW", (ACS_LARROW));
2453 SetDictInt("ACS_RARROW", (ACS_RARROW));
2454 SetDictInt("ACS_DARROW", (ACS_DARROW));
2455 SetDictInt("ACS_UARROW", (ACS_UARROW));
2456 SetDictInt("ACS_BOARD", (ACS_BOARD));
2457 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2458 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002459#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002460 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2461 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2462 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2463 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2464 SetDictInt("ACS_SBSS", (ACS_RTEE));
2465 SetDictInt("ACS_SSSB", (ACS_LTEE));
2466 SetDictInt("ACS_SSBS", (ACS_BTEE));
2467 SetDictInt("ACS_BSSS", (ACS_TTEE));
2468 SetDictInt("ACS_BSBS", (ACS_HLINE));
2469 SetDictInt("ACS_SBSB", (ACS_VLINE));
2470 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002471
Victor Stinner26486ea2010-05-15 22:23:53 +00002472 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002473#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002474 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002475#endif
2476#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002477 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002478#endif
2479#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002480 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002481#endif
2482#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002483 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002484#endif
2485#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002486 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002487#endif
2488#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002489 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002490#endif
2491#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002492 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002493#endif
2494
Victor Stinner26486ea2010-05-15 22:23:53 +00002495 SetDictInt("LINES", LINES);
2496 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002497
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002498 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2499 screen_encoding = winobj->encoding;
2500 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002501}
2502
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002503static PyObject *
2504PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2505{
Victor Stinner26486ea2010-05-15 22:23:53 +00002506 int fd = -1;
2507 int err;
2508 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002509
Victor Stinner26486ea2010-05-15 22:23:53 +00002510 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002511
Victor Stinner26486ea2010-05-15 22:23:53 +00002512 if (!PyArg_ParseTupleAndKeywords(
2513 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2514 return NULL;
2515 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002516
Victor Stinner26486ea2010-05-15 22:23:53 +00002517 if (fd == -1) {
2518 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002519
Victor Stinnerbd303c12013-11-07 23:07:29 +01002520 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002521
Victor Stinner26486ea2010-05-15 22:23:53 +00002522 if (sys_stdout == NULL || sys_stdout == Py_None) {
2523 PyErr_SetString(
2524 PyCursesError,
2525 "lost sys.stdout");
2526 return NULL;
2527 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002528
Victor Stinner26486ea2010-05-15 22:23:53 +00002529 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002530
Victor Stinner26486ea2010-05-15 22:23:53 +00002531 if (fd == -1) {
2532 return NULL;
2533 }
2534 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002535
Matthias Klose635edd12010-07-30 21:40:57 +00002536 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002538
Victor Stinner26486ea2010-05-15 22:23:53 +00002539 if (err == 0) {
2540 s = "setupterm: could not find terminal";
2541 } else if (err == -1) {
2542 s = "setupterm: could not find terminfo database";
2543 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002544
Victor Stinner26486ea2010-05-15 22:23:53 +00002545 PyErr_SetString(PyCursesError,s);
2546 return NULL;
2547 }
2548
2549 initialised_setupterm = TRUE;
2550
2551 Py_INCREF(Py_None);
2552 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002553}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002554
2555static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002556PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002557{
Victor Stinner26486ea2010-05-15 22:23:53 +00002558 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002559
Victor Stinner26486ea2010-05-15 22:23:53 +00002560 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002561
Victor Stinner26486ea2010-05-15 22:23:53 +00002562 switch(PyTuple_Size(args)) {
2563 case 1:
2564 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2565 break;
2566 default:
2567 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2568 return NULL;
2569 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002570
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002572}
2573
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002574#ifdef HAVE_CURSES_IS_TERM_RESIZED
2575static PyObject *
2576PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2577{
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 int lines;
2579 int columns;
2580 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002581
Victor Stinner26486ea2010-05-15 22:23:53 +00002582 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002583
Victor Stinner26486ea2010-05-15 22:23:53 +00002584 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2585 return NULL;
2586 result = is_term_resized(lines, columns);
2587 if (result == TRUE) {
2588 Py_INCREF(Py_True);
2589 return Py_True;
2590 } else {
2591 Py_INCREF(Py_False);
2592 return Py_False;
2593 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002594}
2595#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2596
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002597#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002598static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002599PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002600{
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 const char *knp;
2602 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002603
Victor Stinner26486ea2010-05-15 22:23:53 +00002604 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002605
Victor Stinner26486ea2010-05-15 22:23:53 +00002606 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002607
Victor Stinner26486ea2010-05-15 22:23:53 +00002608 if (ch < 0) {
2609 PyErr_SetString(PyExc_ValueError, "invalid key number");
2610 return NULL;
2611 }
2612 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002613
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03002614 return PyBytes_FromString((knp == NULL) ? "" : knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002615}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002616#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002617
Victor Stinner26486ea2010-05-15 22:23:53 +00002618static PyObject *
2619PyCurses_KillChar(PyObject *self)
2620{
2621 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002622
Victor Stinner26486ea2010-05-15 22:23:53 +00002623 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 return PyBytes_FromStringAndSize(&ch, 1);
2626}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002627
2628static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002629PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002630{
Victor Stinner26486ea2010-05-15 22:23:53 +00002631 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002632
Victor Stinner26486ea2010-05-15 22:23:53 +00002633 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
Victor Stinner26486ea2010-05-15 22:23:53 +00002635 switch(PyTuple_Size(args)) {
2636 case 1:
2637 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2638 break;
2639 default:
2640 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2641 return NULL;
2642 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002643
Victor Stinner26486ea2010-05-15 22:23:53 +00002644 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002645}
2646
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002647#ifdef NCURSES_MOUSE_VERSION
2648static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002649PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002650{
Victor Stinner26486ea2010-05-15 22:23:53 +00002651 int interval;
2652 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002653
Victor Stinner26486ea2010-05-15 22:23:53 +00002654 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2655 return NULL;
2656 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002657}
2658
2659static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002660PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002661{
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 int newmask;
2663 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002664
Victor Stinner26486ea2010-05-15 22:23:53 +00002665 PyCursesInitialised;
2666 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2667 return NULL;
2668 availmask = mousemask(newmask, &oldmask);
2669 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002670}
2671#endif
2672
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002673static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002674PyCurses_Napms(PyObject *self, PyObject *args)
2675{
2676 int ms;
2677
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002678 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002679 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002680
2681 return Py_BuildValue("i", napms(ms));
2682}
2683
2684
2685static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002686PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687{
Victor Stinner26486ea2010-05-15 22:23:53 +00002688 WINDOW *win;
2689 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002690
Victor Stinner26486ea2010-05-15 22:23:53 +00002691 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002692
Victor Stinner26486ea2010-05-15 22:23:53 +00002693 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002696
Victor Stinner26486ea2010-05-15 22:23:53 +00002697 if (win == NULL) {
2698 PyErr_SetString(PyCursesError, catchall_NULL);
2699 return NULL;
2700 }
2701
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002702 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002703}
2704
2705static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002706PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002707{
Victor Stinner26486ea2010-05-15 22:23:53 +00002708 WINDOW *win;
2709 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002710
Victor Stinner26486ea2010-05-15 22:23:53 +00002711 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002712
Victor Stinner26486ea2010-05-15 22:23:53 +00002713 switch (PyTuple_Size(args)) {
2714 case 2:
2715 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2716 return NULL;
2717 break;
2718 case 4:
2719 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2720 &nlines,&ncols,&begin_y,&begin_x))
2721 return NULL;
2722 break;
2723 default:
2724 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2725 return NULL;
2726 }
Guido van Rossum85738471995-02-17 13:50:17 +00002727
Victor Stinner26486ea2010-05-15 22:23:53 +00002728 win = newwin(nlines,ncols,begin_y,begin_x);
2729 if (win == NULL) {
2730 PyErr_SetString(PyCursesError, catchall_NULL);
2731 return NULL;
2732 }
Guido van Rossum85738471995-02-17 13:50:17 +00002733
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002734 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002735}
2736
2737static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002738PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002739{
Victor Stinner26486ea2010-05-15 22:23:53 +00002740 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002741
Victor Stinner26486ea2010-05-15 22:23:53 +00002742 PyCursesInitialised;
2743 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002744
Victor Stinner26486ea2010-05-15 22:23:53 +00002745 switch(PyTuple_Size(args)) {
2746 case 1:
2747 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2748 break;
2749 default:
2750 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2751 return NULL;
2752 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002753
Victor Stinner26486ea2010-05-15 22:23:53 +00002754 if (pair_content(pair, &f, &b)==ERR) {
2755 PyErr_SetString(PyCursesError,
2756 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2757 return NULL;
2758 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002759
Victor Stinner26486ea2010-05-15 22:23:53 +00002760 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002761}
2762
2763static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002764PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002765{
Victor Stinner26486ea2010-05-15 22:23:53 +00002766 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767
Victor Stinner26486ea2010-05-15 22:23:53 +00002768 PyCursesInitialised;
2769 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002770
Victor Stinner26486ea2010-05-15 22:23:53 +00002771 switch(PyTuple_Size(args)) {
2772 case 1:
2773 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2774 break;
2775 default:
2776 PyErr_SetString(PyExc_TypeError,
2777 "pair_number requires 1 argument");
2778 return NULL;
2779 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002780
Victor Stinner26486ea2010-05-15 22:23:53 +00002781 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002782}
2783
2784static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002785PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002786{
Victor Stinner26486ea2010-05-15 22:23:53 +00002787 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002788
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002789 if (!PyArg_ParseTuple(args,"y;str", &str))
2790 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002791 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002792}
2793
2794static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002795PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002796{
Victor Stinner26486ea2010-05-15 22:23:53 +00002797 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002798
Victor Stinner26486ea2010-05-15 22:23:53 +00002799 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002800
Victor Stinner26486ea2010-05-15 22:23:53 +00002801 switch(PyTuple_Size(args)) {
2802 case 0:
2803 qiflush();
2804 Py_INCREF(Py_None);
2805 return Py_None;
2806 case 1:
2807 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2808 if (flag) qiflush();
2809 else noqiflush();
2810 Py_INCREF(Py_None);
2811 return Py_None;
2812 default:
2813 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2814 return NULL;
2815 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816}
2817
Guido van Rossumd8faa362007-04-27 19:54:29 +00002818/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2819 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002820#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002821static int
2822update_lines_cols(void)
2823{
Victor Stinner26486ea2010-05-15 22:23:53 +00002824 PyObject *o;
2825 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002826 _Py_IDENTIFIER(LINES);
2827 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002828
Victor Stinner26486ea2010-05-15 22:23:53 +00002829 if (!m)
2830 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 o = PyLong_FromLong(LINES);
2833 if (!o) {
2834 Py_DECREF(m);
2835 return 0;
2836 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002837 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002838 Py_DECREF(m);
2839 Py_DECREF(o);
2840 return 0;
2841 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002842 /* PyId_LINES.object will be initialized here. */
2843 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002844 Py_DECREF(m);
2845 Py_DECREF(o);
2846 return 0;
2847 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002848 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002849 o = PyLong_FromLong(COLS);
2850 if (!o) {
2851 Py_DECREF(m);
2852 return 0;
2853 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002854 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002855 Py_DECREF(m);
2856 Py_DECREF(o);
2857 return 0;
2858 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002859 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002860 Py_DECREF(m);
2861 Py_DECREF(o);
2862 return 0;
2863 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002864 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002865 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002866 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002867}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002868#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002869
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002870#ifdef HAVE_CURSES_RESIZETERM
2871static PyObject *
2872PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2873{
Victor Stinner26486ea2010-05-15 22:23:53 +00002874 int lines;
2875 int columns;
2876 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002877
Victor Stinner26486ea2010-05-15 22:23:53 +00002878 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002879
Victor Stinner26486ea2010-05-15 22:23:53 +00002880 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2881 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002882
Victor Stinner26486ea2010-05-15 22:23:53 +00002883 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2884 if (!result)
2885 return NULL;
2886 if (!update_lines_cols())
2887 return NULL;
2888 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002889}
2890
2891#endif
2892
2893#ifdef HAVE_CURSES_RESIZE_TERM
2894static PyObject *
2895PyCurses_Resize_Term(PyObject *self, PyObject *args)
2896{
Victor Stinner26486ea2010-05-15 22:23:53 +00002897 int lines;
2898 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002899
Victor Stinner26486ea2010-05-15 22:23:53 +00002900 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002901
Victor Stinner26486ea2010-05-15 22:23:53 +00002902 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002903
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2905 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002906
Victor Stinner26486ea2010-05-15 22:23:53 +00002907 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2908 if (!result)
2909 return NULL;
2910 if (!update_lines_cols())
2911 return NULL;
2912 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002913}
2914#endif /* HAVE_CURSES_RESIZE_TERM */
2915
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002916static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002917PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002918{
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002920
Victor Stinner26486ea2010-05-15 22:23:53 +00002921 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002922
Victor Stinner26486ea2010-05-15 22:23:53 +00002923 if (PyTuple_Size(args)!=2) {
2924 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2925 return NULL;
2926 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002927
Victor Stinner26486ea2010-05-15 22:23:53 +00002928 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002929
Victor Stinner26486ea2010-05-15 22:23:53 +00002930 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002931
Victor Stinner26486ea2010-05-15 22:23:53 +00002932 Py_INCREF(Py_None);
2933 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002934}
2935
2936static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002937PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002938{
Victor Stinner26486ea2010-05-15 22:23:53 +00002939 int code;
2940 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002941
Victor Stinner26486ea2010-05-15 22:23:53 +00002942 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002943
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 code = start_color();
2945 if (code != ERR) {
2946 initialisedcolors = TRUE;
2947 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02002948 if (c == NULL)
2949 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002950 PyDict_SetItemString(ModDict, "COLORS", c);
2951 Py_DECREF(c);
2952 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02002953 if (cp == NULL)
2954 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2956 Py_DECREF(cp);
2957 Py_INCREF(Py_None);
2958 return Py_None;
2959 } else {
2960 PyErr_SetString(PyCursesError, "start_color() returned ERR");
2961 return NULL;
2962 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002963}
2964
2965static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002966PyCurses_tigetflag(PyObject *self, PyObject *args)
2967{
Victor Stinner26486ea2010-05-15 22:23:53 +00002968 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002969
Victor Stinner26486ea2010-05-15 22:23:53 +00002970 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002971
Victor Stinner26486ea2010-05-15 22:23:53 +00002972 if (!PyArg_ParseTuple(args, "s", &capname))
2973 return NULL;
2974
2975 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002976}
2977
2978static PyObject *
2979PyCurses_tigetnum(PyObject *self, PyObject *args)
2980{
Victor Stinner26486ea2010-05-15 22:23:53 +00002981 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002982
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002984
Victor Stinner26486ea2010-05-15 22:23:53 +00002985 if (!PyArg_ParseTuple(args, "s", &capname))
2986 return NULL;
2987
2988 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002989}
2990
2991static PyObject *
2992PyCurses_tigetstr(PyObject *self, PyObject *args)
2993{
Victor Stinner26486ea2010-05-15 22:23:53 +00002994 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002995
Victor Stinner26486ea2010-05-15 22:23:53 +00002996 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002997
Victor Stinner26486ea2010-05-15 22:23:53 +00002998 if (!PyArg_ParseTuple(args, "s", &capname))
2999 return NULL;
3000
3001 capname = tigetstr( capname );
3002 if (capname == 0 || capname == (char*) -1) {
3003 Py_INCREF(Py_None);
3004 return Py_None;
3005 }
3006 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003007}
3008
3009static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003010PyCurses_tparm(PyObject *self, PyObject *args)
3011{
Victor Stinner26486ea2010-05-15 22:23:53 +00003012 char* fmt;
3013 char* result = NULL;
3014 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 +00003015
Victor Stinner26486ea2010-05-15 22:23:53 +00003016 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003017
Victor Stinner26621332011-11-02 23:45:29 +01003018 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 &fmt, &i1, &i2, &i3, &i4,
3020 &i5, &i6, &i7, &i8, &i9)) {
3021 return NULL;
3022 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003023
Victor Stinner26486ea2010-05-15 22:23:53 +00003024 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3025 if (!result) {
3026 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3027 return NULL;
3028 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003029
Victor Stinner26486ea2010-05-15 22:23:53 +00003030 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003031}
3032
3033static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003034PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003035{
Victor Stinner26486ea2010-05-15 22:23:53 +00003036 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003037
Victor Stinner26486ea2010-05-15 22:23:53 +00003038 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003039
Victor Stinner26486ea2010-05-15 22:23:53 +00003040 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003041
Victor Stinner26486ea2010-05-15 22:23:53 +00003042 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003043}
3044
3045static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003046PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003047{
Victor Stinner26486ea2010-05-15 22:23:53 +00003048 PyObject *temp;
3049 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003050
Victor Stinner26486ea2010-05-15 22:23:53 +00003051 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003052
Victor Stinner26486ea2010-05-15 22:23:53 +00003053 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003054
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003055 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003056 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003057
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003059}
3060
3061static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003062PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003063{
Victor Stinner26486ea2010-05-15 22:23:53 +00003064 PyObject *temp;
3065 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003066
Victor Stinner26486ea2010-05-15 22:23:53 +00003067 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003068
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003069 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003070 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003071
3072 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3073 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003074
Victor Stinner26486ea2010-05-15 22:23:53 +00003075 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003076}
3077
Victor Stinner71e44cb2011-09-06 01:53:03 +02003078#ifdef HAVE_NCURSESW
3079/* Convert an object to a character (wchar_t):
3080
3081 - int
3082 - str of length 1
3083
3084 Return 1 on success, 0 on error. */
3085static int
3086PyCurses_ConvertToWchar_t(PyObject *obj,
3087 wchar_t *wch)
3088{
3089 if (PyUnicode_Check(obj)) {
3090 wchar_t buffer[2];
3091 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3092 PyErr_Format(PyExc_TypeError,
3093 "expect bytes or str of length 1, or int, "
3094 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003095 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003096 return 0;
3097 }
3098 *wch = buffer[0];
3099 return 2;
3100 }
3101 else if (PyLong_CheckExact(obj)) {
3102 long value;
3103 int overflow;
3104 value = PyLong_AsLongAndOverflow(obj, &overflow);
3105 if (overflow) {
3106 PyErr_SetString(PyExc_OverflowError,
3107 "int doesn't fit in long");
3108 return 0;
3109 }
3110 *wch = (wchar_t)value;
3111 if ((long)*wch != value) {
3112 PyErr_Format(PyExc_OverflowError,
3113 "character doesn't fit in wchar_t");
3114 return 0;
3115 }
3116 return 1;
3117 }
3118 else {
3119 PyErr_Format(PyExc_TypeError,
3120 "expect bytes or str of length 1, or int, got %s",
3121 Py_TYPE(obj)->tp_name);
3122 return 0;
3123 }
3124}
3125
3126static PyObject *
3127PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3128{
3129 PyObject *obj;
3130 wchar_t wch;
3131
3132 PyCursesInitialised;
3133
3134 if (!PyArg_ParseTuple(args,"O", &obj))
3135 return NULL;
3136
3137 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3138 return NULL;
3139 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3140}
3141#endif
3142
Guido van Rossumf6971e21994-08-30 12:25:20 +00003143static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003144PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003145{
Victor Stinner26486ea2010-05-15 22:23:53 +00003146 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003147
Victor Stinner26486ea2010-05-15 22:23:53 +00003148 switch(PyTuple_Size(args)) {
3149 case 1:
3150 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3151 return NULL;
3152 break;
3153 default:
3154 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3155 return NULL;
3156 }
3157 use_env(flag);
3158 Py_INCREF(Py_None);
3159 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003160}
3161
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003162#ifndef STRICT_SYSV_CURSES
3163static PyObject *
3164PyCurses_Use_Default_Colors(PyObject *self)
3165{
Victor Stinner26486ea2010-05-15 22:23:53 +00003166 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003167
Victor Stinner26486ea2010-05-15 22:23:53 +00003168 PyCursesInitialised;
3169 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003170
Victor Stinner26486ea2010-05-15 22:23:53 +00003171 code = use_default_colors();
3172 if (code != ERR) {
3173 Py_INCREF(Py_None);
3174 return Py_None;
3175 } else {
3176 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3177 return NULL;
3178 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003179}
3180#endif /* STRICT_SYSV_CURSES */
3181
Guido van Rossumf6971e21994-08-30 12:25:20 +00003182/* List of functions defined in the module */
3183
3184static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003185 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3186 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3187 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3188 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3189 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3190 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3191 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3192 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3193 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3194 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3195 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3196 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3197 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3198 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3199 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3200 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3201 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003202#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003203 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3204 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003205#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003206 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3207 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3208 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3209 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3210 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003211#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003212 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003213#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003214 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3215 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3216 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3217 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3218 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3219 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003220#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003221 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003222#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003223#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003224 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003225#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003226 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3227 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3228 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003229#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003230 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3231 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003232#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003233 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3234 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3235 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3236 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3237 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3238 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3239 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3240 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3241 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3242 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3243 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3244 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3245 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3246 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3247 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3248 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3249 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003250#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003251 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003252#endif
3253#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003254 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003255#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003256 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3257 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3258 {"setupterm", (PyCFunction)PyCurses_setupterm,
3259 METH_VARARGS|METH_KEYWORDS},
3260 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3261 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3262 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3263 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3264 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3265 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3266 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3267 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3268 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3269 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003270#ifdef HAVE_NCURSESW
3271 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3272#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003273 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003274#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003275 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003276#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003277 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003278};
3279
3280/* Initialization function for the module */
3281
Martin v. Löwis1a214512008-06-11 05:26:20 +00003282
3283static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003284 PyModuleDef_HEAD_INIT,
3285 "_curses",
3286 NULL,
3287 -1,
3288 PyCurses_methods,
3289 NULL,
3290 NULL,
3291 NULL,
3292 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003293};
3294
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003295PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003296PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003297{
Victor Stinner26486ea2010-05-15 22:23:53 +00003298 PyObject *m, *d, *v, *c_api_object;
3299 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003300
Victor Stinner26486ea2010-05-15 22:23:53 +00003301 /* Initialize object type */
3302 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3303 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003304
Victor Stinner26486ea2010-05-15 22:23:53 +00003305 /* Initialize the C API pointer array */
3306 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3307 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3308 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3309 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003310
Victor Stinner26486ea2010-05-15 22:23:53 +00003311 /* Create the module and add the functions */
3312 m = PyModule_Create(&_cursesmodule);
3313 if (m == NULL)
3314 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003315
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 /* Add some symbolic constants to the module */
3317 d = PyModule_GetDict(m);
3318 if (d == NULL)
3319 return NULL;
3320 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003321
Victor Stinner26486ea2010-05-15 22:23:53 +00003322 /* Add a capsule for the C API */
3323 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3324 PyDict_SetItemString(d, "_C_API", c_api_object);
3325 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003326
Victor Stinner26486ea2010-05-15 22:23:53 +00003327 /* For exception curses.error */
3328 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3329 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003330
Victor Stinner26486ea2010-05-15 22:23:53 +00003331 /* Make the version available */
3332 v = PyBytes_FromString(PyCursesVersion);
3333 PyDict_SetItemString(d, "version", v);
3334 PyDict_SetItemString(d, "__version__", v);
3335 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003336
Victor Stinner26486ea2010-05-15 22:23:53 +00003337 SetDictInt("ERR", ERR);
3338 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003339
Victor Stinner26486ea2010-05-15 22:23:53 +00003340 /* Here are some attributes you can add to chars to print */
3341
3342 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3343 SetDictInt("A_NORMAL", A_NORMAL);
3344 SetDictInt("A_STANDOUT", A_STANDOUT);
3345 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3346 SetDictInt("A_REVERSE", A_REVERSE);
3347 SetDictInt("A_BLINK", A_BLINK);
3348 SetDictInt("A_DIM", A_DIM);
3349 SetDictInt("A_BOLD", A_BOLD);
3350 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003351#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003352 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003353#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003354 SetDictInt("A_PROTECT", A_PROTECT);
3355 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3356 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003357
Victor Stinner26486ea2010-05-15 22:23:53 +00003358 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003359#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003360 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003361#endif
3362#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003364#endif
3365#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003366 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003367#endif
3368#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003369 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003370#endif
3371#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003372 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003373#endif
3374#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003375 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003376#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003377
Victor Stinner26486ea2010-05-15 22:23:53 +00003378 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3379 SetDictInt("COLOR_RED", COLOR_RED);
3380 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3381 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3382 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3383 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3384 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3385 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003386
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003387#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003388 /* Mouse-related constants */
3389 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3390 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3391 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3392 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3393 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003394
Victor Stinner26486ea2010-05-15 22:23:53 +00003395 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3396 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3397 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3398 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3399 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003400
Victor Stinner26486ea2010-05-15 22:23:53 +00003401 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3402 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3403 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3404 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3405 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003406
Victor Stinner26486ea2010-05-15 22:23:53 +00003407 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3408 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3409 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3410 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3411 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003412
Victor Stinner26486ea2010-05-15 22:23:53 +00003413 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3414 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3415 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003416
Victor Stinner26486ea2010-05-15 22:23:53 +00003417 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3418 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003419#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003420 /* Now set everything up for KEY_ variables */
3421 {
3422 int key;
3423 char *key_n;
3424 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003425#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003426 for (key=KEY_MIN;key < KEY_MAX; key++) {
3427 key_n = (char *)keyname(key);
3428 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3429 continue;
3430 if (strncmp(key_n,"KEY_F(",6)==0) {
3431 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003432 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003433 if (!key_n2) {
3434 PyErr_NoMemory();
3435 break;
3436 }
3437 p1 = key_n;
3438 p2 = key_n2;
3439 while (*p1) {
3440 if (*p1 != '(' && *p1 != ')') {
3441 *p2 = *p1;
3442 p2++;
3443 }
3444 p1++;
3445 }
3446 *p2 = (char)0;
3447 } else
3448 key_n2 = key_n;
3449 SetDictInt(key_n2,key);
3450 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003451 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003452 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003453#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003454 SetDictInt("KEY_MIN", KEY_MIN);
3455 SetDictInt("KEY_MAX", KEY_MAX);
3456 }
3457 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003458}