blob: a8735f237a88126b23c81506bfd862e21ea1cd9c [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
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000143/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000145static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000147/* Tells whether setupterm() has been called to initialise terminfo. */
148static int initialised_setupterm = FALSE;
149
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000150/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000151static int initialised = FALSE;
152
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000153/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000154static int initialisedcolors = FALSE;
155
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100156static char *screen_encoding = NULL;
157
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000158/* Utility Macros */
Victor Stinner26486ea2010-05-15 22:23:53 +0000159#define PyCursesSetupTermCalled \
160 if (initialised_setupterm != TRUE) { \
161 PyErr_SetString(PyCursesError, \
162 "must call (at least) setupterm() first"); \
163 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000164
Victor Stinner26486ea2010-05-15 22:23:53 +0000165#define PyCursesInitialised \
166 if (initialised != TRUE) { \
167 PyErr_SetString(PyCursesError, \
168 "must call initscr() first"); \
169 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000170
Victor Stinner26486ea2010-05-15 22:23:53 +0000171#define PyCursesInitialisedColor \
172 if (initialisedcolors != TRUE) { \
173 PyErr_SetString(PyCursesError, \
174 "must call start_color() first"); \
175 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000176
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000177/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000178
Guido van Rossum85738471995-02-17 13:50:17 +0000179/*
Victor Stinner26486ea2010-05-15 22:23:53 +0000180 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000181 * or raise an exception as appropriate. These are exported using the
Victor Stinner26486ea2010-05-15 22:23:53 +0000182 * capsule API.
Guido van Rossum85738471995-02-17 13:50:17 +0000183 */
184
185static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100186PyCursesCheckERR(int code, const char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000187{
Victor Stinner26486ea2010-05-15 22:23:53 +0000188 if (code != ERR) {
189 Py_INCREF(Py_None);
190 return Py_None;
Guido van Rossum85738471995-02-17 13:50:17 +0000191 } else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000192 if (fname == NULL) {
193 PyErr_SetString(PyCursesError, catchall_ERR);
194 } else {
195 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
196 }
197 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000198 }
Guido van Rossum85738471995-02-17 13:50:17 +0000199}
200
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100201/* Convert an object to a byte (an integer of type chtype):
202
203 - int
204 - bytes of length 1
205 - str of length 1
206
207 Return 1 on success, 0 on error (invalid type or integer overflow). */
Victor Stinner26486ea2010-05-15 22:23:53 +0000208static int
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100209PyCurses_ConvertToChtype(PyCursesWindowObject *win, PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000210{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100211 long value;
212 if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
213 value = (unsigned char)PyBytes_AsString(obj)[0];
214 }
215 else if (PyUnicode_Check(obj)) {
216 if (PyUnicode_GetLength(obj) != 1) {
217 PyErr_Format(PyExc_TypeError,
218 "expect bytes or str of length 1, or int, "
219 "got a str of length %zi",
220 PyUnicode_GET_LENGTH(obj));
Victor Stinner26486ea2010-05-15 22:23:53 +0000221 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100222 }
223 value = PyUnicode_READ_CHAR(obj, 0);
224 if (128 < value) {
225 PyObject *bytes;
226 const char *encoding;
227 if (win)
228 encoding = win->encoding;
229 else
230 encoding = screen_encoding;
231 bytes = PyUnicode_AsEncodedObject(obj, encoding, NULL);
232 if (bytes == NULL)
233 return 0;
234 if (PyBytes_GET_SIZE(bytes) == 1)
235 value = (unsigned char)PyBytes_AS_STRING(bytes)[0];
236 else
237 value = -1;
238 Py_DECREF(bytes);
239 if (value < 0)
240 goto overflow;
241 }
242 }
243 else if (PyLong_CheckExact(obj)) {
244 int long_overflow;
245 value = PyLong_AsLongAndOverflow(obj, &long_overflow);
246 if (long_overflow)
247 goto overflow;
248 }
249 else {
250 PyErr_Format(PyExc_TypeError,
251 "expect bytes or str of length 1, or int, got %s",
252 Py_TYPE(obj)->tp_name);
Victor Stinner26486ea2010-05-15 22:23:53 +0000253 return 0;
254 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100255 *ch = (chtype)value;
256 if ((long)*ch != value)
257 goto overflow;
Victor Stinner26486ea2010-05-15 22:23:53 +0000258 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100259
260overflow:
261 PyErr_SetString(PyExc_OverflowError,
262 "byte doesn't fit in chtype");
263 return 0;
264}
265
266/* Convert an object to a byte (chtype) or a character (cchar_t):
267
268 - int
269 - bytes of length 1
270 - str of length 1
271
272 Return:
273
274 - 2 if obj is a character (written into *wch)
275 - 1 if obj is a byte (written into *ch)
276 - 0 on error: raise an exception */
277static int
278PyCurses_ConvertToCchar_t(PyCursesWindowObject *win, PyObject *obj,
279 chtype *ch
280#ifdef HAVE_NCURSESW
281 , cchar_t *wch
282#endif
283 )
284{
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100285 long value;
286#ifdef HAVE_NCURSESW
287 wchar_t buffer[2];
288#endif
289
290 if (PyUnicode_Check(obj)) {
291#ifdef HAVE_NCURSESW
292 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
293 PyErr_Format(PyExc_TypeError,
294 "expect bytes or str of length 1, or int, "
295 "got a str of length %zi",
296 PyUnicode_GET_LENGTH(obj));
297 return 0;
298 }
299 memset(wch->chars, 0, sizeof(wch->chars));
300 wch->chars[0] = buffer[0];
301 return 2;
302#else
303 return PyCurses_ConvertToChtype(win, obj, ch);
304#endif
305 }
306 else if(PyBytes_Check(obj) && PyBytes_Size(obj) == 1) {
307 value = (unsigned char)PyBytes_AsString(obj)[0];
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100308 }
309 else if (PyLong_CheckExact(obj)) {
310 int overflow;
311 value = PyLong_AsLongAndOverflow(obj, &overflow);
312 if (overflow) {
313 PyErr_SetString(PyExc_OverflowError,
314 "int doesn't fit in long");
315 return 0;
316 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100317 }
318 else {
319 PyErr_Format(PyExc_TypeError,
320 "expect bytes or str of length 1, or int, got %s",
321 Py_TYPE(obj)->tp_name);
322 return 0;
323 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200324
325 *ch = (chtype)value;
326 if ((long)*ch != value) {
327 PyErr_Format(PyExc_OverflowError,
328 "byte doesn't fit in chtype");
329 return 0;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100330 }
Victor Stinner9f16e442012-09-01 15:00:34 +0200331 return 1;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100332}
333
334/* Convert an object to a byte string (char*) or a wide character string
335 (wchar_t*). Return:
336
337 - 2 if obj is a character string (written into *wch)
338 - 1 if obj is a byte string (written into *bytes)
339 - 0 on error: raise an exception */
340static int
341PyCurses_ConvertToString(PyCursesWindowObject *win, PyObject *obj,
342 PyObject **bytes, wchar_t **wstr)
343{
344 if (PyUnicode_Check(obj)) {
345#ifdef HAVE_NCURSESW
346 assert (wstr != NULL);
347 *wstr = PyUnicode_AsWideCharString(obj, NULL);
348 if (*wstr == NULL)
349 return 0;
350 return 2;
351#else
352 assert (wstr == NULL);
353 *bytes = PyUnicode_AsEncodedObject(obj, win->encoding, NULL);
354 if (*bytes == NULL)
355 return 0;
356 return 1;
357#endif
358 }
359 else if (PyBytes_Check(obj)) {
360 Py_INCREF(obj);
361 *bytes = obj;
362 return 1;
363 }
364
365 PyErr_Format(PyExc_TypeError, "expect bytes or str, got %s",
366 Py_TYPE(obj)->tp_name);
367 return 0;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000368}
369
Benjamin Peterson21896a32010-03-21 22:03:03 +0000370/* Function versions of the 3 functions for testing whether curses has been
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000371 initialised or not. */
Victor Stinner26486ea2010-05-15 22:23:53 +0000372
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000373static int func_PyCursesSetupTermCalled(void)
374{
375 PyCursesSetupTermCalled;
376 return 1;
377}
378
379static int func_PyCursesInitialised(void)
380{
381 PyCursesInitialised;
382 return 1;
383}
384
385static int func_PyCursesInitialisedColor(void)
386{
387 PyCursesInitialisedColor;
388 return 1;
389}
390
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000391/*****************************************************************************
392 The Window Object
393******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000394
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000395/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000396
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000397PyTypeObject PyCursesWindow_Type;
398
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000399/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000400
401 X - function name
402 TYPE - parameter Type
403 ERGSTR - format string for construction of the return value
404 PARSESTR - format string for argument parsing
Victor Stinner26486ea2010-05-15 22:23:53 +0000405*/
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000406
Victor Stinner26486ea2010-05-15 22:23:53 +0000407#define Window_NoArgNoReturnFunction(X) \
408 static PyObject *PyCursesWindow_ ## X \
409 (PyCursesWindowObject *self, PyObject *args) \
410 { return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000411
Victor Stinner26486ea2010-05-15 22:23:53 +0000412#define Window_NoArgTrueFalseFunction(X) \
413 static PyObject * PyCursesWindow_ ## X \
414 (PyCursesWindowObject *self) \
415 { \
416 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
417 else { Py_INCREF(Py_True); return Py_True; } }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000418
Victor Stinner26486ea2010-05-15 22:23:53 +0000419#define Window_NoArgNoReturnVoidFunction(X) \
420 static PyObject * PyCursesWindow_ ## X \
421 (PyCursesWindowObject *self) \
422 { \
423 X(self->win); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000424
Victor Stinner26486ea2010-05-15 22:23:53 +0000425#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
426 static PyObject * PyCursesWindow_ ## X \
427 (PyCursesWindowObject *self) \
428 { \
429 TYPE arg1, arg2; \
430 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000431
Victor Stinner26486ea2010-05-15 22:23:53 +0000432#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
433 static PyObject * PyCursesWindow_ ## X \
434 (PyCursesWindowObject *self, PyObject *args) \
435 { \
436 TYPE arg1; \
437 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
438 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000439
Victor Stinner26486ea2010-05-15 22:23:53 +0000440#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
441 static PyObject * PyCursesWindow_ ## X \
442 (PyCursesWindowObject *self, PyObject *args) \
443 { \
444 TYPE arg1; \
445 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
446 return PyCursesCheckERR(X(self->win, arg1), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000447
Victor Stinner26486ea2010-05-15 22:23:53 +0000448#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
449 static PyObject * PyCursesWindow_ ## X \
450 (PyCursesWindowObject *self, PyObject *args) \
451 { \
452 TYPE arg1, arg2; \
453 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
454 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000455
Guido van Rossumf6971e21994-08-30 12:25:20 +0000456/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458Window_NoArgNoReturnFunction(untouchwin)
459Window_NoArgNoReturnFunction(touchwin)
460Window_NoArgNoReturnFunction(redrawwin)
461Window_NoArgNoReturnFunction(winsertln)
462Window_NoArgNoReturnFunction(werase)
463Window_NoArgNoReturnFunction(wdeleteln)
464
465Window_NoArgTrueFalseFunction(is_wintouched)
466
467Window_NoArgNoReturnVoidFunction(wsyncup)
468Window_NoArgNoReturnVoidFunction(wsyncdown)
469Window_NoArgNoReturnVoidFunction(wstandend)
470Window_NoArgNoReturnVoidFunction(wstandout)
471Window_NoArgNoReturnVoidFunction(wcursyncup)
472Window_NoArgNoReturnVoidFunction(wclrtoeol)
473Window_NoArgNoReturnVoidFunction(wclrtobot)
474Window_NoArgNoReturnVoidFunction(wclear)
475
476Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
477Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000478Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000480Window_NoArg2TupleReturnFunction(getyx, int, "ii")
481Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
482Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
483Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000484
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000485Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
486Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000487#if defined(__NetBSD__)
488Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
489#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000490Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000491#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000492Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000493#if defined(__NetBSD__)
494Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
495#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000496Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000497#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000498Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
499Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000500Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000501Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
502
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000503Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
504Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
505Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000506#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000507Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000508#endif
509
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000510/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000511
Guido van Rossumf6971e21994-08-30 12:25:20 +0000512static PyObject *
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100513PyCursesWindow_New(WINDOW *win, const char *encoding)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000514{
Victor Stinner26486ea2010-05-15 22:23:53 +0000515 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000516
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100517 if (encoding == NULL) {
518#if defined(MS_WINDOWS)
519 char *buffer[100];
520 UINT cp;
521 cp = GetConsoleOutputCP();
522 if (cp != 0) {
523 PyOS_snprintf(buffer, sizeof(buffer), "cp%u", cp);
524 encoding = buffer;
525 }
526#elif defined(CODESET)
527 const char *codeset = nl_langinfo(CODESET);
528 if (codeset != NULL && codeset[0] != 0)
529 encoding = codeset;
530#endif
531 if (encoding == NULL)
532 encoding = "utf-8";
533 }
534
Victor Stinner26486ea2010-05-15 22:23:53 +0000535 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
536 if (wo == NULL) return NULL;
537 wo->win = win;
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200538 wo->encoding = _PyMem_Strdup(encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100539 if (wo->encoding == NULL) {
540 Py_DECREF(wo);
541 PyErr_NoMemory();
542 return NULL;
543 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000544 return (PyObject *)wo;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000545}
546
547static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000548PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000549{
Victor Stinner26486ea2010-05-15 22:23:53 +0000550 if (wo->win != stdscr) delwin(wo->win);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100551 if (wo->encoding != NULL)
Victor Stinner49fc8ec2013-07-07 23:30:24 +0200552 PyMem_Free(wo->encoding);
Victor Stinner26486ea2010-05-15 22:23:53 +0000553 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000554}
555
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000556/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000557
Larry Hastings61272b72014-01-07 12:41:53 -0800558/*[clinic input]
Larry Hastings31826802013-10-19 00:09:25 -0700559
560curses.window.addch
561
562 [
Larry Hastings31826802013-10-19 00:09:25 -0700563 y: int
564 Y-coordinate.
Larry Hastings9147a962014-05-04 04:41:18 -0700565 x: int
566 X-coordinate.
Larry Hastings31826802013-10-19 00:09:25 -0700567 ]
568
569 ch: object
570 Character to add.
571
572 [
573 attr: long
574 Attributes for the character.
575 ]
576 /
577
578Paint character ch at (y, x) with attributes attr.
579
580Paint character ch at (y, x) with attributes attr,
581overwriting any character previously painted at that location.
582By default, the character position and attributes are the
583current settings for the window object.
Larry Hastings61272b72014-01-07 12:41:53 -0800584[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700585
586PyDoc_STRVAR(curses_window_addch__doc__,
Larry Hastings9147a962014-05-04 04:41:18 -0700587"addch([y, x,] ch, [attr])\n"
Larry Hastings31826802013-10-19 00:09:25 -0700588"Paint character ch at (y, x) with attributes attr.\n"
589"\n"
Larry Hastings31826802013-10-19 00:09:25 -0700590" y\n"
591" Y-coordinate.\n"
Larry Hastings9147a962014-05-04 04:41:18 -0700592" x\n"
593" X-coordinate.\n"
Larry Hastings31826802013-10-19 00:09:25 -0700594" ch\n"
595" Character to add.\n"
596" attr\n"
597" Attributes for the character.\n"
598"\n"
599"Paint character ch at (y, x) with attributes attr,\n"
600"overwriting any character previously painted at that location.\n"
601"By default, the character position and attributes are the\n"
602"current settings for the window object.");
603
604#define CURSES_WINDOW_ADDCH_METHODDEF \
605 {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
606
Guido van Rossumf6971e21994-08-30 12:25:20 +0000607static PyObject *
Larry Hastings9147a962014-05-04 04:41:18 -0700608curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr);
Larry Hastings31826802013-10-19 00:09:25 -0700609
610static PyObject *
Larry Hastingsc2047262014-01-25 20:43:29 -0800611curses_window_addch(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000612{
Larry Hastings31826802013-10-19 00:09:25 -0700613 PyObject *return_value = NULL;
614 int group_left_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800615 int y = 0;
Larry Hastings9147a962014-05-04 04:41:18 -0700616 int x = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700617 PyObject *ch;
618 int group_right_1 = 0;
Larry Hastingsabc716b2013-11-20 09:13:52 -0800619 long attr = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700620
Larry Hastings2a727912014-01-16 11:32:01 -0800621 switch (PyTuple_GET_SIZE(args)) {
Larry Hastings31826802013-10-19 00:09:25 -0700622 case 1:
623 if (!PyArg_ParseTuple(args, "O:addch", &ch))
Larry Hastings46258262014-01-22 03:05:49 -0800624 goto exit;
Larry Hastings31826802013-10-19 00:09:25 -0700625 break;
626 case 2:
627 if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr))
Larry Hastings46258262014-01-22 03:05:49 -0800628 goto exit;
Larry Hastings31826802013-10-19 00:09:25 -0700629 group_right_1 = 1;
630 break;
631 case 3:
Larry Hastings9147a962014-05-04 04:41:18 -0700632 if (!PyArg_ParseTuple(args, "iiO:addch", &y, &x, &ch))
Larry Hastings46258262014-01-22 03:05:49 -0800633 goto exit;
Larry Hastings31826802013-10-19 00:09:25 -0700634 group_left_1 = 1;
635 break;
636 case 4:
Larry Hastings9147a962014-05-04 04:41:18 -0700637 if (!PyArg_ParseTuple(args, "iiOl:addch", &y, &x, &ch, &attr))
Larry Hastings46258262014-01-22 03:05:49 -0800638 goto exit;
Larry Hastings31826802013-10-19 00:09:25 -0700639 group_right_1 = 1;
640 group_left_1 = 1;
641 break;
642 default:
643 PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
Larry Hastings46258262014-01-22 03:05:49 -0800644 goto exit;
Larry Hastings31826802013-10-19 00:09:25 -0700645 }
Larry Hastings9147a962014-05-04 04:41:18 -0700646 return_value = curses_window_addch_impl(self, group_left_1, y, x, ch, group_right_1, attr);
Larry Hastings31826802013-10-19 00:09:25 -0700647
Larry Hastings46258262014-01-22 03:05:49 -0800648exit:
Larry Hastings31826802013-10-19 00:09:25 -0700649 return return_value;
650}
651
652static PyObject *
Larry Hastings9147a962014-05-04 04:41:18 -0700653curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr)
654/*[clinic end generated code: output=d4b97cc287010c54 input=5a41efb34a2de338]*/
Larry Hastings31826802013-10-19 00:09:25 -0700655{
656 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
657 int coordinates_group = group_left_1;
658 int attr_group = group_right_1;
659 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100660 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700661 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100662#ifdef HAVE_NCURSESW
663 cchar_t wch;
664#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100665 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000666
Larry Hastings31826802013-10-19 00:09:25 -0700667 if (!attr_group)
668 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000669
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100670#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700671 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100672 if (type == 2) {
673 funcname = "add_wch";
674 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700675 if (coordinates_group)
676 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100677 else {
Larry Hastings31826802013-10-19 00:09:25 -0700678 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100679 }
680 }
681 else
682#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300683 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100684#endif
685 if (type == 1) {
686 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700687 if (coordinates_group)
688 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100689 else {
Larry Hastings31826802013-10-19 00:09:25 -0700690 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100691 }
692 }
693 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000694 return NULL;
695 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100696 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000697}
698
699static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000700PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000701{
Victor Stinner26486ea2010-05-15 22:23:53 +0000702 int rtn;
703 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100704 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500705 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100706#ifdef HAVE_NCURSESW
707 wchar_t *wstr = NULL;
708#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000709 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
710 long lattr;
711 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100712 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000713
Victor Stinner26486ea2010-05-15 22:23:53 +0000714 switch (PyTuple_Size(args)) {
715 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100716 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000717 return NULL;
718 break;
719 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100720 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000721 return NULL;
722 attr = lattr;
723 use_attr = TRUE;
724 break;
725 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100726 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000727 return NULL;
728 use_xy = TRUE;
729 break;
730 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100731 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000732 return NULL;
733 attr = lattr;
734 use_xy = use_attr = TRUE;
735 break;
736 default:
737 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
738 return NULL;
739 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100740#ifdef HAVE_NCURSESW
741 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
742#else
743 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
744#endif
745 if (strtype == 0)
746 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000747 if (use_attr == TRUE) {
748 attr_old = getattrs(self->win);
749 (void)wattrset(self->win,attr);
750 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100751#ifdef HAVE_NCURSESW
752 if (strtype == 2) {
753 funcname = "addwstr";
754 if (use_xy == TRUE)
755 rtn = mvwaddwstr(self->win,y,x,wstr);
756 else
757 rtn = waddwstr(self->win,wstr);
758 PyMem_Free(wstr);
759 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000760 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100761#endif
762 {
763 char *str = PyBytes_AS_STRING(bytesobj);
764 funcname = "addstr";
765 if (use_xy == TRUE)
766 rtn = mvwaddstr(self->win,y,x,str);
767 else
768 rtn = waddstr(self->win,str);
769 Py_DECREF(bytesobj);
770 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000771 if (use_attr == TRUE)
772 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100773 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000774}
Guido van Rossum85738471995-02-17 13:50:17 +0000775
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000776static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000777PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000778{
Victor Stinner26486ea2010-05-15 22:23:53 +0000779 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100780 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500781 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100782#ifdef HAVE_NCURSESW
783 wchar_t *wstr = NULL;
784#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000785 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
786 long lattr;
787 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100788 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000789
Victor Stinner26486ea2010-05-15 22:23:53 +0000790 switch (PyTuple_Size(args)) {
791 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100792 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000793 return NULL;
794 break;
795 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100796 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000797 return NULL;
798 attr = lattr;
799 use_attr = TRUE;
800 break;
801 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100802 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000803 return NULL;
804 use_xy = TRUE;
805 break;
806 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100807 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000808 return NULL;
809 attr = lattr;
810 use_xy = use_attr = TRUE;
811 break;
812 default:
813 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
814 return NULL;
815 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100816#ifdef HAVE_NCURSESW
817 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
818#else
819 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
820#endif
821 if (strtype == 0)
822 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000823
Victor Stinner26486ea2010-05-15 22:23:53 +0000824 if (use_attr == TRUE) {
825 attr_old = getattrs(self->win);
826 (void)wattrset(self->win,attr);
827 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100828#ifdef HAVE_NCURSESW
829 if (strtype == 2) {
830 funcname = "addnwstr";
831 if (use_xy == TRUE)
832 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
833 else
834 rtn = waddnwstr(self->win,wstr,n);
835 PyMem_Free(wstr);
836 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000837 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100838#endif
839 {
840 char *str = PyBytes_AS_STRING(bytesobj);
841 funcname = "addnstr";
842 if (use_xy == TRUE)
843 rtn = mvwaddnstr(self->win,y,x,str,n);
844 else
845 rtn = waddnstr(self->win,str,n);
846 Py_DECREF(bytesobj);
847 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000848 if (use_attr == TRUE)
849 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100850 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000851}
852
853static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000854PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000855{
Victor Stinner26486ea2010-05-15 22:23:53 +0000856 PyObject *temp;
857 chtype bkgd;
858 attr_t attr = A_NORMAL;
859 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000860
Victor Stinner26486ea2010-05-15 22:23:53 +0000861 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000862 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000863 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
864 return NULL;
865 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000866 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000867 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
868 return NULL;
869 attr = lattr;
870 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000871 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000872 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
873 return NULL;
874 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000875
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100876 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000877 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000878
Victor Stinner26486ea2010-05-15 22:23:53 +0000879 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000880}
881
882static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000883PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
884{
Victor Stinner26486ea2010-05-15 22:23:53 +0000885 long lattr;
886 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
887 return NULL;
888 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000889}
890
891static PyObject *
892PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
893{
Victor Stinner26486ea2010-05-15 22:23:53 +0000894 long lattr;
895 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
896 return NULL;
897 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000898}
899
900static PyObject *
901PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
902{
Victor Stinner26486ea2010-05-15 22:23:53 +0000903 long lattr;
904 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
905 return NULL;
906 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000907}
908
909static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000910PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000911{
Victor Stinner26486ea2010-05-15 22:23:53 +0000912 PyObject *temp;
913 chtype bkgd;
914 attr_t attr = A_NORMAL;
915 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000916
Victor Stinner26486ea2010-05-15 22:23:53 +0000917 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000918 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000919 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
920 return NULL;
921 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000923 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
924 return NULL;
925 attr = lattr;
926 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000927 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000928 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
929 return NULL;
930 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000931
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100932 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000933 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000934
Victor Stinner26486ea2010-05-15 22:23:53 +0000935 wbkgdset(self->win, bkgd | attr);
936 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000937}
938
939static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000940PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000941{
Victor Stinner26486ea2010-05-15 22:23:53 +0000942 PyObject *temp[8];
943 chtype ch[8];
944 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000945
Victor Stinner26486ea2010-05-15 22:23:53 +0000946 /* Clear the array of parameters */
947 for(i=0; i<8; i++) {
948 temp[i] = NULL;
949 ch[i] = 0;
950 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000951
Victor Stinner26486ea2010-05-15 22:23:53 +0000952 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
953 &temp[0], &temp[1], &temp[2], &temp[3],
954 &temp[4], &temp[5], &temp[6], &temp[7]))
955 return NULL;
956
957 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100958 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000959 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000960 }
961
962 wborder(self->win,
963 ch[0], ch[1], ch[2], ch[3],
964 ch[4], ch[5], ch[6], ch[7]);
965 Py_INCREF(Py_None);
966 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000967}
968
969static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000970PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000971{
Victor Stinner26486ea2010-05-15 22:23:53 +0000972 chtype ch1=0,ch2=0;
973 switch(PyTuple_Size(args)){
974 case 0: break;
975 default:
976 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
977 return NULL;
978 }
979 box(self->win,ch1,ch2);
980 Py_INCREF(Py_None);
981 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000982}
983
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000984#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
985#define py_mvwdelch mvwdelch
986#else
987int py_mvwdelch(WINDOW *w, int y, int x)
988{
Victor Stinner26486ea2010-05-15 22:23:53 +0000989 mvwdelch(w,y,x);
990 /* On HP/UX, mvwdelch already returns. On other systems,
991 we may well run into this return statement. */
992 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000993}
994#endif
995
Guido van Rossumd8faa362007-04-27 19:54:29 +0000996/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
997
998static PyObject *
999PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
1000{
Victor Stinner26486ea2010-05-15 22:23:53 +00001001 int rtn;
1002 int x, y;
1003 int num = -1;
1004 short color;
1005 attr_t attr = A_NORMAL;
1006 long lattr;
1007 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001008
Victor Stinner26486ea2010-05-15 22:23:53 +00001009 switch (PyTuple_Size(args)) {
1010 case 1:
1011 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1012 return NULL;
1013 attr = lattr;
1014 break;
1015 case 2:
1016 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1017 return NULL;
1018 attr = lattr;
1019 break;
1020 case 3:
1021 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1022 return NULL;
1023 attr = lattr;
1024 use_xy = TRUE;
1025 break;
1026 case 4:
1027 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1028 return NULL;
1029 attr = lattr;
1030 use_xy = TRUE;
1031 break;
1032 default:
1033 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1034 return NULL;
1035 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001036
Victor Stinner26486ea2010-05-15 22:23:53 +00001037 color = (short)((attr >> 8) & 0xff);
1038 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001039
Victor Stinner26486ea2010-05-15 22:23:53 +00001040 if (use_xy == TRUE) {
1041 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1042 touchline(self->win,y,1);
1043 } else {
1044 getyx(self->win,y,x);
1045 rtn = wchgat(self->win,num,attr,color,NULL);
1046 touchline(self->win,y,1);
1047 }
1048 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001049}
1050
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001051
Guido van Rossumf6971e21994-08-30 12:25:20 +00001052static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001053PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001054{
Victor Stinner26486ea2010-05-15 22:23:53 +00001055 int rtn;
1056 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001057
Victor Stinner26486ea2010-05-15 22:23:53 +00001058 switch (PyTuple_Size(args)) {
1059 case 0:
1060 rtn = wdelch(self->win);
1061 break;
1062 case 2:
1063 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1064 return NULL;
1065 rtn = py_mvwdelch(self->win,y,x);
1066 break;
1067 default:
1068 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1069 return NULL;
1070 }
1071 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001072}
1073
1074static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001075PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001076{
Victor Stinner26486ea2010-05-15 22:23:53 +00001077 WINDOW *win;
1078 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001079
Victor Stinner26486ea2010-05-15 22:23:53 +00001080 nlines = 0;
1081 ncols = 0;
1082 switch (PyTuple_Size(args)) {
1083 case 2:
1084 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1085 return NULL;
1086 break;
1087 case 4:
1088 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1089 &nlines,&ncols,&begin_y,&begin_x))
1090 return NULL;
1091 break;
1092 default:
1093 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1094 return NULL;
1095 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001096
Victor Stinner26486ea2010-05-15 22:23:53 +00001097 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001098
Victor Stinner26486ea2010-05-15 22:23:53 +00001099 if (win == NULL) {
1100 PyErr_SetString(PyCursesError, catchall_NULL);
1101 return NULL;
1102 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001103
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001104 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001105}
1106
1107static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001108PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001109{
Victor Stinner26486ea2010-05-15 22:23:53 +00001110 PyObject *temp;
1111 chtype ch;
1112 attr_t attr = A_NORMAL;
1113 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001114
Victor Stinner26486ea2010-05-15 22:23:53 +00001115 switch (PyTuple_Size(args)) {
1116 case 1:
1117 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1118 return NULL;
1119 break;
1120 case 2:
1121 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1122 return NULL;
1123 attr = lattr;
1124 break;
1125 default:
1126 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001127
1128
Victor Stinner26486ea2010-05-15 22:23:53 +00001129 return NULL;
1130 }
Guido van Rossum85738471995-02-17 13:50:17 +00001131
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001132 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001133 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001134
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001135#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001136 if (self->win->_flags & _ISPAD)
1137 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1138 "echochar");
1139 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001140#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001141 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1142 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001143}
1144
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001145#ifdef NCURSES_MOUSE_VERSION
1146static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001147PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001148{
Victor Stinner26486ea2010-05-15 22:23:53 +00001149 int x, y;
1150 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1151 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001152
Victor Stinner26486ea2010-05-15 22:23:53 +00001153 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001154}
1155#endif
1156
Guido van Rossumf6971e21994-08-30 12:25:20 +00001157static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001158PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001159{
Victor Stinner26486ea2010-05-15 22:23:53 +00001160 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001161}
1162
1163static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001164PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001165{
Victor Stinner26486ea2010-05-15 22:23:53 +00001166 int x, y;
1167 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001168
Victor Stinner26486ea2010-05-15 22:23:53 +00001169 switch (PyTuple_Size(args)) {
1170 case 0:
1171 Py_BEGIN_ALLOW_THREADS
1172 rtn = wgetch(self->win);
1173 Py_END_ALLOW_THREADS
1174 break;
1175 case 2:
1176 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1177 return NULL;
1178 Py_BEGIN_ALLOW_THREADS
1179 rtn = mvwgetch(self->win,y,x);
1180 Py_END_ALLOW_THREADS
1181 break;
1182 default:
1183 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1184 return NULL;
1185 }
1186 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001187}
Guido van Rossum85738471995-02-17 13:50:17 +00001188
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001189static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001190PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001191{
Victor Stinner26486ea2010-05-15 22:23:53 +00001192 int x, y;
1193 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001194
Victor Stinner26486ea2010-05-15 22:23:53 +00001195 switch (PyTuple_Size(args)) {
1196 case 0:
1197 Py_BEGIN_ALLOW_THREADS
1198 rtn = wgetch(self->win);
1199 Py_END_ALLOW_THREADS
1200 break;
1201 case 2:
1202 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1203 return NULL;
1204 Py_BEGIN_ALLOW_THREADS
1205 rtn = mvwgetch(self->win,y,x);
1206 Py_END_ALLOW_THREADS
1207 break;
1208 default:
1209 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1210 return NULL;
1211 }
1212 if (rtn == ERR) {
1213 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001214 PyErr_CheckSignals();
1215 if (!PyErr_Occurred())
1216 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001217 return NULL;
1218 } else if (rtn<=255) {
1219 return Py_BuildValue("C", rtn);
1220 } else {
1221 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001222#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001223 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001224#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001225 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001226#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001227 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1228 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001229}
1230
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001231#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001232static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001233PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1234{
1235 int x, y;
1236 int ct;
1237 wint_t rtn;
1238
1239 switch (PyTuple_Size(args)) {
1240 case 0:
1241 Py_BEGIN_ALLOW_THREADS
1242 ct = wget_wch(self->win,&rtn);
1243 Py_END_ALLOW_THREADS
1244 break;
1245 case 2:
1246 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1247 return NULL;
1248 Py_BEGIN_ALLOW_THREADS
1249 ct = mvwget_wch(self->win,y,x,&rtn);
1250 Py_END_ALLOW_THREADS
1251 break;
1252 default:
1253 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1254 return NULL;
1255 }
1256 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001257 if (PyErr_CheckSignals())
1258 return NULL;
1259
Victor Stinnera7878b72011-07-14 23:07:44 +02001260 /* get_wch() returns ERR in nodelay mode */
1261 PyErr_SetString(PyCursesError, "no input");
1262 return NULL;
1263 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001264 if (ct == KEY_CODE_YES)
1265 return PyLong_FromLong(rtn);
1266 else
1267 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001268}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001269#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001270
1271static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001272PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001273{
Victor Stinner26486ea2010-05-15 22:23:53 +00001274 int x, y, n;
1275 char rtn[1024]; /* This should be big enough.. I hope */
1276 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001277
Victor Stinner26486ea2010-05-15 22:23:53 +00001278 switch (PyTuple_Size(args)) {
1279 case 0:
1280 Py_BEGIN_ALLOW_THREADS
1281 rtn2 = wgetnstr(self->win,rtn, 1023);
1282 Py_END_ALLOW_THREADS
1283 break;
1284 case 1:
1285 if (!PyArg_ParseTuple(args,"i;n", &n))
1286 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001287 if (n < 0) {
1288 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1289 return NULL;
1290 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001291 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001292 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001293 Py_END_ALLOW_THREADS
1294 break;
1295 case 2:
1296 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1297 return NULL;
1298 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001299#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001301#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001302 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001303#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001304 Py_END_ALLOW_THREADS
1305 break;
1306 case 3:
1307 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1308 return NULL;
Benjamin Peterson40a77c32016-08-13 18:15:28 -07001309 if (n < 0) {
1310 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1311 return NULL;
1312 }
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001313#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001314 Py_BEGIN_ALLOW_THREADS
1315 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001316 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001317 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001318#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001319 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001320 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001321 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001322#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001323 break;
1324 default:
1325 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1326 return NULL;
1327 }
1328 if (rtn2 == ERR)
1329 rtn[0] = 0;
1330 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001331}
1332
1333static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001334PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001335{
Victor Stinner26486ea2010-05-15 22:23:53 +00001336 PyObject *temp;
1337 chtype ch;
1338 int n, x, y, code = OK;
1339 attr_t attr = A_NORMAL;
1340 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001341
Victor Stinner26486ea2010-05-15 22:23:53 +00001342 switch (PyTuple_Size(args)) {
1343 case 2:
1344 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1345 return NULL;
1346 break;
1347 case 3:
1348 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1349 return NULL;
1350 attr = lattr;
1351 break;
1352 case 4:
1353 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1354 return NULL;
1355 code = wmove(self->win, y, x);
1356 break;
1357 case 5:
1358 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1359 &y, &x, &temp, &n, &lattr))
1360 return NULL;
1361 attr = lattr;
1362 code = wmove(self->win, y, x);
1363 break;
1364 default:
1365 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1366 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001367 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001368
1369 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001370 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001371 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001372 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1373 } else
1374 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001375}
1376
1377static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001378PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001379{
Victor Stinner26486ea2010-05-15 22:23:53 +00001380 int rtn, x, y, use_xy = FALSE;
1381 PyObject *temp;
1382 chtype ch = 0;
1383 attr_t attr = A_NORMAL;
1384 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001385
Victor Stinner26486ea2010-05-15 22:23:53 +00001386 switch (PyTuple_Size(args)) {
1387 case 1:
1388 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1389 return NULL;
1390 break;
1391 case 2:
1392 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1393 return NULL;
1394 attr = lattr;
1395 break;
1396 case 3:
1397 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1398 return NULL;
1399 use_xy = TRUE;
1400 break;
1401 case 4:
1402 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1403 return NULL;
1404 attr = lattr;
1405 use_xy = TRUE;
1406 break;
1407 default:
1408 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1409 return NULL;
1410 }
1411
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001412 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001413 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001414
1415 if (use_xy == TRUE)
1416 rtn = mvwinsch(self->win,y,x, ch | attr);
1417 else {
1418 rtn = winsch(self->win, ch | attr);
1419 }
1420 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001421}
1422
1423static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001424PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001425{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001426 int x, y;
1427 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001428
Victor Stinner26486ea2010-05-15 22:23:53 +00001429 switch (PyTuple_Size(args)) {
1430 case 0:
1431 rtn = winch(self->win);
1432 break;
1433 case 2:
1434 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1435 return NULL;
1436 rtn = mvwinch(self->win,y,x);
1437 break;
1438 default:
1439 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1440 return NULL;
1441 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001442 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001443}
1444
1445static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001446PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001447{
Victor Stinner26486ea2010-05-15 22:23:53 +00001448 int x, y, n;
1449 char rtn[1024]; /* This should be big enough.. I hope */
1450 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001451
Victor Stinner26486ea2010-05-15 22:23:53 +00001452 switch (PyTuple_Size(args)) {
1453 case 0:
1454 rtn2 = winnstr(self->win,rtn, 1023);
1455 break;
1456 case 1:
1457 if (!PyArg_ParseTuple(args,"i;n", &n))
1458 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001459 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001460 break;
1461 case 2:
1462 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1463 return NULL;
1464 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1465 break;
1466 case 3:
1467 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1468 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001469 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001470 break;
1471 default:
1472 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1473 return NULL;
1474 }
1475 if (rtn2 == ERR)
1476 rtn[0] = 0;
1477 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001478}
1479
1480static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001481PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001482{
Victor Stinner26486ea2010-05-15 22:23:53 +00001483 int rtn;
1484 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001485 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001486 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001487#ifdef HAVE_NCURSESW
1488 wchar_t *wstr = NULL;
1489#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001490 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1491 long lattr;
1492 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001493 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001494
Victor Stinner26486ea2010-05-15 22:23:53 +00001495 switch (PyTuple_Size(args)) {
1496 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001497 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001498 return NULL;
1499 break;
1500 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001501 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001502 return NULL;
1503 attr = lattr;
1504 use_attr = TRUE;
1505 break;
1506 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001507 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001508 return NULL;
1509 use_xy = TRUE;
1510 break;
1511 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001512 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001513 return NULL;
1514 attr = lattr;
1515 use_xy = use_attr = TRUE;
1516 break;
1517 default:
1518 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1519 return NULL;
1520 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001521
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001522#ifdef HAVE_NCURSESW
1523 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1524#else
1525 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1526#endif
1527 if (strtype == 0)
1528 return NULL;
1529
Victor Stinner26486ea2010-05-15 22:23:53 +00001530 if (use_attr == TRUE) {
1531 attr_old = getattrs(self->win);
1532 (void)wattrset(self->win,attr);
1533 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001534#ifdef HAVE_NCURSESW
1535 if (strtype == 2) {
1536 funcname = "inswstr";
1537 if (use_xy == TRUE)
1538 rtn = mvwins_wstr(self->win,y,x,wstr);
1539 else
1540 rtn = wins_wstr(self->win,wstr);
1541 PyMem_Free(wstr);
1542 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001543 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001544#endif
1545 {
1546 char *str = PyBytes_AS_STRING(bytesobj);
1547 funcname = "insstr";
1548 if (use_xy == TRUE)
1549 rtn = mvwinsstr(self->win,y,x,str);
1550 else
1551 rtn = winsstr(self->win,str);
1552 Py_DECREF(bytesobj);
1553 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001554 if (use_attr == TRUE)
1555 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001556 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001557}
1558
1559static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001560PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001561{
Victor Stinner26486ea2010-05-15 22:23:53 +00001562 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001563 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001564 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001565#ifdef HAVE_NCURSESW
1566 wchar_t *wstr = NULL;
1567#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001568 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1569 long lattr;
1570 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001571 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001572
Victor Stinner26486ea2010-05-15 22:23:53 +00001573 switch (PyTuple_Size(args)) {
1574 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001575 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001576 return NULL;
1577 break;
1578 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001579 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001580 return NULL;
1581 attr = lattr;
1582 use_attr = TRUE;
1583 break;
1584 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001585 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001586 return NULL;
1587 use_xy = TRUE;
1588 break;
1589 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001590 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001591 return NULL;
1592 attr = lattr;
1593 use_xy = use_attr = TRUE;
1594 break;
1595 default:
1596 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1597 return NULL;
1598 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001599
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001600#ifdef HAVE_NCURSESW
1601 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1602#else
1603 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1604#endif
1605 if (strtype == 0)
1606 return NULL;
1607
Victor Stinner26486ea2010-05-15 22:23:53 +00001608 if (use_attr == TRUE) {
1609 attr_old = getattrs(self->win);
1610 (void)wattrset(self->win,attr);
1611 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001612#ifdef HAVE_NCURSESW
1613 if (strtype == 2) {
1614 funcname = "insn_wstr";
1615 if (use_xy == TRUE)
1616 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1617 else
1618 rtn = wins_nwstr(self->win,wstr,n);
1619 PyMem_Free(wstr);
1620 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001621 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001622#endif
1623 {
1624 char *str = PyBytes_AS_STRING(bytesobj);
1625 funcname = "insnstr";
1626 if (use_xy == TRUE)
1627 rtn = mvwinsnstr(self->win,y,x,str,n);
1628 else
1629 rtn = winsnstr(self->win,str,n);
1630 Py_DECREF(bytesobj);
1631 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001632 if (use_attr == TRUE)
1633 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001634 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001635}
1636
1637static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001638PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001639{
Victor Stinner26486ea2010-05-15 22:23:53 +00001640 int line, erg;
1641 if (!PyArg_ParseTuple(args,"i;line", &line))
1642 return NULL;
1643 erg = is_linetouched(self->win, line);
1644 if (erg == ERR) {
1645 PyErr_SetString(PyExc_TypeError,
1646 "is_linetouched: line number outside of boundaries");
1647 return NULL;
1648 } else
1649 if (erg == FALSE) {
1650 Py_INCREF(Py_False);
1651 return Py_False;
1652 } else {
1653 Py_INCREF(Py_True);
1654 return Py_True;
1655 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001656}
1657
1658static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001659PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001660{
Victor Stinner26486ea2010-05-15 22:23:53 +00001661 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1662 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001663
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001664#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001665 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001666#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001667 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001668#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001669 {
1670 switch(PyTuple_Size(args)) {
1671 case 6:
1672 if (!PyArg_ParseTuple(args,
1673 "iiiiii;" \
1674 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1675 &pminrow, &pmincol, &sminrow,
1676 &smincol, &smaxrow, &smaxcol))
1677 return NULL;
1678 Py_BEGIN_ALLOW_THREADS
1679 rtn = pnoutrefresh(self->win,
1680 pminrow, pmincol, sminrow,
1681 smincol, smaxrow, smaxcol);
1682 Py_END_ALLOW_THREADS
1683 return PyCursesCheckERR(rtn, "pnoutrefresh");
1684 default:
1685 PyErr_SetString(PyCursesError,
1686 "noutrefresh() called for a pad "
1687 "requires 6 arguments");
1688 return NULL;
1689 }
1690 } else {
1691 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1692 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001693
Victor Stinner26486ea2010-05-15 22:23:53 +00001694 Py_BEGIN_ALLOW_THREADS
1695 rtn = wnoutrefresh(self->win);
1696 Py_END_ALLOW_THREADS
1697 return PyCursesCheckERR(rtn, "wnoutrefresh");
1698 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001699}
1700
1701static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1703{
1704 PyCursesWindowObject *temp;
1705 int use_copywin = FALSE;
1706 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1707 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001708
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001709 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001710 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001711 if (!PyArg_ParseTuple(args, "O!;window object",
1712 &PyCursesWindow_Type, &temp))
1713 return NULL;
1714 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001715 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001716 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1717 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1718 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1719 return NULL;
1720 use_copywin = TRUE;
1721 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001722 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001723 PyErr_SetString(PyExc_TypeError,
1724 "overlay requires one or seven arguments");
1725 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001726 }
1727
1728 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001729 rtn = copywin(self->win, temp->win, sminrow, smincol,
1730 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1731 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001732 }
1733 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001734 rtn = overlay(self->win, temp->win);
1735 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001736 }
1737}
1738
1739static PyObject *
1740PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1741{
1742 PyCursesWindowObject *temp;
1743 int use_copywin = FALSE;
1744 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1745 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001746
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001747 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001748 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001749 if (!PyArg_ParseTuple(args, "O!;window object",
1750 &PyCursesWindow_Type, &temp))
1751 return NULL;
1752 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001753 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001754 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1755 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1756 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1757 return NULL;
1758 use_copywin = TRUE;
1759 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001760 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001761 PyErr_SetString(PyExc_TypeError,
1762 "overwrite requires one or seven arguments");
1763 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001764 }
1765
1766 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001767 rtn = copywin(self->win, temp->win, sminrow, smincol,
1768 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001769 return PyCursesCheckERR(rtn, "copywin");
1770 }
1771 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001772 rtn = overwrite(self->win, temp->win);
1773 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001774 }
1775}
1776
1777static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001778PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001779{
Victor Stinner26486ea2010-05-15 22:23:53 +00001780 /* We have to simulate this by writing to a temporary FILE*,
1781 then reading back, then writing to the argument stream. */
1782 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001783 int fd = -1;
1784 FILE *fp = NULL;
1785 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001786
Victor Stinner26486ea2010-05-15 22:23:53 +00001787 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1788 fd = mkstemp(fn);
1789 if (fd < 0)
1790 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001791 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1792 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001793 fp = fdopen(fd, "wb+");
1794 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001795 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1796 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001797 }
1798 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001799 if (res == NULL)
1800 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001801 fseek(fp, 0, 0);
1802 while (1) {
1803 char buf[BUFSIZ];
1804 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001805 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001806
Victor Stinner26486ea2010-05-15 22:23:53 +00001807 if (n <= 0)
1808 break;
1809 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001810 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001811 if (res == NULL)
1812 break;
1813 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001814
1815exit:
1816 if (fp != NULL)
1817 fclose(fp);
1818 else if (fd != -1)
1819 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001820 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001821 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001822}
1823
1824static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001825PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001826{
Victor Stinner26486ea2010-05-15 22:23:53 +00001827 int beg, num;
1828 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1829 return NULL;
1830 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001831}
1832
1833static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001834PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001835{
Victor Stinner26486ea2010-05-15 22:23:53 +00001836 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1837 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001838
Victor Stinner26486ea2010-05-15 22:23:53 +00001839#ifndef WINDOW_HAS_FLAGS
1840 if (0)
1841#else
1842 if (self->win->_flags & _ISPAD)
1843#endif
1844 {
1845 switch(PyTuple_Size(args)) {
1846 case 6:
1847 if (!PyArg_ParseTuple(args,
1848 "iiiiii;" \
1849 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1850 &pminrow, &pmincol, &sminrow,
1851 &smincol, &smaxrow, &smaxcol))
1852 return NULL;
1853
1854 Py_BEGIN_ALLOW_THREADS
1855 rtn = prefresh(self->win,
1856 pminrow, pmincol, sminrow,
1857 smincol, smaxrow, smaxcol);
1858 Py_END_ALLOW_THREADS
1859 return PyCursesCheckERR(rtn, "prefresh");
1860 default:
1861 PyErr_SetString(PyCursesError,
1862 "refresh() for a pad requires 6 arguments");
1863 return NULL;
1864 }
1865 } else {
1866 if (!PyArg_ParseTuple(args, ":refresh"))
1867 return NULL;
1868 Py_BEGIN_ALLOW_THREADS
1869 rtn = wrefresh(self->win);
1870 Py_END_ALLOW_THREADS
1871 return PyCursesCheckERR(rtn, "prefresh");
1872 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001873}
1874
1875static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001876PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001877{
Victor Stinner26486ea2010-05-15 22:23:53 +00001878 int x, y;
1879 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1880 return NULL;
1881 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001882}
1883
1884static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001885PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001886{
Victor Stinner26486ea2010-05-15 22:23:53 +00001887 WINDOW *win;
1888 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001889
Victor Stinner26486ea2010-05-15 22:23:53 +00001890 nlines = 0;
1891 ncols = 0;
1892 switch (PyTuple_Size(args)) {
1893 case 2:
1894 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1895 return NULL;
1896 break;
1897 case 4:
1898 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1899 &nlines,&ncols,&begin_y,&begin_x))
1900 return NULL;
1901 break;
1902 default:
1903 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1904 return NULL;
1905 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001906
Victor Stinner26486ea2010-05-15 22:23:53 +00001907 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001908#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001909 if (self->win->_flags & _ISPAD)
1910 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1911 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001912#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001913 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001914
Victor Stinner26486ea2010-05-15 22:23:53 +00001915 if (win == NULL) {
1916 PyErr_SetString(PyCursesError, catchall_NULL);
1917 return NULL;
1918 }
1919
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001920 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001921}
1922
1923static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001924PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001925{
Victor Stinner26486ea2010-05-15 22:23:53 +00001926 int nlines;
1927 switch(PyTuple_Size(args)) {
1928 case 0:
1929 return PyCursesCheckERR(scroll(self->win), "scroll");
1930 case 1:
1931 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1932 return NULL;
1933 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1934 default:
1935 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1936 return NULL;
1937 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001938}
1939
1940static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001941PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001942{
Victor Stinner26486ea2010-05-15 22:23:53 +00001943 int st, cnt, val;
1944 switch (PyTuple_Size(args)) {
1945 case 2:
1946 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1947 return NULL;
1948 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1949 case 3:
1950 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1951 return NULL;
1952 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1953 default:
1954 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1955 return NULL;
1956 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001957}
1958
1959static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001960PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001961{
Victor Stinner26486ea2010-05-15 22:23:53 +00001962 PyObject *temp;
1963 chtype ch;
1964 int n, x, y, code = OK;
1965 attr_t attr = A_NORMAL;
1966 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001967
Victor Stinner26486ea2010-05-15 22:23:53 +00001968 switch (PyTuple_Size(args)) {
1969 case 2:
1970 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1971 return NULL;
1972 break;
1973 case 3:
1974 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1975 return NULL;
1976 attr = lattr;
1977 break;
1978 case 4:
1979 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1980 return NULL;
1981 code = wmove(self->win, y, x);
1982 break;
1983 case 5:
1984 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1985 &y, &x, &temp, &n, &lattr))
1986 return NULL;
1987 attr = lattr;
1988 code = wmove(self->win, y, x);
1989 break;
1990 default:
1991 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1992 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001993 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001994
1995 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001996 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001997 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001998 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1999 } else
2000 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002001}
2002
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002003static PyObject *
2004PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
2005{
2006 return PyUnicode_FromString(self->encoding);
2007}
2008
2009static int
2010PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
2011{
2012 PyObject *ascii;
2013 char *encoding;
2014
2015 /* It is illegal to del win.encoding */
2016 if (value == NULL) {
2017 PyErr_SetString(PyExc_TypeError,
2018 "encoding may not be deleted");
2019 return -1;
2020 }
2021
2022 if (!PyUnicode_Check(value)) {
2023 PyErr_SetString(PyExc_TypeError,
2024 "setting encoding to a non-string");
2025 return -1;
2026 }
2027 ascii = PyUnicode_AsASCIIString(value);
2028 if (ascii == NULL)
2029 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002030 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002031 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002032 if (encoding == NULL) {
2033 PyErr_NoMemory();
2034 return -1;
2035 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002036 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002037 self->encoding = encoding;
2038 return 0;
2039}
2040
2041
Guido van Rossumf6971e21994-08-30 12:25:20 +00002042static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002043 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002044 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2045 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2046 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2047 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2048 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2049 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2050 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2051 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2052 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2053 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2054 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2055 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2056 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2057 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2058 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2059 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2060 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2061 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2062 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002063#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002064 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002065#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002066 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2067 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2068 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2069 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2070 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002071#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002072 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002073#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002074 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2075 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2076 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2077 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2078 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2079 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2080 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2081 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2082 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2083 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2084 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2085 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2086 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2087 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2088 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2089 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2090 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2091 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2092 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2093 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2094 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2095 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2096 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2097 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2098 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002099 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2100 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2101 METH_VARARGS},
2102 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2103 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2104 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2105 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002106#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002107 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002108#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002109 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2110 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2111 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2112 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2113 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2114 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2115 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2116 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2117 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2118 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2119 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2120 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2121 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2122 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2123 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2124 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002125};
2126
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002127static PyGetSetDef PyCursesWindow_getsets[] = {
2128 {"encoding",
2129 (getter)PyCursesWindow_get_encoding,
2130 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002131 "the typecode character used to create the array"},
2132 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002133};
2134
Guido van Rossumf6971e21994-08-30 12:25:20 +00002135/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002136
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002137PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002138 PyVarObject_HEAD_INIT(NULL, 0)
2139 "_curses.curses window", /*tp_name*/
2140 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2141 0, /*tp_itemsize*/
2142 /* methods */
2143 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2144 0, /*tp_print*/
2145 (getattrfunc)0, /*tp_getattr*/
2146 (setattrfunc)0, /*tp_setattr*/
2147 0, /*tp_reserved*/
2148 0, /*tp_repr*/
2149 0, /*tp_as_number*/
2150 0, /*tp_as_sequence*/
2151 0, /*tp_as_mapping*/
2152 0, /*tp_hash*/
2153 0, /*tp_call*/
2154 0, /*tp_str*/
2155 0, /*tp_getattro*/
2156 0, /*tp_setattro*/
2157 0, /*tp_as_buffer*/
2158 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2159 0, /*tp_doc*/
2160 0, /*tp_traverse*/
2161 0, /*tp_clear*/
2162 0, /*tp_richcompare*/
2163 0, /*tp_weaklistoffset*/
2164 0, /*tp_iter*/
2165 0, /*tp_iternext*/
2166 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002167 0, /* tp_members */
2168 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002169};
2170
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002171/*********************************************************************
2172 Global Functions
2173**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002174
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002175NoArgNoReturnFunction(beep)
2176NoArgNoReturnFunction(def_prog_mode)
2177NoArgNoReturnFunction(def_shell_mode)
2178NoArgNoReturnFunction(doupdate)
2179NoArgNoReturnFunction(endwin)
2180NoArgNoReturnFunction(flash)
2181NoArgNoReturnFunction(nocbreak)
2182NoArgNoReturnFunction(noecho)
2183NoArgNoReturnFunction(nonl)
2184NoArgNoReturnFunction(noraw)
2185NoArgNoReturnFunction(reset_prog_mode)
2186NoArgNoReturnFunction(reset_shell_mode)
2187NoArgNoReturnFunction(resetty)
2188NoArgNoReturnFunction(savetty)
2189
2190NoArgOrFlagNoReturnFunction(cbreak)
2191NoArgOrFlagNoReturnFunction(echo)
2192NoArgOrFlagNoReturnFunction(nl)
2193NoArgOrFlagNoReturnFunction(raw)
2194
2195NoArgReturnIntFunction(baudrate)
2196NoArgReturnIntFunction(termattrs)
2197
2198NoArgReturnStringFunction(termname)
2199NoArgReturnStringFunction(longname)
2200
2201NoArgTrueFalseFunction(can_change_color)
2202NoArgTrueFalseFunction(has_colors)
2203NoArgTrueFalseFunction(has_ic)
2204NoArgTrueFalseFunction(has_il)
2205NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002206NoArgNoReturnVoidFunction(flushinp)
2207NoArgNoReturnVoidFunction(noqiflush)
2208
2209static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002210PyCurses_filter(PyObject *self)
2211{
Victor Stinner26486ea2010-05-15 22:23:53 +00002212 /* not checking for PyCursesInitialised here since filter() must
2213 be called before initscr() */
2214 filter();
2215 Py_INCREF(Py_None);
2216 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002217}
2218
2219static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002220PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221{
Victor Stinner26486ea2010-05-15 22:23:53 +00002222 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223
Victor Stinner26486ea2010-05-15 22:23:53 +00002224 PyCursesInitialised;
2225 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002226
Victor Stinner26486ea2010-05-15 22:23:53 +00002227 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228
Victor Stinner26486ea2010-05-15 22:23:53 +00002229 if (color_content(color, &r, &g, &b) != ERR)
2230 return Py_BuildValue("(iii)", r, g, b);
2231 else {
2232 PyErr_SetString(PyCursesError,
2233 "Argument 1 was out of range. Check value of COLORS.");
2234 return NULL;
2235 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236}
2237
2238static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002239PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240{
Victor Stinner26486ea2010-05-15 22:23:53 +00002241 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002242
Victor Stinner26486ea2010-05-15 22:23:53 +00002243 PyCursesInitialised;
2244 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002245
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2247 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002248}
2249
2250static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002251PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002252{
Victor Stinner26486ea2010-05-15 22:23:53 +00002253 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002254
Victor Stinner26486ea2010-05-15 22:23:53 +00002255 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002256
Victor Stinner26486ea2010-05-15 22:23:53 +00002257 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002258
Victor Stinner26486ea2010-05-15 22:23:53 +00002259 erg = curs_set(vis);
2260 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263}
2264
2265static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002266PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002267{
Victor Stinner26486ea2010-05-15 22:23:53 +00002268 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002269
Victor Stinner26486ea2010-05-15 22:23:53 +00002270 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275}
2276
2277static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002278PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279{
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002281
Victor Stinner26486ea2010-05-15 22:23:53 +00002282 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283
Victor Stinner26486ea2010-05-15 22:23:53 +00002284 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002285
Victor Stinner26486ea2010-05-15 22:23:53 +00002286 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287}
2288
2289static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002290PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002291{
Victor Stinner26486ea2010-05-15 22:23:53 +00002292 int x = 0;
2293 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002294
Victor Stinner26486ea2010-05-15 22:23:53 +00002295 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002296
Victor Stinner26486ea2010-05-15 22:23:53 +00002297 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002298
Victor Stinner26486ea2010-05-15 22:23:53 +00002299 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002300}
2301
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002302#ifdef NCURSES_MOUSE_VERSION
2303static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002304PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002305{
Victor Stinner26486ea2010-05-15 22:23:53 +00002306 int rtn;
2307 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002308
Victor Stinner26486ea2010-05-15 22:23:53 +00002309 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002310
Victor Stinner26486ea2010-05-15 22:23:53 +00002311 rtn = getmouse( &event );
2312 if (rtn == ERR) {
2313 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2314 return NULL;
2315 }
2316 return Py_BuildValue("(hiiil)",
2317 (short)event.id,
2318 event.x, event.y, event.z,
2319 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002320}
2321
2322static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002323PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002324{
Victor Stinner26486ea2010-05-15 22:23:53 +00002325 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002326
Victor Stinner26486ea2010-05-15 22:23:53 +00002327 PyCursesInitialised;
2328 if (!PyArg_ParseTuple(args, "hiiil",
2329 &event.id,
2330 &event.x, &event.y, &event.z,
2331 (int *) &event.bstate))
2332 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002333
Victor Stinner26486ea2010-05-15 22:23:53 +00002334 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002335}
2336#endif
2337
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002338static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002339PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002340{
Victor Stinner26486ea2010-05-15 22:23:53 +00002341 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002342 int fd = -1;
2343 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 PyObject *data;
2345 size_t datalen;
2346 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002347 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002348 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002349
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002351
Victor Stinner26486ea2010-05-15 22:23:53 +00002352 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2353 fd = mkstemp(fn);
2354 if (fd < 0)
2355 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002356 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2357 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002358 fp = fdopen(fd, "wb+");
2359 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002360 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2361 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002362 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002363
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002364 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002365 if (data == NULL)
2366 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002367 if (!PyBytes_Check(data)) {
2368 PyErr_Format(PyExc_TypeError,
2369 "f.read() returned %.100s instead of bytes",
2370 data->ob_type->tp_name);
2371 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002372 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002373 }
2374 datalen = PyBytes_GET_SIZE(data);
2375 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2376 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002377 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2378 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002380 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002381
Victor Stinner26486ea2010-05-15 22:23:53 +00002382 fseek(fp, 0, 0);
2383 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002384 if (win == NULL) {
2385 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002386 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002387 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002388 res = PyCursesWindow_New(win, NULL);
2389
2390error:
2391 if (fp != NULL)
2392 fclose(fp);
2393 else if (fd != -1)
2394 close(fd);
2395 remove(fn);
2396 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397}
2398
2399static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002400PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401{
Victor Stinner26486ea2010-05-15 22:23:53 +00002402 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002403
Victor Stinner26486ea2010-05-15 22:23:53 +00002404 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002405
Victor Stinner26486ea2010-05-15 22:23:53 +00002406 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002409}
2410
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002411#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002412/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002413static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002414{
Victor Stinner26486ea2010-05-15 22:23:53 +00002415 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002416
Victor Stinner26486ea2010-05-15 22:23:53 +00002417 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002418
Victor Stinner26486ea2010-05-15 22:23:53 +00002419 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002420
Victor Stinner26486ea2010-05-15 22:23:53 +00002421 if (has_key(ch) == FALSE) {
2422 Py_INCREF(Py_False);
2423 return Py_False;
2424 }
2425 Py_INCREF(Py_True);
2426 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002427}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002428#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002429
2430static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002431PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002432{
Victor Stinner26486ea2010-05-15 22:23:53 +00002433 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002434
Victor Stinner26486ea2010-05-15 22:23:53 +00002435 PyCursesInitialised;
2436 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002437
Victor Stinner26486ea2010-05-15 22:23:53 +00002438 switch(PyTuple_Size(args)) {
2439 case 4:
2440 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2441 break;
2442 default:
2443 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2444 return NULL;
2445 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002446
Victor Stinner26486ea2010-05-15 22:23:53 +00002447 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002448}
2449
2450static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002451PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002452{
Victor Stinner26486ea2010-05-15 22:23:53 +00002453 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002454
Victor Stinner26486ea2010-05-15 22:23:53 +00002455 PyCursesInitialised;
2456 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002457
Victor Stinner26486ea2010-05-15 22:23:53 +00002458 if (PyTuple_Size(args) != 3) {
2459 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2460 return NULL;
2461 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002462
Victor Stinner26486ea2010-05-15 22:23:53 +00002463 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002464
Victor Stinner26486ea2010-05-15 22:23:53 +00002465 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002466}
2467
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002468static PyObject *ModDict;
2469
Victor Stinner26486ea2010-05-15 22:23:53 +00002470static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002471PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002472{
Victor Stinner26486ea2010-05-15 22:23:53 +00002473 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002474 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002475
Victor Stinner26486ea2010-05-15 22:23:53 +00002476 if (initialised == TRUE) {
2477 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002478 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002479 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002480
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002482
Victor Stinner26486ea2010-05-15 22:23:53 +00002483 if (win == NULL) {
2484 PyErr_SetString(PyCursesError, catchall_NULL);
2485 return NULL;
2486 }
Guido van Rossum85738471995-02-17 13:50:17 +00002487
Victor Stinner26486ea2010-05-15 22:23:53 +00002488 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002489
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002490/* This was moved from initcurses() because it core dumped on SGI,
2491 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002492#define SetDictInt(string,ch) \
2493 do { \
2494 PyObject *o = PyLong_FromLong((long) (ch)); \
2495 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2496 Py_DECREF(o); \
2497 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002498 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002499
Victor Stinner26486ea2010-05-15 22:23:53 +00002500 /* Here are some graphic symbols you can use */
2501 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2502 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2503 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2504 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2505 SetDictInt("ACS_LTEE", (ACS_LTEE));
2506 SetDictInt("ACS_RTEE", (ACS_RTEE));
2507 SetDictInt("ACS_BTEE", (ACS_BTEE));
2508 SetDictInt("ACS_TTEE", (ACS_TTEE));
2509 SetDictInt("ACS_HLINE", (ACS_HLINE));
2510 SetDictInt("ACS_VLINE", (ACS_VLINE));
2511 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002512#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002513 /* On HP/UX 11, these are of type cchar_t, which is not an
2514 integral type. If this is a problem on more platforms, a
2515 configure test should be added to determine whether ACS_S1
2516 is of integral type. */
2517 SetDictInt("ACS_S1", (ACS_S1));
2518 SetDictInt("ACS_S9", (ACS_S9));
2519 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2520 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2521 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2522 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2523 SetDictInt("ACS_BULLET", (ACS_BULLET));
2524 SetDictInt("ACS_LARROW", (ACS_LARROW));
2525 SetDictInt("ACS_RARROW", (ACS_RARROW));
2526 SetDictInt("ACS_DARROW", (ACS_DARROW));
2527 SetDictInt("ACS_UARROW", (ACS_UARROW));
2528 SetDictInt("ACS_BOARD", (ACS_BOARD));
2529 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2530 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002531#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002532 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2533 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2534 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2535 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2536 SetDictInt("ACS_SBSS", (ACS_RTEE));
2537 SetDictInt("ACS_SSSB", (ACS_LTEE));
2538 SetDictInt("ACS_SSBS", (ACS_BTEE));
2539 SetDictInt("ACS_BSSS", (ACS_TTEE));
2540 SetDictInt("ACS_BSBS", (ACS_HLINE));
2541 SetDictInt("ACS_SBSB", (ACS_VLINE));
2542 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002543
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002545#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002546 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002547#endif
2548#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002549 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002550#endif
2551#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002552 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002553#endif
2554#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002555 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002556#endif
2557#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002558 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002559#endif
2560#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002561 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002562#endif
2563#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002564 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002565#endif
2566
Victor Stinner26486ea2010-05-15 22:23:53 +00002567 SetDictInt("LINES", LINES);
2568 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002569
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002570 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2571 screen_encoding = winobj->encoding;
2572 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002573}
2574
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002575static PyObject *
2576PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2577{
Victor Stinner26486ea2010-05-15 22:23:53 +00002578 int fd = -1;
2579 int err;
2580 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002581
Victor Stinner26486ea2010-05-15 22:23:53 +00002582 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002583
Victor Stinner26486ea2010-05-15 22:23:53 +00002584 if (!PyArg_ParseTupleAndKeywords(
2585 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2586 return NULL;
2587 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002588
Victor Stinner26486ea2010-05-15 22:23:53 +00002589 if (fd == -1) {
2590 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002591
Victor Stinnerbd303c12013-11-07 23:07:29 +01002592 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002593
Victor Stinner26486ea2010-05-15 22:23:53 +00002594 if (sys_stdout == NULL || sys_stdout == Py_None) {
2595 PyErr_SetString(
2596 PyCursesError,
2597 "lost sys.stdout");
2598 return NULL;
2599 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002600
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002602
Victor Stinner26486ea2010-05-15 22:23:53 +00002603 if (fd == -1) {
2604 return NULL;
2605 }
2606 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002607
Matthias Klose635edd12010-07-30 21:40:57 +00002608 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 if (err == 0) {
2612 s = "setupterm: could not find terminal";
2613 } else if (err == -1) {
2614 s = "setupterm: could not find terminfo database";
2615 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002616
Victor Stinner26486ea2010-05-15 22:23:53 +00002617 PyErr_SetString(PyCursesError,s);
2618 return NULL;
2619 }
2620
2621 initialised_setupterm = TRUE;
2622
2623 Py_INCREF(Py_None);
2624 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002625}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002626
2627static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002628PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002629{
Victor Stinner26486ea2010-05-15 22:23:53 +00002630 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002631
Victor Stinner26486ea2010-05-15 22:23:53 +00002632 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002633
Victor Stinner26486ea2010-05-15 22:23:53 +00002634 switch(PyTuple_Size(args)) {
2635 case 1:
2636 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2637 break;
2638 default:
2639 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2640 return NULL;
2641 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002642
Victor Stinner26486ea2010-05-15 22:23:53 +00002643 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002644}
2645
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002646#ifdef HAVE_CURSES_IS_TERM_RESIZED
2647static PyObject *
2648PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2649{
Victor Stinner26486ea2010-05-15 22:23:53 +00002650 int lines;
2651 int columns;
2652 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002653
Victor Stinner26486ea2010-05-15 22:23:53 +00002654 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002655
Victor Stinner26486ea2010-05-15 22:23:53 +00002656 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2657 return NULL;
2658 result = is_term_resized(lines, columns);
2659 if (result == TRUE) {
2660 Py_INCREF(Py_True);
2661 return Py_True;
2662 } else {
2663 Py_INCREF(Py_False);
2664 return Py_False;
2665 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002666}
2667#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2668
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002669#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002670static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002671PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002672{
Victor Stinner26486ea2010-05-15 22:23:53 +00002673 const char *knp;
2674 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002675
Victor Stinner26486ea2010-05-15 22:23:53 +00002676 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002677
Victor Stinner26486ea2010-05-15 22:23:53 +00002678 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002679
Victor Stinner26486ea2010-05-15 22:23:53 +00002680 if (ch < 0) {
2681 PyErr_SetString(PyExc_ValueError, "invalid key number");
2682 return NULL;
2683 }
2684 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002685
Victor Stinner26486ea2010-05-15 22:23:53 +00002686 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002688#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002689
Victor Stinner26486ea2010-05-15 22:23:53 +00002690static PyObject *
2691PyCurses_KillChar(PyObject *self)
2692{
2693 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002696
Victor Stinner26486ea2010-05-15 22:23:53 +00002697 return PyBytes_FromStringAndSize(&ch, 1);
2698}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002699
2700static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002701PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002702{
Victor Stinner26486ea2010-05-15 22:23:53 +00002703 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002704
Victor Stinner26486ea2010-05-15 22:23:53 +00002705 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002706
Victor Stinner26486ea2010-05-15 22:23:53 +00002707 switch(PyTuple_Size(args)) {
2708 case 1:
2709 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2710 break;
2711 default:
2712 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2713 return NULL;
2714 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002715
Victor Stinner26486ea2010-05-15 22:23:53 +00002716 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002717}
2718
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002719#ifdef NCURSES_MOUSE_VERSION
2720static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002721PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002722{
Victor Stinner26486ea2010-05-15 22:23:53 +00002723 int interval;
2724 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002725
Victor Stinner26486ea2010-05-15 22:23:53 +00002726 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2727 return NULL;
2728 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002729}
2730
2731static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002732PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002733{
Victor Stinner26486ea2010-05-15 22:23:53 +00002734 int newmask;
2735 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002736
Victor Stinner26486ea2010-05-15 22:23:53 +00002737 PyCursesInitialised;
2738 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2739 return NULL;
2740 availmask = mousemask(newmask, &oldmask);
2741 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002742}
2743#endif
2744
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002745static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002746PyCurses_Napms(PyObject *self, PyObject *args)
2747{
2748 int ms;
2749
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002750 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002751 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002752
2753 return Py_BuildValue("i", napms(ms));
2754}
2755
2756
2757static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002758PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002759{
Victor Stinner26486ea2010-05-15 22:23:53 +00002760 WINDOW *win;
2761 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002762
Victor Stinner26486ea2010-05-15 22:23:53 +00002763 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002764
Victor Stinner26486ea2010-05-15 22:23:53 +00002765 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002766
Victor Stinner26486ea2010-05-15 22:23:53 +00002767 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002768
Victor Stinner26486ea2010-05-15 22:23:53 +00002769 if (win == NULL) {
2770 PyErr_SetString(PyCursesError, catchall_NULL);
2771 return NULL;
2772 }
2773
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002774 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002775}
2776
2777static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002778PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002779{
Victor Stinner26486ea2010-05-15 22:23:53 +00002780 WINDOW *win;
2781 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002782
Victor Stinner26486ea2010-05-15 22:23:53 +00002783 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002784
Victor Stinner26486ea2010-05-15 22:23:53 +00002785 switch (PyTuple_Size(args)) {
2786 case 2:
2787 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2788 return NULL;
2789 break;
2790 case 4:
2791 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2792 &nlines,&ncols,&begin_y,&begin_x))
2793 return NULL;
2794 break;
2795 default:
2796 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2797 return NULL;
2798 }
Guido van Rossum85738471995-02-17 13:50:17 +00002799
Victor Stinner26486ea2010-05-15 22:23:53 +00002800 win = newwin(nlines,ncols,begin_y,begin_x);
2801 if (win == NULL) {
2802 PyErr_SetString(PyCursesError, catchall_NULL);
2803 return NULL;
2804 }
Guido van Rossum85738471995-02-17 13:50:17 +00002805
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002806 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002807}
2808
2809static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002810PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002811{
Victor Stinner26486ea2010-05-15 22:23:53 +00002812 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002813
Victor Stinner26486ea2010-05-15 22:23:53 +00002814 PyCursesInitialised;
2815 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002816
Victor Stinner26486ea2010-05-15 22:23:53 +00002817 switch(PyTuple_Size(args)) {
2818 case 1:
2819 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2820 break;
2821 default:
2822 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2823 return NULL;
2824 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002825
Victor Stinner26486ea2010-05-15 22:23:53 +00002826 if (pair_content(pair, &f, &b)==ERR) {
2827 PyErr_SetString(PyCursesError,
2828 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2829 return NULL;
2830 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002833}
2834
2835static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002836PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002837{
Victor Stinner26486ea2010-05-15 22:23:53 +00002838 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002839
Victor Stinner26486ea2010-05-15 22:23:53 +00002840 PyCursesInitialised;
2841 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002842
Victor Stinner26486ea2010-05-15 22:23:53 +00002843 switch(PyTuple_Size(args)) {
2844 case 1:
2845 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2846 break;
2847 default:
2848 PyErr_SetString(PyExc_TypeError,
2849 "pair_number requires 1 argument");
2850 return NULL;
2851 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002852
Victor Stinner26486ea2010-05-15 22:23:53 +00002853 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002854}
2855
2856static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002857PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002858{
Victor Stinner26486ea2010-05-15 22:23:53 +00002859 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002861 if (!PyArg_ParseTuple(args,"y;str", &str))
2862 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002863 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002864}
2865
2866static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002867PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002868{
Victor Stinner26486ea2010-05-15 22:23:53 +00002869 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002870
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002872
Victor Stinner26486ea2010-05-15 22:23:53 +00002873 switch(PyTuple_Size(args)) {
2874 case 0:
2875 qiflush();
2876 Py_INCREF(Py_None);
2877 return Py_None;
2878 case 1:
2879 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2880 if (flag) qiflush();
2881 else noqiflush();
2882 Py_INCREF(Py_None);
2883 return Py_None;
2884 default:
2885 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2886 return NULL;
2887 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002888}
2889
Guido van Rossumd8faa362007-04-27 19:54:29 +00002890/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2891 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002892#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002893static int
2894update_lines_cols(void)
2895{
Victor Stinner26486ea2010-05-15 22:23:53 +00002896 PyObject *o;
2897 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002898 _Py_IDENTIFIER(LINES);
2899 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002900
Victor Stinner26486ea2010-05-15 22:23:53 +00002901 if (!m)
2902 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002903
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 o = PyLong_FromLong(LINES);
2905 if (!o) {
2906 Py_DECREF(m);
2907 return 0;
2908 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002909 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002910 Py_DECREF(m);
2911 Py_DECREF(o);
2912 return 0;
2913 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002914 /* PyId_LINES.object will be initialized here. */
2915 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002916 Py_DECREF(m);
2917 Py_DECREF(o);
2918 return 0;
2919 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002920 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002921 o = PyLong_FromLong(COLS);
2922 if (!o) {
2923 Py_DECREF(m);
2924 return 0;
2925 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002926 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002927 Py_DECREF(m);
2928 Py_DECREF(o);
2929 return 0;
2930 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002931 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002932 Py_DECREF(m);
2933 Py_DECREF(o);
2934 return 0;
2935 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002936 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002937 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002939}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002940#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002941
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002942#ifdef HAVE_CURSES_RESIZETERM
2943static PyObject *
2944PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2945{
Victor Stinner26486ea2010-05-15 22:23:53 +00002946 int lines;
2947 int columns;
2948 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002949
Victor Stinner26486ea2010-05-15 22:23:53 +00002950 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002951
Victor Stinner26486ea2010-05-15 22:23:53 +00002952 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2953 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002954
Victor Stinner26486ea2010-05-15 22:23:53 +00002955 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2956 if (!result)
2957 return NULL;
2958 if (!update_lines_cols())
2959 return NULL;
2960 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002961}
2962
2963#endif
2964
2965#ifdef HAVE_CURSES_RESIZE_TERM
2966static PyObject *
2967PyCurses_Resize_Term(PyObject *self, PyObject *args)
2968{
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 int lines;
2970 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002971
Victor Stinner26486ea2010-05-15 22:23:53 +00002972 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002973
Victor Stinner26486ea2010-05-15 22:23:53 +00002974 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002975
Victor Stinner26486ea2010-05-15 22:23:53 +00002976 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2977 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002978
Victor Stinner26486ea2010-05-15 22:23:53 +00002979 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2980 if (!result)
2981 return NULL;
2982 if (!update_lines_cols())
2983 return NULL;
2984 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002985}
2986#endif /* HAVE_CURSES_RESIZE_TERM */
2987
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002988static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002989PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002990{
Victor Stinner26486ea2010-05-15 22:23:53 +00002991 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002994
Victor Stinner26486ea2010-05-15 22:23:53 +00002995 if (PyTuple_Size(args)!=2) {
2996 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2997 return NULL;
2998 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002999
Victor Stinner26486ea2010-05-15 22:23:53 +00003000 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003001
Victor Stinner26486ea2010-05-15 22:23:53 +00003002 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003003
Victor Stinner26486ea2010-05-15 22:23:53 +00003004 Py_INCREF(Py_None);
3005 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003006}
3007
3008static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00003009PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003010{
Victor Stinner26486ea2010-05-15 22:23:53 +00003011 int code;
3012 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003013
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003015
Victor Stinner26486ea2010-05-15 22:23:53 +00003016 code = start_color();
3017 if (code != ERR) {
3018 initialisedcolors = TRUE;
3019 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003020 if (c == NULL)
3021 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003022 PyDict_SetItemString(ModDict, "COLORS", c);
3023 Py_DECREF(c);
3024 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003025 if (cp == NULL)
3026 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003027 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3028 Py_DECREF(cp);
3029 Py_INCREF(Py_None);
3030 return Py_None;
3031 } else {
3032 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3033 return NULL;
3034 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003035}
3036
3037static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003038PyCurses_tigetflag(PyObject *self, PyObject *args)
3039{
Victor Stinner26486ea2010-05-15 22:23:53 +00003040 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003041
Victor Stinner26486ea2010-05-15 22:23:53 +00003042 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003043
Victor Stinner26486ea2010-05-15 22:23:53 +00003044 if (!PyArg_ParseTuple(args, "s", &capname))
3045 return NULL;
3046
3047 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003048}
3049
3050static PyObject *
3051PyCurses_tigetnum(PyObject *self, PyObject *args)
3052{
Victor Stinner26486ea2010-05-15 22:23:53 +00003053 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003054
Victor Stinner26486ea2010-05-15 22:23:53 +00003055 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003056
Victor Stinner26486ea2010-05-15 22:23:53 +00003057 if (!PyArg_ParseTuple(args, "s", &capname))
3058 return NULL;
3059
3060 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003061}
3062
3063static PyObject *
3064PyCurses_tigetstr(PyObject *self, PyObject *args)
3065{
Victor Stinner26486ea2010-05-15 22:23:53 +00003066 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003067
Victor Stinner26486ea2010-05-15 22:23:53 +00003068 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003069
Victor Stinner26486ea2010-05-15 22:23:53 +00003070 if (!PyArg_ParseTuple(args, "s", &capname))
3071 return NULL;
3072
3073 capname = tigetstr( capname );
3074 if (capname == 0 || capname == (char*) -1) {
3075 Py_INCREF(Py_None);
3076 return Py_None;
3077 }
3078 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003079}
3080
3081static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003082PyCurses_tparm(PyObject *self, PyObject *args)
3083{
Victor Stinner26486ea2010-05-15 22:23:53 +00003084 char* fmt;
3085 char* result = NULL;
3086 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 +00003087
Victor Stinner26486ea2010-05-15 22:23:53 +00003088 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003089
Victor Stinner26621332011-11-02 23:45:29 +01003090 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003091 &fmt, &i1, &i2, &i3, &i4,
3092 &i5, &i6, &i7, &i8, &i9)) {
3093 return NULL;
3094 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003095
Victor Stinner26486ea2010-05-15 22:23:53 +00003096 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3097 if (!result) {
3098 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3099 return NULL;
3100 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003101
Victor Stinner26486ea2010-05-15 22:23:53 +00003102 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003103}
3104
3105static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003106PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003107{
Victor Stinner26486ea2010-05-15 22:23:53 +00003108 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003109
Victor Stinner26486ea2010-05-15 22:23:53 +00003110 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003111
Victor Stinner26486ea2010-05-15 22:23:53 +00003112 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003113
Victor Stinner26486ea2010-05-15 22:23:53 +00003114 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003115}
3116
3117static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003118PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003119{
Victor Stinner26486ea2010-05-15 22:23:53 +00003120 PyObject *temp;
3121 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003122
Victor Stinner26486ea2010-05-15 22:23:53 +00003123 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003124
Victor Stinner26486ea2010-05-15 22:23:53 +00003125 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003126
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003127 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003128 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003129
Victor Stinner26486ea2010-05-15 22:23:53 +00003130 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003131}
3132
3133static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003134PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003135{
Victor Stinner26486ea2010-05-15 22:23:53 +00003136 PyObject *temp;
3137 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003138
Victor Stinner26486ea2010-05-15 22:23:53 +00003139 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003140
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003141 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003142 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003143
3144 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3145 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003146
Victor Stinner26486ea2010-05-15 22:23:53 +00003147 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003148}
3149
Victor Stinner71e44cb2011-09-06 01:53:03 +02003150#ifdef HAVE_NCURSESW
3151/* Convert an object to a character (wchar_t):
3152
3153 - int
3154 - str of length 1
3155
3156 Return 1 on success, 0 on error. */
3157static int
3158PyCurses_ConvertToWchar_t(PyObject *obj,
3159 wchar_t *wch)
3160{
3161 if (PyUnicode_Check(obj)) {
3162 wchar_t buffer[2];
3163 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3164 PyErr_Format(PyExc_TypeError,
3165 "expect bytes or str of length 1, or int, "
3166 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003167 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003168 return 0;
3169 }
3170 *wch = buffer[0];
3171 return 2;
3172 }
3173 else if (PyLong_CheckExact(obj)) {
3174 long value;
3175 int overflow;
3176 value = PyLong_AsLongAndOverflow(obj, &overflow);
3177 if (overflow) {
3178 PyErr_SetString(PyExc_OverflowError,
3179 "int doesn't fit in long");
3180 return 0;
3181 }
3182 *wch = (wchar_t)value;
3183 if ((long)*wch != value) {
3184 PyErr_Format(PyExc_OverflowError,
3185 "character doesn't fit in wchar_t");
3186 return 0;
3187 }
3188 return 1;
3189 }
3190 else {
3191 PyErr_Format(PyExc_TypeError,
3192 "expect bytes or str of length 1, or int, got %s",
3193 Py_TYPE(obj)->tp_name);
3194 return 0;
3195 }
3196}
3197
3198static PyObject *
3199PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3200{
3201 PyObject *obj;
3202 wchar_t wch;
3203
3204 PyCursesInitialised;
3205
3206 if (!PyArg_ParseTuple(args,"O", &obj))
3207 return NULL;
3208
3209 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3210 return NULL;
3211 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3212}
3213#endif
3214
Guido van Rossumf6971e21994-08-30 12:25:20 +00003215static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003216PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003217{
Victor Stinner26486ea2010-05-15 22:23:53 +00003218 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003219
Victor Stinner26486ea2010-05-15 22:23:53 +00003220 switch(PyTuple_Size(args)) {
3221 case 1:
3222 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3223 return NULL;
3224 break;
3225 default:
3226 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3227 return NULL;
3228 }
3229 use_env(flag);
3230 Py_INCREF(Py_None);
3231 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003232}
3233
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003234#ifndef STRICT_SYSV_CURSES
3235static PyObject *
3236PyCurses_Use_Default_Colors(PyObject *self)
3237{
Victor Stinner26486ea2010-05-15 22:23:53 +00003238 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003239
Victor Stinner26486ea2010-05-15 22:23:53 +00003240 PyCursesInitialised;
3241 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003242
Victor Stinner26486ea2010-05-15 22:23:53 +00003243 code = use_default_colors();
3244 if (code != ERR) {
3245 Py_INCREF(Py_None);
3246 return Py_None;
3247 } else {
3248 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3249 return NULL;
3250 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003251}
3252#endif /* STRICT_SYSV_CURSES */
3253
Guido van Rossumf6971e21994-08-30 12:25:20 +00003254/* List of functions defined in the module */
3255
3256static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003257 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3258 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3259 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3260 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3261 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3262 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3263 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3264 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3265 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3266 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3267 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3268 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3269 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3270 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3271 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3272 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3273 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003274#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003275 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3276 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003277#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003278 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3279 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3280 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3281 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3282 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003283#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003284 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003285#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3287 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3288 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3289 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3290 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3291 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003292#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003293 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003294#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003295#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003296 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003297#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003298 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3299 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3300 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003301#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003302 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3303 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003304#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003305 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3306 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3307 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3308 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3309 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3310 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3311 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3312 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3313 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3314 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3315 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3316 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3317 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3318 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3319 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3320 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3321 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003322#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003323 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003324#endif
3325#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003326 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003327#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003328 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3329 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3330 {"setupterm", (PyCFunction)PyCurses_setupterm,
3331 METH_VARARGS|METH_KEYWORDS},
3332 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3333 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3334 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3335 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3336 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3337 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3338 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3339 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3340 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3341 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003342#ifdef HAVE_NCURSESW
3343 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3344#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003345 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003346#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003347 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003348#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003349 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003350};
3351
3352/* Initialization function for the module */
3353
Martin v. Löwis1a214512008-06-11 05:26:20 +00003354
3355static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003356 PyModuleDef_HEAD_INIT,
3357 "_curses",
3358 NULL,
3359 -1,
3360 PyCurses_methods,
3361 NULL,
3362 NULL,
3363 NULL,
3364 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003365};
3366
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003367PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003368PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003369{
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 PyObject *m, *d, *v, *c_api_object;
3371 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003372
Victor Stinner26486ea2010-05-15 22:23:53 +00003373 /* Initialize object type */
3374 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3375 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003376
Victor Stinner26486ea2010-05-15 22:23:53 +00003377 /* Initialize the C API pointer array */
3378 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3379 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3380 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3381 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003382
Victor Stinner26486ea2010-05-15 22:23:53 +00003383 /* Create the module and add the functions */
3384 m = PyModule_Create(&_cursesmodule);
3385 if (m == NULL)
3386 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003387
Victor Stinner26486ea2010-05-15 22:23:53 +00003388 /* Add some symbolic constants to the module */
3389 d = PyModule_GetDict(m);
3390 if (d == NULL)
3391 return NULL;
3392 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003393
Victor Stinner26486ea2010-05-15 22:23:53 +00003394 /* Add a capsule for the C API */
3395 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3396 PyDict_SetItemString(d, "_C_API", c_api_object);
3397 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003398
Victor Stinner26486ea2010-05-15 22:23:53 +00003399 /* For exception curses.error */
3400 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3401 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003402
Victor Stinner26486ea2010-05-15 22:23:53 +00003403 /* Make the version available */
3404 v = PyBytes_FromString(PyCursesVersion);
3405 PyDict_SetItemString(d, "version", v);
3406 PyDict_SetItemString(d, "__version__", v);
3407 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003408
Victor Stinner26486ea2010-05-15 22:23:53 +00003409 SetDictInt("ERR", ERR);
3410 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003411
Victor Stinner26486ea2010-05-15 22:23:53 +00003412 /* Here are some attributes you can add to chars to print */
3413
3414 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3415 SetDictInt("A_NORMAL", A_NORMAL);
3416 SetDictInt("A_STANDOUT", A_STANDOUT);
3417 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3418 SetDictInt("A_REVERSE", A_REVERSE);
3419 SetDictInt("A_BLINK", A_BLINK);
3420 SetDictInt("A_DIM", A_DIM);
3421 SetDictInt("A_BOLD", A_BOLD);
3422 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003423#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003424 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003425#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003426 SetDictInt("A_PROTECT", A_PROTECT);
3427 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3428 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003429
Victor Stinner26486ea2010-05-15 22:23:53 +00003430 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003431#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003433#endif
3434#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003435 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003436#endif
3437#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003438 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003439#endif
3440#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003441 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003442#endif
3443#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003444 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003445#endif
3446#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003447 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003448#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003449
Victor Stinner26486ea2010-05-15 22:23:53 +00003450 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3451 SetDictInt("COLOR_RED", COLOR_RED);
3452 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3453 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3454 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3455 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3456 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3457 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003458
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003459#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003460 /* Mouse-related constants */
3461 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3462 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3463 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3464 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3465 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003466
Victor Stinner26486ea2010-05-15 22:23:53 +00003467 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3468 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3469 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3470 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3471 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003472
Victor Stinner26486ea2010-05-15 22:23:53 +00003473 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3474 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3475 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3476 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3477 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003478
Victor Stinner26486ea2010-05-15 22:23:53 +00003479 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3480 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3481 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3482 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3483 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003484
Victor Stinner26486ea2010-05-15 22:23:53 +00003485 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3486 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3487 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003488
Victor Stinner26486ea2010-05-15 22:23:53 +00003489 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3490 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003491#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003492 /* Now set everything up for KEY_ variables */
3493 {
3494 int key;
3495 char *key_n;
3496 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003497#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003498 for (key=KEY_MIN;key < KEY_MAX; key++) {
3499 key_n = (char *)keyname(key);
3500 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3501 continue;
3502 if (strncmp(key_n,"KEY_F(",6)==0) {
3503 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003504 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003505 if (!key_n2) {
3506 PyErr_NoMemory();
3507 break;
3508 }
3509 p1 = key_n;
3510 p2 = key_n2;
3511 while (*p1) {
3512 if (*p1 != '(' && *p1 != ')') {
3513 *p2 = *p1;
3514 p2++;
3515 }
3516 p1++;
3517 }
3518 *p2 = (char)0;
3519 } else
3520 key_n2 = key_n;
3521 SetDictInt(key_n2,key);
3522 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003523 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003524 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003525#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003526 SetDictInt("KEY_MIN", KEY_MIN);
3527 SetDictInt("KEY_MAX", KEY_MAX);
3528 }
3529 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003530}