blob: 5ffce2f9541a2d0f8ad325ed468997d35b5251c3 [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;
1287 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001288 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001289 Py_END_ALLOW_THREADS
1290 break;
1291 case 2:
1292 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1293 return NULL;
1294 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001295#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001296 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001297#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001298 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001299#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001300 Py_END_ALLOW_THREADS
1301 break;
1302 case 3:
1303 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1304 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001305#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001306 Py_BEGIN_ALLOW_THREADS
1307 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001308 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001309 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001310#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001311 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001312 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001313 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001314#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001315 break;
1316 default:
1317 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1318 return NULL;
1319 }
1320 if (rtn2 == ERR)
1321 rtn[0] = 0;
1322 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001323}
1324
1325static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001326PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001327{
Victor Stinner26486ea2010-05-15 22:23:53 +00001328 PyObject *temp;
1329 chtype ch;
1330 int n, x, y, code = OK;
1331 attr_t attr = A_NORMAL;
1332 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001333
Victor Stinner26486ea2010-05-15 22:23:53 +00001334 switch (PyTuple_Size(args)) {
1335 case 2:
1336 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1337 return NULL;
1338 break;
1339 case 3:
1340 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1341 return NULL;
1342 attr = lattr;
1343 break;
1344 case 4:
1345 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1346 return NULL;
1347 code = wmove(self->win, y, x);
1348 break;
1349 case 5:
1350 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1351 &y, &x, &temp, &n, &lattr))
1352 return NULL;
1353 attr = lattr;
1354 code = wmove(self->win, y, x);
1355 break;
1356 default:
1357 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1358 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001359 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001360
1361 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001362 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001363 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001364 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1365 } else
1366 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001367}
1368
1369static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001370PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001371{
Victor Stinner26486ea2010-05-15 22:23:53 +00001372 int rtn, x, y, use_xy = FALSE;
1373 PyObject *temp;
1374 chtype ch = 0;
1375 attr_t attr = A_NORMAL;
1376 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001377
Victor Stinner26486ea2010-05-15 22:23:53 +00001378 switch (PyTuple_Size(args)) {
1379 case 1:
1380 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1381 return NULL;
1382 break;
1383 case 2:
1384 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1385 return NULL;
1386 attr = lattr;
1387 break;
1388 case 3:
1389 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1390 return NULL;
1391 use_xy = TRUE;
1392 break;
1393 case 4:
1394 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1395 return NULL;
1396 attr = lattr;
1397 use_xy = TRUE;
1398 break;
1399 default:
1400 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1401 return NULL;
1402 }
1403
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001404 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001405 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001406
1407 if (use_xy == TRUE)
1408 rtn = mvwinsch(self->win,y,x, ch | attr);
1409 else {
1410 rtn = winsch(self->win, ch | attr);
1411 }
1412 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001413}
1414
1415static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001416PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001417{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001418 int x, y;
1419 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001420
Victor Stinner26486ea2010-05-15 22:23:53 +00001421 switch (PyTuple_Size(args)) {
1422 case 0:
1423 rtn = winch(self->win);
1424 break;
1425 case 2:
1426 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1427 return NULL;
1428 rtn = mvwinch(self->win,y,x);
1429 break;
1430 default:
1431 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1432 return NULL;
1433 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001434 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001435}
1436
1437static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001438PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001439{
Victor Stinner26486ea2010-05-15 22:23:53 +00001440 int x, y, n;
1441 char rtn[1024]; /* This should be big enough.. I hope */
1442 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001443
Victor Stinner26486ea2010-05-15 22:23:53 +00001444 switch (PyTuple_Size(args)) {
1445 case 0:
1446 rtn2 = winnstr(self->win,rtn, 1023);
1447 break;
1448 case 1:
1449 if (!PyArg_ParseTuple(args,"i;n", &n))
1450 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001451 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001452 break;
1453 case 2:
1454 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1455 return NULL;
1456 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1457 break;
1458 case 3:
1459 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1460 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001461 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001462 break;
1463 default:
1464 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1465 return NULL;
1466 }
1467 if (rtn2 == ERR)
1468 rtn[0] = 0;
1469 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001470}
1471
1472static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001473PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001474{
Victor Stinner26486ea2010-05-15 22:23:53 +00001475 int rtn;
1476 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001477 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001478 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001479#ifdef HAVE_NCURSESW
1480 wchar_t *wstr = NULL;
1481#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001482 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1483 long lattr;
1484 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001485 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001486
Victor Stinner26486ea2010-05-15 22:23:53 +00001487 switch (PyTuple_Size(args)) {
1488 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001489 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001490 return NULL;
1491 break;
1492 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001493 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001494 return NULL;
1495 attr = lattr;
1496 use_attr = TRUE;
1497 break;
1498 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001499 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001500 return NULL;
1501 use_xy = TRUE;
1502 break;
1503 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001504 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001505 return NULL;
1506 attr = lattr;
1507 use_xy = use_attr = TRUE;
1508 break;
1509 default:
1510 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1511 return NULL;
1512 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001513
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001514#ifdef HAVE_NCURSESW
1515 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1516#else
1517 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1518#endif
1519 if (strtype == 0)
1520 return NULL;
1521
Victor Stinner26486ea2010-05-15 22:23:53 +00001522 if (use_attr == TRUE) {
1523 attr_old = getattrs(self->win);
1524 (void)wattrset(self->win,attr);
1525 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001526#ifdef HAVE_NCURSESW
1527 if (strtype == 2) {
1528 funcname = "inswstr";
1529 if (use_xy == TRUE)
1530 rtn = mvwins_wstr(self->win,y,x,wstr);
1531 else
1532 rtn = wins_wstr(self->win,wstr);
1533 PyMem_Free(wstr);
1534 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001535 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001536#endif
1537 {
1538 char *str = PyBytes_AS_STRING(bytesobj);
1539 funcname = "insstr";
1540 if (use_xy == TRUE)
1541 rtn = mvwinsstr(self->win,y,x,str);
1542 else
1543 rtn = winsstr(self->win,str);
1544 Py_DECREF(bytesobj);
1545 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001546 if (use_attr == TRUE)
1547 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001548 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001549}
1550
1551static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001552PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001553{
Victor Stinner26486ea2010-05-15 22:23:53 +00001554 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001555 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001556 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001557#ifdef HAVE_NCURSESW
1558 wchar_t *wstr = NULL;
1559#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001560 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1561 long lattr;
1562 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001563 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001564
Victor Stinner26486ea2010-05-15 22:23:53 +00001565 switch (PyTuple_Size(args)) {
1566 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001567 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001568 return NULL;
1569 break;
1570 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001571 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001572 return NULL;
1573 attr = lattr;
1574 use_attr = TRUE;
1575 break;
1576 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001577 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001578 return NULL;
1579 use_xy = TRUE;
1580 break;
1581 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001582 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001583 return NULL;
1584 attr = lattr;
1585 use_xy = use_attr = TRUE;
1586 break;
1587 default:
1588 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1589 return NULL;
1590 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001591
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001592#ifdef HAVE_NCURSESW
1593 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1594#else
1595 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1596#endif
1597 if (strtype == 0)
1598 return NULL;
1599
Victor Stinner26486ea2010-05-15 22:23:53 +00001600 if (use_attr == TRUE) {
1601 attr_old = getattrs(self->win);
1602 (void)wattrset(self->win,attr);
1603 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001604#ifdef HAVE_NCURSESW
1605 if (strtype == 2) {
1606 funcname = "insn_wstr";
1607 if (use_xy == TRUE)
1608 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1609 else
1610 rtn = wins_nwstr(self->win,wstr,n);
1611 PyMem_Free(wstr);
1612 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001613 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001614#endif
1615 {
1616 char *str = PyBytes_AS_STRING(bytesobj);
1617 funcname = "insnstr";
1618 if (use_xy == TRUE)
1619 rtn = mvwinsnstr(self->win,y,x,str,n);
1620 else
1621 rtn = winsnstr(self->win,str,n);
1622 Py_DECREF(bytesobj);
1623 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001624 if (use_attr == TRUE)
1625 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001626 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001627}
1628
1629static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001630PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001631{
Victor Stinner26486ea2010-05-15 22:23:53 +00001632 int line, erg;
1633 if (!PyArg_ParseTuple(args,"i;line", &line))
1634 return NULL;
1635 erg = is_linetouched(self->win, line);
1636 if (erg == ERR) {
1637 PyErr_SetString(PyExc_TypeError,
1638 "is_linetouched: line number outside of boundaries");
1639 return NULL;
1640 } else
1641 if (erg == FALSE) {
1642 Py_INCREF(Py_False);
1643 return Py_False;
1644 } else {
1645 Py_INCREF(Py_True);
1646 return Py_True;
1647 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001648}
1649
1650static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001651PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001652{
Victor Stinner26486ea2010-05-15 22:23:53 +00001653 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1654 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001655
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001656#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001657 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001658#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001659 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001660#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001661 {
1662 switch(PyTuple_Size(args)) {
1663 case 6:
1664 if (!PyArg_ParseTuple(args,
1665 "iiiiii;" \
1666 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1667 &pminrow, &pmincol, &sminrow,
1668 &smincol, &smaxrow, &smaxcol))
1669 return NULL;
1670 Py_BEGIN_ALLOW_THREADS
1671 rtn = pnoutrefresh(self->win,
1672 pminrow, pmincol, sminrow,
1673 smincol, smaxrow, smaxcol);
1674 Py_END_ALLOW_THREADS
1675 return PyCursesCheckERR(rtn, "pnoutrefresh");
1676 default:
1677 PyErr_SetString(PyCursesError,
1678 "noutrefresh() called for a pad "
1679 "requires 6 arguments");
1680 return NULL;
1681 }
1682 } else {
1683 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1684 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001685
Victor Stinner26486ea2010-05-15 22:23:53 +00001686 Py_BEGIN_ALLOW_THREADS
1687 rtn = wnoutrefresh(self->win);
1688 Py_END_ALLOW_THREADS
1689 return PyCursesCheckERR(rtn, "wnoutrefresh");
1690 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001691}
1692
1693static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001694PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1695{
1696 PyCursesWindowObject *temp;
1697 int use_copywin = FALSE;
1698 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1699 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001700
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001701 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001702 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001703 if (!PyArg_ParseTuple(args, "O!;window object",
1704 &PyCursesWindow_Type, &temp))
1705 return NULL;
1706 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001707 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001708 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1709 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1710 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1711 return NULL;
1712 use_copywin = TRUE;
1713 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001714 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001715 PyErr_SetString(PyExc_TypeError,
1716 "overlay requires one or seven arguments");
1717 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001718 }
1719
1720 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001721 rtn = copywin(self->win, temp->win, sminrow, smincol,
1722 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1723 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001724 }
1725 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001726 rtn = overlay(self->win, temp->win);
1727 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001728 }
1729}
1730
1731static PyObject *
1732PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1733{
1734 PyCursesWindowObject *temp;
1735 int use_copywin = FALSE;
1736 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1737 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001738
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001739 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001740 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001741 if (!PyArg_ParseTuple(args, "O!;window object",
1742 &PyCursesWindow_Type, &temp))
1743 return NULL;
1744 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001745 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001746 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1747 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1748 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1749 return NULL;
1750 use_copywin = TRUE;
1751 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001752 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001753 PyErr_SetString(PyExc_TypeError,
1754 "overwrite requires one or seven arguments");
1755 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001756 }
1757
1758 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001759 rtn = copywin(self->win, temp->win, sminrow, smincol,
1760 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001761 return PyCursesCheckERR(rtn, "copywin");
1762 }
1763 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001764 rtn = overwrite(self->win, temp->win);
1765 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001766 }
1767}
1768
1769static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001770PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001771{
Victor Stinner26486ea2010-05-15 22:23:53 +00001772 /* We have to simulate this by writing to a temporary FILE*,
1773 then reading back, then writing to the argument stream. */
1774 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001775 int fd = -1;
1776 FILE *fp = NULL;
1777 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001778
Victor Stinner26486ea2010-05-15 22:23:53 +00001779 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1780 fd = mkstemp(fn);
1781 if (fd < 0)
1782 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001783 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1784 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001785 fp = fdopen(fd, "wb+");
1786 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001787 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1788 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001789 }
1790 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001791 if (res == NULL)
1792 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001793 fseek(fp, 0, 0);
1794 while (1) {
1795 char buf[BUFSIZ];
1796 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001797 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001798
Victor Stinner26486ea2010-05-15 22:23:53 +00001799 if (n <= 0)
1800 break;
1801 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001802 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001803 if (res == NULL)
1804 break;
1805 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001806
1807exit:
1808 if (fp != NULL)
1809 fclose(fp);
1810 else if (fd != -1)
1811 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001812 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001813 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001814}
1815
1816static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001817PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001818{
Victor Stinner26486ea2010-05-15 22:23:53 +00001819 int beg, num;
1820 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1821 return NULL;
1822 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001823}
1824
1825static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001826PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001827{
Victor Stinner26486ea2010-05-15 22:23:53 +00001828 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1829 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001830
Victor Stinner26486ea2010-05-15 22:23:53 +00001831#ifndef WINDOW_HAS_FLAGS
1832 if (0)
1833#else
1834 if (self->win->_flags & _ISPAD)
1835#endif
1836 {
1837 switch(PyTuple_Size(args)) {
1838 case 6:
1839 if (!PyArg_ParseTuple(args,
1840 "iiiiii;" \
1841 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1842 &pminrow, &pmincol, &sminrow,
1843 &smincol, &smaxrow, &smaxcol))
1844 return NULL;
1845
1846 Py_BEGIN_ALLOW_THREADS
1847 rtn = prefresh(self->win,
1848 pminrow, pmincol, sminrow,
1849 smincol, smaxrow, smaxcol);
1850 Py_END_ALLOW_THREADS
1851 return PyCursesCheckERR(rtn, "prefresh");
1852 default:
1853 PyErr_SetString(PyCursesError,
1854 "refresh() for a pad requires 6 arguments");
1855 return NULL;
1856 }
1857 } else {
1858 if (!PyArg_ParseTuple(args, ":refresh"))
1859 return NULL;
1860 Py_BEGIN_ALLOW_THREADS
1861 rtn = wrefresh(self->win);
1862 Py_END_ALLOW_THREADS
1863 return PyCursesCheckERR(rtn, "prefresh");
1864 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001865}
1866
1867static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001868PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001869{
Victor Stinner26486ea2010-05-15 22:23:53 +00001870 int x, y;
1871 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1872 return NULL;
1873 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001874}
1875
1876static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001877PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001878{
Victor Stinner26486ea2010-05-15 22:23:53 +00001879 WINDOW *win;
1880 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001881
Victor Stinner26486ea2010-05-15 22:23:53 +00001882 nlines = 0;
1883 ncols = 0;
1884 switch (PyTuple_Size(args)) {
1885 case 2:
1886 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1887 return NULL;
1888 break;
1889 case 4:
1890 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1891 &nlines,&ncols,&begin_y,&begin_x))
1892 return NULL;
1893 break;
1894 default:
1895 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1896 return NULL;
1897 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001898
Victor Stinner26486ea2010-05-15 22:23:53 +00001899 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001900#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001901 if (self->win->_flags & _ISPAD)
1902 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1903 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001904#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001905 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001906
Victor Stinner26486ea2010-05-15 22:23:53 +00001907 if (win == NULL) {
1908 PyErr_SetString(PyCursesError, catchall_NULL);
1909 return NULL;
1910 }
1911
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001912 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001913}
1914
1915static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001916PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001917{
Victor Stinner26486ea2010-05-15 22:23:53 +00001918 int nlines;
1919 switch(PyTuple_Size(args)) {
1920 case 0:
1921 return PyCursesCheckERR(scroll(self->win), "scroll");
1922 case 1:
1923 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1924 return NULL;
1925 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1926 default:
1927 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1928 return NULL;
1929 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001930}
1931
1932static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001933PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001934{
Victor Stinner26486ea2010-05-15 22:23:53 +00001935 int st, cnt, val;
1936 switch (PyTuple_Size(args)) {
1937 case 2:
1938 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1939 return NULL;
1940 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1941 case 3:
1942 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1943 return NULL;
1944 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1945 default:
1946 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1947 return NULL;
1948 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001949}
1950
1951static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001952PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001953{
Victor Stinner26486ea2010-05-15 22:23:53 +00001954 PyObject *temp;
1955 chtype ch;
1956 int n, x, y, code = OK;
1957 attr_t attr = A_NORMAL;
1958 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001959
Victor Stinner26486ea2010-05-15 22:23:53 +00001960 switch (PyTuple_Size(args)) {
1961 case 2:
1962 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1963 return NULL;
1964 break;
1965 case 3:
1966 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1967 return NULL;
1968 attr = lattr;
1969 break;
1970 case 4:
1971 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1972 return NULL;
1973 code = wmove(self->win, y, x);
1974 break;
1975 case 5:
1976 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1977 &y, &x, &temp, &n, &lattr))
1978 return NULL;
1979 attr = lattr;
1980 code = wmove(self->win, y, x);
1981 break;
1982 default:
1983 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1984 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001985 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001986
1987 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001988 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001989 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001990 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1991 } else
1992 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001993}
1994
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001995static PyObject *
1996PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1997{
1998 return PyUnicode_FromString(self->encoding);
1999}
2000
2001static int
2002PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
2003{
2004 PyObject *ascii;
2005 char *encoding;
2006
2007 /* It is illegal to del win.encoding */
2008 if (value == NULL) {
2009 PyErr_SetString(PyExc_TypeError,
2010 "encoding may not be deleted");
2011 return -1;
2012 }
2013
2014 if (!PyUnicode_Check(value)) {
2015 PyErr_SetString(PyExc_TypeError,
2016 "setting encoding to a non-string");
2017 return -1;
2018 }
2019 ascii = PyUnicode_AsASCIIString(value);
2020 if (ascii == NULL)
2021 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002022 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002023 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002024 if (encoding == NULL) {
2025 PyErr_NoMemory();
2026 return -1;
2027 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002028 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002029 self->encoding = encoding;
2030 return 0;
2031}
2032
2033
Guido van Rossumf6971e21994-08-30 12:25:20 +00002034static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002035 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002036 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2037 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2038 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2039 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2040 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2041 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2042 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2043 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2044 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2045 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2046 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2047 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2048 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2049 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2050 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2051 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2052 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2053 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2054 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002055#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002056 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002057#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002058 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2059 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2060 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2061 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2062 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002063#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002064 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002065#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002066 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2067 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2068 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2069 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2070 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2071 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2072 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2073 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2074 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2075 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2076 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2077 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2078 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2079 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2080 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2081 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2082 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2083 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2084 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2085 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2086 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2087 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2088 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2089 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2090 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Victor Stinner26486ea2010-05-15 22:23:53 +00002091 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2092 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2093 METH_VARARGS},
2094 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2095 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2096 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2097 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002098#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002099 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002100#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002101 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2102 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2103 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2104 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2105 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2106 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2107 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2108 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2109 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2110 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2111 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2112 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2113 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2114 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2115 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2116 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002117};
2118
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002119static PyGetSetDef PyCursesWindow_getsets[] = {
2120 {"encoding",
2121 (getter)PyCursesWindow_get_encoding,
2122 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002123 "the typecode character used to create the array"},
2124 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002125};
2126
Guido van Rossumf6971e21994-08-30 12:25:20 +00002127/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002128
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002129PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002130 PyVarObject_HEAD_INIT(NULL, 0)
2131 "_curses.curses window", /*tp_name*/
2132 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2133 0, /*tp_itemsize*/
2134 /* methods */
2135 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2136 0, /*tp_print*/
2137 (getattrfunc)0, /*tp_getattr*/
2138 (setattrfunc)0, /*tp_setattr*/
2139 0, /*tp_reserved*/
2140 0, /*tp_repr*/
2141 0, /*tp_as_number*/
2142 0, /*tp_as_sequence*/
2143 0, /*tp_as_mapping*/
2144 0, /*tp_hash*/
2145 0, /*tp_call*/
2146 0, /*tp_str*/
2147 0, /*tp_getattro*/
2148 0, /*tp_setattro*/
2149 0, /*tp_as_buffer*/
2150 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2151 0, /*tp_doc*/
2152 0, /*tp_traverse*/
2153 0, /*tp_clear*/
2154 0, /*tp_richcompare*/
2155 0, /*tp_weaklistoffset*/
2156 0, /*tp_iter*/
2157 0, /*tp_iternext*/
2158 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002159 0, /* tp_members */
2160 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002161};
2162
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002163/*********************************************************************
2164 Global Functions
2165**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002166
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002167NoArgNoReturnFunction(beep)
2168NoArgNoReturnFunction(def_prog_mode)
2169NoArgNoReturnFunction(def_shell_mode)
2170NoArgNoReturnFunction(doupdate)
2171NoArgNoReturnFunction(endwin)
2172NoArgNoReturnFunction(flash)
2173NoArgNoReturnFunction(nocbreak)
2174NoArgNoReturnFunction(noecho)
2175NoArgNoReturnFunction(nonl)
2176NoArgNoReturnFunction(noraw)
2177NoArgNoReturnFunction(reset_prog_mode)
2178NoArgNoReturnFunction(reset_shell_mode)
2179NoArgNoReturnFunction(resetty)
2180NoArgNoReturnFunction(savetty)
2181
2182NoArgOrFlagNoReturnFunction(cbreak)
2183NoArgOrFlagNoReturnFunction(echo)
2184NoArgOrFlagNoReturnFunction(nl)
2185NoArgOrFlagNoReturnFunction(raw)
2186
2187NoArgReturnIntFunction(baudrate)
2188NoArgReturnIntFunction(termattrs)
2189
2190NoArgReturnStringFunction(termname)
2191NoArgReturnStringFunction(longname)
2192
2193NoArgTrueFalseFunction(can_change_color)
2194NoArgTrueFalseFunction(has_colors)
2195NoArgTrueFalseFunction(has_ic)
2196NoArgTrueFalseFunction(has_il)
2197NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002198NoArgNoReturnVoidFunction(flushinp)
2199NoArgNoReturnVoidFunction(noqiflush)
2200
2201static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002202PyCurses_filter(PyObject *self)
2203{
Victor Stinner26486ea2010-05-15 22:23:53 +00002204 /* not checking for PyCursesInitialised here since filter() must
2205 be called before initscr() */
2206 filter();
2207 Py_INCREF(Py_None);
2208 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002209}
2210
2211static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002212PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002213{
Victor Stinner26486ea2010-05-15 22:23:53 +00002214 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002215
Victor Stinner26486ea2010-05-15 22:23:53 +00002216 PyCursesInitialised;
2217 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002218
Victor Stinner26486ea2010-05-15 22:23:53 +00002219 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002220
Victor Stinner26486ea2010-05-15 22:23:53 +00002221 if (color_content(color, &r, &g, &b) != ERR)
2222 return Py_BuildValue("(iii)", r, g, b);
2223 else {
2224 PyErr_SetString(PyCursesError,
2225 "Argument 1 was out of range. Check value of COLORS.");
2226 return NULL;
2227 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002228}
2229
2230static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002231PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232{
Victor Stinner26486ea2010-05-15 22:23:53 +00002233 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234
Victor Stinner26486ea2010-05-15 22:23:53 +00002235 PyCursesInitialised;
2236 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002237
Victor Stinner26486ea2010-05-15 22:23:53 +00002238 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2239 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240}
2241
2242static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002243PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002244{
Victor Stinner26486ea2010-05-15 22:23:53 +00002245 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246
Victor Stinner26486ea2010-05-15 22:23:53 +00002247 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002248
Victor Stinner26486ea2010-05-15 22:23:53 +00002249 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002250
Victor Stinner26486ea2010-05-15 22:23:53 +00002251 erg = curs_set(vis);
2252 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002253
Victor Stinner26486ea2010-05-15 22:23:53 +00002254 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255}
2256
2257static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002258PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002259{
Victor Stinner26486ea2010-05-15 22:23:53 +00002260 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002261
Victor Stinner26486ea2010-05-15 22:23:53 +00002262 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002263
Victor Stinner26486ea2010-05-15 22:23:53 +00002264 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002265
Victor Stinner26486ea2010-05-15 22:23:53 +00002266 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002267}
2268
2269static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002270PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002271{
Victor Stinner26486ea2010-05-15 22:23:53 +00002272 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002273
Victor Stinner26486ea2010-05-15 22:23:53 +00002274 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002275
Victor Stinner26486ea2010-05-15 22:23:53 +00002276 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002277
Victor Stinner26486ea2010-05-15 22:23:53 +00002278 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002279}
2280
2281static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002282PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002283{
Victor Stinner26486ea2010-05-15 22:23:53 +00002284 int x = 0;
2285 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002286
Victor Stinner26486ea2010-05-15 22:23:53 +00002287 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002288
Victor Stinner26486ea2010-05-15 22:23:53 +00002289 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002290
Victor Stinner26486ea2010-05-15 22:23:53 +00002291 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002292}
2293
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002294#ifdef NCURSES_MOUSE_VERSION
2295static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002296PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002297{
Victor Stinner26486ea2010-05-15 22:23:53 +00002298 int rtn;
2299 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002300
Victor Stinner26486ea2010-05-15 22:23:53 +00002301 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002302
Victor Stinner26486ea2010-05-15 22:23:53 +00002303 rtn = getmouse( &event );
2304 if (rtn == ERR) {
2305 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2306 return NULL;
2307 }
2308 return Py_BuildValue("(hiiil)",
2309 (short)event.id,
2310 event.x, event.y, event.z,
2311 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002312}
2313
2314static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002315PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002316{
Victor Stinner26486ea2010-05-15 22:23:53 +00002317 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002318
Victor Stinner26486ea2010-05-15 22:23:53 +00002319 PyCursesInitialised;
2320 if (!PyArg_ParseTuple(args, "hiiil",
2321 &event.id,
2322 &event.x, &event.y, &event.z,
2323 (int *) &event.bstate))
2324 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002325
Victor Stinner26486ea2010-05-15 22:23:53 +00002326 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002327}
2328#endif
2329
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002330static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002331PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002332{
Victor Stinner26486ea2010-05-15 22:23:53 +00002333 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002334 int fd = -1;
2335 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002336 PyObject *data;
2337 size_t datalen;
2338 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002339 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002340 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002341
Victor Stinner26486ea2010-05-15 22:23:53 +00002342 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002343
Victor Stinner26486ea2010-05-15 22:23:53 +00002344 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2345 fd = mkstemp(fn);
2346 if (fd < 0)
2347 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002348 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2349 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002350 fp = fdopen(fd, "wb+");
2351 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002352 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2353 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002354 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002355
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002356 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002357 if (data == NULL)
2358 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002359 if (!PyBytes_Check(data)) {
2360 PyErr_Format(PyExc_TypeError,
2361 "f.read() returned %.100s instead of bytes",
2362 data->ob_type->tp_name);
2363 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002364 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002365 }
2366 datalen = PyBytes_GET_SIZE(data);
2367 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2368 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002369 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2370 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002371 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002372 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002373
Victor Stinner26486ea2010-05-15 22:23:53 +00002374 fseek(fp, 0, 0);
2375 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002376 if (win == NULL) {
2377 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002378 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002379 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002380 res = PyCursesWindow_New(win, NULL);
2381
2382error:
2383 if (fp != NULL)
2384 fclose(fp);
2385 else if (fd != -1)
2386 close(fd);
2387 remove(fn);
2388 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389}
2390
2391static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002392PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002393{
Victor Stinner26486ea2010-05-15 22:23:53 +00002394 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002395
Victor Stinner26486ea2010-05-15 22:23:53 +00002396 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397
Victor Stinner26486ea2010-05-15 22:23:53 +00002398 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002399
Victor Stinner26486ea2010-05-15 22:23:53 +00002400 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002401}
2402
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002403#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002404/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002405static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002406{
Victor Stinner26486ea2010-05-15 22:23:53 +00002407 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002408
Victor Stinner26486ea2010-05-15 22:23:53 +00002409 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002410
Victor Stinner26486ea2010-05-15 22:23:53 +00002411 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002412
Victor Stinner26486ea2010-05-15 22:23:53 +00002413 if (has_key(ch) == FALSE) {
2414 Py_INCREF(Py_False);
2415 return Py_False;
2416 }
2417 Py_INCREF(Py_True);
2418 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002419}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002420#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002421
2422static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002423PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002424{
Victor Stinner26486ea2010-05-15 22:23:53 +00002425 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002426
Victor Stinner26486ea2010-05-15 22:23:53 +00002427 PyCursesInitialised;
2428 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002429
Victor Stinner26486ea2010-05-15 22:23:53 +00002430 switch(PyTuple_Size(args)) {
2431 case 4:
2432 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2433 break;
2434 default:
2435 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2436 return NULL;
2437 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002438
Victor Stinner26486ea2010-05-15 22:23:53 +00002439 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002440}
2441
2442static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002443PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002444{
Victor Stinner26486ea2010-05-15 22:23:53 +00002445 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002446
Victor Stinner26486ea2010-05-15 22:23:53 +00002447 PyCursesInitialised;
2448 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002449
Victor Stinner26486ea2010-05-15 22:23:53 +00002450 if (PyTuple_Size(args) != 3) {
2451 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2452 return NULL;
2453 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002454
Victor Stinner26486ea2010-05-15 22:23:53 +00002455 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002456
Victor Stinner26486ea2010-05-15 22:23:53 +00002457 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002458}
2459
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002460static PyObject *ModDict;
2461
Victor Stinner26486ea2010-05-15 22:23:53 +00002462static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002463PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002464{
Victor Stinner26486ea2010-05-15 22:23:53 +00002465 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002466 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002467
Victor Stinner26486ea2010-05-15 22:23:53 +00002468 if (initialised == TRUE) {
2469 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002470 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002471 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002472
Victor Stinner26486ea2010-05-15 22:23:53 +00002473 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002474
Victor Stinner26486ea2010-05-15 22:23:53 +00002475 if (win == NULL) {
2476 PyErr_SetString(PyCursesError, catchall_NULL);
2477 return NULL;
2478 }
Guido van Rossum85738471995-02-17 13:50:17 +00002479
Victor Stinner26486ea2010-05-15 22:23:53 +00002480 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002481
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002482/* This was moved from initcurses() because it core dumped on SGI,
2483 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002484#define SetDictInt(string,ch) \
2485 do { \
2486 PyObject *o = PyLong_FromLong((long) (ch)); \
2487 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2488 Py_DECREF(o); \
2489 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002490 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002491
Victor Stinner26486ea2010-05-15 22:23:53 +00002492 /* Here are some graphic symbols you can use */
2493 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2494 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2495 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2496 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2497 SetDictInt("ACS_LTEE", (ACS_LTEE));
2498 SetDictInt("ACS_RTEE", (ACS_RTEE));
2499 SetDictInt("ACS_BTEE", (ACS_BTEE));
2500 SetDictInt("ACS_TTEE", (ACS_TTEE));
2501 SetDictInt("ACS_HLINE", (ACS_HLINE));
2502 SetDictInt("ACS_VLINE", (ACS_VLINE));
2503 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002504#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002505 /* On HP/UX 11, these are of type cchar_t, which is not an
2506 integral type. If this is a problem on more platforms, a
2507 configure test should be added to determine whether ACS_S1
2508 is of integral type. */
2509 SetDictInt("ACS_S1", (ACS_S1));
2510 SetDictInt("ACS_S9", (ACS_S9));
2511 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2512 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2513 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2514 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2515 SetDictInt("ACS_BULLET", (ACS_BULLET));
2516 SetDictInt("ACS_LARROW", (ACS_LARROW));
2517 SetDictInt("ACS_RARROW", (ACS_RARROW));
2518 SetDictInt("ACS_DARROW", (ACS_DARROW));
2519 SetDictInt("ACS_UARROW", (ACS_UARROW));
2520 SetDictInt("ACS_BOARD", (ACS_BOARD));
2521 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2522 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002523#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002524 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2525 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2526 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2527 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2528 SetDictInt("ACS_SBSS", (ACS_RTEE));
2529 SetDictInt("ACS_SSSB", (ACS_LTEE));
2530 SetDictInt("ACS_SSBS", (ACS_BTEE));
2531 SetDictInt("ACS_BSSS", (ACS_TTEE));
2532 SetDictInt("ACS_BSBS", (ACS_HLINE));
2533 SetDictInt("ACS_SBSB", (ACS_VLINE));
2534 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002535
Victor Stinner26486ea2010-05-15 22:23:53 +00002536 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002537#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002538 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002539#endif
2540#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002541 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002542#endif
2543#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002544 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002545#endif
2546#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002547 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002548#endif
2549#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002550 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002551#endif
2552#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002553 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002554#endif
2555#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002556 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002557#endif
2558
Victor Stinner26486ea2010-05-15 22:23:53 +00002559 SetDictInt("LINES", LINES);
2560 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002561
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002562 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2563 screen_encoding = winobj->encoding;
2564 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002565}
2566
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002567static PyObject *
2568PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2569{
Victor Stinner26486ea2010-05-15 22:23:53 +00002570 int fd = -1;
2571 int err;
2572 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002573
Victor Stinner26486ea2010-05-15 22:23:53 +00002574 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002575
Victor Stinner26486ea2010-05-15 22:23:53 +00002576 if (!PyArg_ParseTupleAndKeywords(
2577 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2578 return NULL;
2579 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002580
Victor Stinner26486ea2010-05-15 22:23:53 +00002581 if (fd == -1) {
2582 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002583
Victor Stinnerbd303c12013-11-07 23:07:29 +01002584 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002585
Victor Stinner26486ea2010-05-15 22:23:53 +00002586 if (sys_stdout == NULL || sys_stdout == Py_None) {
2587 PyErr_SetString(
2588 PyCursesError,
2589 "lost sys.stdout");
2590 return NULL;
2591 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002592
Victor Stinner26486ea2010-05-15 22:23:53 +00002593 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002594
Victor Stinner26486ea2010-05-15 22:23:53 +00002595 if (fd == -1) {
2596 return NULL;
2597 }
2598 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002599
Matthias Klose635edd12010-07-30 21:40:57 +00002600 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002601 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002602
Victor Stinner26486ea2010-05-15 22:23:53 +00002603 if (err == 0) {
2604 s = "setupterm: could not find terminal";
2605 } else if (err == -1) {
2606 s = "setupterm: could not find terminfo database";
2607 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002608
Victor Stinner26486ea2010-05-15 22:23:53 +00002609 PyErr_SetString(PyCursesError,s);
2610 return NULL;
2611 }
2612
2613 initialised_setupterm = TRUE;
2614
2615 Py_INCREF(Py_None);
2616 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002617}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002618
2619static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002620PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002621{
Victor Stinner26486ea2010-05-15 22:23:53 +00002622 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002623
Victor Stinner26486ea2010-05-15 22:23:53 +00002624 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002625
Victor Stinner26486ea2010-05-15 22:23:53 +00002626 switch(PyTuple_Size(args)) {
2627 case 1:
2628 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2629 break;
2630 default:
2631 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2632 return NULL;
2633 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002634
Victor Stinner26486ea2010-05-15 22:23:53 +00002635 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002636}
2637
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002638#ifdef HAVE_CURSES_IS_TERM_RESIZED
2639static PyObject *
2640PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2641{
Victor Stinner26486ea2010-05-15 22:23:53 +00002642 int lines;
2643 int columns;
2644 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002645
Victor Stinner26486ea2010-05-15 22:23:53 +00002646 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002647
Victor Stinner26486ea2010-05-15 22:23:53 +00002648 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2649 return NULL;
2650 result = is_term_resized(lines, columns);
2651 if (result == TRUE) {
2652 Py_INCREF(Py_True);
2653 return Py_True;
2654 } else {
2655 Py_INCREF(Py_False);
2656 return Py_False;
2657 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002658}
2659#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2660
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002661#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002662static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002663PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002664{
Victor Stinner26486ea2010-05-15 22:23:53 +00002665 const char *knp;
2666 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002667
Victor Stinner26486ea2010-05-15 22:23:53 +00002668 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002669
Victor Stinner26486ea2010-05-15 22:23:53 +00002670 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002671
Victor Stinner26486ea2010-05-15 22:23:53 +00002672 if (ch < 0) {
2673 PyErr_SetString(PyExc_ValueError, "invalid key number");
2674 return NULL;
2675 }
2676 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002677
Victor Stinner26486ea2010-05-15 22:23:53 +00002678 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002679}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002680#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002681
Victor Stinner26486ea2010-05-15 22:23:53 +00002682static PyObject *
2683PyCurses_KillChar(PyObject *self)
2684{
2685 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002686
Victor Stinner26486ea2010-05-15 22:23:53 +00002687 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002688
Victor Stinner26486ea2010-05-15 22:23:53 +00002689 return PyBytes_FromStringAndSize(&ch, 1);
2690}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002691
2692static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002693PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002694{
Victor Stinner26486ea2010-05-15 22:23:53 +00002695 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002696
Victor Stinner26486ea2010-05-15 22:23:53 +00002697 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002698
Victor Stinner26486ea2010-05-15 22:23:53 +00002699 switch(PyTuple_Size(args)) {
2700 case 1:
2701 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2702 break;
2703 default:
2704 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2705 return NULL;
2706 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002707
Victor Stinner26486ea2010-05-15 22:23:53 +00002708 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002709}
2710
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002711#ifdef NCURSES_MOUSE_VERSION
2712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002713PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002714{
Victor Stinner26486ea2010-05-15 22:23:53 +00002715 int interval;
2716 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002717
Victor Stinner26486ea2010-05-15 22:23:53 +00002718 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2719 return NULL;
2720 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002721}
2722
2723static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002724PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002725{
Victor Stinner26486ea2010-05-15 22:23:53 +00002726 int newmask;
2727 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002728
Victor Stinner26486ea2010-05-15 22:23:53 +00002729 PyCursesInitialised;
2730 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2731 return NULL;
2732 availmask = mousemask(newmask, &oldmask);
2733 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002734}
2735#endif
2736
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002737static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002738PyCurses_Napms(PyObject *self, PyObject *args)
2739{
2740 int ms;
2741
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002742 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002743 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002744
2745 return Py_BuildValue("i", napms(ms));
2746}
2747
2748
2749static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002750PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002751{
Victor Stinner26486ea2010-05-15 22:23:53 +00002752 WINDOW *win;
2753 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002754
Victor Stinner26486ea2010-05-15 22:23:53 +00002755 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002756
Victor Stinner26486ea2010-05-15 22:23:53 +00002757 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002758
Victor Stinner26486ea2010-05-15 22:23:53 +00002759 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002760
Victor Stinner26486ea2010-05-15 22:23:53 +00002761 if (win == NULL) {
2762 PyErr_SetString(PyCursesError, catchall_NULL);
2763 return NULL;
2764 }
2765
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002766 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002767}
2768
2769static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002770PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002771{
Victor Stinner26486ea2010-05-15 22:23:53 +00002772 WINDOW *win;
2773 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002774
Victor Stinner26486ea2010-05-15 22:23:53 +00002775 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002776
Victor Stinner26486ea2010-05-15 22:23:53 +00002777 switch (PyTuple_Size(args)) {
2778 case 2:
2779 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2780 return NULL;
2781 break;
2782 case 4:
2783 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2784 &nlines,&ncols,&begin_y,&begin_x))
2785 return NULL;
2786 break;
2787 default:
2788 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2789 return NULL;
2790 }
Guido van Rossum85738471995-02-17 13:50:17 +00002791
Victor Stinner26486ea2010-05-15 22:23:53 +00002792 win = newwin(nlines,ncols,begin_y,begin_x);
2793 if (win == NULL) {
2794 PyErr_SetString(PyCursesError, catchall_NULL);
2795 return NULL;
2796 }
Guido van Rossum85738471995-02-17 13:50:17 +00002797
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002798 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002799}
2800
2801static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002802PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002803{
Victor Stinner26486ea2010-05-15 22:23:53 +00002804 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002805
Victor Stinner26486ea2010-05-15 22:23:53 +00002806 PyCursesInitialised;
2807 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002808
Victor Stinner26486ea2010-05-15 22:23:53 +00002809 switch(PyTuple_Size(args)) {
2810 case 1:
2811 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2812 break;
2813 default:
2814 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2815 return NULL;
2816 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002817
Victor Stinner26486ea2010-05-15 22:23:53 +00002818 if (pair_content(pair, &f, &b)==ERR) {
2819 PyErr_SetString(PyCursesError,
2820 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2821 return NULL;
2822 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002823
Victor Stinner26486ea2010-05-15 22:23:53 +00002824 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002825}
2826
2827static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002828PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002829{
Victor Stinner26486ea2010-05-15 22:23:53 +00002830 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002831
Victor Stinner26486ea2010-05-15 22:23:53 +00002832 PyCursesInitialised;
2833 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002834
Victor Stinner26486ea2010-05-15 22:23:53 +00002835 switch(PyTuple_Size(args)) {
2836 case 1:
2837 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2838 break;
2839 default:
2840 PyErr_SetString(PyExc_TypeError,
2841 "pair_number requires 1 argument");
2842 return NULL;
2843 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002844
Victor Stinner26486ea2010-05-15 22:23:53 +00002845 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002846}
2847
2848static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002849PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002850{
Victor Stinner26486ea2010-05-15 22:23:53 +00002851 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002852
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002853 if (!PyArg_ParseTuple(args,"y;str", &str))
2854 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002855 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002856}
2857
2858static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002859PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002860{
Victor Stinner26486ea2010-05-15 22:23:53 +00002861 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002862
Victor Stinner26486ea2010-05-15 22:23:53 +00002863 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002864
Victor Stinner26486ea2010-05-15 22:23:53 +00002865 switch(PyTuple_Size(args)) {
2866 case 0:
2867 qiflush();
2868 Py_INCREF(Py_None);
2869 return Py_None;
2870 case 1:
2871 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2872 if (flag) qiflush();
2873 else noqiflush();
2874 Py_INCREF(Py_None);
2875 return Py_None;
2876 default:
2877 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2878 return NULL;
2879 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002880}
2881
Guido van Rossumd8faa362007-04-27 19:54:29 +00002882/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2883 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002884#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002885static int
2886update_lines_cols(void)
2887{
Victor Stinner26486ea2010-05-15 22:23:53 +00002888 PyObject *o;
2889 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002890 _Py_IDENTIFIER(LINES);
2891 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002892
Victor Stinner26486ea2010-05-15 22:23:53 +00002893 if (!m)
2894 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002895
Victor Stinner26486ea2010-05-15 22:23:53 +00002896 o = PyLong_FromLong(LINES);
2897 if (!o) {
2898 Py_DECREF(m);
2899 return 0;
2900 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002901 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002902 Py_DECREF(m);
2903 Py_DECREF(o);
2904 return 0;
2905 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002906 /* PyId_LINES.object will be initialized here. */
2907 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002908 Py_DECREF(m);
2909 Py_DECREF(o);
2910 return 0;
2911 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002912 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002913 o = PyLong_FromLong(COLS);
2914 if (!o) {
2915 Py_DECREF(m);
2916 return 0;
2917 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002918 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002919 Py_DECREF(m);
2920 Py_DECREF(o);
2921 return 0;
2922 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002923 if (PyDict_SetItem(ModDict, PyId_COLS.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);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002929 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002930 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002931}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002932#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002933
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002934#ifdef HAVE_CURSES_RESIZETERM
2935static PyObject *
2936PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2937{
Victor Stinner26486ea2010-05-15 22:23:53 +00002938 int lines;
2939 int columns;
2940 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002941
Victor Stinner26486ea2010-05-15 22:23:53 +00002942 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002943
Victor Stinner26486ea2010-05-15 22:23:53 +00002944 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2945 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002946
Victor Stinner26486ea2010-05-15 22:23:53 +00002947 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2948 if (!result)
2949 return NULL;
2950 if (!update_lines_cols())
2951 return NULL;
2952 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002953}
2954
2955#endif
2956
2957#ifdef HAVE_CURSES_RESIZE_TERM
2958static PyObject *
2959PyCurses_Resize_Term(PyObject *self, PyObject *args)
2960{
Victor Stinner26486ea2010-05-15 22:23:53 +00002961 int lines;
2962 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002963
Victor Stinner26486ea2010-05-15 22:23:53 +00002964 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002965
Victor Stinner26486ea2010-05-15 22:23:53 +00002966 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002967
Victor Stinner26486ea2010-05-15 22:23:53 +00002968 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2969 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002970
Victor Stinner26486ea2010-05-15 22:23:53 +00002971 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2972 if (!result)
2973 return NULL;
2974 if (!update_lines_cols())
2975 return NULL;
2976 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002977}
2978#endif /* HAVE_CURSES_RESIZE_TERM */
2979
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002980static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002981PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002982{
Victor Stinner26486ea2010-05-15 22:23:53 +00002983 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002984
Victor Stinner26486ea2010-05-15 22:23:53 +00002985 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002986
Victor Stinner26486ea2010-05-15 22:23:53 +00002987 if (PyTuple_Size(args)!=2) {
2988 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2989 return NULL;
2990 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002991
Victor Stinner26486ea2010-05-15 22:23:53 +00002992 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002993
Victor Stinner26486ea2010-05-15 22:23:53 +00002994 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002995
Victor Stinner26486ea2010-05-15 22:23:53 +00002996 Py_INCREF(Py_None);
2997 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002998}
2999
3000static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00003001PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003002{
Victor Stinner26486ea2010-05-15 22:23:53 +00003003 int code;
3004 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003005
Victor Stinner26486ea2010-05-15 22:23:53 +00003006 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003007
Victor Stinner26486ea2010-05-15 22:23:53 +00003008 code = start_color();
3009 if (code != ERR) {
3010 initialisedcolors = TRUE;
3011 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003012 if (c == NULL)
3013 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003014 PyDict_SetItemString(ModDict, "COLORS", c);
3015 Py_DECREF(c);
3016 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003017 if (cp == NULL)
3018 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003019 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3020 Py_DECREF(cp);
3021 Py_INCREF(Py_None);
3022 return Py_None;
3023 } else {
3024 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3025 return NULL;
3026 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003027}
3028
3029static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003030PyCurses_tigetflag(PyObject *self, PyObject *args)
3031{
Victor Stinner26486ea2010-05-15 22:23:53 +00003032 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003033
Victor Stinner26486ea2010-05-15 22:23:53 +00003034 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003035
Victor Stinner26486ea2010-05-15 22:23:53 +00003036 if (!PyArg_ParseTuple(args, "s", &capname))
3037 return NULL;
3038
3039 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003040}
3041
3042static PyObject *
3043PyCurses_tigetnum(PyObject *self, PyObject *args)
3044{
Victor Stinner26486ea2010-05-15 22:23:53 +00003045 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003046
Victor Stinner26486ea2010-05-15 22:23:53 +00003047 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003048
Victor Stinner26486ea2010-05-15 22:23:53 +00003049 if (!PyArg_ParseTuple(args, "s", &capname))
3050 return NULL;
3051
3052 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003053}
3054
3055static PyObject *
3056PyCurses_tigetstr(PyObject *self, PyObject *args)
3057{
Victor Stinner26486ea2010-05-15 22:23:53 +00003058 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003059
Victor Stinner26486ea2010-05-15 22:23:53 +00003060 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003061
Victor Stinner26486ea2010-05-15 22:23:53 +00003062 if (!PyArg_ParseTuple(args, "s", &capname))
3063 return NULL;
3064
3065 capname = tigetstr( capname );
3066 if (capname == 0 || capname == (char*) -1) {
3067 Py_INCREF(Py_None);
3068 return Py_None;
3069 }
3070 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003071}
3072
3073static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003074PyCurses_tparm(PyObject *self, PyObject *args)
3075{
Victor Stinner26486ea2010-05-15 22:23:53 +00003076 char* fmt;
3077 char* result = NULL;
3078 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 +00003079
Victor Stinner26486ea2010-05-15 22:23:53 +00003080 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003081
Victor Stinner26621332011-11-02 23:45:29 +01003082 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003083 &fmt, &i1, &i2, &i3, &i4,
3084 &i5, &i6, &i7, &i8, &i9)) {
3085 return NULL;
3086 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003087
Victor Stinner26486ea2010-05-15 22:23:53 +00003088 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3089 if (!result) {
3090 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3091 return NULL;
3092 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003093
Victor Stinner26486ea2010-05-15 22:23:53 +00003094 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003095}
3096
3097static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003098PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003099{
Victor Stinner26486ea2010-05-15 22:23:53 +00003100 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003101
Victor Stinner26486ea2010-05-15 22:23:53 +00003102 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003103
Victor Stinner26486ea2010-05-15 22:23:53 +00003104 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003105
Victor Stinner26486ea2010-05-15 22:23:53 +00003106 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003107}
3108
3109static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003110PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003111{
Victor Stinner26486ea2010-05-15 22:23:53 +00003112 PyObject *temp;
3113 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003114
Victor Stinner26486ea2010-05-15 22:23:53 +00003115 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003116
Victor Stinner26486ea2010-05-15 22:23:53 +00003117 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003118
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003119 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003120 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003121
Victor Stinner26486ea2010-05-15 22:23:53 +00003122 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003123}
3124
3125static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003126PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +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 Stinner0fdfceb2011-11-25 22:10:02 +01003133 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003134 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003135
3136 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3137 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003138
Victor Stinner26486ea2010-05-15 22:23:53 +00003139 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003140}
3141
Victor Stinner71e44cb2011-09-06 01:53:03 +02003142#ifdef HAVE_NCURSESW
3143/* Convert an object to a character (wchar_t):
3144
3145 - int
3146 - str of length 1
3147
3148 Return 1 on success, 0 on error. */
3149static int
3150PyCurses_ConvertToWchar_t(PyObject *obj,
3151 wchar_t *wch)
3152{
3153 if (PyUnicode_Check(obj)) {
3154 wchar_t buffer[2];
3155 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3156 PyErr_Format(PyExc_TypeError,
3157 "expect bytes or str of length 1, or int, "
3158 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003159 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003160 return 0;
3161 }
3162 *wch = buffer[0];
3163 return 2;
3164 }
3165 else if (PyLong_CheckExact(obj)) {
3166 long value;
3167 int overflow;
3168 value = PyLong_AsLongAndOverflow(obj, &overflow);
3169 if (overflow) {
3170 PyErr_SetString(PyExc_OverflowError,
3171 "int doesn't fit in long");
3172 return 0;
3173 }
3174 *wch = (wchar_t)value;
3175 if ((long)*wch != value) {
3176 PyErr_Format(PyExc_OverflowError,
3177 "character doesn't fit in wchar_t");
3178 return 0;
3179 }
3180 return 1;
3181 }
3182 else {
3183 PyErr_Format(PyExc_TypeError,
3184 "expect bytes or str of length 1, or int, got %s",
3185 Py_TYPE(obj)->tp_name);
3186 return 0;
3187 }
3188}
3189
3190static PyObject *
3191PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3192{
3193 PyObject *obj;
3194 wchar_t wch;
3195
3196 PyCursesInitialised;
3197
3198 if (!PyArg_ParseTuple(args,"O", &obj))
3199 return NULL;
3200
3201 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3202 return NULL;
3203 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3204}
3205#endif
3206
Guido van Rossumf6971e21994-08-30 12:25:20 +00003207static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003208PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003209{
Victor Stinner26486ea2010-05-15 22:23:53 +00003210 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003211
Victor Stinner26486ea2010-05-15 22:23:53 +00003212 switch(PyTuple_Size(args)) {
3213 case 1:
3214 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3215 return NULL;
3216 break;
3217 default:
3218 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3219 return NULL;
3220 }
3221 use_env(flag);
3222 Py_INCREF(Py_None);
3223 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003224}
3225
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003226#ifndef STRICT_SYSV_CURSES
3227static PyObject *
3228PyCurses_Use_Default_Colors(PyObject *self)
3229{
Victor Stinner26486ea2010-05-15 22:23:53 +00003230 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003231
Victor Stinner26486ea2010-05-15 22:23:53 +00003232 PyCursesInitialised;
3233 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003234
Victor Stinner26486ea2010-05-15 22:23:53 +00003235 code = use_default_colors();
3236 if (code != ERR) {
3237 Py_INCREF(Py_None);
3238 return Py_None;
3239 } else {
3240 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3241 return NULL;
3242 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003243}
3244#endif /* STRICT_SYSV_CURSES */
3245
Guido van Rossumf6971e21994-08-30 12:25:20 +00003246/* List of functions defined in the module */
3247
3248static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003249 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3250 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3251 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3252 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3253 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3254 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3255 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3256 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3257 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3258 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3259 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3260 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3261 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3262 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3263 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3264 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3265 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003266#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003267 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3268 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003269#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003270 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3271 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3272 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3273 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3274 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003275#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003276 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003277#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003278 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3279 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3280 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3281 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3282 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3283 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003284#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003285 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003286#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003287#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003288 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003289#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003290 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3291 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3292 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003293#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003294 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3295 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003296#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003297 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3298 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3299 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3300 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3301 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3302 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3303 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3304 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3305 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3306 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3307 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3308 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3309 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3310 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3311 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3312 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3313 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003314#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003315 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003316#endif
3317#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003318 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003320 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3321 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3322 {"setupterm", (PyCFunction)PyCurses_setupterm,
3323 METH_VARARGS|METH_KEYWORDS},
3324 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3325 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3326 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3327 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3328 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3329 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3330 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3331 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3332 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3333 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003334#ifdef HAVE_NCURSESW
3335 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3336#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003337 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003338#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003339 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003340#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003341 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003342};
3343
3344/* Initialization function for the module */
3345
Martin v. Löwis1a214512008-06-11 05:26:20 +00003346
3347static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003348 PyModuleDef_HEAD_INIT,
3349 "_curses",
3350 NULL,
3351 -1,
3352 PyCurses_methods,
3353 NULL,
3354 NULL,
3355 NULL,
3356 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003357};
3358
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003359PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003360PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003361{
Victor Stinner26486ea2010-05-15 22:23:53 +00003362 PyObject *m, *d, *v, *c_api_object;
3363 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003364
Victor Stinner26486ea2010-05-15 22:23:53 +00003365 /* Initialize object type */
3366 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3367 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003368
Victor Stinner26486ea2010-05-15 22:23:53 +00003369 /* Initialize the C API pointer array */
3370 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3371 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3372 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3373 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003374
Victor Stinner26486ea2010-05-15 22:23:53 +00003375 /* Create the module and add the functions */
3376 m = PyModule_Create(&_cursesmodule);
3377 if (m == NULL)
3378 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003379
Victor Stinner26486ea2010-05-15 22:23:53 +00003380 /* Add some symbolic constants to the module */
3381 d = PyModule_GetDict(m);
3382 if (d == NULL)
3383 return NULL;
3384 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003385
Victor Stinner26486ea2010-05-15 22:23:53 +00003386 /* Add a capsule for the C API */
3387 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3388 PyDict_SetItemString(d, "_C_API", c_api_object);
3389 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003390
Victor Stinner26486ea2010-05-15 22:23:53 +00003391 /* For exception curses.error */
3392 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3393 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003394
Victor Stinner26486ea2010-05-15 22:23:53 +00003395 /* Make the version available */
3396 v = PyBytes_FromString(PyCursesVersion);
3397 PyDict_SetItemString(d, "version", v);
3398 PyDict_SetItemString(d, "__version__", v);
3399 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003400
Victor Stinner26486ea2010-05-15 22:23:53 +00003401 SetDictInt("ERR", ERR);
3402 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003403
Victor Stinner26486ea2010-05-15 22:23:53 +00003404 /* Here are some attributes you can add to chars to print */
3405
3406 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3407 SetDictInt("A_NORMAL", A_NORMAL);
3408 SetDictInt("A_STANDOUT", A_STANDOUT);
3409 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3410 SetDictInt("A_REVERSE", A_REVERSE);
3411 SetDictInt("A_BLINK", A_BLINK);
3412 SetDictInt("A_DIM", A_DIM);
3413 SetDictInt("A_BOLD", A_BOLD);
3414 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003415#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003416 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003417#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003418 SetDictInt("A_PROTECT", A_PROTECT);
3419 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3420 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003421
Victor Stinner26486ea2010-05-15 22:23:53 +00003422 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003423#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003424 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003425#endif
3426#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003427 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003428#endif
3429#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003430 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003431#endif
3432#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003433 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003434#endif
3435#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003436 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003437#endif
3438#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003439 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003440#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003441
Victor Stinner26486ea2010-05-15 22:23:53 +00003442 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3443 SetDictInt("COLOR_RED", COLOR_RED);
3444 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3445 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3446 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3447 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3448 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3449 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003450
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003451#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003452 /* Mouse-related constants */
3453 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3454 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3455 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3456 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3457 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003458
Victor Stinner26486ea2010-05-15 22:23:53 +00003459 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3460 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3461 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3462 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3463 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003464
Victor Stinner26486ea2010-05-15 22:23:53 +00003465 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3466 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3467 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3468 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3469 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003470
Victor Stinner26486ea2010-05-15 22:23:53 +00003471 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3472 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3473 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3474 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3475 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003476
Victor Stinner26486ea2010-05-15 22:23:53 +00003477 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3478 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3479 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003480
Victor Stinner26486ea2010-05-15 22:23:53 +00003481 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3482 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003483#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003484 /* Now set everything up for KEY_ variables */
3485 {
3486 int key;
3487 char *key_n;
3488 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003489#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003490 for (key=KEY_MIN;key < KEY_MAX; key++) {
3491 key_n = (char *)keyname(key);
3492 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3493 continue;
3494 if (strncmp(key_n,"KEY_F(",6)==0) {
3495 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003496 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003497 if (!key_n2) {
3498 PyErr_NoMemory();
3499 break;
3500 }
3501 p1 = key_n;
3502 p2 = key_n2;
3503 while (*p1) {
3504 if (*p1 != '(' && *p1 != ')') {
3505 *p2 = *p1;
3506 p2++;
3507 }
3508 p1++;
3509 }
3510 *p2 = (char)0;
3511 } else
3512 key_n2 = key_n;
3513 SetDictInt(key_n2,key);
3514 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003515 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003516 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003517#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003518 SetDictInt("KEY_MIN", KEY_MIN);
3519 SetDictInt("KEY_MAX", KEY_MAX);
3520 }
3521 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003522}