blob: 501ec91869d90fb01f08254a8184762c500bf2a7 [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;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001459 if (n < 0) {
1460 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1461 return NULL;
1462 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001463 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001464 break;
1465 case 2:
1466 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1467 return NULL;
1468 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1469 break;
1470 case 3:
1471 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1472 return NULL;
Benjamin Peterson432ea4f2016-08-15 21:40:14 -07001473 if (n < 0) {
1474 PyErr_SetString(PyExc_ValueError, "'n' must be nonnegative");
1475 return NULL;
1476 }
Victor Stinner640c35c2013-06-04 23:14:37 +02001477 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001478 break;
1479 default:
1480 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1481 return NULL;
1482 }
1483 if (rtn2 == ERR)
1484 rtn[0] = 0;
1485 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001486}
1487
1488static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001489PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001490{
Victor Stinner26486ea2010-05-15 22:23:53 +00001491 int rtn;
1492 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001493 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001494 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001495#ifdef HAVE_NCURSESW
1496 wchar_t *wstr = NULL;
1497#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001498 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1499 long lattr;
1500 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001501 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001502
Victor Stinner26486ea2010-05-15 22:23:53 +00001503 switch (PyTuple_Size(args)) {
1504 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001505 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001506 return NULL;
1507 break;
1508 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001509 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001510 return NULL;
1511 attr = lattr;
1512 use_attr = TRUE;
1513 break;
1514 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001515 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001516 return NULL;
1517 use_xy = TRUE;
1518 break;
1519 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001520 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001521 return NULL;
1522 attr = lattr;
1523 use_xy = use_attr = TRUE;
1524 break;
1525 default:
1526 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1527 return NULL;
1528 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001529
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001530#ifdef HAVE_NCURSESW
1531 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1532#else
1533 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1534#endif
1535 if (strtype == 0)
1536 return NULL;
1537
Victor Stinner26486ea2010-05-15 22:23:53 +00001538 if (use_attr == TRUE) {
1539 attr_old = getattrs(self->win);
1540 (void)wattrset(self->win,attr);
1541 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001542#ifdef HAVE_NCURSESW
1543 if (strtype == 2) {
1544 funcname = "inswstr";
1545 if (use_xy == TRUE)
1546 rtn = mvwins_wstr(self->win,y,x,wstr);
1547 else
1548 rtn = wins_wstr(self->win,wstr);
1549 PyMem_Free(wstr);
1550 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001551 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001552#endif
1553 {
1554 char *str = PyBytes_AS_STRING(bytesobj);
1555 funcname = "insstr";
1556 if (use_xy == TRUE)
1557 rtn = mvwinsstr(self->win,y,x,str);
1558 else
1559 rtn = winsstr(self->win,str);
1560 Py_DECREF(bytesobj);
1561 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001562 if (use_attr == TRUE)
1563 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001564 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001565}
1566
1567static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001568PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001569{
Victor Stinner26486ea2010-05-15 22:23:53 +00001570 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001571 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001572 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001573#ifdef HAVE_NCURSESW
1574 wchar_t *wstr = NULL;
1575#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001576 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1577 long lattr;
1578 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001579 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001580
Victor Stinner26486ea2010-05-15 22:23:53 +00001581 switch (PyTuple_Size(args)) {
1582 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001583 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001584 return NULL;
1585 break;
1586 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001587 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001588 return NULL;
1589 attr = lattr;
1590 use_attr = TRUE;
1591 break;
1592 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001593 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001594 return NULL;
1595 use_xy = TRUE;
1596 break;
1597 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001598 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001599 return NULL;
1600 attr = lattr;
1601 use_xy = use_attr = TRUE;
1602 break;
1603 default:
1604 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1605 return NULL;
1606 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001607
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001608#ifdef HAVE_NCURSESW
1609 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1610#else
1611 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1612#endif
1613 if (strtype == 0)
1614 return NULL;
1615
Victor Stinner26486ea2010-05-15 22:23:53 +00001616 if (use_attr == TRUE) {
1617 attr_old = getattrs(self->win);
1618 (void)wattrset(self->win,attr);
1619 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001620#ifdef HAVE_NCURSESW
1621 if (strtype == 2) {
1622 funcname = "insn_wstr";
1623 if (use_xy == TRUE)
1624 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1625 else
1626 rtn = wins_nwstr(self->win,wstr,n);
1627 PyMem_Free(wstr);
1628 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001629 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001630#endif
1631 {
1632 char *str = PyBytes_AS_STRING(bytesobj);
1633 funcname = "insnstr";
1634 if (use_xy == TRUE)
1635 rtn = mvwinsnstr(self->win,y,x,str,n);
1636 else
1637 rtn = winsnstr(self->win,str,n);
1638 Py_DECREF(bytesobj);
1639 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001640 if (use_attr == TRUE)
1641 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001642 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001643}
1644
1645static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001646PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001647{
Victor Stinner26486ea2010-05-15 22:23:53 +00001648 int line, erg;
1649 if (!PyArg_ParseTuple(args,"i;line", &line))
1650 return NULL;
1651 erg = is_linetouched(self->win, line);
1652 if (erg == ERR) {
1653 PyErr_SetString(PyExc_TypeError,
1654 "is_linetouched: line number outside of boundaries");
1655 return NULL;
1656 } else
1657 if (erg == FALSE) {
1658 Py_INCREF(Py_False);
1659 return Py_False;
1660 } else {
1661 Py_INCREF(Py_True);
1662 return Py_True;
1663 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001664}
1665
1666static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001667PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001668{
Victor Stinner26486ea2010-05-15 22:23:53 +00001669 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1670 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001671
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001672#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001673 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001674#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001675 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001676#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001677 {
1678 switch(PyTuple_Size(args)) {
1679 case 6:
1680 if (!PyArg_ParseTuple(args,
1681 "iiiiii;" \
1682 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1683 &pminrow, &pmincol, &sminrow,
1684 &smincol, &smaxrow, &smaxcol))
1685 return NULL;
1686 Py_BEGIN_ALLOW_THREADS
1687 rtn = pnoutrefresh(self->win,
1688 pminrow, pmincol, sminrow,
1689 smincol, smaxrow, smaxcol);
1690 Py_END_ALLOW_THREADS
1691 return PyCursesCheckERR(rtn, "pnoutrefresh");
1692 default:
1693 PyErr_SetString(PyCursesError,
1694 "noutrefresh() called for a pad "
1695 "requires 6 arguments");
1696 return NULL;
1697 }
1698 } else {
1699 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1700 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001701
Victor Stinner26486ea2010-05-15 22:23:53 +00001702 Py_BEGIN_ALLOW_THREADS
1703 rtn = wnoutrefresh(self->win);
1704 Py_END_ALLOW_THREADS
1705 return PyCursesCheckERR(rtn, "wnoutrefresh");
1706 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001707}
1708
1709static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001710PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1711{
1712 PyCursesWindowObject *temp;
1713 int use_copywin = FALSE;
1714 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1715 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001716
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001717 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001718 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001719 if (!PyArg_ParseTuple(args, "O!;window object",
1720 &PyCursesWindow_Type, &temp))
1721 return NULL;
1722 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001723 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001724 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1725 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1726 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1727 return NULL;
1728 use_copywin = TRUE;
1729 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001730 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001731 PyErr_SetString(PyExc_TypeError,
1732 "overlay requires one or seven arguments");
1733 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001734 }
1735
1736 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001737 rtn = copywin(self->win, temp->win, sminrow, smincol,
1738 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1739 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001740 }
1741 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001742 rtn = overlay(self->win, temp->win);
1743 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001744 }
1745}
1746
1747static PyObject *
1748PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1749{
1750 PyCursesWindowObject *temp;
1751 int use_copywin = FALSE;
1752 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1753 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001754
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001755 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001756 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001757 if (!PyArg_ParseTuple(args, "O!;window object",
1758 &PyCursesWindow_Type, &temp))
1759 return NULL;
1760 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001761 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001762 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1763 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1764 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1765 return NULL;
1766 use_copywin = TRUE;
1767 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001768 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001769 PyErr_SetString(PyExc_TypeError,
1770 "overwrite requires one or seven arguments");
1771 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001772 }
1773
1774 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001775 rtn = copywin(self->win, temp->win, sminrow, smincol,
1776 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001777 return PyCursesCheckERR(rtn, "copywin");
1778 }
1779 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001780 rtn = overwrite(self->win, temp->win);
1781 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001782 }
1783}
1784
1785static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001786PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001787{
Victor Stinner26486ea2010-05-15 22:23:53 +00001788 /* We have to simulate this by writing to a temporary FILE*,
1789 then reading back, then writing to the argument stream. */
1790 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001791 int fd = -1;
1792 FILE *fp = NULL;
1793 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001794
Victor Stinner26486ea2010-05-15 22:23:53 +00001795 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1796 fd = mkstemp(fn);
1797 if (fd < 0)
1798 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001799 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1800 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001801 fp = fdopen(fd, "wb+");
1802 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001803 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1804 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001805 }
1806 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001807 if (res == NULL)
1808 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001809 fseek(fp, 0, 0);
1810 while (1) {
1811 char buf[BUFSIZ];
1812 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001813 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001814
Victor Stinner26486ea2010-05-15 22:23:53 +00001815 if (n <= 0)
1816 break;
1817 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001818 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001819 if (res == NULL)
1820 break;
1821 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001822
1823exit:
1824 if (fp != NULL)
1825 fclose(fp);
1826 else if (fd != -1)
1827 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001828 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001829 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001830}
1831
1832static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001833PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001834{
Victor Stinner26486ea2010-05-15 22:23:53 +00001835 int beg, num;
1836 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1837 return NULL;
1838 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001839}
1840
1841static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001842PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001843{
Victor Stinner26486ea2010-05-15 22:23:53 +00001844 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1845 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001846
Victor Stinner26486ea2010-05-15 22:23:53 +00001847#ifndef WINDOW_HAS_FLAGS
1848 if (0)
1849#else
1850 if (self->win->_flags & _ISPAD)
1851#endif
1852 {
1853 switch(PyTuple_Size(args)) {
1854 case 6:
1855 if (!PyArg_ParseTuple(args,
1856 "iiiiii;" \
1857 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1858 &pminrow, &pmincol, &sminrow,
1859 &smincol, &smaxrow, &smaxcol))
1860 return NULL;
1861
1862 Py_BEGIN_ALLOW_THREADS
1863 rtn = prefresh(self->win,
1864 pminrow, pmincol, sminrow,
1865 smincol, smaxrow, smaxcol);
1866 Py_END_ALLOW_THREADS
1867 return PyCursesCheckERR(rtn, "prefresh");
1868 default:
1869 PyErr_SetString(PyCursesError,
1870 "refresh() for a pad requires 6 arguments");
1871 return NULL;
1872 }
1873 } else {
1874 if (!PyArg_ParseTuple(args, ":refresh"))
1875 return NULL;
1876 Py_BEGIN_ALLOW_THREADS
1877 rtn = wrefresh(self->win);
1878 Py_END_ALLOW_THREADS
1879 return PyCursesCheckERR(rtn, "prefresh");
1880 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001881}
1882
1883static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001884PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001885{
Victor Stinner26486ea2010-05-15 22:23:53 +00001886 int x, y;
1887 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1888 return NULL;
1889 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001890}
1891
1892static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001893PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001894{
Victor Stinner26486ea2010-05-15 22:23:53 +00001895 WINDOW *win;
1896 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001897
Victor Stinner26486ea2010-05-15 22:23:53 +00001898 nlines = 0;
1899 ncols = 0;
1900 switch (PyTuple_Size(args)) {
1901 case 2:
1902 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1903 return NULL;
1904 break;
1905 case 4:
1906 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1907 &nlines,&ncols,&begin_y,&begin_x))
1908 return NULL;
1909 break;
1910 default:
1911 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1912 return NULL;
1913 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001914
Victor Stinner26486ea2010-05-15 22:23:53 +00001915 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001916#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001917 if (self->win->_flags & _ISPAD)
1918 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1919 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001920#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001921 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001922
Victor Stinner26486ea2010-05-15 22:23:53 +00001923 if (win == NULL) {
1924 PyErr_SetString(PyCursesError, catchall_NULL);
1925 return NULL;
1926 }
1927
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001928 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001929}
1930
1931static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001932PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001933{
Victor Stinner26486ea2010-05-15 22:23:53 +00001934 int nlines;
1935 switch(PyTuple_Size(args)) {
1936 case 0:
1937 return PyCursesCheckERR(scroll(self->win), "scroll");
1938 case 1:
1939 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1940 return NULL;
1941 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1942 default:
1943 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1944 return NULL;
1945 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001946}
1947
1948static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001949PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001950{
Victor Stinner26486ea2010-05-15 22:23:53 +00001951 int st, cnt, val;
1952 switch (PyTuple_Size(args)) {
1953 case 2:
1954 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1955 return NULL;
1956 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1957 case 3:
1958 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1959 return NULL;
1960 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1961 default:
1962 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1963 return NULL;
1964 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001965}
1966
1967static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001968PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001969{
Victor Stinner26486ea2010-05-15 22:23:53 +00001970 PyObject *temp;
1971 chtype ch;
1972 int n, x, y, code = OK;
1973 attr_t attr = A_NORMAL;
1974 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001975
Victor Stinner26486ea2010-05-15 22:23:53 +00001976 switch (PyTuple_Size(args)) {
1977 case 2:
1978 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1979 return NULL;
1980 break;
1981 case 3:
1982 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1983 return NULL;
1984 attr = lattr;
1985 break;
1986 case 4:
1987 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1988 return NULL;
1989 code = wmove(self->win, y, x);
1990 break;
1991 case 5:
1992 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1993 &y, &x, &temp, &n, &lattr))
1994 return NULL;
1995 attr = lattr;
1996 code = wmove(self->win, y, x);
1997 break;
1998 default:
1999 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
2000 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002001 }
Victor Stinner26486ea2010-05-15 22:23:53 +00002002
2003 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002004 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00002005 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002006 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
2007 } else
2008 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002009}
2010
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002011static PyObject *
2012PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
2013{
2014 return PyUnicode_FromString(self->encoding);
2015}
2016
2017static int
2018PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
2019{
2020 PyObject *ascii;
2021 char *encoding;
2022
2023 /* It is illegal to del win.encoding */
2024 if (value == NULL) {
2025 PyErr_SetString(PyExc_TypeError,
2026 "encoding may not be deleted");
2027 return -1;
2028 }
2029
2030 if (!PyUnicode_Check(value)) {
2031 PyErr_SetString(PyExc_TypeError,
2032 "setting encoding to a non-string");
2033 return -1;
2034 }
2035 ascii = PyUnicode_AsASCIIString(value);
2036 if (ascii == NULL)
2037 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002038 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002039 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002040 if (encoding == NULL) {
2041 PyErr_NoMemory();
2042 return -1;
2043 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002044 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002045 self->encoding = encoding;
2046 return 0;
2047}
2048
2049
Guido van Rossumf6971e21994-08-30 12:25:20 +00002050static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002051 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002052 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2053 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2054 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2055 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2056 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2057 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2058 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2059 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2060 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2061 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2062 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2063 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2064 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2065 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2066 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2067 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2068 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2069 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2070 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002071#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002072 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002073#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002074 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2075 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2076 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2077 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2078 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002079#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002080 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002081#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002082 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2083 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2084 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2085 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2086 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2087 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2088 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2089 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2090 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2091 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2092 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2093 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2094 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2095 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2096 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2097 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2098 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2099 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2100 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2101 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2102 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2103 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2104 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2105 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2106 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002107 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2108 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2109 METH_VARARGS},
2110 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2111 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2112 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2113 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002114#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002115 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002116#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002117 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2118 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2119 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2120 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2121 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2122 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2123 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2124 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2125 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2126 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2127 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2128 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2129 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2130 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2131 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2132 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002133};
2134
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002135static PyGetSetDef PyCursesWindow_getsets[] = {
2136 {"encoding",
2137 (getter)PyCursesWindow_get_encoding,
2138 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002139 "the typecode character used to create the array"},
2140 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002141};
2142
Guido van Rossumf6971e21994-08-30 12:25:20 +00002143/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002144
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002145PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002146 PyVarObject_HEAD_INIT(NULL, 0)
2147 "_curses.curses window", /*tp_name*/
2148 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2149 0, /*tp_itemsize*/
2150 /* methods */
2151 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2152 0, /*tp_print*/
2153 (getattrfunc)0, /*tp_getattr*/
2154 (setattrfunc)0, /*tp_setattr*/
2155 0, /*tp_reserved*/
2156 0, /*tp_repr*/
2157 0, /*tp_as_number*/
2158 0, /*tp_as_sequence*/
2159 0, /*tp_as_mapping*/
2160 0, /*tp_hash*/
2161 0, /*tp_call*/
2162 0, /*tp_str*/
2163 0, /*tp_getattro*/
2164 0, /*tp_setattro*/
2165 0, /*tp_as_buffer*/
2166 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2167 0, /*tp_doc*/
2168 0, /*tp_traverse*/
2169 0, /*tp_clear*/
2170 0, /*tp_richcompare*/
2171 0, /*tp_weaklistoffset*/
2172 0, /*tp_iter*/
2173 0, /*tp_iternext*/
2174 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002175 0, /* tp_members */
2176 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002177};
2178
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002179/*********************************************************************
2180 Global Functions
2181**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002182
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183NoArgNoReturnFunction(beep)
2184NoArgNoReturnFunction(def_prog_mode)
2185NoArgNoReturnFunction(def_shell_mode)
2186NoArgNoReturnFunction(doupdate)
2187NoArgNoReturnFunction(endwin)
2188NoArgNoReturnFunction(flash)
2189NoArgNoReturnFunction(nocbreak)
2190NoArgNoReturnFunction(noecho)
2191NoArgNoReturnFunction(nonl)
2192NoArgNoReturnFunction(noraw)
2193NoArgNoReturnFunction(reset_prog_mode)
2194NoArgNoReturnFunction(reset_shell_mode)
2195NoArgNoReturnFunction(resetty)
2196NoArgNoReturnFunction(savetty)
2197
2198NoArgOrFlagNoReturnFunction(cbreak)
2199NoArgOrFlagNoReturnFunction(echo)
2200NoArgOrFlagNoReturnFunction(nl)
2201NoArgOrFlagNoReturnFunction(raw)
2202
2203NoArgReturnIntFunction(baudrate)
2204NoArgReturnIntFunction(termattrs)
2205
2206NoArgReturnStringFunction(termname)
2207NoArgReturnStringFunction(longname)
2208
2209NoArgTrueFalseFunction(can_change_color)
2210NoArgTrueFalseFunction(has_colors)
2211NoArgTrueFalseFunction(has_ic)
2212NoArgTrueFalseFunction(has_il)
2213NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214NoArgNoReturnVoidFunction(flushinp)
2215NoArgNoReturnVoidFunction(noqiflush)
2216
2217static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002218PyCurses_filter(PyObject *self)
2219{
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 /* not checking for PyCursesInitialised here since filter() must
2221 be called before initscr() */
2222 filter();
2223 Py_INCREF(Py_None);
2224 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002225}
2226
2227static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002228PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229{
Victor Stinner26486ea2010-05-15 22:23:53 +00002230 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231
Victor Stinner26486ea2010-05-15 22:23:53 +00002232 PyCursesInitialised;
2233 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002236
Victor Stinner26486ea2010-05-15 22:23:53 +00002237 if (color_content(color, &r, &g, &b) != ERR)
2238 return Py_BuildValue("(iii)", r, g, b);
2239 else {
2240 PyErr_SetString(PyCursesError,
2241 "Argument 1 was out of range. Check value of COLORS.");
2242 return NULL;
2243 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244}
2245
2246static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002247PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002248{
Victor Stinner26486ea2010-05-15 22:23:53 +00002249 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 PyCursesInitialised;
2252 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002253
Victor Stinner26486ea2010-05-15 22:23:53 +00002254 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2255 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002256}
2257
2258static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002259PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002260{
Victor Stinner26486ea2010-05-15 22:23:53 +00002261 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002262
Victor Stinner26486ea2010-05-15 22:23:53 +00002263 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002264
Victor Stinner26486ea2010-05-15 22:23:53 +00002265 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002266
Victor Stinner26486ea2010-05-15 22:23:53 +00002267 erg = curs_set(vis);
2268 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002269
Victor Stinner26486ea2010-05-15 22:23:53 +00002270 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271}
2272
2273static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002274PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275{
Victor Stinner26486ea2010-05-15 22:23:53 +00002276 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277
Victor Stinner26486ea2010-05-15 22:23:53 +00002278 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279
Victor Stinner26486ea2010-05-15 22:23:53 +00002280 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002281
Victor Stinner26486ea2010-05-15 22:23:53 +00002282 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283}
2284
2285static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002286PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287{
Victor Stinner26486ea2010-05-15 22:23:53 +00002288 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002289
Victor Stinner26486ea2010-05-15 22:23:53 +00002290 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002291
Victor Stinner26486ea2010-05-15 22:23:53 +00002292 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002293
Victor Stinner26486ea2010-05-15 22:23:53 +00002294 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002295}
2296
2297static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002298PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002299{
Victor Stinner26486ea2010-05-15 22:23:53 +00002300 int x = 0;
2301 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002302
Victor Stinner26486ea2010-05-15 22:23:53 +00002303 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002304
Victor Stinner26486ea2010-05-15 22:23:53 +00002305 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002306
Victor Stinner26486ea2010-05-15 22:23:53 +00002307 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002308}
2309
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002310#ifdef NCURSES_MOUSE_VERSION
2311static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002312PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002313{
Victor Stinner26486ea2010-05-15 22:23:53 +00002314 int rtn;
2315 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002316
Victor Stinner26486ea2010-05-15 22:23:53 +00002317 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002318
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 rtn = getmouse( &event );
2320 if (rtn == ERR) {
2321 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2322 return NULL;
2323 }
2324 return Py_BuildValue("(hiiil)",
2325 (short)event.id,
2326 event.x, event.y, event.z,
2327 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002328}
2329
2330static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002331PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002332{
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002334
Victor Stinner26486ea2010-05-15 22:23:53 +00002335 PyCursesInitialised;
2336 if (!PyArg_ParseTuple(args, "hiiil",
2337 &event.id,
2338 &event.x, &event.y, &event.z,
2339 (int *) &event.bstate))
2340 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002341
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002343}
2344#endif
2345
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002346static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002347PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002348{
Victor Stinner26486ea2010-05-15 22:23:53 +00002349 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002350 int fd = -1;
2351 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002352 PyObject *data;
2353 size_t datalen;
2354 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002355 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002356 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002357
Victor Stinner26486ea2010-05-15 22:23:53 +00002358 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002359
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2361 fd = mkstemp(fn);
2362 if (fd < 0)
2363 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002364 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2365 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002366 fp = fdopen(fd, "wb+");
2367 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002368 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2369 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002370 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002371
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002372 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002373 if (data == NULL)
2374 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002375 if (!PyBytes_Check(data)) {
2376 PyErr_Format(PyExc_TypeError,
2377 "f.read() returned %.100s instead of bytes",
2378 data->ob_type->tp_name);
2379 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002380 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002381 }
2382 datalen = PyBytes_GET_SIZE(data);
2383 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2384 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002385 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2386 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002387 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002388 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002389
Victor Stinner26486ea2010-05-15 22:23:53 +00002390 fseek(fp, 0, 0);
2391 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002392 if (win == NULL) {
2393 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002394 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002395 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002396 res = PyCursesWindow_New(win, NULL);
2397
2398error:
2399 if (fp != NULL)
2400 fclose(fp);
2401 else if (fd != -1)
2402 close(fd);
2403 remove(fn);
2404 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002405}
2406
2407static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002408PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002409{
Victor Stinner26486ea2010-05-15 22:23:53 +00002410 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002411
Victor Stinner26486ea2010-05-15 22:23:53 +00002412 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002413
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002415
Victor Stinner26486ea2010-05-15 22:23:53 +00002416 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002417}
2418
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002419#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002420/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002421static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422{
Victor Stinner26486ea2010-05-15 22:23:53 +00002423 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002424
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002426
Victor Stinner26486ea2010-05-15 22:23:53 +00002427 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002428
Victor Stinner26486ea2010-05-15 22:23:53 +00002429 if (has_key(ch) == FALSE) {
2430 Py_INCREF(Py_False);
2431 return Py_False;
2432 }
2433 Py_INCREF(Py_True);
2434 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002435}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002436#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002437
2438static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002439PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002440{
Victor Stinner26486ea2010-05-15 22:23:53 +00002441 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002442
Victor Stinner26486ea2010-05-15 22:23:53 +00002443 PyCursesInitialised;
2444 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002445
Victor Stinner26486ea2010-05-15 22:23:53 +00002446 switch(PyTuple_Size(args)) {
2447 case 4:
2448 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2449 break;
2450 default:
2451 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2452 return NULL;
2453 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002454
Victor Stinner26486ea2010-05-15 22:23:53 +00002455 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002456}
2457
2458static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002459PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002460{
Victor Stinner26486ea2010-05-15 22:23:53 +00002461 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002462
Victor Stinner26486ea2010-05-15 22:23:53 +00002463 PyCursesInitialised;
2464 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002465
Victor Stinner26486ea2010-05-15 22:23:53 +00002466 if (PyTuple_Size(args) != 3) {
2467 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2468 return NULL;
2469 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002470
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002472
Victor Stinner26486ea2010-05-15 22:23:53 +00002473 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002474}
2475
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002476static PyObject *ModDict;
2477
Victor Stinner26486ea2010-05-15 22:23:53 +00002478static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002479PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002480{
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002482 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002483
Victor Stinner26486ea2010-05-15 22:23:53 +00002484 if (initialised == TRUE) {
2485 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002486 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002487 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002488
Victor Stinner26486ea2010-05-15 22:23:53 +00002489 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002490
Victor Stinner26486ea2010-05-15 22:23:53 +00002491 if (win == NULL) {
2492 PyErr_SetString(PyCursesError, catchall_NULL);
2493 return NULL;
2494 }
Guido van Rossum85738471995-02-17 13:50:17 +00002495
Victor Stinner26486ea2010-05-15 22:23:53 +00002496 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002497
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002498/* This was moved from initcurses() because it core dumped on SGI,
2499 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002500#define SetDictInt(string,ch) \
2501 do { \
2502 PyObject *o = PyLong_FromLong((long) (ch)); \
2503 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2504 Py_DECREF(o); \
2505 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002506 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002507
Victor Stinner26486ea2010-05-15 22:23:53 +00002508 /* Here are some graphic symbols you can use */
2509 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2510 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2511 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2512 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2513 SetDictInt("ACS_LTEE", (ACS_LTEE));
2514 SetDictInt("ACS_RTEE", (ACS_RTEE));
2515 SetDictInt("ACS_BTEE", (ACS_BTEE));
2516 SetDictInt("ACS_TTEE", (ACS_TTEE));
2517 SetDictInt("ACS_HLINE", (ACS_HLINE));
2518 SetDictInt("ACS_VLINE", (ACS_VLINE));
2519 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002520#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002521 /* On HP/UX 11, these are of type cchar_t, which is not an
2522 integral type. If this is a problem on more platforms, a
2523 configure test should be added to determine whether ACS_S1
2524 is of integral type. */
2525 SetDictInt("ACS_S1", (ACS_S1));
2526 SetDictInt("ACS_S9", (ACS_S9));
2527 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2528 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2529 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2530 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2531 SetDictInt("ACS_BULLET", (ACS_BULLET));
2532 SetDictInt("ACS_LARROW", (ACS_LARROW));
2533 SetDictInt("ACS_RARROW", (ACS_RARROW));
2534 SetDictInt("ACS_DARROW", (ACS_DARROW));
2535 SetDictInt("ACS_UARROW", (ACS_UARROW));
2536 SetDictInt("ACS_BOARD", (ACS_BOARD));
2537 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2538 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002539#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002540 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2541 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2542 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2543 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2544 SetDictInt("ACS_SBSS", (ACS_RTEE));
2545 SetDictInt("ACS_SSSB", (ACS_LTEE));
2546 SetDictInt("ACS_SSBS", (ACS_BTEE));
2547 SetDictInt("ACS_BSSS", (ACS_TTEE));
2548 SetDictInt("ACS_BSBS", (ACS_HLINE));
2549 SetDictInt("ACS_SBSB", (ACS_VLINE));
2550 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002551
Victor Stinner26486ea2010-05-15 22:23:53 +00002552 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002553#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002554 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002555#endif
2556#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002558#endif
2559#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002560 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002561#endif
2562#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002563 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002564#endif
2565#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002566 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002567#endif
2568#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002569 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002570#endif
2571#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002572 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002573#endif
2574
Victor Stinner26486ea2010-05-15 22:23:53 +00002575 SetDictInt("LINES", LINES);
2576 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002577
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002578 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2579 screen_encoding = winobj->encoding;
2580 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002581}
2582
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002583static PyObject *
2584PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2585{
Victor Stinner26486ea2010-05-15 22:23:53 +00002586 int fd = -1;
2587 int err;
2588 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002589
Victor Stinner26486ea2010-05-15 22:23:53 +00002590 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002591
Victor Stinner26486ea2010-05-15 22:23:53 +00002592 if (!PyArg_ParseTupleAndKeywords(
2593 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2594 return NULL;
2595 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002596
Victor Stinner26486ea2010-05-15 22:23:53 +00002597 if (fd == -1) {
2598 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002599
Victor Stinnerbd303c12013-11-07 23:07:29 +01002600 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002601
Victor Stinner26486ea2010-05-15 22:23:53 +00002602 if (sys_stdout == NULL || sys_stdout == Py_None) {
2603 PyErr_SetString(
2604 PyCursesError,
2605 "lost sys.stdout");
2606 return NULL;
2607 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002610
Victor Stinner26486ea2010-05-15 22:23:53 +00002611 if (fd == -1) {
2612 return NULL;
2613 }
2614 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002615
Matthias Klose635edd12010-07-30 21:40:57 +00002616 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002617 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002618
Victor Stinner26486ea2010-05-15 22:23:53 +00002619 if (err == 0) {
2620 s = "setupterm: could not find terminal";
2621 } else if (err == -1) {
2622 s = "setupterm: could not find terminfo database";
2623 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 PyErr_SetString(PyCursesError,s);
2626 return NULL;
2627 }
2628
2629 initialised_setupterm = TRUE;
2630
2631 Py_INCREF(Py_None);
2632 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002633}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002634
2635static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002636PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002637{
Victor Stinner26486ea2010-05-15 22:23:53 +00002638 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002639
Victor Stinner26486ea2010-05-15 22:23:53 +00002640 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002641
Victor Stinner26486ea2010-05-15 22:23:53 +00002642 switch(PyTuple_Size(args)) {
2643 case 1:
2644 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2645 break;
2646 default:
2647 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2648 return NULL;
2649 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002650
Victor Stinner26486ea2010-05-15 22:23:53 +00002651 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002652}
2653
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002654#ifdef HAVE_CURSES_IS_TERM_RESIZED
2655static PyObject *
2656PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2657{
Victor Stinner26486ea2010-05-15 22:23:53 +00002658 int lines;
2659 int columns;
2660 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002661
Victor Stinner26486ea2010-05-15 22:23:53 +00002662 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002663
Victor Stinner26486ea2010-05-15 22:23:53 +00002664 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2665 return NULL;
2666 result = is_term_resized(lines, columns);
2667 if (result == TRUE) {
2668 Py_INCREF(Py_True);
2669 return Py_True;
2670 } else {
2671 Py_INCREF(Py_False);
2672 return Py_False;
2673 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002674}
2675#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2676
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002677#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002678static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002679PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002680{
Victor Stinner26486ea2010-05-15 22:23:53 +00002681 const char *knp;
2682 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002683
Victor Stinner26486ea2010-05-15 22:23:53 +00002684 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002685
Victor Stinner26486ea2010-05-15 22:23:53 +00002686 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687
Victor Stinner26486ea2010-05-15 22:23:53 +00002688 if (ch < 0) {
2689 PyErr_SetString(PyExc_ValueError, "invalid key number");
2690 return NULL;
2691 }
2692 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002693
Victor Stinner26486ea2010-05-15 22:23:53 +00002694 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002695}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002696#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697
Victor Stinner26486ea2010-05-15 22:23:53 +00002698static PyObject *
2699PyCurses_KillChar(PyObject *self)
2700{
2701 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002702
Victor Stinner26486ea2010-05-15 22:23:53 +00002703 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002704
Victor Stinner26486ea2010-05-15 22:23:53 +00002705 return PyBytes_FromStringAndSize(&ch, 1);
2706}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002707
2708static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002709PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002710{
Victor Stinner26486ea2010-05-15 22:23:53 +00002711 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002712
Victor Stinner26486ea2010-05-15 22:23:53 +00002713 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002714
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 switch(PyTuple_Size(args)) {
2716 case 1:
2717 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2718 break;
2719 default:
2720 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2721 return NULL;
2722 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002723
Victor Stinner26486ea2010-05-15 22:23:53 +00002724 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002725}
2726
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002727#ifdef NCURSES_MOUSE_VERSION
2728static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002729PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002730{
Victor Stinner26486ea2010-05-15 22:23:53 +00002731 int interval;
2732 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002733
Victor Stinner26486ea2010-05-15 22:23:53 +00002734 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2735 return NULL;
2736 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002737}
2738
2739static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002740PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002741{
Victor Stinner26486ea2010-05-15 22:23:53 +00002742 int newmask;
2743 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002744
Victor Stinner26486ea2010-05-15 22:23:53 +00002745 PyCursesInitialised;
2746 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2747 return NULL;
2748 availmask = mousemask(newmask, &oldmask);
2749 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002750}
2751#endif
2752
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002753static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002754PyCurses_Napms(PyObject *self, PyObject *args)
2755{
2756 int ms;
2757
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002758 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002759 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002760
2761 return Py_BuildValue("i", napms(ms));
2762}
2763
2764
2765static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002766PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002767{
Victor Stinner26486ea2010-05-15 22:23:53 +00002768 WINDOW *win;
2769 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002770
Victor Stinner26486ea2010-05-15 22:23:53 +00002771 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002772
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002774
Victor Stinner26486ea2010-05-15 22:23:53 +00002775 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002776
Victor Stinner26486ea2010-05-15 22:23:53 +00002777 if (win == NULL) {
2778 PyErr_SetString(PyCursesError, catchall_NULL);
2779 return NULL;
2780 }
2781
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002782 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002783}
2784
2785static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002786PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002787{
Victor Stinner26486ea2010-05-15 22:23:53 +00002788 WINDOW *win;
2789 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002790
Victor Stinner26486ea2010-05-15 22:23:53 +00002791 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002792
Victor Stinner26486ea2010-05-15 22:23:53 +00002793 switch (PyTuple_Size(args)) {
2794 case 2:
2795 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2796 return NULL;
2797 break;
2798 case 4:
2799 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2800 &nlines,&ncols,&begin_y,&begin_x))
2801 return NULL;
2802 break;
2803 default:
2804 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2805 return NULL;
2806 }
Guido van Rossum85738471995-02-17 13:50:17 +00002807
Victor Stinner26486ea2010-05-15 22:23:53 +00002808 win = newwin(nlines,ncols,begin_y,begin_x);
2809 if (win == NULL) {
2810 PyErr_SetString(PyCursesError, catchall_NULL);
2811 return NULL;
2812 }
Guido van Rossum85738471995-02-17 13:50:17 +00002813
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002814 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002815}
2816
2817static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002818PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002819{
Victor Stinner26486ea2010-05-15 22:23:53 +00002820 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002821
Victor Stinner26486ea2010-05-15 22:23:53 +00002822 PyCursesInitialised;
2823 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002824
Victor Stinner26486ea2010-05-15 22:23:53 +00002825 switch(PyTuple_Size(args)) {
2826 case 1:
2827 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2828 break;
2829 default:
2830 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2831 return NULL;
2832 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002833
Victor Stinner26486ea2010-05-15 22:23:53 +00002834 if (pair_content(pair, &f, &b)==ERR) {
2835 PyErr_SetString(PyCursesError,
2836 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2837 return NULL;
2838 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002839
Victor Stinner26486ea2010-05-15 22:23:53 +00002840 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002841}
2842
2843static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002844PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002845{
Victor Stinner26486ea2010-05-15 22:23:53 +00002846 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002847
Victor Stinner26486ea2010-05-15 22:23:53 +00002848 PyCursesInitialised;
2849 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002850
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 switch(PyTuple_Size(args)) {
2852 case 1:
2853 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2854 break;
2855 default:
2856 PyErr_SetString(PyExc_TypeError,
2857 "pair_number requires 1 argument");
2858 return NULL;
2859 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860
Victor Stinner26486ea2010-05-15 22:23:53 +00002861 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002862}
2863
2864static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002865PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002866{
Victor Stinner26486ea2010-05-15 22:23:53 +00002867 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002868
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002869 if (!PyArg_ParseTuple(args,"y;str", &str))
2870 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002871 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002872}
2873
2874static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002875PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002876{
Victor Stinner26486ea2010-05-15 22:23:53 +00002877 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002878
Victor Stinner26486ea2010-05-15 22:23:53 +00002879 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002880
Victor Stinner26486ea2010-05-15 22:23:53 +00002881 switch(PyTuple_Size(args)) {
2882 case 0:
2883 qiflush();
2884 Py_INCREF(Py_None);
2885 return Py_None;
2886 case 1:
2887 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2888 if (flag) qiflush();
2889 else noqiflush();
2890 Py_INCREF(Py_None);
2891 return Py_None;
2892 default:
2893 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2894 return NULL;
2895 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002896}
2897
Guido van Rossumd8faa362007-04-27 19:54:29 +00002898/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2899 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002900#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002901static int
2902update_lines_cols(void)
2903{
Victor Stinner26486ea2010-05-15 22:23:53 +00002904 PyObject *o;
2905 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002906 _Py_IDENTIFIER(LINES);
2907 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002908
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 if (!m)
2910 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002911
Victor Stinner26486ea2010-05-15 22:23:53 +00002912 o = PyLong_FromLong(LINES);
2913 if (!o) {
2914 Py_DECREF(m);
2915 return 0;
2916 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002917 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002918 Py_DECREF(m);
2919 Py_DECREF(o);
2920 return 0;
2921 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002922 /* PyId_LINES.object will be initialized here. */
2923 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002924 Py_DECREF(m);
2925 Py_DECREF(o);
2926 return 0;
2927 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002928 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002929 o = PyLong_FromLong(COLS);
2930 if (!o) {
2931 Py_DECREF(m);
2932 return 0;
2933 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002934 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002935 Py_DECREF(m);
2936 Py_DECREF(o);
2937 return 0;
2938 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002939 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002940 Py_DECREF(m);
2941 Py_DECREF(o);
2942 return 0;
2943 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002944 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002945 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002946 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002947}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002948#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002949
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002950#ifdef HAVE_CURSES_RESIZETERM
2951static PyObject *
2952PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2953{
Victor Stinner26486ea2010-05-15 22:23:53 +00002954 int lines;
2955 int columns;
2956 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002957
Victor Stinner26486ea2010-05-15 22:23:53 +00002958 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002959
Victor Stinner26486ea2010-05-15 22:23:53 +00002960 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2961 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002962
Victor Stinner26486ea2010-05-15 22:23:53 +00002963 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2964 if (!result)
2965 return NULL;
2966 if (!update_lines_cols())
2967 return NULL;
2968 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002969}
2970
2971#endif
2972
2973#ifdef HAVE_CURSES_RESIZE_TERM
2974static PyObject *
2975PyCurses_Resize_Term(PyObject *self, PyObject *args)
2976{
Victor Stinner26486ea2010-05-15 22:23:53 +00002977 int lines;
2978 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002979
Victor Stinner26486ea2010-05-15 22:23:53 +00002980 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002981
Victor Stinner26486ea2010-05-15 22:23:53 +00002982 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002983
Victor Stinner26486ea2010-05-15 22:23:53 +00002984 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2985 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002986
Victor Stinner26486ea2010-05-15 22:23:53 +00002987 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2988 if (!result)
2989 return NULL;
2990 if (!update_lines_cols())
2991 return NULL;
2992 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002993}
2994#endif /* HAVE_CURSES_RESIZE_TERM */
2995
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002996static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002997PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002998{
Victor Stinner26486ea2010-05-15 22:23:53 +00002999 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003000
Victor Stinner26486ea2010-05-15 22:23:53 +00003001 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003002
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 if (PyTuple_Size(args)!=2) {
3004 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
3005 return NULL;
3006 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003007
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003009
Victor Stinner26486ea2010-05-15 22:23:53 +00003010 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003011
Victor Stinner26486ea2010-05-15 22:23:53 +00003012 Py_INCREF(Py_None);
3013 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003014}
3015
3016static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00003017PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003018{
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 int code;
3020 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003021
Victor Stinner26486ea2010-05-15 22:23:53 +00003022 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003023
Victor Stinner26486ea2010-05-15 22:23:53 +00003024 code = start_color();
3025 if (code != ERR) {
3026 initialisedcolors = TRUE;
3027 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003028 if (c == NULL)
3029 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003030 PyDict_SetItemString(ModDict, "COLORS", c);
3031 Py_DECREF(c);
3032 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003033 if (cp == NULL)
3034 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003035 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3036 Py_DECREF(cp);
3037 Py_INCREF(Py_None);
3038 return Py_None;
3039 } else {
3040 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3041 return NULL;
3042 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003043}
3044
3045static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003046PyCurses_tigetflag(PyObject *self, PyObject *args)
3047{
Victor Stinner26486ea2010-05-15 22:23:53 +00003048 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003051
Victor Stinner26486ea2010-05-15 22:23:53 +00003052 if (!PyArg_ParseTuple(args, "s", &capname))
3053 return NULL;
3054
3055 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003056}
3057
3058static PyObject *
3059PyCurses_tigetnum(PyObject *self, PyObject *args)
3060{
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003062
Victor Stinner26486ea2010-05-15 22:23:53 +00003063 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003064
Victor Stinner26486ea2010-05-15 22:23:53 +00003065 if (!PyArg_ParseTuple(args, "s", &capname))
3066 return NULL;
3067
3068 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003069}
3070
3071static PyObject *
3072PyCurses_tigetstr(PyObject *self, PyObject *args)
3073{
Victor Stinner26486ea2010-05-15 22:23:53 +00003074 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003075
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003077
Victor Stinner26486ea2010-05-15 22:23:53 +00003078 if (!PyArg_ParseTuple(args, "s", &capname))
3079 return NULL;
3080
3081 capname = tigetstr( capname );
3082 if (capname == 0 || capname == (char*) -1) {
3083 Py_INCREF(Py_None);
3084 return Py_None;
3085 }
3086 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003087}
3088
3089static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003090PyCurses_tparm(PyObject *self, PyObject *args)
3091{
Victor Stinner26486ea2010-05-15 22:23:53 +00003092 char* fmt;
3093 char* result = NULL;
3094 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 +00003095
Victor Stinner26486ea2010-05-15 22:23:53 +00003096 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003097
Victor Stinner26621332011-11-02 23:45:29 +01003098 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003099 &fmt, &i1, &i2, &i3, &i4,
3100 &i5, &i6, &i7, &i8, &i9)) {
3101 return NULL;
3102 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003103
Victor Stinner26486ea2010-05-15 22:23:53 +00003104 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3105 if (!result) {
3106 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3107 return NULL;
3108 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003109
Victor Stinner26486ea2010-05-15 22:23:53 +00003110 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003111}
3112
3113static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003114PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003115{
Victor Stinner26486ea2010-05-15 22:23:53 +00003116 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003117
Victor Stinner26486ea2010-05-15 22:23:53 +00003118 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003119
Victor Stinner26486ea2010-05-15 22:23:53 +00003120 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003121
Victor Stinner26486ea2010-05-15 22:23:53 +00003122 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003123}
3124
3125static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003126PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003127{
Victor Stinner26486ea2010-05-15 22:23:53 +00003128 PyObject *temp;
3129 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003130
Victor Stinner26486ea2010-05-15 22:23:53 +00003131 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003132
Victor Stinner26486ea2010-05-15 22:23:53 +00003133 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003134
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003135 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003136 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003137
Victor Stinner26486ea2010-05-15 22:23:53 +00003138 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003139}
3140
3141static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003142PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003143{
Victor Stinner26486ea2010-05-15 22:23:53 +00003144 PyObject *temp;
3145 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003146
Victor Stinner26486ea2010-05-15 22:23:53 +00003147 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003148
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003149 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003150 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003151
3152 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3153 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003154
Victor Stinner26486ea2010-05-15 22:23:53 +00003155 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003156}
3157
Victor Stinner71e44cb2011-09-06 01:53:03 +02003158#ifdef HAVE_NCURSESW
3159/* Convert an object to a character (wchar_t):
3160
3161 - int
3162 - str of length 1
3163
3164 Return 1 on success, 0 on error. */
3165static int
3166PyCurses_ConvertToWchar_t(PyObject *obj,
3167 wchar_t *wch)
3168{
3169 if (PyUnicode_Check(obj)) {
3170 wchar_t buffer[2];
3171 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3172 PyErr_Format(PyExc_TypeError,
3173 "expect bytes or str of length 1, or int, "
3174 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003175 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003176 return 0;
3177 }
3178 *wch = buffer[0];
3179 return 2;
3180 }
3181 else if (PyLong_CheckExact(obj)) {
3182 long value;
3183 int overflow;
3184 value = PyLong_AsLongAndOverflow(obj, &overflow);
3185 if (overflow) {
3186 PyErr_SetString(PyExc_OverflowError,
3187 "int doesn't fit in long");
3188 return 0;
3189 }
3190 *wch = (wchar_t)value;
3191 if ((long)*wch != value) {
3192 PyErr_Format(PyExc_OverflowError,
3193 "character doesn't fit in wchar_t");
3194 return 0;
3195 }
3196 return 1;
3197 }
3198 else {
3199 PyErr_Format(PyExc_TypeError,
3200 "expect bytes or str of length 1, or int, got %s",
3201 Py_TYPE(obj)->tp_name);
3202 return 0;
3203 }
3204}
3205
3206static PyObject *
3207PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3208{
3209 PyObject *obj;
3210 wchar_t wch;
3211
3212 PyCursesInitialised;
3213
3214 if (!PyArg_ParseTuple(args,"O", &obj))
3215 return NULL;
3216
3217 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3218 return NULL;
3219 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3220}
3221#endif
3222
Guido van Rossumf6971e21994-08-30 12:25:20 +00003223static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003224PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003225{
Victor Stinner26486ea2010-05-15 22:23:53 +00003226 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003227
Victor Stinner26486ea2010-05-15 22:23:53 +00003228 switch(PyTuple_Size(args)) {
3229 case 1:
3230 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3231 return NULL;
3232 break;
3233 default:
3234 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3235 return NULL;
3236 }
3237 use_env(flag);
3238 Py_INCREF(Py_None);
3239 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003240}
3241
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003242#ifndef STRICT_SYSV_CURSES
3243static PyObject *
3244PyCurses_Use_Default_Colors(PyObject *self)
3245{
Victor Stinner26486ea2010-05-15 22:23:53 +00003246 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003247
Victor Stinner26486ea2010-05-15 22:23:53 +00003248 PyCursesInitialised;
3249 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003250
Victor Stinner26486ea2010-05-15 22:23:53 +00003251 code = use_default_colors();
3252 if (code != ERR) {
3253 Py_INCREF(Py_None);
3254 return Py_None;
3255 } else {
3256 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3257 return NULL;
3258 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003259}
3260#endif /* STRICT_SYSV_CURSES */
3261
Guido van Rossumf6971e21994-08-30 12:25:20 +00003262/* List of functions defined in the module */
3263
3264static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003265 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3266 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3267 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3268 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3269 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3270 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3271 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3272 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3273 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3274 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3275 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3276 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3277 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3278 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3279 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3280 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3281 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003282#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003283 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3284 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003285#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3287 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3288 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3289 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3290 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003291#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003292 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003293#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3295 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3296 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3297 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3298 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3299 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003300#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003301 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003302#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003303#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003304 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003305#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003306 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3307 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3308 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003309#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003310 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3311 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003312#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003313 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3314 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3315 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3316 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3317 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3318 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3319 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3320 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3321 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3322 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3323 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3324 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3325 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3326 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3327 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3328 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3329 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003330#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003331 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003332#endif
3333#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003334 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003335#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003336 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3337 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3338 {"setupterm", (PyCFunction)PyCurses_setupterm,
3339 METH_VARARGS|METH_KEYWORDS},
3340 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3341 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3342 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3343 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3344 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3345 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3346 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3347 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3348 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3349 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003350#ifdef HAVE_NCURSESW
3351 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3352#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003353 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003354#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003355 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003356#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003357 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003358};
3359
3360/* Initialization function for the module */
3361
Martin v. Löwis1a214512008-06-11 05:26:20 +00003362
3363static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003364 PyModuleDef_HEAD_INIT,
3365 "_curses",
3366 NULL,
3367 -1,
3368 PyCurses_methods,
3369 NULL,
3370 NULL,
3371 NULL,
3372 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003373};
3374
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003375PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003376PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003377{
Victor Stinner26486ea2010-05-15 22:23:53 +00003378 PyObject *m, *d, *v, *c_api_object;
3379 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003380
Victor Stinner26486ea2010-05-15 22:23:53 +00003381 /* Initialize object type */
3382 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3383 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003384
Victor Stinner26486ea2010-05-15 22:23:53 +00003385 /* Initialize the C API pointer array */
3386 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3387 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3388 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3389 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003390
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 /* Create the module and add the functions */
3392 m = PyModule_Create(&_cursesmodule);
3393 if (m == NULL)
3394 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003395
Victor Stinner26486ea2010-05-15 22:23:53 +00003396 /* Add some symbolic constants to the module */
3397 d = PyModule_GetDict(m);
3398 if (d == NULL)
3399 return NULL;
3400 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003401
Victor Stinner26486ea2010-05-15 22:23:53 +00003402 /* Add a capsule for the C API */
3403 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3404 PyDict_SetItemString(d, "_C_API", c_api_object);
3405 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003406
Victor Stinner26486ea2010-05-15 22:23:53 +00003407 /* For exception curses.error */
3408 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3409 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003410
Victor Stinner26486ea2010-05-15 22:23:53 +00003411 /* Make the version available */
3412 v = PyBytes_FromString(PyCursesVersion);
3413 PyDict_SetItemString(d, "version", v);
3414 PyDict_SetItemString(d, "__version__", v);
3415 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003416
Victor Stinner26486ea2010-05-15 22:23:53 +00003417 SetDictInt("ERR", ERR);
3418 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003419
Victor Stinner26486ea2010-05-15 22:23:53 +00003420 /* Here are some attributes you can add to chars to print */
3421
3422 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3423 SetDictInt("A_NORMAL", A_NORMAL);
3424 SetDictInt("A_STANDOUT", A_STANDOUT);
3425 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3426 SetDictInt("A_REVERSE", A_REVERSE);
3427 SetDictInt("A_BLINK", A_BLINK);
3428 SetDictInt("A_DIM", A_DIM);
3429 SetDictInt("A_BOLD", A_BOLD);
3430 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003431#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003432 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003433#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003434 SetDictInt("A_PROTECT", A_PROTECT);
3435 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3436 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003437
Victor Stinner26486ea2010-05-15 22:23:53 +00003438 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003439#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003440 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003441#endif
3442#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003443 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003444#endif
3445#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003446 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003447#endif
3448#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003449 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003450#endif
3451#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003452 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003453#endif
3454#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003455 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003456#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003457
Victor Stinner26486ea2010-05-15 22:23:53 +00003458 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3459 SetDictInt("COLOR_RED", COLOR_RED);
3460 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3461 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3462 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3463 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3464 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3465 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003466
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003467#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003468 /* Mouse-related constants */
3469 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3470 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3471 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3472 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3473 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003474
Victor Stinner26486ea2010-05-15 22:23:53 +00003475 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3476 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3477 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3478 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3479 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003480
Victor Stinner26486ea2010-05-15 22:23:53 +00003481 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3482 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3483 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3484 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3485 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003486
Victor Stinner26486ea2010-05-15 22:23:53 +00003487 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3488 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3489 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3490 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3491 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003492
Victor Stinner26486ea2010-05-15 22:23:53 +00003493 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3494 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3495 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003496
Victor Stinner26486ea2010-05-15 22:23:53 +00003497 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3498 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003499#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003500 /* Now set everything up for KEY_ variables */
3501 {
3502 int key;
3503 char *key_n;
3504 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003505#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003506 for (key=KEY_MIN;key < KEY_MAX; key++) {
3507 key_n = (char *)keyname(key);
3508 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3509 continue;
3510 if (strncmp(key_n,"KEY_F(",6)==0) {
3511 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003512 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003513 if (!key_n2) {
3514 PyErr_NoMemory();
3515 break;
3516 }
3517 p1 = key_n;
3518 p2 = key_n2;
3519 while (*p1) {
3520 if (*p1 != '(' && *p1 != ')') {
3521 *p2 = *p1;
3522 p2++;
3523 }
3524 p1++;
3525 }
3526 *p2 = (char)0;
3527 } else
3528 key_n2 = key_n;
3529 SetDictInt(key_n2,key);
3530 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003531 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003532 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003533#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003534 SetDictInt("KEY_MIN", KEY_MIN);
3535 SetDictInt("KEY_MAX", KEY_MAX);
3536 }
3537 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003538}