blob: 9eaf09caf537f9628abf081a0162e2b864222a48 [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
139class curses.window
Larry Hastings61272b72014-01-07 12:41:53 -0800140[clinic start generated code]*/
141/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
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 [
563 x: int
564 X-coordinate.
565 y: int
566 Y-coordinate.
567 ]
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 Hastings44e2eaa2013-11-23 15:37:55 -0800587"addch([x, y,] 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" x\n"
591" X-coordinate.\n"
592" y\n"
593" Y-coordinate.\n"
594" 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 Hastings31826802013-10-19 00:09:25 -0700608curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
609
610static PyObject *
611curses_window_addch(PyObject *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 x = 0;
616 int y = 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))
624 return NULL;
625 break;
626 case 2:
627 if (!PyArg_ParseTuple(args, "Ol:addch", &ch, &attr))
628 return NULL;
629 group_right_1 = 1;
630 break;
631 case 3:
632 if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
633 return NULL;
634 group_left_1 = 1;
635 break;
636 case 4:
637 if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
638 return NULL;
639 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");
644 return NULL;
645 }
646 return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
647
648 return return_value;
649}
650
651static PyObject *
652curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
Larry Hastings2a727912014-01-16 11:32:01 -0800653/*[clinic end generated code: checksum=b073327add8197b6ba7fb96c87062422c8312954]*/
Larry Hastings31826802013-10-19 00:09:25 -0700654{
655 PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
656 int coordinates_group = group_left_1;
657 int attr_group = group_right_1;
658 int rtn;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100659 int type;
Larry Hastings31826802013-10-19 00:09:25 -0700660 chtype cch;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100661#ifdef HAVE_NCURSESW
662 cchar_t wch;
663#endif
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100664 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000665
Larry Hastings31826802013-10-19 00:09:25 -0700666 if (!attr_group)
667 attr = A_NORMAL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000668
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100669#ifdef HAVE_NCURSESW
Larry Hastings31826802013-10-19 00:09:25 -0700670 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100671 if (type == 2) {
672 funcname = "add_wch";
673 wch.attr = attr;
Larry Hastings31826802013-10-19 00:09:25 -0700674 if (coordinates_group)
675 rtn = mvwadd_wch(cwself->win,y,x, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100676 else {
Larry Hastings31826802013-10-19 00:09:25 -0700677 rtn = wadd_wch(cwself->win, &wch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100678 }
679 }
680 else
681#else
Serhiy Storchakaa412f762013-10-19 10:45:48 +0300682 type = PyCurses_ConvertToCchar_t(cwself, ch, &cch);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100683#endif
684 if (type == 1) {
685 funcname = "addch";
Larry Hastings31826802013-10-19 00:09:25 -0700686 if (coordinates_group)
687 rtn = mvwaddch(cwself->win,y,x, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100688 else {
Larry Hastings31826802013-10-19 00:09:25 -0700689 rtn = waddch(cwself->win, cch | attr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100690 }
691 }
692 else {
Victor Stinner26486ea2010-05-15 22:23:53 +0000693 return NULL;
694 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100695 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000696}
697
698static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000699PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000700{
Victor Stinner26486ea2010-05-15 22:23:53 +0000701 int rtn;
702 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100703 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500704 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100705#ifdef HAVE_NCURSESW
706 wchar_t *wstr = NULL;
707#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000708 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
709 long lattr;
710 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100711 const char *funcname;
Guido van Rossum85738471995-02-17 13:50:17 +0000712
Victor Stinner26486ea2010-05-15 22:23:53 +0000713 switch (PyTuple_Size(args)) {
714 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100715 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000716 return NULL;
717 break;
718 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100719 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000720 return NULL;
721 attr = lattr;
722 use_attr = TRUE;
723 break;
724 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100725 if (!PyArg_ParseTuple(args,"iiO;int,int,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +0000726 return NULL;
727 use_xy = TRUE;
728 break;
729 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100730 if (!PyArg_ParseTuple(args,"iiOl;int,int,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000731 return NULL;
732 attr = lattr;
733 use_xy = use_attr = TRUE;
734 break;
735 default:
736 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
737 return NULL;
738 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100739#ifdef HAVE_NCURSESW
740 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
741#else
742 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
743#endif
744 if (strtype == 0)
745 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000746 if (use_attr == TRUE) {
747 attr_old = getattrs(self->win);
748 (void)wattrset(self->win,attr);
749 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100750#ifdef HAVE_NCURSESW
751 if (strtype == 2) {
752 funcname = "addwstr";
753 if (use_xy == TRUE)
754 rtn = mvwaddwstr(self->win,y,x,wstr);
755 else
756 rtn = waddwstr(self->win,wstr);
757 PyMem_Free(wstr);
758 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000759 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100760#endif
761 {
762 char *str = PyBytes_AS_STRING(bytesobj);
763 funcname = "addstr";
764 if (use_xy == TRUE)
765 rtn = mvwaddstr(self->win,y,x,str);
766 else
767 rtn = waddstr(self->win,str);
768 Py_DECREF(bytesobj);
769 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000770 if (use_attr == TRUE)
771 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100772 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000773}
Guido van Rossum85738471995-02-17 13:50:17 +0000774
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000775static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000776PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000777{
Victor Stinner26486ea2010-05-15 22:23:53 +0000778 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100779 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -0500780 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100781#ifdef HAVE_NCURSESW
782 wchar_t *wstr = NULL;
783#endif
Victor Stinner26486ea2010-05-15 22:23:53 +0000784 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
785 long lattr;
786 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100787 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000788
Victor Stinner26486ea2010-05-15 22:23:53 +0000789 switch (PyTuple_Size(args)) {
790 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100791 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000792 return NULL;
793 break;
794 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100795 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000796 return NULL;
797 attr = lattr;
798 use_attr = TRUE;
799 break;
800 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100801 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +0000802 return NULL;
803 use_xy = TRUE;
804 break;
805 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100806 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +0000807 return NULL;
808 attr = lattr;
809 use_xy = use_attr = TRUE;
810 break;
811 default:
812 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
813 return NULL;
814 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100815#ifdef HAVE_NCURSESW
816 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
817#else
818 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
819#endif
820 if (strtype == 0)
821 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000822
Victor Stinner26486ea2010-05-15 22:23:53 +0000823 if (use_attr == TRUE) {
824 attr_old = getattrs(self->win);
825 (void)wattrset(self->win,attr);
826 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100827#ifdef HAVE_NCURSESW
828 if (strtype == 2) {
829 funcname = "addnwstr";
830 if (use_xy == TRUE)
831 rtn = mvwaddnwstr(self->win,y,x,wstr,n);
832 else
833 rtn = waddnwstr(self->win,wstr,n);
834 PyMem_Free(wstr);
835 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000836 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100837#endif
838 {
839 char *str = PyBytes_AS_STRING(bytesobj);
840 funcname = "addnstr";
841 if (use_xy == TRUE)
842 rtn = mvwaddnstr(self->win,y,x,str,n);
843 else
844 rtn = waddnstr(self->win,str,n);
845 Py_DECREF(bytesobj);
846 }
Victor Stinner26486ea2010-05-15 22:23:53 +0000847 if (use_attr == TRUE)
848 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100849 return PyCursesCheckERR(rtn, funcname);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000850}
851
852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854{
Victor Stinner26486ea2010-05-15 22:23:53 +0000855 PyObject *temp;
856 chtype bkgd;
857 attr_t attr = A_NORMAL;
858 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000859
Victor Stinner26486ea2010-05-15 22:23:53 +0000860 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000862 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
863 return NULL;
864 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000865 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000866 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
867 return NULL;
868 attr = lattr;
869 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000871 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
872 return NULL;
873 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000874
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100875 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000876 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000877
Victor Stinner26486ea2010-05-15 22:23:53 +0000878 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000879}
880
881static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +0000882PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
883{
Victor Stinner26486ea2010-05-15 22:23:53 +0000884 long lattr;
885 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
886 return NULL;
887 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
Christian Heimes2380ac72008-01-09 00:17:24 +0000888}
889
890static PyObject *
891PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
892{
Victor Stinner26486ea2010-05-15 22:23:53 +0000893 long lattr;
894 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
895 return NULL;
896 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
Christian Heimes2380ac72008-01-09 00:17:24 +0000897}
898
899static PyObject *
900PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
901{
Victor Stinner26486ea2010-05-15 22:23:53 +0000902 long lattr;
903 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
904 return NULL;
905 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
Christian Heimes2380ac72008-01-09 00:17:24 +0000906}
907
908static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000909PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000910{
Victor Stinner26486ea2010-05-15 22:23:53 +0000911 PyObject *temp;
912 chtype bkgd;
913 attr_t attr = A_NORMAL;
914 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000915
Victor Stinner26486ea2010-05-15 22:23:53 +0000916 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000917 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +0000918 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
919 return NULL;
920 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000921 case 2:
Victor Stinner26486ea2010-05-15 22:23:53 +0000922 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
923 return NULL;
924 attr = lattr;
925 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000926 default:
Victor Stinner26486ea2010-05-15 22:23:53 +0000927 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
928 return NULL;
929 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000930
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100931 if (!PyCurses_ConvertToChtype(self, temp, &bkgd))
Victor Stinner26486ea2010-05-15 22:23:53 +0000932 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000933
Victor Stinner26486ea2010-05-15 22:23:53 +0000934 wbkgdset(self->win, bkgd | attr);
935 return PyCursesCheckERR(0, "bkgdset");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000936}
937
938static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000939PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000940{
Victor Stinner26486ea2010-05-15 22:23:53 +0000941 PyObject *temp[8];
942 chtype ch[8];
943 int i;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000944
Victor Stinner26486ea2010-05-15 22:23:53 +0000945 /* Clear the array of parameters */
946 for(i=0; i<8; i++) {
947 temp[i] = NULL;
948 ch[i] = 0;
949 }
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000950
Victor Stinner26486ea2010-05-15 22:23:53 +0000951 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
952 &temp[0], &temp[1], &temp[2], &temp[3],
953 &temp[4], &temp[5], &temp[6], &temp[7]))
954 return NULL;
955
956 for(i=0; i<8; i++) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +0100957 if (temp[i] != NULL && !PyCurses_ConvertToChtype(self, temp[i], &ch[i]))
Victor Stinner26486ea2010-05-15 22:23:53 +0000958 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +0000959 }
960
961 wborder(self->win,
962 ch[0], ch[1], ch[2], ch[3],
963 ch[4], ch[5], ch[6], ch[7]);
964 Py_INCREF(Py_None);
965 return Py_None;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966}
967
968static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000969PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000970{
Victor Stinner26486ea2010-05-15 22:23:53 +0000971 chtype ch1=0,ch2=0;
972 switch(PyTuple_Size(args)){
973 case 0: break;
974 default:
975 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
976 return NULL;
977 }
978 box(self->win,ch1,ch2);
979 Py_INCREF(Py_None);
980 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000981}
982
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000983#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
984#define py_mvwdelch mvwdelch
985#else
986int py_mvwdelch(WINDOW *w, int y, int x)
987{
Victor Stinner26486ea2010-05-15 22:23:53 +0000988 mvwdelch(w,y,x);
989 /* On HP/UX, mvwdelch already returns. On other systems,
990 we may well run into this return statement. */
991 return 0;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000992}
993#endif
994
Guido van Rossumd8faa362007-04-27 19:54:29 +0000995/* chgat, added by Fabian Kreutz <fabian.kreutz at gmx.net> */
996
997static PyObject *
998PyCursesWindow_ChgAt(PyCursesWindowObject *self, PyObject *args)
999{
Victor Stinner26486ea2010-05-15 22:23:53 +00001000 int rtn;
1001 int x, y;
1002 int num = -1;
1003 short color;
1004 attr_t attr = A_NORMAL;
1005 long lattr;
1006 int use_xy = FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001007
Victor Stinner26486ea2010-05-15 22:23:53 +00001008 switch (PyTuple_Size(args)) {
1009 case 1:
1010 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
1011 return NULL;
1012 attr = lattr;
1013 break;
1014 case 2:
1015 if (!PyArg_ParseTuple(args,"il;n,attr", &num, &lattr))
1016 return NULL;
1017 attr = lattr;
1018 break;
1019 case 3:
1020 if (!PyArg_ParseTuple(args,"iil;int,int,attr", &y, &x, &lattr))
1021 return NULL;
1022 attr = lattr;
1023 use_xy = TRUE;
1024 break;
1025 case 4:
1026 if (!PyArg_ParseTuple(args,"iiil;int,int,n,attr", &y, &x, &num, &lattr))
1027 return NULL;
1028 attr = lattr;
1029 use_xy = TRUE;
1030 break;
1031 default:
1032 PyErr_SetString(PyExc_TypeError, "chgat requires 1 to 4 arguments");
1033 return NULL;
1034 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035
Victor Stinner26486ea2010-05-15 22:23:53 +00001036 color = (short)((attr >> 8) & 0xff);
1037 attr = attr - (color << 8);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038
Victor Stinner26486ea2010-05-15 22:23:53 +00001039 if (use_xy == TRUE) {
1040 rtn = mvwchgat(self->win,y,x,num,attr,color,NULL);
1041 touchline(self->win,y,1);
1042 } else {
1043 getyx(self->win,y,x);
1044 rtn = wchgat(self->win,num,attr,color,NULL);
1045 touchline(self->win,y,1);
1046 }
1047 return PyCursesCheckERR(rtn, "chgat");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001048}
1049
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001050
Guido van Rossumf6971e21994-08-30 12:25:20 +00001051static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001052PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001053{
Victor Stinner26486ea2010-05-15 22:23:53 +00001054 int rtn;
1055 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +00001056
Victor Stinner26486ea2010-05-15 22:23:53 +00001057 switch (PyTuple_Size(args)) {
1058 case 0:
1059 rtn = wdelch(self->win);
1060 break;
1061 case 2:
1062 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1063 return NULL;
1064 rtn = py_mvwdelch(self->win,y,x);
1065 break;
1066 default:
1067 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
1068 return NULL;
1069 }
1070 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001071}
1072
1073static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001074PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001075{
Victor Stinner26486ea2010-05-15 22:23:53 +00001076 WINDOW *win;
1077 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001078
Victor Stinner26486ea2010-05-15 22:23:53 +00001079 nlines = 0;
1080 ncols = 0;
1081 switch (PyTuple_Size(args)) {
1082 case 2:
1083 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1084 return NULL;
1085 break;
1086 case 4:
1087 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1088 &nlines,&ncols,&begin_y,&begin_x))
1089 return NULL;
1090 break;
1091 default:
1092 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
1093 return NULL;
1094 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001095
Victor Stinner26486ea2010-05-15 22:23:53 +00001096 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001097
Victor Stinner26486ea2010-05-15 22:23:53 +00001098 if (win == NULL) {
1099 PyErr_SetString(PyCursesError, catchall_NULL);
1100 return NULL;
1101 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001102
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001103 return (PyObject *)PyCursesWindow_New(win, NULL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001104}
1105
1106static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001107PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001108{
Victor Stinner26486ea2010-05-15 22:23:53 +00001109 PyObject *temp;
1110 chtype ch;
1111 attr_t attr = A_NORMAL;
1112 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +00001113
Victor Stinner26486ea2010-05-15 22:23:53 +00001114 switch (PyTuple_Size(args)) {
1115 case 1:
1116 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
1117 return NULL;
1118 break;
1119 case 2:
1120 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
1121 return NULL;
1122 attr = lattr;
1123 break;
1124 default:
1125 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001126
1127
Victor Stinner26486ea2010-05-15 22:23:53 +00001128 return NULL;
1129 }
Guido van Rossum85738471995-02-17 13:50:17 +00001130
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001131 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001132 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001133
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001134#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001135 if (self->win->_flags & _ISPAD)
1136 return PyCursesCheckERR(pechochar(self->win, ch | attr),
1137 "echochar");
1138 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001139#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001140 return PyCursesCheckERR(wechochar(self->win, ch | attr),
1141 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001142}
1143
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001144#ifdef NCURSES_MOUSE_VERSION
1145static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001146PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001147{
Victor Stinner26486ea2010-05-15 22:23:53 +00001148 int x, y;
1149 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
1150 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001151
Victor Stinner26486ea2010-05-15 22:23:53 +00001152 return PyLong_FromLong( wenclose(self->win,y,x) );
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001153}
1154#endif
1155
Guido van Rossumf6971e21994-08-30 12:25:20 +00001156static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001157PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001158{
Victor Stinner26486ea2010-05-15 22:23:53 +00001159 return PyLong_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +00001160}
1161
1162static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001163PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001164{
Victor Stinner26486ea2010-05-15 22:23:53 +00001165 int x, y;
1166 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001167
Victor Stinner26486ea2010-05-15 22:23:53 +00001168 switch (PyTuple_Size(args)) {
1169 case 0:
1170 Py_BEGIN_ALLOW_THREADS
1171 rtn = wgetch(self->win);
1172 Py_END_ALLOW_THREADS
1173 break;
1174 case 2:
1175 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1176 return NULL;
1177 Py_BEGIN_ALLOW_THREADS
1178 rtn = mvwgetch(self->win,y,x);
1179 Py_END_ALLOW_THREADS
1180 break;
1181 default:
1182 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
1183 return NULL;
1184 }
1185 return PyLong_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001186}
Guido van Rossum85738471995-02-17 13:50:17 +00001187
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001188static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001189PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001190{
Victor Stinner26486ea2010-05-15 22:23:53 +00001191 int x, y;
1192 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001193
Victor Stinner26486ea2010-05-15 22:23:53 +00001194 switch (PyTuple_Size(args)) {
1195 case 0:
1196 Py_BEGIN_ALLOW_THREADS
1197 rtn = wgetch(self->win);
1198 Py_END_ALLOW_THREADS
1199 break;
1200 case 2:
1201 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1202 return NULL;
1203 Py_BEGIN_ALLOW_THREADS
1204 rtn = mvwgetch(self->win,y,x);
1205 Py_END_ALLOW_THREADS
1206 break;
1207 default:
1208 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
1209 return NULL;
1210 }
1211 if (rtn == ERR) {
1212 /* getch() returns ERR in nodelay mode */
R David Murrayf5d7cc22013-03-19 16:23:09 -04001213 PyErr_CheckSignals();
1214 if (!PyErr_Occurred())
1215 PyErr_SetString(PyCursesError, "no input");
Victor Stinner26486ea2010-05-15 22:23:53 +00001216 return NULL;
1217 } else if (rtn<=255) {
1218 return Py_BuildValue("C", rtn);
1219 } else {
1220 const char *knp;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001221#if defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00001222 knp = unctrl(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001223#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001224 knp = keyname(rtn);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001225#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001226 return PyUnicode_FromString((knp == NULL) ? "" : knp);
1227 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001228}
1229
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001230#ifdef HAVE_NCURSESW
Guido van Rossumf6971e21994-08-30 12:25:20 +00001231static PyObject *
Victor Stinnera7878b72011-07-14 23:07:44 +02001232PyCursesWindow_Get_WCh(PyCursesWindowObject *self, PyObject *args)
1233{
1234 int x, y;
1235 int ct;
1236 wint_t rtn;
1237
1238 switch (PyTuple_Size(args)) {
1239 case 0:
1240 Py_BEGIN_ALLOW_THREADS
1241 ct = wget_wch(self->win,&rtn);
1242 Py_END_ALLOW_THREADS
1243 break;
1244 case 2:
1245 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1246 return NULL;
1247 Py_BEGIN_ALLOW_THREADS
1248 ct = mvwget_wch(self->win,y,x,&rtn);
1249 Py_END_ALLOW_THREADS
1250 break;
1251 default:
1252 PyErr_SetString(PyExc_TypeError, "get_wch requires 0 or 2 arguments");
1253 return NULL;
1254 }
1255 if (ct == ERR) {
Victor Stinnerbd2d30c2013-03-21 12:21:06 +01001256 if (PyErr_CheckSignals())
1257 return NULL;
1258
Victor Stinnera7878b72011-07-14 23:07:44 +02001259 /* get_wch() returns ERR in nodelay mode */
1260 PyErr_SetString(PyCursesError, "no input");
1261 return NULL;
1262 }
Victor Stinner1d39cde2012-08-29 01:40:57 +02001263 if (ct == KEY_CODE_YES)
1264 return PyLong_FromLong(rtn);
1265 else
1266 return PyUnicode_FromOrdinal(rtn);
Victor Stinnera7878b72011-07-14 23:07:44 +02001267}
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001268#endif
Victor Stinnera7878b72011-07-14 23:07:44 +02001269
1270static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001271PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001272{
Victor Stinner26486ea2010-05-15 22:23:53 +00001273 int x, y, n;
1274 char rtn[1024]; /* This should be big enough.. I hope */
1275 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +00001276
Victor Stinner26486ea2010-05-15 22:23:53 +00001277 switch (PyTuple_Size(args)) {
1278 case 0:
1279 Py_BEGIN_ALLOW_THREADS
1280 rtn2 = wgetnstr(self->win,rtn, 1023);
1281 Py_END_ALLOW_THREADS
1282 break;
1283 case 1:
1284 if (!PyArg_ParseTuple(args,"i;n", &n))
1285 return NULL;
1286 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001287 rtn2 = wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001288 Py_END_ALLOW_THREADS
1289 break;
1290 case 2:
1291 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1292 return NULL;
1293 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001294#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001295 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001296#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001297 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001298#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001299 Py_END_ALLOW_THREADS
1300 break;
1301 case 3:
1302 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
1303 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001304#ifdef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00001305 Py_BEGIN_ALLOW_THREADS
1306 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Victor Stinner640c35c2013-06-04 23:14:37 +02001307 wgetnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001308 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001309#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001310 Py_BEGIN_ALLOW_THREADS
Victor Stinner640c35c2013-06-04 23:14:37 +02001311 rtn2 = mvwgetnstr(self->win, y, x, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001312 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001313#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001314 break;
1315 default:
1316 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
1317 return NULL;
1318 }
1319 if (rtn2 == ERR)
1320 rtn[0] = 0;
1321 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001322}
1323
1324static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001325PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001326{
Victor Stinner26486ea2010-05-15 22:23:53 +00001327 PyObject *temp;
1328 chtype ch;
1329 int n, x, y, code = OK;
1330 attr_t attr = A_NORMAL;
1331 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001332
Victor Stinner26486ea2010-05-15 22:23:53 +00001333 switch (PyTuple_Size(args)) {
1334 case 2:
1335 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1336 return NULL;
1337 break;
1338 case 3:
1339 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1340 return NULL;
1341 attr = lattr;
1342 break;
1343 case 4:
1344 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1345 return NULL;
1346 code = wmove(self->win, y, x);
1347 break;
1348 case 5:
1349 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1350 &y, &x, &temp, &n, &lattr))
1351 return NULL;
1352 attr = lattr;
1353 code = wmove(self->win, y, x);
1354 break;
1355 default:
1356 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
1357 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001358 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001359
1360 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001361 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001362 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001363 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
1364 } else
1365 return PyCursesCheckERR(code, "wmove");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001366}
1367
1368static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001369PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001370{
Victor Stinner26486ea2010-05-15 22:23:53 +00001371 int rtn, x, y, use_xy = FALSE;
1372 PyObject *temp;
1373 chtype ch = 0;
1374 attr_t attr = A_NORMAL;
1375 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001376
Victor Stinner26486ea2010-05-15 22:23:53 +00001377 switch (PyTuple_Size(args)) {
1378 case 1:
1379 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
1380 return NULL;
1381 break;
1382 case 2:
1383 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
1384 return NULL;
1385 attr = lattr;
1386 break;
1387 case 3:
1388 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
1389 return NULL;
1390 use_xy = TRUE;
1391 break;
1392 case 4:
1393 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
1394 return NULL;
1395 attr = lattr;
1396 use_xy = TRUE;
1397 break;
1398 default:
1399 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
1400 return NULL;
1401 }
1402
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001403 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001404 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001405
1406 if (use_xy == TRUE)
1407 rtn = mvwinsch(self->win,y,x, ch | attr);
1408 else {
1409 rtn = winsch(self->win, ch | attr);
1410 }
1411 return PyCursesCheckERR(rtn, "insch");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001412}
1413
1414static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001415PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001416{
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001417 int x, y;
1418 unsigned long rtn;
Guido van Rossum85738471995-02-17 13:50:17 +00001419
Victor Stinner26486ea2010-05-15 22:23:53 +00001420 switch (PyTuple_Size(args)) {
1421 case 0:
1422 rtn = winch(self->win);
1423 break;
1424 case 2:
1425 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1426 return NULL;
1427 rtn = mvwinch(self->win,y,x);
1428 break;
1429 default:
1430 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1431 return NULL;
1432 }
Christian Heimesabbc8ca2013-12-04 08:50:22 +01001433 return PyLong_FromUnsignedLong(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001434}
1435
1436static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001437PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001438{
Victor Stinner26486ea2010-05-15 22:23:53 +00001439 int x, y, n;
1440 char rtn[1024]; /* This should be big enough.. I hope */
1441 int rtn2;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001442
Victor Stinner26486ea2010-05-15 22:23:53 +00001443 switch (PyTuple_Size(args)) {
1444 case 0:
1445 rtn2 = winnstr(self->win,rtn, 1023);
1446 break;
1447 case 1:
1448 if (!PyArg_ParseTuple(args,"i;n", &n))
1449 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001450 rtn2 = winnstr(self->win, rtn, Py_MIN(n, 1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001451 break;
1452 case 2:
1453 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
1454 return NULL;
1455 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
1456 break;
1457 case 3:
1458 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
1459 return NULL;
Victor Stinner640c35c2013-06-04 23:14:37 +02001460 rtn2 = mvwinnstr(self->win, y, x, rtn, Py_MIN(n,1023));
Victor Stinner26486ea2010-05-15 22:23:53 +00001461 break;
1462 default:
1463 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
1464 return NULL;
1465 }
1466 if (rtn2 == ERR)
1467 rtn[0] = 0;
1468 return PyBytes_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001469}
1470
1471static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001472PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001473{
Victor Stinner26486ea2010-05-15 22:23:53 +00001474 int rtn;
1475 int x, y;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001476 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001477 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001478#ifdef HAVE_NCURSESW
1479 wchar_t *wstr = NULL;
1480#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001481 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1482 long lattr;
1483 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001484 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001485
Victor Stinner26486ea2010-05-15 22:23:53 +00001486 switch (PyTuple_Size(args)) {
1487 case 1:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001488 if (!PyArg_ParseTuple(args,"O;str", &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001489 return NULL;
1490 break;
1491 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001492 if (!PyArg_ParseTuple(args,"Ol;str,attr", &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001493 return NULL;
1494 attr = lattr;
1495 use_attr = TRUE;
1496 break;
1497 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001498 if (!PyArg_ParseTuple(args,"iiO;y,x,str", &y, &x, &strobj))
Victor Stinner26486ea2010-05-15 22:23:53 +00001499 return NULL;
1500 use_xy = TRUE;
1501 break;
1502 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001503 if (!PyArg_ParseTuple(args,"iiOl;y,x,str,attr", &y, &x, &strobj, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001504 return NULL;
1505 attr = lattr;
1506 use_xy = use_attr = TRUE;
1507 break;
1508 default:
1509 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
1510 return NULL;
1511 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001512
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001513#ifdef HAVE_NCURSESW
1514 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1515#else
1516 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1517#endif
1518 if (strtype == 0)
1519 return NULL;
1520
Victor Stinner26486ea2010-05-15 22:23:53 +00001521 if (use_attr == TRUE) {
1522 attr_old = getattrs(self->win);
1523 (void)wattrset(self->win,attr);
1524 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001525#ifdef HAVE_NCURSESW
1526 if (strtype == 2) {
1527 funcname = "inswstr";
1528 if (use_xy == TRUE)
1529 rtn = mvwins_wstr(self->win,y,x,wstr);
1530 else
1531 rtn = wins_wstr(self->win,wstr);
1532 PyMem_Free(wstr);
1533 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001534 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001535#endif
1536 {
1537 char *str = PyBytes_AS_STRING(bytesobj);
1538 funcname = "insstr";
1539 if (use_xy == TRUE)
1540 rtn = mvwinsstr(self->win,y,x,str);
1541 else
1542 rtn = winsstr(self->win,str);
1543 Py_DECREF(bytesobj);
1544 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001545 if (use_attr == TRUE)
1546 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001547 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001548}
1549
1550static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001551PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001552{
Victor Stinner26486ea2010-05-15 22:23:53 +00001553 int rtn, x, y, n;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001554 int strtype;
Benjamin Peterson5e545192012-03-14 18:21:35 -05001555 PyObject *strobj, *bytesobj = NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001556#ifdef HAVE_NCURSESW
1557 wchar_t *wstr = NULL;
1558#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001559 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1560 long lattr;
1561 int use_xy = FALSE, use_attr = FALSE;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001562 const char *funcname;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001563
Victor Stinner26486ea2010-05-15 22:23:53 +00001564 switch (PyTuple_Size(args)) {
1565 case 2:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001566 if (!PyArg_ParseTuple(args,"Oi;str,n", &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001567 return NULL;
1568 break;
1569 case 3:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001570 if (!PyArg_ParseTuple(args,"Oil;str,n,attr", &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001571 return NULL;
1572 attr = lattr;
1573 use_attr = TRUE;
1574 break;
1575 case 4:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001576 if (!PyArg_ParseTuple(args,"iiOi;y,x,str,n", &y, &x, &strobj, &n))
Victor Stinner26486ea2010-05-15 22:23:53 +00001577 return NULL;
1578 use_xy = TRUE;
1579 break;
1580 case 5:
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001581 if (!PyArg_ParseTuple(args,"iiOil;y,x,str,n,attr", &y, &x, &strobj, &n, &lattr))
Victor Stinner26486ea2010-05-15 22:23:53 +00001582 return NULL;
1583 attr = lattr;
1584 use_xy = use_attr = TRUE;
1585 break;
1586 default:
1587 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
1588 return NULL;
1589 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001590
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001591#ifdef HAVE_NCURSESW
1592 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, &wstr);
1593#else
1594 strtype = PyCurses_ConvertToString(self, strobj, &bytesobj, NULL);
1595#endif
1596 if (strtype == 0)
1597 return NULL;
1598
Victor Stinner26486ea2010-05-15 22:23:53 +00001599 if (use_attr == TRUE) {
1600 attr_old = getattrs(self->win);
1601 (void)wattrset(self->win,attr);
1602 }
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001603#ifdef HAVE_NCURSESW
1604 if (strtype == 2) {
1605 funcname = "insn_wstr";
1606 if (use_xy == TRUE)
1607 rtn = mvwins_nwstr(self->win,y,x,wstr,n);
1608 else
1609 rtn = wins_nwstr(self->win,wstr,n);
1610 PyMem_Free(wstr);
1611 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001612 else
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001613#endif
1614 {
1615 char *str = PyBytes_AS_STRING(bytesobj);
1616 funcname = "insnstr";
1617 if (use_xy == TRUE)
1618 rtn = mvwinsnstr(self->win,y,x,str,n);
1619 else
1620 rtn = winsnstr(self->win,str,n);
1621 Py_DECREF(bytesobj);
1622 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001623 if (use_attr == TRUE)
1624 (void)wattrset(self->win,attr_old);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001625 return PyCursesCheckERR(rtn, funcname);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001626}
1627
1628static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001629PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001630{
Victor Stinner26486ea2010-05-15 22:23:53 +00001631 int line, erg;
1632 if (!PyArg_ParseTuple(args,"i;line", &line))
1633 return NULL;
1634 erg = is_linetouched(self->win, line);
1635 if (erg == ERR) {
1636 PyErr_SetString(PyExc_TypeError,
1637 "is_linetouched: line number outside of boundaries");
1638 return NULL;
1639 } else
1640 if (erg == FALSE) {
1641 Py_INCREF(Py_False);
1642 return Py_False;
1643 } else {
1644 Py_INCREF(Py_True);
1645 return Py_True;
1646 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001647}
1648
1649static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001650PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001651{
Victor Stinner26486ea2010-05-15 22:23:53 +00001652 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1653 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001654
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001655#ifndef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001656 if (0)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001657#else
Victor Stinner26486ea2010-05-15 22:23:53 +00001658 if (self->win->_flags & _ISPAD)
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001659#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001660 {
1661 switch(PyTuple_Size(args)) {
1662 case 6:
1663 if (!PyArg_ParseTuple(args,
1664 "iiiiii;" \
1665 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1666 &pminrow, &pmincol, &sminrow,
1667 &smincol, &smaxrow, &smaxcol))
1668 return NULL;
1669 Py_BEGIN_ALLOW_THREADS
1670 rtn = pnoutrefresh(self->win,
1671 pminrow, pmincol, sminrow,
1672 smincol, smaxrow, smaxcol);
1673 Py_END_ALLOW_THREADS
1674 return PyCursesCheckERR(rtn, "pnoutrefresh");
1675 default:
1676 PyErr_SetString(PyCursesError,
1677 "noutrefresh() called for a pad "
1678 "requires 6 arguments");
1679 return NULL;
1680 }
1681 } else {
1682 if (!PyArg_ParseTuple(args, ":noutrefresh"))
1683 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001684
Victor Stinner26486ea2010-05-15 22:23:53 +00001685 Py_BEGIN_ALLOW_THREADS
1686 rtn = wnoutrefresh(self->win);
1687 Py_END_ALLOW_THREADS
1688 return PyCursesCheckERR(rtn, "wnoutrefresh");
1689 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001690}
1691
1692static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001693PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1694{
1695 PyCursesWindowObject *temp;
1696 int use_copywin = FALSE;
1697 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1698 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001699
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001700 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001701 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001702 if (!PyArg_ParseTuple(args, "O!;window object",
1703 &PyCursesWindow_Type, &temp))
1704 return NULL;
1705 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001706 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001707 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1708 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1709 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1710 return NULL;
1711 use_copywin = TRUE;
1712 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001713 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001714 PyErr_SetString(PyExc_TypeError,
1715 "overlay requires one or seven arguments");
1716 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001717 }
1718
1719 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001720 rtn = copywin(self->win, temp->win, sminrow, smincol,
1721 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1722 return PyCursesCheckERR(rtn, "copywin");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001723 }
1724 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001725 rtn = overlay(self->win, temp->win);
1726 return PyCursesCheckERR(rtn, "overlay");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001727 }
1728}
1729
1730static PyObject *
1731PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1732{
1733 PyCursesWindowObject *temp;
1734 int use_copywin = FALSE;
1735 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1736 int rtn;
Victor Stinner26486ea2010-05-15 22:23:53 +00001737
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001738 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001739 case 1:
Victor Stinner26486ea2010-05-15 22:23:53 +00001740 if (!PyArg_ParseTuple(args, "O!;window object",
1741 &PyCursesWindow_Type, &temp))
1742 return NULL;
1743 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001744 case 7:
Victor Stinner26486ea2010-05-15 22:23:53 +00001745 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
1746 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1747 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1748 return NULL;
1749 use_copywin = TRUE;
1750 break;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001751 default:
Victor Stinner26486ea2010-05-15 22:23:53 +00001752 PyErr_SetString(PyExc_TypeError,
1753 "overwrite requires one or seven arguments");
1754 return NULL;
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001755 }
1756
1757 if (use_copywin == TRUE) {
Victor Stinner26486ea2010-05-15 22:23:53 +00001758 rtn = copywin(self->win, temp->win, sminrow, smincol,
1759 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001760 return PyCursesCheckERR(rtn, "copywin");
1761 }
1762 else {
Victor Stinner26486ea2010-05-15 22:23:53 +00001763 rtn = overwrite(self->win, temp->win);
1764 return PyCursesCheckERR(rtn, "overwrite");
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001765 }
1766}
1767
1768static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00001769PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001770{
Victor Stinner26486ea2010-05-15 22:23:53 +00001771 /* We have to simulate this by writing to a temporary FILE*,
1772 then reading back, then writing to the argument stream. */
1773 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02001774 int fd = -1;
1775 FILE *fp = NULL;
1776 PyObject *res = NULL;
Guido van Rossumda5b8f22007-06-12 23:30:11 +00001777
Victor Stinner26486ea2010-05-15 22:23:53 +00001778 strcpy(fn, "/tmp/py.curses.putwin.XXXXXX");
1779 fd = mkstemp(fn);
1780 if (fd < 0)
1781 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02001782 if (_Py_set_inheritable(fd, 0, NULL) < 0)
1783 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001784 fp = fdopen(fd, "wb+");
1785 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001786 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
1787 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001788 }
1789 res = PyCursesCheckERR(putwin(self->win, fp), "putwin");
Victor Stinnerdaf45552013-08-28 00:53:59 +02001790 if (res == NULL)
1791 goto exit;
Victor Stinner26486ea2010-05-15 22:23:53 +00001792 fseek(fp, 0, 0);
1793 while (1) {
1794 char buf[BUFSIZ];
1795 Py_ssize_t n = fread(buf, 1, BUFSIZ, fp);
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001796 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001797
Victor Stinner26486ea2010-05-15 22:23:53 +00001798 if (n <= 0)
1799 break;
1800 Py_DECREF(res);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001801 res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n);
Victor Stinner26486ea2010-05-15 22:23:53 +00001802 if (res == NULL)
1803 break;
1804 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02001805
1806exit:
1807 if (fp != NULL)
1808 fclose(fp);
1809 else if (fd != -1)
1810 close(fd);
Guido van Rossum150b7d72007-08-30 23:34:01 +00001811 remove(fn);
Guido van Rossum6c95da32007-07-24 00:16:38 +00001812 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001813}
1814
1815static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001816PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001817{
Victor Stinner26486ea2010-05-15 22:23:53 +00001818 int beg, num;
1819 if (!PyArg_ParseTuple(args, "ii;beg,num", &beg, &num))
1820 return NULL;
1821 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001822}
1823
1824static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001825PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001826{
Victor Stinner26486ea2010-05-15 22:23:53 +00001827 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
1828 int rtn;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001829
Victor Stinner26486ea2010-05-15 22:23:53 +00001830#ifndef WINDOW_HAS_FLAGS
1831 if (0)
1832#else
1833 if (self->win->_flags & _ISPAD)
1834#endif
1835 {
1836 switch(PyTuple_Size(args)) {
1837 case 6:
1838 if (!PyArg_ParseTuple(args,
1839 "iiiiii;" \
1840 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1841 &pminrow, &pmincol, &sminrow,
1842 &smincol, &smaxrow, &smaxcol))
1843 return NULL;
1844
1845 Py_BEGIN_ALLOW_THREADS
1846 rtn = prefresh(self->win,
1847 pminrow, pmincol, sminrow,
1848 smincol, smaxrow, smaxcol);
1849 Py_END_ALLOW_THREADS
1850 return PyCursesCheckERR(rtn, "prefresh");
1851 default:
1852 PyErr_SetString(PyCursesError,
1853 "refresh() for a pad requires 6 arguments");
1854 return NULL;
1855 }
1856 } else {
1857 if (!PyArg_ParseTuple(args, ":refresh"))
1858 return NULL;
1859 Py_BEGIN_ALLOW_THREADS
1860 rtn = wrefresh(self->win);
1861 Py_END_ALLOW_THREADS
1862 return PyCursesCheckERR(rtn, "prefresh");
1863 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001864}
1865
1866static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001867PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001868{
Victor Stinner26486ea2010-05-15 22:23:53 +00001869 int x, y;
1870 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
1871 return NULL;
1872 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001873}
1874
1875static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001876PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001877{
Victor Stinner26486ea2010-05-15 22:23:53 +00001878 WINDOW *win;
1879 int nlines, ncols, begin_y, begin_x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001880
Victor Stinner26486ea2010-05-15 22:23:53 +00001881 nlines = 0;
1882 ncols = 0;
1883 switch (PyTuple_Size(args)) {
1884 case 2:
1885 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
1886 return NULL;
1887 break;
1888 case 4:
1889 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
1890 &nlines,&ncols,&begin_y,&begin_x))
1891 return NULL;
1892 break;
1893 default:
1894 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
1895 return NULL;
1896 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001897
Victor Stinner26486ea2010-05-15 22:23:53 +00001898 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001899#ifdef WINDOW_HAS_FLAGS
Victor Stinner26486ea2010-05-15 22:23:53 +00001900 if (self->win->_flags & _ISPAD)
1901 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1902 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001903#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00001904 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001905
Victor Stinner26486ea2010-05-15 22:23:53 +00001906 if (win == NULL) {
1907 PyErr_SetString(PyCursesError, catchall_NULL);
1908 return NULL;
1909 }
1910
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001911 return (PyObject *)PyCursesWindow_New(win, self->encoding);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001912}
1913
1914static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001915PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001916{
Victor Stinner26486ea2010-05-15 22:23:53 +00001917 int nlines;
1918 switch(PyTuple_Size(args)) {
1919 case 0:
1920 return PyCursesCheckERR(scroll(self->win), "scroll");
1921 case 1:
1922 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
1923 return NULL;
1924 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
1925 default:
1926 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
1927 return NULL;
1928 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001929}
1930
1931static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001932PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001933{
Victor Stinner26486ea2010-05-15 22:23:53 +00001934 int st, cnt, val;
1935 switch (PyTuple_Size(args)) {
1936 case 2:
1937 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
1938 return NULL;
1939 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
1940 case 3:
1941 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
1942 return NULL;
1943 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1944 default:
1945 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
1946 return NULL;
1947 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001948}
1949
1950static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001951PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001952{
Victor Stinner26486ea2010-05-15 22:23:53 +00001953 PyObject *temp;
1954 chtype ch;
1955 int n, x, y, code = OK;
1956 attr_t attr = A_NORMAL;
1957 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001958
Victor Stinner26486ea2010-05-15 22:23:53 +00001959 switch (PyTuple_Size(args)) {
1960 case 2:
1961 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
1962 return NULL;
1963 break;
1964 case 3:
1965 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
1966 return NULL;
1967 attr = lattr;
1968 break;
1969 case 4:
1970 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
1971 return NULL;
1972 code = wmove(self->win, y, x);
1973 break;
1974 case 5:
1975 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
1976 &y, &x, &temp, &n, &lattr))
1977 return NULL;
1978 attr = lattr;
1979 code = wmove(self->win, y, x);
1980 break;
1981 default:
1982 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
1983 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001984 }
Victor Stinner26486ea2010-05-15 22:23:53 +00001985
1986 if (code != ERR) {
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001987 if (!PyCurses_ConvertToChtype(self, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00001988 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00001989 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
1990 } else
1991 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001992}
1993
Victor Stinner0fdfceb2011-11-25 22:10:02 +01001994static PyObject *
1995PyCursesWindow_get_encoding(PyCursesWindowObject *self, void *closure)
1996{
1997 return PyUnicode_FromString(self->encoding);
1998}
1999
2000static int
2001PyCursesWindow_set_encoding(PyCursesWindowObject *self, PyObject *value)
2002{
2003 PyObject *ascii;
2004 char *encoding;
2005
2006 /* It is illegal to del win.encoding */
2007 if (value == NULL) {
2008 PyErr_SetString(PyExc_TypeError,
2009 "encoding may not be deleted");
2010 return -1;
2011 }
2012
2013 if (!PyUnicode_Check(value)) {
2014 PyErr_SetString(PyExc_TypeError,
2015 "setting encoding to a non-string");
2016 return -1;
2017 }
2018 ascii = PyUnicode_AsASCIIString(value);
2019 if (ascii == NULL)
2020 return -1;
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002021 encoding = _PyMem_Strdup(PyBytes_AS_STRING(ascii));
Ross Lagerwall2dabaf62012-09-07 08:34:23 +02002022 Py_DECREF(ascii);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002023 if (encoding == NULL) {
2024 PyErr_NoMemory();
2025 return -1;
2026 }
Victor Stinner49fc8ec2013-07-07 23:30:24 +02002027 PyMem_Free(self->encoding);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002028 self->encoding = encoding;
2029 return 0;
2030}
2031
2032
Guido van Rossumf6971e21994-08-30 12:25:20 +00002033static PyMethodDef PyCursesWindow_Methods[] = {
Larry Hastings31826802013-10-19 00:09:25 -07002034 CURSES_WINDOW_ADDCH_METHODDEF
Victor Stinner26486ea2010-05-15 22:23:53 +00002035 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
2036 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
2037 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
2038 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
2039 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
2040 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
2041 {"chgat", (PyCFunction)PyCursesWindow_ChgAt, METH_VARARGS},
2042 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
2043 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
2044 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
2045 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
2046 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
2047 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
2048 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
2049 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
2050 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
2051 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
2052 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
2053 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002054#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00002055 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002056#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002057 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
2058 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
2059 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
2060 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
2061 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002062#ifdef HAVE_NCURSESW
Victor Stinnera7878b72011-07-14 23:07:44 +02002063 {"get_wch", (PyCFunction)PyCursesWindow_Get_WCh, METH_VARARGS},
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02002064#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002065 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
2066 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
2067 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
2068 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
2069 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
2070 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
2071 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
2072 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
2073 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
2074 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
2075 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
2076 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
2077 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
2078 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
2079 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
2080 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
2081 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
2082 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
2083 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
2084 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
2085 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
2086 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
2087 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
2088 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
2089 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2090 /* Backward compatibility alias -- remove in Python 2.3 */
2091 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
2092 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
2093 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
2094 METH_VARARGS},
2095 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_O},
2096 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine, METH_VARARGS},
2097 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
2098 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00002099#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002100 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002101#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002102 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
2103 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
2104 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
2105 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
2106 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
2107 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2108 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
2109 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
2110 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
2111 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
2112 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
2113 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
2114 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
2115 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
2116 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
2117 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002118};
2119
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002120static PyGetSetDef PyCursesWindow_getsets[] = {
2121 {"encoding",
2122 (getter)PyCursesWindow_get_encoding,
2123 (setter)PyCursesWindow_set_encoding,
Ronald Oussoren2a7fe032012-01-17 16:53:20 +01002124 "the typecode character used to create the array"},
2125 {NULL, NULL, NULL, NULL } /* sentinel */
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002126};
2127
Guido van Rossumf6971e21994-08-30 12:25:20 +00002128/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00002129
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002130PyTypeObject PyCursesWindow_Type = {
Victor Stinner26486ea2010-05-15 22:23:53 +00002131 PyVarObject_HEAD_INIT(NULL, 0)
2132 "_curses.curses window", /*tp_name*/
2133 sizeof(PyCursesWindowObject), /*tp_basicsize*/
2134 0, /*tp_itemsize*/
2135 /* methods */
2136 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
2137 0, /*tp_print*/
2138 (getattrfunc)0, /*tp_getattr*/
2139 (setattrfunc)0, /*tp_setattr*/
2140 0, /*tp_reserved*/
2141 0, /*tp_repr*/
2142 0, /*tp_as_number*/
2143 0, /*tp_as_sequence*/
2144 0, /*tp_as_mapping*/
2145 0, /*tp_hash*/
2146 0, /*tp_call*/
2147 0, /*tp_str*/
2148 0, /*tp_getattro*/
2149 0, /*tp_setattro*/
2150 0, /*tp_as_buffer*/
2151 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2152 0, /*tp_doc*/
2153 0, /*tp_traverse*/
2154 0, /*tp_clear*/
2155 0, /*tp_richcompare*/
2156 0, /*tp_weaklistoffset*/
2157 0, /*tp_iter*/
2158 0, /*tp_iternext*/
2159 PyCursesWindow_Methods, /*tp_methods*/
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002160 0, /* tp_members */
2161 PyCursesWindow_getsets, /* tp_getset */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002162};
2163
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002164/*********************************************************************
2165 Global Functions
2166**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00002167
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168NoArgNoReturnFunction(beep)
2169NoArgNoReturnFunction(def_prog_mode)
2170NoArgNoReturnFunction(def_shell_mode)
2171NoArgNoReturnFunction(doupdate)
2172NoArgNoReturnFunction(endwin)
2173NoArgNoReturnFunction(flash)
2174NoArgNoReturnFunction(nocbreak)
2175NoArgNoReturnFunction(noecho)
2176NoArgNoReturnFunction(nonl)
2177NoArgNoReturnFunction(noraw)
2178NoArgNoReturnFunction(reset_prog_mode)
2179NoArgNoReturnFunction(reset_shell_mode)
2180NoArgNoReturnFunction(resetty)
2181NoArgNoReturnFunction(savetty)
2182
2183NoArgOrFlagNoReturnFunction(cbreak)
2184NoArgOrFlagNoReturnFunction(echo)
2185NoArgOrFlagNoReturnFunction(nl)
2186NoArgOrFlagNoReturnFunction(raw)
2187
2188NoArgReturnIntFunction(baudrate)
2189NoArgReturnIntFunction(termattrs)
2190
2191NoArgReturnStringFunction(termname)
2192NoArgReturnStringFunction(longname)
2193
2194NoArgTrueFalseFunction(can_change_color)
2195NoArgTrueFalseFunction(has_colors)
2196NoArgTrueFalseFunction(has_ic)
2197NoArgTrueFalseFunction(has_il)
2198NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002199NoArgNoReturnVoidFunction(flushinp)
2200NoArgNoReturnVoidFunction(noqiflush)
2201
2202static PyObject *
Christian Heimesaf98da12008-01-27 15:18:18 +00002203PyCurses_filter(PyObject *self)
2204{
Victor Stinner26486ea2010-05-15 22:23:53 +00002205 /* not checking for PyCursesInitialised here since filter() must
2206 be called before initscr() */
2207 filter();
2208 Py_INCREF(Py_None);
2209 return Py_None;
Christian Heimesaf98da12008-01-27 15:18:18 +00002210}
2211
2212static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002213PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002214{
Victor Stinner26486ea2010-05-15 22:23:53 +00002215 short color,r,g,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002216
Victor Stinner26486ea2010-05-15 22:23:53 +00002217 PyCursesInitialised;
2218 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219
Victor Stinner26486ea2010-05-15 22:23:53 +00002220 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002221
Victor Stinner26486ea2010-05-15 22:23:53 +00002222 if (color_content(color, &r, &g, &b) != ERR)
2223 return Py_BuildValue("(iii)", r, g, b);
2224 else {
2225 PyErr_SetString(PyCursesError,
2226 "Argument 1 was out of range. Check value of COLORS.");
2227 return NULL;
2228 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002229}
2230
2231static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002232PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002233{
Victor Stinner26486ea2010-05-15 22:23:53 +00002234 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002235
Victor Stinner26486ea2010-05-15 22:23:53 +00002236 PyCursesInitialised;
2237 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002238
Victor Stinner26486ea2010-05-15 22:23:53 +00002239 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
2240 return PyLong_FromLong((long) (n << 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002241}
2242
2243static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002244PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002245{
Victor Stinner26486ea2010-05-15 22:23:53 +00002246 int vis,erg;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002247
Victor Stinner26486ea2010-05-15 22:23:53 +00002248 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002249
Victor Stinner26486ea2010-05-15 22:23:53 +00002250 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002251
Victor Stinner26486ea2010-05-15 22:23:53 +00002252 erg = curs_set(vis);
2253 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002254
Victor Stinner26486ea2010-05-15 22:23:53 +00002255 return PyLong_FromLong((long) erg);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002256}
2257
2258static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002259PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002260{
Victor Stinner26486ea2010-05-15 22:23:53 +00002261 int ms;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002262
Victor Stinner26486ea2010-05-15 22:23:53 +00002263 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002264
Victor Stinner26486ea2010-05-15 22:23:53 +00002265 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002266
Victor Stinner26486ea2010-05-15 22:23:53 +00002267 return PyCursesCheckERR(delay_output(ms), "delay_output");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002268}
2269
2270static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002271PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002272{
Victor Stinner26486ea2010-05-15 22:23:53 +00002273 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002274
Victor Stinner26486ea2010-05-15 22:23:53 +00002275 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002276
Victor Stinner26486ea2010-05-15 22:23:53 +00002277 ch = erasechar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002278
Victor Stinner26486ea2010-05-15 22:23:53 +00002279 return PyBytes_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002280}
2281
2282static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002283PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002284{
Victor Stinner26486ea2010-05-15 22:23:53 +00002285 int x = 0;
2286 int y = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002287
Victor Stinner26486ea2010-05-15 22:23:53 +00002288 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002289
Victor Stinner26486ea2010-05-15 22:23:53 +00002290 getsyx(y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002291
Victor Stinner26486ea2010-05-15 22:23:53 +00002292 return Py_BuildValue("(ii)", y, x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002293}
2294
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002295#ifdef NCURSES_MOUSE_VERSION
2296static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002297PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002298{
Victor Stinner26486ea2010-05-15 22:23:53 +00002299 int rtn;
2300 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002301
Victor Stinner26486ea2010-05-15 22:23:53 +00002302 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002303
Victor Stinner26486ea2010-05-15 22:23:53 +00002304 rtn = getmouse( &event );
2305 if (rtn == ERR) {
2306 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
2307 return NULL;
2308 }
2309 return Py_BuildValue("(hiiil)",
2310 (short)event.id,
2311 event.x, event.y, event.z,
2312 (long) event.bstate);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002313}
2314
2315static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002316PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002317{
Victor Stinner26486ea2010-05-15 22:23:53 +00002318 MEVENT event;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002319
Victor Stinner26486ea2010-05-15 22:23:53 +00002320 PyCursesInitialised;
2321 if (!PyArg_ParseTuple(args, "hiiil",
2322 &event.id,
2323 &event.x, &event.y, &event.z,
2324 (int *) &event.bstate))
2325 return NULL;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002326
Victor Stinner26486ea2010-05-15 22:23:53 +00002327 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002328}
2329#endif
2330
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002331static PyObject *
Guido van Rossum6c95da32007-07-24 00:16:38 +00002332PyCurses_GetWin(PyCursesWindowObject *self, PyObject *stream)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002333{
Victor Stinner26486ea2010-05-15 22:23:53 +00002334 char fn[100];
Victor Stinnerdaf45552013-08-28 00:53:59 +02002335 int fd = -1;
2336 FILE *fp = NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002337 PyObject *data;
2338 size_t datalen;
2339 WINDOW *win;
Benjamin Peterson18b71912013-05-16 15:29:44 -05002340 _Py_IDENTIFIER(read);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002341 PyObject *res = NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002342
Victor Stinner26486ea2010-05-15 22:23:53 +00002343 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002344
Victor Stinner26486ea2010-05-15 22:23:53 +00002345 strcpy(fn, "/tmp/py.curses.getwin.XXXXXX");
2346 fd = mkstemp(fn);
2347 if (fd < 0)
2348 return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002349 if (_Py_set_inheritable(fd, 0, NULL) < 0)
2350 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002351 fp = fdopen(fd, "wb+");
2352 if (fp == NULL) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002353 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2354 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002355 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002356
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002357 data = _PyObject_CallMethodId(stream, &PyId_read, "");
Victor Stinnerdaf45552013-08-28 00:53:59 +02002358 if (data == NULL)
2359 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002360 if (!PyBytes_Check(data)) {
2361 PyErr_Format(PyExc_TypeError,
2362 "f.read() returned %.100s instead of bytes",
2363 data->ob_type->tp_name);
2364 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002365 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002366 }
2367 datalen = PyBytes_GET_SIZE(data);
2368 if (fwrite(PyBytes_AS_STRING(data), 1, datalen, fp) != datalen) {
2369 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002370 PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn);
2371 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002372 }
Guido van Rossum6c95da32007-07-24 00:16:38 +00002373 Py_DECREF(data);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002374
Victor Stinner26486ea2010-05-15 22:23:53 +00002375 fseek(fp, 0, 0);
2376 win = getwin(fp);
Victor Stinner26486ea2010-05-15 22:23:53 +00002377 if (win == NULL) {
2378 PyErr_SetString(PyCursesError, catchall_NULL);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002379 goto error;
Victor Stinner26486ea2010-05-15 22:23:53 +00002380 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002381 res = PyCursesWindow_New(win, NULL);
2382
2383error:
2384 if (fp != NULL)
2385 fclose(fp);
2386 else if (fd != -1)
2387 close(fd);
2388 remove(fn);
2389 return res;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002390}
2391
2392static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002393PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002394{
Victor Stinner26486ea2010-05-15 22:23:53 +00002395 unsigned char tenths;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002396
Victor Stinner26486ea2010-05-15 22:23:53 +00002397 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002398
Victor Stinner26486ea2010-05-15 22:23:53 +00002399 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002400
Victor Stinner26486ea2010-05-15 22:23:53 +00002401 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002402}
2403
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002404#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00002405/* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002406static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407{
Victor Stinner26486ea2010-05-15 22:23:53 +00002408 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002409
Victor Stinner26486ea2010-05-15 22:23:53 +00002410 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002411
Victor Stinner26486ea2010-05-15 22:23:53 +00002412 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002413
Victor Stinner26486ea2010-05-15 22:23:53 +00002414 if (has_key(ch) == FALSE) {
2415 Py_INCREF(Py_False);
2416 return Py_False;
2417 }
2418 Py_INCREF(Py_True);
2419 return Py_True;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002420}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002421#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002422
2423static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002424PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002425{
Victor Stinner26486ea2010-05-15 22:23:53 +00002426 short color, r, g, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002427
Victor Stinner26486ea2010-05-15 22:23:53 +00002428 PyCursesInitialised;
2429 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002430
Victor Stinner26486ea2010-05-15 22:23:53 +00002431 switch(PyTuple_Size(args)) {
2432 case 4:
2433 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
2434 break;
2435 default:
2436 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
2437 return NULL;
2438 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002439
Victor Stinner26486ea2010-05-15 22:23:53 +00002440 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002441}
2442
2443static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002444PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002445{
Victor Stinner26486ea2010-05-15 22:23:53 +00002446 short pair, f, b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002447
Victor Stinner26486ea2010-05-15 22:23:53 +00002448 PyCursesInitialised;
2449 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002450
Victor Stinner26486ea2010-05-15 22:23:53 +00002451 if (PyTuple_Size(args) != 3) {
2452 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
2453 return NULL;
2454 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002455
Victor Stinner26486ea2010-05-15 22:23:53 +00002456 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002457
Victor Stinner26486ea2010-05-15 22:23:53 +00002458 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002459}
2460
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002461static PyObject *ModDict;
2462
Victor Stinner26486ea2010-05-15 22:23:53 +00002463static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002464PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002465{
Victor Stinner26486ea2010-05-15 22:23:53 +00002466 WINDOW *win;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002467 PyCursesWindowObject *winobj;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002468
Victor Stinner26486ea2010-05-15 22:23:53 +00002469 if (initialised == TRUE) {
2470 wrefresh(stdscr);
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002471 return (PyObject *)PyCursesWindow_New(stdscr, NULL);
Victor Stinner26486ea2010-05-15 22:23:53 +00002472 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00002473
Victor Stinner26486ea2010-05-15 22:23:53 +00002474 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002475
Victor Stinner26486ea2010-05-15 22:23:53 +00002476 if (win == NULL) {
2477 PyErr_SetString(PyCursesError, catchall_NULL);
2478 return NULL;
2479 }
Guido van Rossum85738471995-02-17 13:50:17 +00002480
Victor Stinner26486ea2010-05-15 22:23:53 +00002481 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00002482
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002483/* This was moved from initcurses() because it core dumped on SGI,
2484 where they're not defined until you've called initscr() */
Victor Stinner26486ea2010-05-15 22:23:53 +00002485#define SetDictInt(string,ch) \
2486 do { \
2487 PyObject *o = PyLong_FromLong((long) (ch)); \
2488 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
2489 Py_DECREF(o); \
2490 } \
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002491 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002492
Victor Stinner26486ea2010-05-15 22:23:53 +00002493 /* Here are some graphic symbols you can use */
2494 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
2495 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
2496 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
2497 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
2498 SetDictInt("ACS_LTEE", (ACS_LTEE));
2499 SetDictInt("ACS_RTEE", (ACS_RTEE));
2500 SetDictInt("ACS_BTEE", (ACS_BTEE));
2501 SetDictInt("ACS_TTEE", (ACS_TTEE));
2502 SetDictInt("ACS_HLINE", (ACS_HLINE));
2503 SetDictInt("ACS_VLINE", (ACS_VLINE));
2504 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002505#if !defined(__hpux) || defined(HAVE_NCURSES_H)
Victor Stinner26486ea2010-05-15 22:23:53 +00002506 /* On HP/UX 11, these are of type cchar_t, which is not an
2507 integral type. If this is a problem on more platforms, a
2508 configure test should be added to determine whether ACS_S1
2509 is of integral type. */
2510 SetDictInt("ACS_S1", (ACS_S1));
2511 SetDictInt("ACS_S9", (ACS_S9));
2512 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
2513 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
2514 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
2515 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
2516 SetDictInt("ACS_BULLET", (ACS_BULLET));
2517 SetDictInt("ACS_LARROW", (ACS_LARROW));
2518 SetDictInt("ACS_RARROW", (ACS_RARROW));
2519 SetDictInt("ACS_DARROW", (ACS_DARROW));
2520 SetDictInt("ACS_UARROW", (ACS_UARROW));
2521 SetDictInt("ACS_BOARD", (ACS_BOARD));
2522 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
2523 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00002524#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00002525 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
2526 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
2527 SetDictInt("ACS_BBSS", (ACS_URCORNER));
2528 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
2529 SetDictInt("ACS_SBSS", (ACS_RTEE));
2530 SetDictInt("ACS_SSSB", (ACS_LTEE));
2531 SetDictInt("ACS_SSBS", (ACS_BTEE));
2532 SetDictInt("ACS_BSSS", (ACS_TTEE));
2533 SetDictInt("ACS_BSBS", (ACS_HLINE));
2534 SetDictInt("ACS_SBSB", (ACS_VLINE));
2535 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002536
Victor Stinner26486ea2010-05-15 22:23:53 +00002537 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002538#ifdef ACS_S3
Victor Stinner26486ea2010-05-15 22:23:53 +00002539 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002540#endif
2541#ifdef ACS_S7
Victor Stinner26486ea2010-05-15 22:23:53 +00002542 SetDictInt("ACS_S7", (ACS_S7));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002543#endif
2544#ifdef ACS_LEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002545 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002546#endif
2547#ifdef ACS_GEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002548 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002549#endif
2550#ifdef ACS_PI
Victor Stinner26486ea2010-05-15 22:23:53 +00002551 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002552#endif
2553#ifdef ACS_NEQUAL
Victor Stinner26486ea2010-05-15 22:23:53 +00002554 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002555#endif
2556#ifdef ACS_STERLING
Victor Stinner26486ea2010-05-15 22:23:53 +00002557 SetDictInt("ACS_STERLING", (ACS_STERLING));
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002558#endif
2559
Victor Stinner26486ea2010-05-15 22:23:53 +00002560 SetDictInt("LINES", LINES);
2561 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00002562
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002563 winobj = (PyCursesWindowObject *)PyCursesWindow_New(win, NULL);
2564 screen_encoding = winobj->encoding;
2565 return (PyObject *)winobj;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002566}
2567
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002568static PyObject *
2569PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
2570{
Victor Stinner26486ea2010-05-15 22:23:53 +00002571 int fd = -1;
2572 int err;
2573 char* termstr = NULL;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002574
Victor Stinner26486ea2010-05-15 22:23:53 +00002575 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002576
Victor Stinner26486ea2010-05-15 22:23:53 +00002577 if (!PyArg_ParseTupleAndKeywords(
2578 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
2579 return NULL;
2580 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002581
Victor Stinner26486ea2010-05-15 22:23:53 +00002582 if (fd == -1) {
2583 PyObject* sys_stdout;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002584
Victor Stinnerbd303c12013-11-07 23:07:29 +01002585 sys_stdout = PySys_GetObject("stdout");
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002586
Victor Stinner26486ea2010-05-15 22:23:53 +00002587 if (sys_stdout == NULL || sys_stdout == Py_None) {
2588 PyErr_SetString(
2589 PyCursesError,
2590 "lost sys.stdout");
2591 return NULL;
2592 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002593
Victor Stinner26486ea2010-05-15 22:23:53 +00002594 fd = PyObject_AsFileDescriptor(sys_stdout);
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002595
Victor Stinner26486ea2010-05-15 22:23:53 +00002596 if (fd == -1) {
2597 return NULL;
2598 }
2599 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002600
Matthias Klose635edd12010-07-30 21:40:57 +00002601 if (!initialised_setupterm && setupterm(termstr,fd,&err) == ERR) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002602 char* s = "setupterm: unknown error";
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002603
Victor Stinner26486ea2010-05-15 22:23:53 +00002604 if (err == 0) {
2605 s = "setupterm: could not find terminal";
2606 } else if (err == -1) {
2607 s = "setupterm: could not find terminfo database";
2608 }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002609
Victor Stinner26486ea2010-05-15 22:23:53 +00002610 PyErr_SetString(PyCursesError,s);
2611 return NULL;
2612 }
2613
2614 initialised_setupterm = TRUE;
2615
2616 Py_INCREF(Py_None);
2617 return Py_None;
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002618}
Guido van Rossumf6971e21994-08-30 12:25:20 +00002619
2620static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002621PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002622{
Victor Stinner26486ea2010-05-15 22:23:53 +00002623 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002624
Victor Stinner26486ea2010-05-15 22:23:53 +00002625 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002626
Victor Stinner26486ea2010-05-15 22:23:53 +00002627 switch(PyTuple_Size(args)) {
2628 case 1:
2629 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2630 break;
2631 default:
2632 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
2633 return NULL;
2634 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002635
Victor Stinner26486ea2010-05-15 22:23:53 +00002636 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002637}
2638
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002639#ifdef HAVE_CURSES_IS_TERM_RESIZED
2640static PyObject *
2641PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2642{
Victor Stinner26486ea2010-05-15 22:23:53 +00002643 int lines;
2644 int columns;
2645 int result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002646
Victor Stinner26486ea2010-05-15 22:23:53 +00002647 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002648
Victor Stinner26486ea2010-05-15 22:23:53 +00002649 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2650 return NULL;
2651 result = is_term_resized(lines, columns);
2652 if (result == TRUE) {
2653 Py_INCREF(Py_True);
2654 return Py_True;
2655 } else {
2656 Py_INCREF(Py_False);
2657 return Py_False;
2658 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002659}
2660#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2661
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002662#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002663static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002664PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002665{
Victor Stinner26486ea2010-05-15 22:23:53 +00002666 const char *knp;
2667 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002668
Victor Stinner26486ea2010-05-15 22:23:53 +00002669 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002670
Victor Stinner26486ea2010-05-15 22:23:53 +00002671 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002672
Victor Stinner26486ea2010-05-15 22:23:53 +00002673 if (ch < 0) {
2674 PyErr_SetString(PyExc_ValueError, "invalid key number");
2675 return NULL;
2676 }
2677 knp = keyname(ch);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002678
Victor Stinner26486ea2010-05-15 22:23:53 +00002679 return PyBytes_FromString((knp == NULL) ? "" : (char *)knp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002680}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002681#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002682
Victor Stinner26486ea2010-05-15 22:23:53 +00002683static PyObject *
2684PyCurses_KillChar(PyObject *self)
2685{
2686 char ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002687
Victor Stinner26486ea2010-05-15 22:23:53 +00002688 ch = killchar();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002689
Victor Stinner26486ea2010-05-15 22:23:53 +00002690 return PyBytes_FromStringAndSize(&ch, 1);
2691}
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002692
2693static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002694PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002695{
Victor Stinner26486ea2010-05-15 22:23:53 +00002696 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002697
Victor Stinner26486ea2010-05-15 22:23:53 +00002698 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002699
Victor Stinner26486ea2010-05-15 22:23:53 +00002700 switch(PyTuple_Size(args)) {
2701 case 1:
2702 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
2703 break;
2704 default:
2705 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2706 return NULL;
2707 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002708
Victor Stinner26486ea2010-05-15 22:23:53 +00002709 return PyCursesCheckERR(meta(stdscr, ch), "meta");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002710}
2711
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002712#ifdef NCURSES_MOUSE_VERSION
2713static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002714PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002715{
Victor Stinner26486ea2010-05-15 22:23:53 +00002716 int interval;
2717 PyCursesInitialised;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002718
Victor Stinner26486ea2010-05-15 22:23:53 +00002719 if (!PyArg_ParseTuple(args,"i;interval",&interval))
2720 return NULL;
2721 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002722}
2723
2724static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002725PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002726{
Victor Stinner26486ea2010-05-15 22:23:53 +00002727 int newmask;
2728 mmask_t oldmask, availmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002729
Victor Stinner26486ea2010-05-15 22:23:53 +00002730 PyCursesInitialised;
2731 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
2732 return NULL;
2733 availmask = mousemask(newmask, &oldmask);
2734 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002735}
2736#endif
2737
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002738static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002739PyCurses_Napms(PyObject *self, PyObject *args)
2740{
2741 int ms;
2742
Andrew M. Kuchling2b146762010-05-10 23:30:25 +00002743 PyCursesInitialised;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002744 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002745
2746 return Py_BuildValue("i", napms(ms));
2747}
2748
2749
2750static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002751PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002752{
Victor Stinner26486ea2010-05-15 22:23:53 +00002753 WINDOW *win;
2754 int nlines, ncols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002755
Victor Stinner26486ea2010-05-15 22:23:53 +00002756 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002757
Victor Stinner26486ea2010-05-15 22:23:53 +00002758 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002759
Victor Stinner26486ea2010-05-15 22:23:53 +00002760 win = newpad(nlines, ncols);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002761
Victor Stinner26486ea2010-05-15 22:23:53 +00002762 if (win == NULL) {
2763 PyErr_SetString(PyCursesError, catchall_NULL);
2764 return NULL;
2765 }
2766
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002767 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002768}
2769
2770static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002771PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002772{
Victor Stinner26486ea2010-05-15 22:23:53 +00002773 WINDOW *win;
2774 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002775
Victor Stinner26486ea2010-05-15 22:23:53 +00002776 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002777
Victor Stinner26486ea2010-05-15 22:23:53 +00002778 switch (PyTuple_Size(args)) {
2779 case 2:
2780 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
2781 return NULL;
2782 break;
2783 case 4:
2784 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
2785 &nlines,&ncols,&begin_y,&begin_x))
2786 return NULL;
2787 break;
2788 default:
2789 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2790 return NULL;
2791 }
Guido van Rossum85738471995-02-17 13:50:17 +00002792
Victor Stinner26486ea2010-05-15 22:23:53 +00002793 win = newwin(nlines,ncols,begin_y,begin_x);
2794 if (win == NULL) {
2795 PyErr_SetString(PyCursesError, catchall_NULL);
2796 return NULL;
2797 }
Guido van Rossum85738471995-02-17 13:50:17 +00002798
Victor Stinner0fdfceb2011-11-25 22:10:02 +01002799 return (PyObject *)PyCursesWindow_New(win, NULL);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002800}
2801
2802static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002803PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002804{
Victor Stinner26486ea2010-05-15 22:23:53 +00002805 short pair,f,b;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002806
Victor Stinner26486ea2010-05-15 22:23:53 +00002807 PyCursesInitialised;
2808 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002809
Victor Stinner26486ea2010-05-15 22:23:53 +00002810 switch(PyTuple_Size(args)) {
2811 case 1:
2812 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
2813 break;
2814 default:
2815 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
2816 return NULL;
2817 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002818
Victor Stinner26486ea2010-05-15 22:23:53 +00002819 if (pair_content(pair, &f, &b)==ERR) {
2820 PyErr_SetString(PyCursesError,
2821 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2822 return NULL;
2823 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002824
Victor Stinner26486ea2010-05-15 22:23:53 +00002825 return Py_BuildValue("(ii)", f, b);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002826}
2827
2828static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002829PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002830{
Victor Stinner26486ea2010-05-15 22:23:53 +00002831 int n;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002832
Victor Stinner26486ea2010-05-15 22:23:53 +00002833 PyCursesInitialised;
2834 PyCursesInitialisedColor;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002835
Victor Stinner26486ea2010-05-15 22:23:53 +00002836 switch(PyTuple_Size(args)) {
2837 case 1:
2838 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
2839 break;
2840 default:
2841 PyErr_SetString(PyExc_TypeError,
2842 "pair_number requires 1 argument");
2843 return NULL;
2844 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002845
Victor Stinner26486ea2010-05-15 22:23:53 +00002846 return PyLong_FromLong((long) ((n & A_COLOR) >> 8));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002847}
2848
2849static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002850PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002851{
Victor Stinner26486ea2010-05-15 22:23:53 +00002852 char *str;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002853
Victor Stinnerb3bc7e72011-11-03 20:35:40 +01002854 if (!PyArg_ParseTuple(args,"y;str", &str))
2855 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00002856 return PyCursesCheckERR(putp(str), "putp");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002857}
2858
2859static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002860PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002861{
Victor Stinner26486ea2010-05-15 22:23:53 +00002862 int flag = 0;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002863
Victor Stinner26486ea2010-05-15 22:23:53 +00002864 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002865
Victor Stinner26486ea2010-05-15 22:23:53 +00002866 switch(PyTuple_Size(args)) {
2867 case 0:
2868 qiflush();
2869 Py_INCREF(Py_None);
2870 return Py_None;
2871 case 1:
2872 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
2873 if (flag) qiflush();
2874 else noqiflush();
2875 Py_INCREF(Py_None);
2876 return Py_None;
2877 default:
2878 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
2879 return NULL;
2880 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002881}
2882
Guido van Rossumd8faa362007-04-27 19:54:29 +00002883/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2884 * and _curses.COLS */
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002885#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM)
Guido van Rossumd8faa362007-04-27 19:54:29 +00002886static int
2887update_lines_cols(void)
2888{
Victor Stinner26486ea2010-05-15 22:23:53 +00002889 PyObject *o;
2890 PyObject *m = PyImport_ImportModuleNoBlock("curses");
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002891 _Py_IDENTIFIER(LINES);
2892 _Py_IDENTIFIER(COLS);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002893
Victor Stinner26486ea2010-05-15 22:23:53 +00002894 if (!m)
2895 return 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002896
Victor Stinner26486ea2010-05-15 22:23:53 +00002897 o = PyLong_FromLong(LINES);
2898 if (!o) {
2899 Py_DECREF(m);
2900 return 0;
2901 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002902 if (_PyObject_SetAttrId(m, &PyId_LINES, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002903 Py_DECREF(m);
2904 Py_DECREF(o);
2905 return 0;
2906 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002907 /* PyId_LINES.object will be initialized here. */
2908 if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002909 Py_DECREF(m);
2910 Py_DECREF(o);
2911 return 0;
2912 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002913 Py_DECREF(o);
Victor Stinner26486ea2010-05-15 22:23:53 +00002914 o = PyLong_FromLong(COLS);
2915 if (!o) {
2916 Py_DECREF(m);
2917 return 0;
2918 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002919 if (_PyObject_SetAttrId(m, &PyId_COLS, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002920 Py_DECREF(m);
2921 Py_DECREF(o);
2922 return 0;
2923 }
Martin v. Löwis1c67dd92011-10-14 15:16:45 +02002924 if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) {
Victor Stinner26486ea2010-05-15 22:23:53 +00002925 Py_DECREF(m);
2926 Py_DECREF(o);
2927 return 0;
2928 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002929 Py_DECREF(o);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002930 Py_DECREF(m);
Victor Stinner26486ea2010-05-15 22:23:53 +00002931 return 1;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002932}
Benjamin Petersonfea6a942008-07-02 16:11:42 +00002933#endif
Guido van Rossumd8faa362007-04-27 19:54:29 +00002934
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002935#ifdef HAVE_CURSES_RESIZETERM
2936static PyObject *
2937PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2938{
Victor Stinner26486ea2010-05-15 22:23:53 +00002939 int lines;
2940 int columns;
2941 PyObject *result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002942
Victor Stinner26486ea2010-05-15 22:23:53 +00002943 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002944
Victor Stinner26486ea2010-05-15 22:23:53 +00002945 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2946 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002947
Victor Stinner26486ea2010-05-15 22:23:53 +00002948 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2949 if (!result)
2950 return NULL;
2951 if (!update_lines_cols())
2952 return NULL;
2953 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002954}
2955
2956#endif
2957
2958#ifdef HAVE_CURSES_RESIZE_TERM
2959static PyObject *
2960PyCurses_Resize_Term(PyObject *self, PyObject *args)
2961{
Victor Stinner26486ea2010-05-15 22:23:53 +00002962 int lines;
2963 int columns;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002964
Victor Stinner26486ea2010-05-15 22:23:53 +00002965 PyObject *result;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002966
Victor Stinner26486ea2010-05-15 22:23:53 +00002967 PyCursesInitialised;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002968
Victor Stinner26486ea2010-05-15 22:23:53 +00002969 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2970 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002971
Victor Stinner26486ea2010-05-15 22:23:53 +00002972 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2973 if (!result)
2974 return NULL;
2975 if (!update_lines_cols())
2976 return NULL;
2977 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002978}
2979#endif /* HAVE_CURSES_RESIZE_TERM */
2980
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002981static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002982PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002983{
Victor Stinner26486ea2010-05-15 22:23:53 +00002984 int y,x;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002985
Victor Stinner26486ea2010-05-15 22:23:53 +00002986 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002987
Victor Stinner26486ea2010-05-15 22:23:53 +00002988 if (PyTuple_Size(args)!=2) {
2989 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
2990 return NULL;
2991 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002992
Victor Stinner26486ea2010-05-15 22:23:53 +00002993 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002994
Victor Stinner26486ea2010-05-15 22:23:53 +00002995 setsyx(y,x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002996
Victor Stinner26486ea2010-05-15 22:23:53 +00002997 Py_INCREF(Py_None);
2998 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002999}
3000
3001static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00003002PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003003{
Victor Stinner26486ea2010-05-15 22:23:53 +00003004 int code;
3005 PyObject *c, *cp;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003006
Victor Stinner26486ea2010-05-15 22:23:53 +00003007 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003008
Victor Stinner26486ea2010-05-15 22:23:53 +00003009 code = start_color();
3010 if (code != ERR) {
3011 initialisedcolors = TRUE;
3012 c = PyLong_FromLong((long) COLORS);
Christian Heimesa956e642013-07-26 14:45:37 +02003013 if (c == NULL)
3014 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003015 PyDict_SetItemString(ModDict, "COLORS", c);
3016 Py_DECREF(c);
3017 cp = PyLong_FromLong((long) COLOR_PAIRS);
Christian Heimesa956e642013-07-26 14:45:37 +02003018 if (cp == NULL)
3019 return NULL;
Victor Stinner26486ea2010-05-15 22:23:53 +00003020 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
3021 Py_DECREF(cp);
3022 Py_INCREF(Py_None);
3023 return Py_None;
3024 } else {
3025 PyErr_SetString(PyCursesError, "start_color() returned ERR");
3026 return NULL;
3027 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003028}
3029
3030static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003031PyCurses_tigetflag(PyObject *self, PyObject *args)
3032{
Victor Stinner26486ea2010-05-15 22:23:53 +00003033 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003034
Victor Stinner26486ea2010-05-15 22:23:53 +00003035 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003036
Victor Stinner26486ea2010-05-15 22:23:53 +00003037 if (!PyArg_ParseTuple(args, "s", &capname))
3038 return NULL;
3039
3040 return PyLong_FromLong( (long) tigetflag( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003041}
3042
3043static PyObject *
3044PyCurses_tigetnum(PyObject *self, PyObject *args)
3045{
Victor Stinner26486ea2010-05-15 22:23:53 +00003046 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003047
Victor Stinner26486ea2010-05-15 22:23:53 +00003048 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003049
Victor Stinner26486ea2010-05-15 22:23:53 +00003050 if (!PyArg_ParseTuple(args, "s", &capname))
3051 return NULL;
3052
3053 return PyLong_FromLong( (long) tigetnum( capname ) );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003054}
3055
3056static PyObject *
3057PyCurses_tigetstr(PyObject *self, PyObject *args)
3058{
Victor Stinner26486ea2010-05-15 22:23:53 +00003059 char *capname;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003060
Victor Stinner26486ea2010-05-15 22:23:53 +00003061 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003062
Victor Stinner26486ea2010-05-15 22:23:53 +00003063 if (!PyArg_ParseTuple(args, "s", &capname))
3064 return NULL;
3065
3066 capname = tigetstr( capname );
3067 if (capname == 0 || capname == (char*) -1) {
3068 Py_INCREF(Py_None);
3069 return Py_None;
3070 }
3071 return PyBytes_FromString( capname );
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00003072}
3073
3074static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003075PyCurses_tparm(PyObject *self, PyObject *args)
3076{
Victor Stinner26486ea2010-05-15 22:23:53 +00003077 char* fmt;
3078 char* result = NULL;
3079 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 +00003080
Victor Stinner26486ea2010-05-15 22:23:53 +00003081 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003082
Victor Stinner26621332011-11-02 23:45:29 +01003083 if (!PyArg_ParseTuple(args, "y|iiiiiiiii:tparm",
Victor Stinner26486ea2010-05-15 22:23:53 +00003084 &fmt, &i1, &i2, &i3, &i4,
3085 &i5, &i6, &i7, &i8, &i9)) {
3086 return NULL;
3087 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003088
Victor Stinner26486ea2010-05-15 22:23:53 +00003089 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
3090 if (!result) {
3091 PyErr_SetString(PyCursesError, "tparm() returned NULL");
3092 return NULL;
3093 }
Michael W. Hudson21007982002-11-21 14:17:51 +00003094
Victor Stinner26486ea2010-05-15 22:23:53 +00003095 return PyBytes_FromString(result);
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00003096}
3097
3098static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003099PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003100{
Victor Stinner26486ea2010-05-15 22:23:53 +00003101 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003102
Victor Stinner26486ea2010-05-15 22:23:53 +00003103 PyCursesInitialised;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003104
Victor Stinner26486ea2010-05-15 22:23:53 +00003105 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003106
Victor Stinner26486ea2010-05-15 22:23:53 +00003107 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00003108}
3109
3110static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003111PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003112{
Victor Stinner26486ea2010-05-15 22:23:53 +00003113 PyObject *temp;
3114 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003115
Victor Stinner26486ea2010-05-15 22:23:53 +00003116 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003117
Victor Stinner26486ea2010-05-15 22:23:53 +00003118 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003119
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003120 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
Victor Stinner26486ea2010-05-15 22:23:53 +00003121 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003122
Victor Stinner26486ea2010-05-15 22:23:53 +00003123 return PyBytes_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00003124}
3125
3126static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003127PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003128{
Victor Stinner26486ea2010-05-15 22:23:53 +00003129 PyObject *temp;
3130 chtype ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003131
Victor Stinner26486ea2010-05-15 22:23:53 +00003132 PyCursesInitialised;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003133
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003134 if (!PyArg_ParseTuple(args,"O;ch or int",&temp))
Victor Stinner26486ea2010-05-15 22:23:53 +00003135 return NULL;
Victor Stinner0fdfceb2011-11-25 22:10:02 +01003136
3137 if (!PyCurses_ConvertToChtype(NULL, temp, &ch))
3138 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003139
Victor Stinner26486ea2010-05-15 22:23:53 +00003140 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00003141}
3142
Victor Stinner71e44cb2011-09-06 01:53:03 +02003143#ifdef HAVE_NCURSESW
3144/* Convert an object to a character (wchar_t):
3145
3146 - int
3147 - str of length 1
3148
3149 Return 1 on success, 0 on error. */
3150static int
3151PyCurses_ConvertToWchar_t(PyObject *obj,
3152 wchar_t *wch)
3153{
3154 if (PyUnicode_Check(obj)) {
3155 wchar_t buffer[2];
3156 if (PyUnicode_AsWideChar(obj, buffer, 2) != 1) {
3157 PyErr_Format(PyExc_TypeError,
3158 "expect bytes or str of length 1, or int, "
3159 "got a str of length %zi",
Victor Stinnerc4f281e2011-10-11 22:11:42 +02003160 PyUnicode_GET_LENGTH(obj));
Victor Stinner71e44cb2011-09-06 01:53:03 +02003161 return 0;
3162 }
3163 *wch = buffer[0];
3164 return 2;
3165 }
3166 else if (PyLong_CheckExact(obj)) {
3167 long value;
3168 int overflow;
3169 value = PyLong_AsLongAndOverflow(obj, &overflow);
3170 if (overflow) {
3171 PyErr_SetString(PyExc_OverflowError,
3172 "int doesn't fit in long");
3173 return 0;
3174 }
3175 *wch = (wchar_t)value;
3176 if ((long)*wch != value) {
3177 PyErr_Format(PyExc_OverflowError,
3178 "character doesn't fit in wchar_t");
3179 return 0;
3180 }
3181 return 1;
3182 }
3183 else {
3184 PyErr_Format(PyExc_TypeError,
3185 "expect bytes or str of length 1, or int, got %s",
3186 Py_TYPE(obj)->tp_name);
3187 return 0;
3188 }
3189}
3190
3191static PyObject *
3192PyCurses_Unget_Wch(PyObject *self, PyObject *args)
3193{
3194 PyObject *obj;
3195 wchar_t wch;
3196
3197 PyCursesInitialised;
3198
3199 if (!PyArg_ParseTuple(args,"O", &obj))
3200 return NULL;
3201
3202 if (!PyCurses_ConvertToWchar_t(obj, &wch))
3203 return NULL;
3204 return PyCursesCheckERR(unget_wch(wch), "unget_wch");
3205}
3206#endif
3207
Guido van Rossumf6971e21994-08-30 12:25:20 +00003208static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00003209PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003210{
Victor Stinner26486ea2010-05-15 22:23:53 +00003211 int flag;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003212
Victor Stinner26486ea2010-05-15 22:23:53 +00003213 switch(PyTuple_Size(args)) {
3214 case 1:
3215 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
3216 return NULL;
3217 break;
3218 default:
3219 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
3220 return NULL;
3221 }
3222 use_env(flag);
3223 Py_INCREF(Py_None);
3224 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003225}
3226
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003227#ifndef STRICT_SYSV_CURSES
3228static PyObject *
3229PyCurses_Use_Default_Colors(PyObject *self)
3230{
Victor Stinner26486ea2010-05-15 22:23:53 +00003231 int code;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003232
Victor Stinner26486ea2010-05-15 22:23:53 +00003233 PyCursesInitialised;
3234 PyCursesInitialisedColor;
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003235
Victor Stinner26486ea2010-05-15 22:23:53 +00003236 code = use_default_colors();
3237 if (code != ERR) {
3238 Py_INCREF(Py_None);
3239 return Py_None;
3240 } else {
3241 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
3242 return NULL;
3243 }
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003244}
3245#endif /* STRICT_SYSV_CURSES */
3246
Guido van Rossumf6971e21994-08-30 12:25:20 +00003247/* List of functions defined in the module */
3248
3249static PyMethodDef PyCurses_methods[] = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003250 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
3251 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
3252 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
3253 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
3254 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
3255 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
3256 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
3257 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
3258 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
3259 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
3260 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
3261 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
3262 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
3263 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
3264 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
3265 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
3266 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003267#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003268 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
3269 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003270#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003271 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
3272 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
3273 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
3274 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
3275 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00003276#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003277 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00003278#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003279 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
3280 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
3281 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
3282 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
3283 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
3284 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003285#ifdef HAVE_CURSES_IS_TERM_RESIZED
Victor Stinner26486ea2010-05-15 22:23:53 +00003286 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003287#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003288#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003289 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003290#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003291 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
3292 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
3293 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003294#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003295 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
3296 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003297#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003298 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
3299 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
3300 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
3301 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
3302 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
3303 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
3304 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
3305 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
3306 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
3307 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
3308 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
3309 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
3310 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
3311 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
3312 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
3313 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
3314 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003315#ifdef HAVE_CURSES_RESIZETERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003316 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003317#endif
3318#ifdef HAVE_CURSES_RESIZE_TERM
Victor Stinner26486ea2010-05-15 22:23:53 +00003319 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003320#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003321 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
3322 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
3323 {"setupterm", (PyCFunction)PyCurses_setupterm,
3324 METH_VARARGS|METH_KEYWORDS},
3325 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
3326 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
3327 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
3328 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
3329 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
3330 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
3331 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
3332 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
3333 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
3334 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
Victor Stinner71e44cb2011-09-06 01:53:03 +02003335#ifdef HAVE_NCURSESW
3336 {"unget_wch", (PyCFunction)PyCurses_Unget_Wch, METH_VARARGS},
3337#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003338 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003339#ifndef STRICT_SYSV_CURSES
Victor Stinner26486ea2010-05-15 22:23:53 +00003340 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00003341#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003342 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00003343};
3344
3345/* Initialization function for the module */
3346
Martin v. Löwis1a214512008-06-11 05:26:20 +00003347
3348static struct PyModuleDef _cursesmodule = {
Victor Stinner26486ea2010-05-15 22:23:53 +00003349 PyModuleDef_HEAD_INIT,
3350 "_curses",
3351 NULL,
3352 -1,
3353 PyCurses_methods,
3354 NULL,
3355 NULL,
3356 NULL,
3357 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003358};
3359
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003360PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003361PyInit__curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00003362{
Victor Stinner26486ea2010-05-15 22:23:53 +00003363 PyObject *m, *d, *v, *c_api_object;
3364 static void *PyCurses_API[PyCurses_API_pointers];
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003365
Victor Stinner26486ea2010-05-15 22:23:53 +00003366 /* Initialize object type */
3367 if (PyType_Ready(&PyCursesWindow_Type) < 0)
3368 return NULL;
Guido van Rossum6915c4d2001-01-19 00:28:08 +00003369
Victor Stinner26486ea2010-05-15 22:23:53 +00003370 /* Initialize the C API pointer array */
3371 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
3372 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
3373 PyCurses_API[2] = (void *)func_PyCursesInitialised;
3374 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003375
Victor Stinner26486ea2010-05-15 22:23:53 +00003376 /* Create the module and add the functions */
3377 m = PyModule_Create(&_cursesmodule);
3378 if (m == NULL)
3379 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003380
Victor Stinner26486ea2010-05-15 22:23:53 +00003381 /* Add some symbolic constants to the module */
3382 d = PyModule_GetDict(m);
3383 if (d == NULL)
3384 return NULL;
3385 ModDict = d; /* For PyCurses_InitScr to use later */
Andrew M. Kuchling32552682000-12-22 21:52:27 +00003386
Victor Stinner26486ea2010-05-15 22:23:53 +00003387 /* Add a capsule for the C API */
3388 c_api_object = PyCapsule_New(PyCurses_API, PyCurses_CAPSULE_NAME, NULL);
3389 PyDict_SetItemString(d, "_C_API", c_api_object);
3390 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003391
Victor Stinner26486ea2010-05-15 22:23:53 +00003392 /* For exception curses.error */
3393 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
3394 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00003395
Victor Stinner26486ea2010-05-15 22:23:53 +00003396 /* Make the version available */
3397 v = PyBytes_FromString(PyCursesVersion);
3398 PyDict_SetItemString(d, "version", v);
3399 PyDict_SetItemString(d, "__version__", v);
3400 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003401
Victor Stinner26486ea2010-05-15 22:23:53 +00003402 SetDictInt("ERR", ERR);
3403 SetDictInt("OK", OK);
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00003404
Victor Stinner26486ea2010-05-15 22:23:53 +00003405 /* Here are some attributes you can add to chars to print */
3406
3407 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
3408 SetDictInt("A_NORMAL", A_NORMAL);
3409 SetDictInt("A_STANDOUT", A_STANDOUT);
3410 SetDictInt("A_UNDERLINE", A_UNDERLINE);
3411 SetDictInt("A_REVERSE", A_REVERSE);
3412 SetDictInt("A_BLINK", A_BLINK);
3413 SetDictInt("A_DIM", A_DIM);
3414 SetDictInt("A_BOLD", A_BOLD);
3415 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003416#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003417 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003418#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003419 SetDictInt("A_PROTECT", A_PROTECT);
3420 SetDictInt("A_CHARTEXT", A_CHARTEXT);
3421 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003422
Victor Stinner26486ea2010-05-15 22:23:53 +00003423 /* The following are never available with strict SYSV curses */
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003424#ifdef A_HORIZONTAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003425 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003426#endif
3427#ifdef A_LEFT
Victor Stinner26486ea2010-05-15 22:23:53 +00003428 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003429#endif
3430#ifdef A_LOW
Victor Stinner26486ea2010-05-15 22:23:53 +00003431 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003432#endif
3433#ifdef A_RIGHT
Victor Stinner26486ea2010-05-15 22:23:53 +00003434 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003435#endif
3436#ifdef A_TOP
Victor Stinner26486ea2010-05-15 22:23:53 +00003437 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00003438#endif
3439#ifdef A_VERTICAL
Victor Stinner26486ea2010-05-15 22:23:53 +00003440 SetDictInt("A_VERTICAL", A_VERTICAL);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00003441#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00003442
Victor Stinner26486ea2010-05-15 22:23:53 +00003443 SetDictInt("COLOR_BLACK", COLOR_BLACK);
3444 SetDictInt("COLOR_RED", COLOR_RED);
3445 SetDictInt("COLOR_GREEN", COLOR_GREEN);
3446 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
3447 SetDictInt("COLOR_BLUE", COLOR_BLUE);
3448 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
3449 SetDictInt("COLOR_CYAN", COLOR_CYAN);
3450 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00003451
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003452#ifdef NCURSES_MOUSE_VERSION
Victor Stinner26486ea2010-05-15 22:23:53 +00003453 /* Mouse-related constants */
3454 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
3455 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
3456 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
3457 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
3458 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003459
Victor Stinner26486ea2010-05-15 22:23:53 +00003460 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
3461 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
3462 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
3463 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
3464 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003465
Victor Stinner26486ea2010-05-15 22:23:53 +00003466 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
3467 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
3468 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
3469 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
3470 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003471
Victor Stinner26486ea2010-05-15 22:23:53 +00003472 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
3473 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
3474 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
3475 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
3476 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003477
Victor Stinner26486ea2010-05-15 22:23:53 +00003478 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
3479 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
3480 SetDictInt("BUTTON_ALT", BUTTON_ALT);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003481
Victor Stinner26486ea2010-05-15 22:23:53 +00003482 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
3483 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00003484#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003485 /* Now set everything up for KEY_ variables */
3486 {
3487 int key;
3488 char *key_n;
3489 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003490#if !defined(__NetBSD__)
Victor Stinner26486ea2010-05-15 22:23:53 +00003491 for (key=KEY_MIN;key < KEY_MAX; key++) {
3492 key_n = (char *)keyname(key);
3493 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
3494 continue;
3495 if (strncmp(key_n,"KEY_F(",6)==0) {
3496 char *p1, *p2;
Victor Stinnerb6404912013-07-07 16:21:41 +02003497 key_n2 = PyMem_Malloc(strlen(key_n)+1);
Victor Stinner26486ea2010-05-15 22:23:53 +00003498 if (!key_n2) {
3499 PyErr_NoMemory();
3500 break;
3501 }
3502 p1 = key_n;
3503 p2 = key_n2;
3504 while (*p1) {
3505 if (*p1 != '(' && *p1 != ')') {
3506 *p2 = *p1;
3507 p2++;
3508 }
3509 p1++;
3510 }
3511 *p2 = (char)0;
3512 } else
3513 key_n2 = key_n;
3514 SetDictInt(key_n2,key);
3515 if (key_n2 != key_n)
Victor Stinnerb6404912013-07-07 16:21:41 +02003516 PyMem_Free(key_n2);
Victor Stinner26486ea2010-05-15 22:23:53 +00003517 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00003518#endif
Victor Stinner26486ea2010-05-15 22:23:53 +00003519 SetDictInt("KEY_MIN", KEY_MIN);
3520 SetDictInt("KEY_MAX", KEY_MAX);
3521 }
3522 return m;
Guido van Rossumf6971e21994-08-30 12:25:20 +00003523}