blob: ec55c8ed2319ca5c5546baaa2a17db7420b47226 [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. Kuchling22b88ce2000-05-23 16:18:03 +000034/* CVS: $Id$ */
Guido van Rossumf6971e21994-08-30 12:25:20 +000035
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000036/*
37
38A number of SysV or ncurses functions don't have wrappers yet; if you need
39a given function, add it and send a patch. Here's a list of currently
40unsupported functions:
41
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +000042 addchnstr addchstr chgat color_set define_key
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000043 del_curterm delscreen dupwin inchnstr inchstr innstr keyok
44 mcprint mvaddchnstr mvaddchstr mvchgat mvcur mvinchnstr
45 mvinchstr mvinnstr mmvwaddchnstr mvwaddchstr mvwchgat
Thomas Wouters0e3f5912006-08-11 14:57:12 +000046 mvwinchnstr mvwinchstr mvwinnstr newterm
47 restartterm ripoffline scr_dump
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000048 scr_init scr_restore scr_set scrl set_curterm set_term setterm
49 tgetent tgetflag tgetnum tgetstr tgoto timeout tputs
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +000050 vidattr vidputs waddchnstr waddchstr wchgat
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +000051 wcolor_set winchnstr winchstr winnstr wmouse_trafo wscrl
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000052
53Low-priority:
54 slk_attr slk_attr_off slk_attr_on slk_attr_set slk_attroff
55 slk_attron slk_attrset slk_clear slk_color slk_init slk_label
56 slk_noutrefresh slk_refresh slk_restore slk_set slk_touch
57
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +000058Menu extension (ncurses and probably SYSV):
59 current_item free_item free_menu item_count item_description
60 item_index item_init item_name item_opts item_opts_off
61 item_opts_on item_term item_userptr item_value item_visible
62 menu_back menu_driver menu_fore menu_format menu_grey
63 menu_init menu_items menu_mark menu_opts menu_opts_off
64 menu_opts_on menu_pad menu_pattern menu_request_by_name
65 menu_request_name menu_spacing menu_sub menu_term menu_userptr
66 menu_win new_item new_menu pos_menu_cursor post_menu
67 scale_menu set_current_item set_item_init set_item_opts
68 set_item_term set_item_userptr set_item_value set_menu_back
69 set_menu_fore set_menu_format set_menu_grey set_menu_init
70 set_menu_items set_menu_mark set_menu_opts set_menu_pad
71 set_menu_pattern set_menu_spacing set_menu_sub set_menu_term
72 set_menu_userptr set_menu_win set_top_row top_row unpost_menu
73
74Form extension (ncurses and probably SYSV):
75 current_field data_ahead data_behind dup_field
76 dynamic_fieldinfo field_arg field_back field_buffer
77 field_count field_fore field_index field_info field_init
78 field_just field_opts field_opts_off field_opts_on field_pad
79 field_status field_term field_type field_userptr form_driver
80 form_fields form_init form_opts form_opts_off form_opts_on
81 form_page form_request_by_name form_request_name form_sub
82 form_term form_userptr form_win free_field free_form
83 link_field link_fieldtype move_field new_field new_form
84 new_page pos_form_cursor post_form scale_form
85 set_current_field set_field_back set_field_buffer
86 set_field_fore set_field_init set_field_just set_field_opts
87 set_field_pad set_field_status set_field_term set_field_type
88 set_field_userptr set_fieldtype_arg set_fieldtype_choice
89 set_form_fields set_form_init set_form_opts set_form_page
90 set_form_sub set_form_term set_form_userptr set_form_win
91 set_max_field set_new_page unpost_form
92
93
Andrew M. Kuchlingfb6bbf52000-07-27 11:58:01 +000094 */
95
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +000096/* Release Number */
Guido van Rossumf6971e21994-08-30 12:25:20 +000097
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +000098char *PyCursesVersion = "2.2";
Guido van Rossumf6971e21994-08-30 12:25:20 +000099
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000100/* Includes */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000101
Guido van Rossum602099a1994-09-14 13:32:22 +0000102#include "Python.h"
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000103
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000104#ifdef __osf__
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000105#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000106#endif
107
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
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +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
118 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
Martin v. Löwis21ee4092002-09-30 16:19:48 +0000124#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun) || defined(SCO5))
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +0000125#define STRICT_SYSV_CURSES /* Don't use ncurses extensions */
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000126typedef chtype attr_t; /* No attr_t type is available */
Guido van Rossum1266a011996-02-25 04:50:31 +0000127#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000128
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000129#if defined(_AIX)
130#define STRICT_SYSV_CURSES
131#endif
132
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000133/* Definition of exception curses.error */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000134
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000135static PyObject *PyCursesError;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000136
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000137/* Tells whether setupterm() has been called to initialise terminfo. */
138static int initialised_setupterm = FALSE;
139
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000140/* Tells whether initscr() has been called to initialise curses. */
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000141static int initialised = FALSE;
142
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000143/* Tells whether start_color() has been called to initialise color usage. */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000144static int initialisedcolors = FALSE;
145
146/* Utility Macros */
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000147#define PyCursesSetupTermCalled \
148 if (initialised_setupterm != TRUE) { \
149 PyErr_SetString(PyCursesError, \
150 "must call (at least) setupterm() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000151 return 0; }
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +0000152
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000153#define PyCursesInitialised \
154 if (initialised != TRUE) { \
155 PyErr_SetString(PyCursesError, \
156 "must call initscr() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000157 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000158
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000159#define PyCursesInitialisedColor \
160 if (initialisedcolors != TRUE) { \
161 PyErr_SetString(PyCursesError, \
162 "must call start_color() first"); \
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000163 return 0; }
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000164
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000165#ifndef MIN
166#define MIN(x,y) ((x) < (y) ? (x) : (y))
167#endif
168
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000169/* Utility Functions */
Guido van Rossumfbea2f31994-08-31 22:05:27 +0000170
Guido van Rossum85738471995-02-17 13:50:17 +0000171/*
172 * Check the return code from a curses function and return None
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000173 * or raise an exception as appropriate. These are exported using the
174 * CObject API.
Guido van Rossum85738471995-02-17 13:50:17 +0000175 */
176
177static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000178PyCursesCheckERR(int code, char *fname)
Guido van Rossum85738471995-02-17 13:50:17 +0000179{
Guido van Rossum85738471995-02-17 13:50:17 +0000180 if (code != ERR) {
181 Py_INCREF(Py_None);
182 return Py_None;
183 } else {
184 if (fname == NULL) {
185 PyErr_SetString(PyCursesError, catchall_ERR);
186 } else {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000187 PyErr_Format(PyCursesError, "%s() returned ERR", fname);
Guido van Rossum85738471995-02-17 13:50:17 +0000188 }
189 return NULL;
190 }
191}
192
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000193static int
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000194PyCurses_ConvertToChtype(PyObject *obj, chtype *ch)
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000195{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000196 if (PyInt_Check(obj)) {
197 *ch = (chtype) PyInt_AsLong(obj);
Martin v. Löwisbfdf4ec2001-06-23 19:58:46 +0000198 } else if(PyString_Check(obj)
199 && (PyString_Size(obj) == 1)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000200 *ch = (chtype) *PyString_AsString(obj);
201 } else {
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000202 return 0;
203 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000204 return 1;
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000205}
206
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000207/* Function versions of the 3 functions for tested whether curses has been
208 initialised or not. */
209
210static int func_PyCursesSetupTermCalled(void)
211{
212 PyCursesSetupTermCalled;
213 return 1;
214}
215
216static int func_PyCursesInitialised(void)
217{
218 PyCursesInitialised;
219 return 1;
220}
221
222static int func_PyCursesInitialisedColor(void)
223{
224 PyCursesInitialisedColor;
225 return 1;
226}
227
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000228/*****************************************************************************
229 The Window Object
230******************************************************************************/
Guido van Rossum585c6dc1995-02-24 13:45:43 +0000231
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000232/* Definition of the window type */
Guido van Rossum85738471995-02-17 13:50:17 +0000233
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000234PyTypeObject PyCursesWindow_Type;
235
Andrew M. Kuchling32552682000-12-22 21:52:27 +0000236/* Function prototype macros for Window object
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000237
238 X - function name
239 TYPE - parameter Type
240 ERGSTR - format string for construction of the return value
241 PARSESTR - format string for argument parsing
242 */
243
244#define Window_NoArgNoReturnFunction(X) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000245static PyObject *PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000246{ return PyCursesCheckERR(X(self->win), # X); }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000247
248#define Window_NoArgTrueFalseFunction(X) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000249static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000250{ \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000251 if (X (self->win) == FALSE) { Py_INCREF(Py_False); return Py_False; } \
252 else { Py_INCREF(Py_True); return Py_True; } }
253
254#define Window_NoArgNoReturnVoidFunction(X) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000255static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000256{ \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000257 X(self->win); Py_INCREF(Py_None); return Py_None; }
258
259#define Window_NoArg2TupleReturnFunction(X, TYPE, ERGSTR) \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000260static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000261{ \
262 TYPE arg1, arg2; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000263 X(self->win,arg1,arg2); return Py_BuildValue(ERGSTR, arg1, arg2); }
264
265#define Window_OneArgNoReturnVoidFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000266static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000267{ \
268 TYPE arg1; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000269 if (!PyArg_ParseTuple(args, PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000270 X(self->win,arg1); Py_INCREF(Py_None); return Py_None; }
271
272#define Window_OneArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000273static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000274{ \
275 TYPE arg1; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000276 if (!PyArg_ParseTuple(args,PARSESTR, &arg1)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000277 return PyCursesCheckERR(X(self->win, arg1), # X); }
278
279#define Window_TwoArgNoReturnFunction(X, TYPE, PARSESTR) \
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000280static PyObject * PyCursesWindow_ ## X (PyCursesWindowObject *self, PyObject *args) \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000281{ \
282 TYPE arg1, arg2; \
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000283 if (!PyArg_ParseTuple(args,PARSESTR, &arg1, &arg2)) return NULL; \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000284 return PyCursesCheckERR(X(self->win, arg1, arg2), # X); }
Guido van Rossum85738471995-02-17 13:50:17 +0000285
Guido van Rossumf6971e21994-08-30 12:25:20 +0000286/* ------------- WINDOW routines --------------- */
Guido van Rossum85738471995-02-17 13:50:17 +0000287
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000288Window_NoArgNoReturnFunction(untouchwin)
289Window_NoArgNoReturnFunction(touchwin)
290Window_NoArgNoReturnFunction(redrawwin)
291Window_NoArgNoReturnFunction(winsertln)
292Window_NoArgNoReturnFunction(werase)
293Window_NoArgNoReturnFunction(wdeleteln)
294
295Window_NoArgTrueFalseFunction(is_wintouched)
296
297Window_NoArgNoReturnVoidFunction(wsyncup)
298Window_NoArgNoReturnVoidFunction(wsyncdown)
299Window_NoArgNoReturnVoidFunction(wstandend)
300Window_NoArgNoReturnVoidFunction(wstandout)
301Window_NoArgNoReturnVoidFunction(wcursyncup)
302Window_NoArgNoReturnVoidFunction(wclrtoeol)
303Window_NoArgNoReturnVoidFunction(wclrtobot)
304Window_NoArgNoReturnVoidFunction(wclear)
305
306Window_OneArgNoReturnVoidFunction(idcok, int, "i;True(1) or False(0)")
307Window_OneArgNoReturnVoidFunction(immedok, int, "i;True(1) or False(0)")
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +0000308Window_OneArgNoReturnVoidFunction(wtimeout, int, "i;delay")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000309
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000310Window_NoArg2TupleReturnFunction(getyx, int, "ii")
311Window_NoArg2TupleReturnFunction(getbegyx, int, "ii")
312Window_NoArg2TupleReturnFunction(getmaxyx, int, "ii")
313Window_NoArg2TupleReturnFunction(getparyx, int, "ii")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000314
315Window_OneArgNoReturnFunction(wattron, attr_t, "l;attr")
316Window_OneArgNoReturnFunction(wattroff, attr_t, "l;attr")
317Window_OneArgNoReturnFunction(wattrset, attr_t, "l;attr")
318Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
319Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000320#if defined(__NetBSD__)
321Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
322#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000323Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000324#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000325Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000326#if defined(__NetBSD__)
327Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
328#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000329Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000330#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000331Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
332Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000333Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000334Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
335
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000336Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
337Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
338Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000339#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000340Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000341#endif
342
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000343/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000344
Guido van Rossumf6971e21994-08-30 12:25:20 +0000345static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000346PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000347{
348 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000349
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000350 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
351 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000352 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000353 return (PyObject *)wo;
354}
355
356static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000357PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000358{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000359 if (wo->win != stdscr) delwin(wo->win);
Michael W. Hudson67fb0c32002-01-30 15:39:28 +0000360 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000361}
362
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000363/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000364
365static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000366PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000367{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000368 int rtn, x, y, use_xy = FALSE;
369 PyObject *temp;
370 chtype ch = 0;
371 attr_t attr = A_NORMAL;
372
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000373 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000374 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000375 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000376 return NULL;
377 break;
378 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000379 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000380 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000381 break;
382 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000383 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000384 return NULL;
385 use_xy = TRUE;
386 break;
387 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000388 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000389 &y, &x, &temp, &attr))
390 return NULL;
391 use_xy = TRUE;
392 break;
393 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000394 PyErr_SetString(PyExc_TypeError, "addch requires 1 to 4 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000395 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000396 }
Guido van Rossum85738471995-02-17 13:50:17 +0000397
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000398 if (!PyCurses_ConvertToChtype(temp, &ch)) {
399 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
400 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000401 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000402
Guido van Rossumf6971e21994-08-30 12:25:20 +0000403 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000404 rtn = mvwaddch(self->win,y,x, ch | attr);
405 else {
406 rtn = waddch(self->win, ch | attr);
407 }
408 return PyCursesCheckERR(rtn, "addch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000409}
410
411static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000412PyCursesWindow_AddStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000413{
414 int rtn;
415 int x, y;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000416 char *str;
417 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
418 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000419
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000420 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000421 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000422 if (!PyArg_ParseTuple(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000423 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000424 break;
425 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000426 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000427 return NULL;
428 use_attr = TRUE;
429 break;
430 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000431 if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000432 return NULL;
433 use_xy = TRUE;
434 break;
435 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000436 if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000437 return NULL;
438 use_xy = use_attr = TRUE;
439 break;
440 default:
441 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
442 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000443 }
Guido van Rossum85738471995-02-17 13:50:17 +0000444
Guido van Rossumf6971e21994-08-30 12:25:20 +0000445 if (use_attr == TRUE) {
446 attr_old = getattrs(self->win);
447 wattrset(self->win,attr);
448 }
449 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000450 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000451 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000452 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000453 if (use_attr == TRUE)
454 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000455 return PyCursesCheckERR(rtn, "addstr");
456}
Guido van Rossum85738471995-02-17 13:50:17 +0000457
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000459PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000460{
461 int rtn, x, y, n;
462 char *str;
463 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
464 int use_xy = FALSE, use_attr = FALSE;
465
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000466 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000467 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000468 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000469 return NULL;
470 break;
471 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000472 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000473 return NULL;
474 use_attr = TRUE;
475 break;
476 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000477 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000478 return NULL;
479 use_xy = TRUE;
480 break;
481 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000482 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000483 return NULL;
484 use_xy = use_attr = TRUE;
485 break;
486 default:
487 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
488 return NULL;
489 }
490
491 if (use_attr == TRUE) {
492 attr_old = getattrs(self->win);
493 wattrset(self->win,attr);
494 }
495 if (use_xy == TRUE)
496 rtn = mvwaddnstr(self->win,y,x,str,n);
497 else
498 rtn = waddnstr(self->win,str,n);
499 if (use_attr == TRUE)
500 wattrset(self->win,attr_old);
501 return PyCursesCheckERR(rtn, "addnstr");
502}
503
504static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000505PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000506{
507 PyObject *temp;
508 chtype bkgd;
509 attr_t attr = A_NORMAL;
510
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000511 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000512 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000513 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000514 return NULL;
515 break;
516 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000517 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000518 return NULL;
519 break;
520 default:
521 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
522 return NULL;
523 }
524
525 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
526 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
527 return NULL;
528 }
529
Andrew M. Kuchling4a596e32001-09-04 19:34:32 +0000530 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000531}
532
533static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000534PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000535{
536 PyObject *temp;
537 chtype bkgd;
538 attr_t attr = A_NORMAL;
539
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000540 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000541 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000542 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000543 return NULL;
544 break;
545 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000546 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000547 return NULL;
548 break;
549 default:
550 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
551 return NULL;
552 }
553
554 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000555 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000556 return NULL;
557 }
558
559 wbkgdset(self->win, bkgd | attr);
560 return PyCursesCheckERR(0, "bkgdset");
561}
562
563static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000564PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000565{
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000566 PyObject *temp[8];
567 chtype ch[8];
568 int i;
569
570 /* Clear the array of parameters */
571 for(i=0; i<8; i++) {
572 temp[i] = NULL;
573 ch[i] = 0;
574 }
575
576 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
577 &temp[0], &temp[1], &temp[2], &temp[3],
578 &temp[4], &temp[5], &temp[6], &temp[7]))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000579 return NULL;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000580
581 for(i=0; i<8; i++) {
582 if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
583 PyErr_Format(PyExc_TypeError,
584 "argument %i must be a ch or an int", i+1);
585 return NULL;
586 }
587 }
588
589 wborder(self->win,
590 ch[0], ch[1], ch[2], ch[3],
591 ch[4], ch[5], ch[6], ch[7]);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000592 Py_INCREF(Py_None);
593 return Py_None;
594}
595
596static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000597PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000598{
599 chtype ch1=0,ch2=0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000600 switch(PyTuple_Size(args)){
601 case 0: break;
602 default:
603 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000604 return NULL;
605 }
606 box(self->win,ch1,ch2);
607 Py_INCREF(Py_None);
608 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000609}
610
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000611#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
612#define py_mvwdelch mvwdelch
613#else
614int py_mvwdelch(WINDOW *w, int y, int x)
615{
616 mvwdelch(w,y,x);
617 /* On HP/UX, mvwdelch already returns. On other systems,
618 we may well run into this return statement. */
619 return 0;
620}
621#endif
622
623
Guido van Rossumf6971e21994-08-30 12:25:20 +0000624static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000625PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000626{
627 int rtn;
628 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000629
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000630 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000631 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000632 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000633 break;
634 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000635 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000636 return NULL;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000637 rtn = py_mvwdelch(self->win,y,x);
Guido van Rossum85738471995-02-17 13:50:17 +0000638 break;
639 default:
640 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
641 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000642 }
Guido van Rossum85738471995-02-17 13:50:17 +0000643 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000644}
645
646static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000647PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000648{
649 WINDOW *win;
650 int nlines, ncols, begin_y, begin_x;
651
652 nlines = 0;
653 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000654 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000655 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000656 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000657 return NULL;
658 break;
659 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000660 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000661 &nlines,&ncols,&begin_y,&begin_x))
662 return NULL;
663 break;
664 default:
665 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
666 return NULL;
667 }
668
669 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
670
671 if (win == NULL) {
672 PyErr_SetString(PyCursesError, catchall_NULL);
673 return NULL;
674 }
675
676 return (PyObject *)PyCursesWindow_New(win);
677}
678
679static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000680PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000681{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000682 PyObject *temp;
683 chtype ch;
684 attr_t attr = A_NORMAL;
Guido van Rossum85738471995-02-17 13:50:17 +0000685
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000686 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000687 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000688 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000689 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000690 break;
691 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000692 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &attr))
Guido van Rossum85738471995-02-17 13:50:17 +0000693 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000694 break;
695 default:
696 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000697
698
Guido van Rossum85738471995-02-17 13:50:17 +0000699 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000700 }
Guido van Rossum85738471995-02-17 13:50:17 +0000701
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000702 if (!PyCurses_ConvertToChtype(temp, &ch)) {
703 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000704 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000705 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000706
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000707#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000708 if (self->win->_flags & _ISPAD)
709 return PyCursesCheckERR(pechochar(self->win, ch | attr),
710 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000711 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000712#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000713 return PyCursesCheckERR(wechochar(self->win, ch | attr),
714 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000715}
716
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000717#ifdef NCURSES_MOUSE_VERSION
718static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000719PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000720{
721 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000722 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000723 return NULL;
724
725 return PyInt_FromLong( wenclose(self->win,y,x) );
726}
727#endif
728
Guido van Rossumf6971e21994-08-30 12:25:20 +0000729static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000730PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000731{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000732 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000733}
734
735static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000736PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000737{
738 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000739 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000740
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000741 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000742 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000743 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000744 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000745 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000746 break;
747 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000748 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000749 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000750 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000751 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000752 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000753 break;
754 default:
755 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
756 return NULL;
757 }
Fred Drake0368bc42001-07-19 20:48:32 +0000758 return PyInt_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000759}
Guido van Rossum85738471995-02-17 13:50:17 +0000760
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000761static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000762PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000763{
764 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000765 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000766
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000767 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000768 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000769 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000770 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000771 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000772 break;
773 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000774 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000775 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000776 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000777 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000778 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000779 break;
780 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000781 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000782 return NULL;
783 }
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000784 if (rtn == ERR) {
785 /* getch() returns ERR in nodelay mode */
786 PyErr_SetString(PyCursesError, "no input");
787 return NULL;
788 } else if (rtn<=255)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000789 return Py_BuildValue("c", rtn);
790 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000791#if defined(__NetBSD__)
792 return PyString_FromString(unctrl(rtn));
793#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000794 return PyString_FromString((char *)keyname(rtn));
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000795#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000796}
797
798static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000799PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000800{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000801 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000802 char rtn[1024]; /* This should be big enough.. I hope */
803 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000804
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000805 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000806 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000807 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000808 rtn2 = wgetnstr(self->win,rtn, 1023);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000809 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000810 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000811 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000812 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000813 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000814 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000815 rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000816 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000817 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000818 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000819 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000820 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000821 Py_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000822#ifdef STRICT_SYSV_CURSES
823 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
824#else
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000825 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000826#endif
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000827 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000828 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000829 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000830 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000831 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000832#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000833 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000834 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000835 wgetnstr(self->win, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000836 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000837#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000838 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000839 rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000840 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000841#endif
842 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000843 default:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000844 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000845 return NULL;
846 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000847 if (rtn2 == ERR)
848 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000849 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000850}
851
852static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000853PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000854{
855 PyObject *temp;
856 chtype ch;
857 int n, x, y, code = OK;
858 attr_t attr = A_NORMAL;
859
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000860 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000861 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000862 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000863 return NULL;
864 break;
865 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000866 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000867 return NULL;
868 break;
869 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000870 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000871 return NULL;
872 code = wmove(self->win, y, x);
873 break;
874 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000875 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000876 &y, &x, &temp, &n, &attr))
877 return NULL;
878 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000879 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000880 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000881 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000882 return NULL;
883 }
884
885 if (code != ERR) {
886 if (!PyCurses_ConvertToChtype(temp, &ch)) {
887 PyErr_SetString(PyExc_TypeError,
888 "argument 1 or 3 must be a ch or an int");
889 return NULL;
890 }
891 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
892 } else
893 return PyCursesCheckERR(code, "wmove");
894}
895
896static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000897PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000898{
899 int rtn, x, y, use_xy = FALSE;
900 PyObject *temp;
901 chtype ch = 0;
902 attr_t attr = A_NORMAL;
903
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000904 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000905 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000906 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907 return NULL;
908 break;
909 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000910 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000911 return NULL;
912 break;
913 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000914 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000915 return NULL;
916 use_xy = TRUE;
917 break;
918 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000919 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000920 return NULL;
921 use_xy = TRUE;
922 break;
923 default:
924 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
925 return NULL;
926 }
927
928 if (!PyCurses_ConvertToChtype(temp, &ch)) {
929 PyErr_SetString(PyExc_TypeError,
930 "argument 1 or 3 must be a ch or an int");
931 return NULL;
932 }
933
934 if (use_xy == TRUE)
935 rtn = mvwinsch(self->win,y,x, ch | attr);
936 else {
937 rtn = winsch(self->win, ch | attr);
938 }
939 return PyCursesCheckERR(rtn, "insch");
940}
941
942static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000943PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000944{
Guido van Rossum85738471995-02-17 13:50:17 +0000945 int x, y, rtn;
946
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000947 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000948 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000949 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000950 break;
951 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000952 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000953 return NULL;
954 rtn = mvwinch(self->win,y,x);
955 break;
956 default:
957 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
958 return NULL;
959 }
Guido van Rossum85738471995-02-17 13:50:17 +0000960 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000961}
962
963static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000964PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000965{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966 int x, y, n;
967 char rtn[1024]; /* This should be big enough.. I hope */
968 int rtn2;
969
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000970 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000971 case 0:
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000972 rtn2 = winnstr(self->win,rtn, 1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000973 break;
974 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000975 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000976 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000977 rtn2 = winnstr(self->win,rtn,MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000978 break;
979 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000980 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000981 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000982 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000983 break;
984 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000985 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000986 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000987 rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000988 break;
989 default:
990 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000991 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000992 }
993 if (rtn2 == ERR)
994 rtn[0] = 0;
995 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000996}
997
998static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000999PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001000{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001001 int rtn;
1002 int x, y;
1003 char *str;
1004 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1005 int use_xy = FALSE, use_attr = FALSE;
1006
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001007 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001008 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001009 if (!PyArg_ParseTuple(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001010 return NULL;
1011 break;
1012 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001013 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001014 return NULL;
1015 use_attr = TRUE;
1016 break;
1017 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001018 if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001019 return NULL;
1020 use_xy = TRUE;
1021 break;
1022 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001023 if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001024 return NULL;
1025 use_xy = use_attr = TRUE;
1026 break;
1027 default:
1028 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001029 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001030 }
1031
1032 if (use_attr == TRUE) {
1033 attr_old = getattrs(self->win);
1034 wattrset(self->win,attr);
1035 }
1036 if (use_xy == TRUE)
1037 rtn = mvwinsstr(self->win,y,x,str);
1038 else
1039 rtn = winsstr(self->win,str);
1040 if (use_attr == TRUE)
1041 wattrset(self->win,attr_old);
1042 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001043}
1044
1045static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001046PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001047{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001048 int rtn, x, y, n;
1049 char *str;
1050 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
1051 int use_xy = FALSE, use_attr = FALSE;
1052
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001053 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001054 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001055 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001056 return NULL;
1057 break;
1058 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001059 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001060 return NULL;
1061 use_attr = TRUE;
1062 break;
1063 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001064 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001065 return NULL;
1066 use_xy = TRUE;
1067 break;
1068 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001069 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001070 return NULL;
1071 use_xy = use_attr = TRUE;
1072 break;
1073 default:
1074 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001075 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001076 }
1077
1078 if (use_attr == TRUE) {
1079 attr_old = getattrs(self->win);
1080 wattrset(self->win,attr);
1081 }
1082 if (use_xy == TRUE)
1083 rtn = mvwinsnstr(self->win,y,x,str,n);
1084 else
1085 rtn = winsnstr(self->win,str,n);
1086 if (use_attr == TRUE)
1087 wattrset(self->win,attr_old);
1088 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001089}
1090
1091static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001092PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001093{
1094 int line, erg;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001095 if (!PyArg_ParseTuple(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001096 return NULL;
1097 erg = is_linetouched(self->win, line);
1098 if (erg == ERR) {
1099 PyErr_SetString(PyExc_TypeError,
1100 "is_linetouched: line number outside of boundaries");
1101 return NULL;
1102 } else
1103 if (erg == FALSE) {
1104 Py_INCREF(Py_False);
1105 return Py_False;
1106 } else {
1107 Py_INCREF(Py_True);
1108 return Py_True;
1109 }
1110}
1111
1112static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001113PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001114{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001115 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001116 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001117
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001118#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001119 if (0) {
1120#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001121 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001122#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001123 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001124 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001125 if (!PyArg_ParseTuple(args,
1126 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001127 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1128 &pminrow, &pmincol, &sminrow,
1129 &smincol, &smaxrow, &smaxcol))
1130 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001131 Py_BEGIN_ALLOW_THREADS
1132 rtn = pnoutrefresh(self->win,
1133 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001134 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001135 Py_END_ALLOW_THREADS
1136 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001137 default:
1138 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001139 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001140 "requires 6 arguments");
1141 return NULL;
1142 }
1143 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001144 if (!PyArg_ParseTuple(args, ":noutrefresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001145 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001146
1147 Py_BEGIN_ALLOW_THREADS
1148 rtn = wnoutrefresh(self->win);
1149 Py_END_ALLOW_THREADS
1150 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001151 }
1152}
1153
1154static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001155PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1156{
1157 PyCursesWindowObject *temp;
1158 int use_copywin = FALSE;
1159 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1160 int rtn;
1161
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001162 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001163 case 1:
1164 if (!PyArg_ParseTuple(args, "O!;window object",
1165 &PyCursesWindow_Type, &temp))
1166 return NULL;
1167 break;
1168 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001169 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001170 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1171 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1172 return NULL;
1173 use_copywin = TRUE;
1174 break;
1175 default:
1176 PyErr_SetString(PyExc_TypeError,
1177 "overlay requires one or seven arguments");
1178 return NULL;
1179 }
1180
1181 if (use_copywin == TRUE) {
1182 rtn = copywin(self->win, temp->win, sminrow, smincol,
1183 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1184 return PyCursesCheckERR(rtn, "copywin");
1185 }
1186 else {
1187 rtn = overlay(self->win, temp->win);
1188 return PyCursesCheckERR(rtn, "overlay");
1189 }
1190}
1191
1192static PyObject *
1193PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1194{
1195 PyCursesWindowObject *temp;
1196 int use_copywin = FALSE;
1197 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1198 int rtn;
1199
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001200 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001201 case 1:
1202 if (!PyArg_ParseTuple(args, "O!;window object",
1203 &PyCursesWindow_Type, &temp))
1204 return NULL;
1205 break;
1206 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001207 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001208 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1209 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1210 return NULL;
1211 use_copywin = TRUE;
1212 break;
1213 default:
1214 PyErr_SetString(PyExc_TypeError,
1215 "overwrite requires one or seven arguments");
1216 return NULL;
1217 }
1218
1219 if (use_copywin == TRUE) {
1220 rtn = copywin(self->win, temp->win, sminrow, smincol,
1221 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
1222 return PyCursesCheckERR(rtn, "copywin");
1223 }
1224 else {
1225 rtn = overwrite(self->win, temp->win);
1226 return PyCursesCheckERR(rtn, "overwrite");
1227 }
1228}
1229
1230static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001231PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001232{
1233 PyObject *temp;
1234
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001235 if (!PyArg_ParseTuple(args, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001236 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001237 if (!PyFile_Check(temp)) {
1238 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1239 return NULL;
1240 }
1241 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1242 "putwin");
1243}
1244
1245static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001246PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001247{
1248 int beg, num;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001249 if (!PyArg_ParseTuple(args,"ii;beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001250 return NULL;
1251 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1252}
1253
1254static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001255PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001256{
1257 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001258 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001259
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001260#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001261 if (0) {
1262#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001263 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001264#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001265 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001266 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001267 if (!PyArg_ParseTuple(args,
1268 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001269 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1270 &pminrow, &pmincol, &sminrow,
1271 &smincol, &smaxrow, &smaxcol))
1272 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001273
1274 Py_BEGIN_ALLOW_THREADS
1275 rtn = prefresh(self->win,
1276 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001277 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001278 Py_END_ALLOW_THREADS
1279 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001280 default:
1281 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001282 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001283 return NULL;
1284 }
1285 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001286 if (!PyArg_ParseTuple(args, ":refresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001287 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001288 Py_BEGIN_ALLOW_THREADS
1289 rtn = wrefresh(self->win);
1290 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001291 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001292 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001293}
1294
1295static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001296PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001297{
1298 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001299 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001300 return NULL;
1301 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001302}
1303
1304static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001305PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001306{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001307 WINDOW *win;
1308 int nlines, ncols, begin_y, begin_x;
1309
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001310 nlines = 0;
1311 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001312 switch (PyTuple_Size(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001313 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001314 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001315 return NULL;
1316 break;
1317 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001318 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001319 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001320 return NULL;
1321 break;
1322 default:
1323 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001324 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001325 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001326
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001327 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001328#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001329 if (self->win->_flags & _ISPAD)
1330 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1331 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001332#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001333 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001334
1335 if (win == NULL) {
1336 PyErr_SetString(PyCursesError, catchall_NULL);
1337 return NULL;
1338 }
1339
1340 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001341}
1342
1343static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001344PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001345{
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001346 int nlines;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001347 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001348 case 0:
1349 return PyCursesCheckERR(scroll(self->win), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001350 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001351 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001352 return NULL;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001353 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001354 default:
1355 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001356 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001357 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001358}
1359
1360static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001361PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001362{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001363 int st, cnt, val;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001364 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001365 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001366 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001367 return NULL;
1368 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001369 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001370 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001371 return NULL;
1372 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1373 default:
1374 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001375 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001376 }
1377}
1378
1379static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001380PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001381{
1382 PyObject *temp;
1383 chtype ch;
1384 int n, x, y, code = OK;
1385 attr_t attr = A_NORMAL;
1386
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001387 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001388 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001389 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001390 return NULL;
1391 break;
1392 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001393 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &attr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001394 return NULL;
1395 break;
1396 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001397 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001398 return NULL;
1399 code = wmove(self->win, y, x);
1400 break;
1401 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001402 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001403 &y, &x, &temp, &n, &attr))
1404 return NULL;
1405 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001406 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001407 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001408 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001409 return NULL;
1410 }
1411
1412 if (code != ERR) {
1413 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1414 PyErr_SetString(PyExc_TypeError,
1415 "argument 1 or 3 must be a ch or an int");
1416 return NULL;
1417 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001418 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001419 } else
1420 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001421}
1422
1423static PyMethodDef PyCursesWindow_Methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001424 {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
1425 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1426 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
1427 {"attroff", (PyCFunction)PyCursesWindow_wattroff, METH_VARARGS},
1428 {"attron", (PyCFunction)PyCursesWindow_wattron, METH_VARARGS},
1429 {"attrset", (PyCFunction)PyCursesWindow_wattrset, METH_VARARGS},
1430 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1431 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001432 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001433 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1434 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1435 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1436 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1437 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1438 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1439 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1440 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1441 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1442 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001443#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001444 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001445#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001446 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1447 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1448 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1449 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1450 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
1451 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
1452 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
1453 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
1454 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
1455 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
1456 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
1457 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
1458 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
1459 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
1460 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
1461 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
1462 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
1463 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
1464 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
1465 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
1466 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
1467 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
1468 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
1469 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
1470 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
1471 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
1472 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
1473 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
1474 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
1475 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1476 /* Backward compatibility alias -- remove in Python 2.3 */
1477 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001478 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1479 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
1480 METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001481 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001482 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001483 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
1484 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001485#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001486 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001487#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001488 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
1489 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
1490 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
1491 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
1492 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
1493 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1494 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1495 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
1496 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
1497 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
1498 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
1499 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
1500 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
1501 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
1502 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001503 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001504};
1505
1506static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001507PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001508{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001509 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001510}
1511
Guido van Rossumf6971e21994-08-30 12:25:20 +00001512/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001513
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001514PyTypeObject PyCursesWindow_Type = {
Guido van Rossum6915c4d2001-01-19 00:28:08 +00001515 PyObject_HEAD_INIT(NULL)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001516 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00001517 "_curses.curses window", /*tp_name*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001518 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1519 0, /*tp_itemsize*/
1520 /* methods */
1521 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1522 0, /*tp_print*/
1523 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1524 (setattrfunc)0, /*tp_setattr*/
1525 0, /*tp_compare*/
1526 0, /*tp_repr*/
1527 0, /*tp_as_number*/
1528 0, /*tp_as_sequence*/
1529 0, /*tp_as_mapping*/
1530 0, /*tp_hash*/
1531};
1532
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001533/*********************************************************************
1534 Global Functions
1535**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001536
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001537NoArgNoReturnFunction(beep)
1538NoArgNoReturnFunction(def_prog_mode)
1539NoArgNoReturnFunction(def_shell_mode)
1540NoArgNoReturnFunction(doupdate)
1541NoArgNoReturnFunction(endwin)
1542NoArgNoReturnFunction(flash)
1543NoArgNoReturnFunction(nocbreak)
1544NoArgNoReturnFunction(noecho)
1545NoArgNoReturnFunction(nonl)
1546NoArgNoReturnFunction(noraw)
1547NoArgNoReturnFunction(reset_prog_mode)
1548NoArgNoReturnFunction(reset_shell_mode)
1549NoArgNoReturnFunction(resetty)
1550NoArgNoReturnFunction(savetty)
1551
1552NoArgOrFlagNoReturnFunction(cbreak)
1553NoArgOrFlagNoReturnFunction(echo)
1554NoArgOrFlagNoReturnFunction(nl)
1555NoArgOrFlagNoReturnFunction(raw)
1556
1557NoArgReturnIntFunction(baudrate)
1558NoArgReturnIntFunction(termattrs)
1559
1560NoArgReturnStringFunction(termname)
1561NoArgReturnStringFunction(longname)
1562
1563NoArgTrueFalseFunction(can_change_color)
1564NoArgTrueFalseFunction(has_colors)
1565NoArgTrueFalseFunction(has_ic)
1566NoArgTrueFalseFunction(has_il)
1567NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001568NoArgNoReturnVoidFunction(filter)
1569NoArgNoReturnVoidFunction(flushinp)
1570NoArgNoReturnVoidFunction(noqiflush)
1571
1572static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001573PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001574{
1575 short color,r,g,b;
1576
1577 PyCursesInitialised
1578 PyCursesInitialisedColor
1579
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001580 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001581
1582 if (color_content(color, &r, &g, &b) != ERR)
1583 return Py_BuildValue("(iii)", r, g, b);
1584 else {
1585 PyErr_SetString(PyCursesError,
1586 "Argument 1 was out of range. Check value of COLORS.");
1587 return NULL;
1588 }
1589}
1590
1591static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001592PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001593{
1594 int n;
1595
1596 PyCursesInitialised
1597 PyCursesInitialisedColor
1598
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001599 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001600 return PyInt_FromLong((long) (n << 8));
1601}
1602
1603static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001604PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001605{
1606 int vis,erg;
1607
1608 PyCursesInitialised
1609
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001610 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001611
1612 erg = curs_set(vis);
1613 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1614
1615 return PyInt_FromLong((long) erg);
1616}
1617
1618static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001619PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001620{
1621 int ms;
1622
1623 PyCursesInitialised
1624
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001625 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001626
1627 return PyCursesCheckERR(delay_output(ms), "delay_output");
1628}
1629
1630static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001631PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001632{
1633 char ch;
1634
1635 PyCursesInitialised
1636
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001637 ch = erasechar();
1638
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00001639 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001640}
1641
1642static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001643PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001644{
1645 int x,y;
1646
1647 PyCursesInitialised
1648
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001649 getsyx(y, x);
1650
1651 return Py_BuildValue("(ii)", y, x);
1652}
1653
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001654#ifdef NCURSES_MOUSE_VERSION
1655static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001656PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001657{
1658 int rtn;
1659 MEVENT event;
1660
1661 PyCursesInitialised
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001662
1663 rtn = getmouse( &event );
1664 if (rtn == ERR) {
1665 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1666 return NULL;
1667 }
1668 return Py_BuildValue("(hiiil)",
1669 (short)event.id,
1670 event.x, event.y, event.z,
1671 (long) event.bstate);
1672}
1673
1674static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001675PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001676{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001677 MEVENT event;
1678
1679 PyCursesInitialised
Neal Norwitz88bbd732006-01-10 07:05:44 +00001680 if (!PyArg_ParseTuple(args, "hiiil",
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001681 &event.id,
1682 &event.x, &event.y, &event.z,
1683 (int *) &event.bstate))
1684 return NULL;
1685
1686 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1687}
1688#endif
1689
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001690static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001691PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001692{
1693 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001694
1695 PyCursesInitialised
1696
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001697 if (!PyFile_Check(temp)) {
1698 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1699 return NULL;
1700 }
1701
1702 win = getwin(PyFile_AsFile(temp));
1703
1704 if (win == NULL) {
1705 PyErr_SetString(PyCursesError, catchall_NULL);
1706 return NULL;
1707 }
1708
1709 return PyCursesWindow_New(win);
1710}
1711
1712static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001713PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001714{
1715 unsigned char tenths;
1716
1717 PyCursesInitialised
1718
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001719 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001720
1721 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1722}
1723
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001724#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001725 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001726static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001727{
1728 int ch;
1729
1730 PyCursesInitialised
1731
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001732 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001733
1734 if (has_key(ch) == FALSE) {
1735 Py_INCREF(Py_False);
1736 return Py_False;
1737 }
1738 Py_INCREF(Py_True);
1739 return Py_True;
1740}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001741#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001742
1743static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001744PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001745{
1746 short color, r, g, b;
1747
1748 PyCursesInitialised
1749 PyCursesInitialisedColor
1750
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001751 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001752 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001753 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001754 break;
1755 default:
1756 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1757 return NULL;
1758 }
1759
1760 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1761}
1762
1763static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001764PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001765{
1766 short pair, f, b;
1767
1768 PyCursesInitialised
1769 PyCursesInitialisedColor
1770
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001771 if (PyTuple_Size(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001772 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1773 return NULL;
1774 }
1775
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001776 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001777
1778 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1779}
1780
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001781static PyObject *ModDict;
1782
Guido van Rossumf6971e21994-08-30 12:25:20 +00001783static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001784PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001785{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001786 WINDOW *win;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001787 PyObject *nlines, *cols;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001788
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001789 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001790 wrefresh(stdscr);
1791 return (PyObject *)PyCursesWindow_New(stdscr);
1792 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001793
1794 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001795
Guido van Rossum85738471995-02-17 13:50:17 +00001796 if (win == NULL) {
1797 PyErr_SetString(PyCursesError, catchall_NULL);
1798 return NULL;
1799 }
1800
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001801 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001802
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001803/* This was moved from initcurses() because it core dumped on SGI,
1804 where they're not defined until you've called initscr() */
1805#define SetDictInt(string,ch) \
1806 PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
1807
1808 /* Here are some graphic symbols you can use */
1809 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1810 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1811 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1812 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1813 SetDictInt("ACS_LTEE", (ACS_LTEE));
1814 SetDictInt("ACS_RTEE", (ACS_RTEE));
1815 SetDictInt("ACS_BTEE", (ACS_BTEE));
1816 SetDictInt("ACS_TTEE", (ACS_TTEE));
1817 SetDictInt("ACS_HLINE", (ACS_HLINE));
1818 SetDictInt("ACS_VLINE", (ACS_VLINE));
1819 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001820#if !defined(__hpux) || defined(HAVE_NCURSES_H)
1821 /* On HP/UX 11, these are of type cchar_t, which is not an
1822 integral type. If this is a problem on more platforms, a
1823 configure test should be added to determine whether ACS_S1
1824 is of integral type. */
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001825 SetDictInt("ACS_S1", (ACS_S1));
1826 SetDictInt("ACS_S9", (ACS_S9));
1827 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1828 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1829 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1830 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1831 SetDictInt("ACS_BULLET", (ACS_BULLET));
1832 SetDictInt("ACS_LARROW", (ACS_LARROW));
1833 SetDictInt("ACS_RARROW", (ACS_RARROW));
1834 SetDictInt("ACS_DARROW", (ACS_DARROW));
1835 SetDictInt("ACS_UARROW", (ACS_UARROW));
1836 SetDictInt("ACS_BOARD", (ACS_BOARD));
1837 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1838 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001839#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001840 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1841 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1842 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1843 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1844 SetDictInt("ACS_SBSS", (ACS_RTEE));
1845 SetDictInt("ACS_SSSB", (ACS_LTEE));
1846 SetDictInt("ACS_SSBS", (ACS_BTEE));
1847 SetDictInt("ACS_BSSS", (ACS_TTEE));
1848 SetDictInt("ACS_BSBS", (ACS_HLINE));
1849 SetDictInt("ACS_SBSB", (ACS_VLINE));
1850 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001851
1852 /* The following are never available with strict SYSV curses */
1853#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001854 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001855#endif
1856#ifdef ACS_S7
1857 SetDictInt("ACS_S7", (ACS_S7));
1858#endif
1859#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001860 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001861#endif
1862#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001863 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001864#endif
1865#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001866 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001867#endif
1868#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001869 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001870#endif
1871#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001872 SetDictInt("ACS_STERLING", (ACS_STERLING));
1873#endif
1874
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001875 nlines = PyInt_FromLong((long) LINES);
1876 PyDict_SetItemString(ModDict, "LINES", nlines);
1877 Py_DECREF(nlines);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001878 cols = PyInt_FromLong((long) COLS);
1879 PyDict_SetItemString(ModDict, "COLS", cols);
1880 Py_DECREF(cols);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001881
1882 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001883}
1884
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001885static PyObject *
1886PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1887{
1888 int fd = -1;
1889 int err;
1890 char* termstr = NULL;
1891
Martin v. Löwis15e62742006-02-27 16:46:16 +00001892 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001893
1894 if (!PyArg_ParseTupleAndKeywords(
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001895 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001896 return NULL;
1897 }
1898
1899 if (fd == -1) {
1900 PyObject* sys_stdout;
1901
1902 sys_stdout = PySys_GetObject("stdout");
1903
1904 if (sys_stdout == NULL) {
1905 PyErr_SetString(
1906 PyCursesError,
1907 "lost sys.stdout");
1908 return NULL;
1909 }
1910
1911 fd = PyObject_AsFileDescriptor(sys_stdout);
1912
1913 if (fd == -1) {
1914 return NULL;
1915 }
1916 }
1917
1918 if (setupterm(termstr,fd,&err) == ERR) {
1919 char* s = "setupterm: unknown error";
1920
1921 if (err == 0) {
1922 s = "setupterm: could not find terminal";
1923 } else if (err == -1) {
1924 s = "setupterm: could not find terminfo database";
1925 }
1926
1927 PyErr_SetString(PyCursesError,s);
1928 return NULL;
1929 }
1930
1931 initialised_setupterm = TRUE;
1932
1933 Py_INCREF(Py_None);
1934 return Py_None;
1935}
Guido van Rossumf6971e21994-08-30 12:25:20 +00001936
1937static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001938PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001939{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001940 int ch;
1941
1942 PyCursesInitialised
1943
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001944 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001945 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001946 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001947 break;
1948 default:
1949 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00001950 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001951 }
1952
1953 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
1954}
1955
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001956#ifdef HAVE_CURSES_IS_TERM_RESIZED
1957static PyObject *
1958PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
1959{
1960 int lines;
1961 int columns;
1962 int result;
1963
1964 PyCursesInitialised
1965
1966 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
1967 return NULL;
1968 result = is_term_resized(lines, columns);
1969 if (result == TRUE) {
1970 Py_INCREF(Py_True);
1971 return Py_True;
1972 } else {
1973 Py_INCREF(Py_False);
1974 return Py_False;
1975 }
1976}
1977#endif /* HAVE_CURSES_IS_TERM_RESIZED */
1978
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001979#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001980static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001981PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001982{
1983 const char *knp;
1984 int ch;
1985
1986 PyCursesInitialised
1987
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001988 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001989
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00001990 if (ch < 0) {
1991 PyErr_SetString(PyExc_ValueError, "invalid key number");
1992 return NULL;
1993 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001994 knp = keyname(ch);
1995
1996 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
1997}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001998#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001999
2000static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002001PyCurses_KillChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002002{
2003 char ch;
2004
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002005 ch = killchar();
2006
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00002007 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002008}
2009
2010static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002011PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002012{
2013 int ch;
2014
2015 PyCursesInitialised
2016
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002017 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002018 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002019 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002020 break;
2021 default:
2022 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2023 return NULL;
2024 }
2025
2026 return PyCursesCheckERR(meta(stdscr, ch), "meta");
2027}
2028
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002029#ifdef NCURSES_MOUSE_VERSION
2030static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002031PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002032{
2033 int interval;
2034 PyCursesInitialised
2035
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002036 if (!PyArg_ParseTuple(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002037 return NULL;
2038 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
2039}
2040
2041static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002042PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002043{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002044 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002045 mmask_t oldmask, availmask;
2046
2047 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002048 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002049 return NULL;
2050 availmask = mousemask(newmask, &oldmask);
2051 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
2052}
2053#endif
2054
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002055static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002056PyCurses_Napms(PyObject *self, PyObject *args)
2057{
2058 int ms;
2059
2060 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002061 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002062
2063 return Py_BuildValue("i", napms(ms));
2064}
2065
2066
2067static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002068PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002069{
2070 WINDOW *win;
2071 int nlines, ncols;
2072
2073 PyCursesInitialised
2074
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002075 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002076
2077 win = newpad(nlines, ncols);
2078
2079 if (win == NULL) {
2080 PyErr_SetString(PyCursesError, catchall_NULL);
2081 return NULL;
2082 }
2083
2084 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002085}
2086
2087static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002088PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002089{
2090 WINDOW *win;
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002091 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002092
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002093 PyCursesInitialised
2094
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002095 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002096 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002097 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002098 return NULL;
2099 break;
2100 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002101 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002102 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002103 return NULL;
2104 break;
2105 default:
2106 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2107 return NULL;
2108 }
2109
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002110 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002111 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002112 PyErr_SetString(PyCursesError, catchall_NULL);
2113 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002114 }
Guido van Rossum85738471995-02-17 13:50:17 +00002115
Guido van Rossumf6971e21994-08-30 12:25:20 +00002116 return (PyObject *)PyCursesWindow_New(win);
2117}
2118
2119static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002120PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002121{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002122 short pair,f,b;
2123
2124 PyCursesInitialised
2125 PyCursesInitialisedColor
2126
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002127 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002128 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002129 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002130 break;
2131 default:
2132 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002133 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002134 }
2135
Andrew M. Kuchlingb5e7ff42005-06-15 18:46:50 +00002136 if (pair_content(pair, &f, &b)==ERR) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002137 PyErr_SetString(PyCursesError,
2138 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2139 return NULL;
2140 }
2141
2142 return Py_BuildValue("(ii)", f, b);
2143}
2144
2145static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002146PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002147{
2148 int n;
2149
2150 PyCursesInitialised
2151 PyCursesInitialisedColor
2152
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002153 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002154 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002155 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002156 break;
2157 default:
2158 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002159 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002160 return NULL;
2161 }
2162
2163 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2164}
2165
2166static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002167PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002168{
2169 char *str;
2170
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002171 if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002172 return PyCursesCheckERR(putp(str), "putp");
2173}
2174
2175static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002176PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002177{
2178 int flag = 0;
2179
2180 PyCursesInitialised
2181
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002182 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002183 case 0:
2184 qiflush();
2185 Py_INCREF(Py_None);
2186 return Py_None;
2187 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002188 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002189 if (flag) qiflush();
2190 else noqiflush();
2191 Py_INCREF(Py_None);
2192 return Py_None;
2193 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002194 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002195 return NULL;
2196 }
2197}
2198
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002199#ifdef HAVE_CURSES_RESIZETERM
2200static PyObject *
2201PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2202{
2203 int lines;
2204 int columns;
2205
2206 PyCursesInitialised
2207
2208 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2209 return NULL;
2210
2211 return PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2212}
2213
2214#endif
2215
2216#ifdef HAVE_CURSES_RESIZE_TERM
2217static PyObject *
2218PyCurses_Resize_Term(PyObject *self, PyObject *args)
2219{
2220 int lines;
2221 int columns;
2222
2223 PyCursesInitialised
2224
2225 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2226 return NULL;
2227
2228 return PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2229}
2230#endif /* HAVE_CURSES_RESIZE_TERM */
2231
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002232static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002233PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002234{
2235 int y,x;
2236
2237 PyCursesInitialised
2238
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002239 if (PyTuple_Size(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002240 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002241 return NULL;
2242 }
2243
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002244 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002245
2246 setsyx(y,x);
2247
Guido van Rossumf6971e21994-08-30 12:25:20 +00002248 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002249 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002250}
2251
2252static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002253PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002254{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002255 int code;
2256 PyObject *c, *cp;
2257
2258 PyCursesInitialised
2259
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002260 code = start_color();
2261 if (code != ERR) {
2262 initialisedcolors = TRUE;
2263 c = PyInt_FromLong((long) COLORS);
2264 PyDict_SetItemString(ModDict, "COLORS", c);
2265 Py_DECREF(c);
2266 cp = PyInt_FromLong((long) COLOR_PAIRS);
2267 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2268 Py_DECREF(cp);
2269 Py_INCREF(Py_None);
2270 return Py_None;
2271 } else {
2272 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002273 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002274 }
2275}
2276
2277static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002278PyCurses_tigetflag(PyObject *self, PyObject *args)
2279{
2280 char *capname;
2281
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002282 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002283
2284 if (!PyArg_ParseTuple(args, "z", &capname))
2285 return NULL;
2286
2287 return PyInt_FromLong( (long) tigetflag( capname ) );
2288}
2289
2290static PyObject *
2291PyCurses_tigetnum(PyObject *self, PyObject *args)
2292{
2293 char *capname;
2294
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002295 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002296
2297 if (!PyArg_ParseTuple(args, "z", &capname))
2298 return NULL;
2299
2300 return PyInt_FromLong( (long) tigetnum( capname ) );
2301}
2302
2303static PyObject *
2304PyCurses_tigetstr(PyObject *self, PyObject *args)
2305{
2306 char *capname;
2307
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002308 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002309
2310 if (!PyArg_ParseTuple(args, "z", &capname))
2311 return NULL;
2312
2313 capname = tigetstr( capname );
2314 if (capname == 0 || capname == (char*) -1) {
2315 Py_INCREF(Py_None);
2316 return Py_None;
2317 }
2318 return PyString_FromString( capname );
2319}
2320
2321static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002322PyCurses_tparm(PyObject *self, PyObject *args)
2323{
2324 char* fmt;
2325 char* result = NULL;
Michael W. Hudson21007982002-11-21 14:17:51 +00002326 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 +00002327
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002328 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002329
2330 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2331 &fmt, &i1, &i2, &i3, &i4,
2332 &i5, &i6, &i7, &i8, &i9)) {
2333 return NULL;
2334 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002335
Michael W. Hudson8f514602002-01-16 15:18:09 +00002336 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Michael W. Hudson21007982002-11-21 14:17:51 +00002337
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002338 return PyString_FromString(result);
2339}
2340
2341static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002342PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002343{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002344 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002345
2346 PyCursesInitialised
2347
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002348 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002349
Michael W. Hudson7d6cc5b2004-08-04 14:33:28 +00002350 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002351}
2352
2353static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002354PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355{
2356 PyObject *temp;
2357 chtype ch;
2358
2359 PyCursesInitialised
2360
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002361 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002362
2363 if (PyInt_Check(temp))
2364 ch = (chtype) PyInt_AsLong(temp);
2365 else if (PyString_Check(temp))
2366 ch = (chtype) *PyString_AsString(temp);
2367 else {
2368 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2369 return NULL;
2370 }
2371
2372 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002373}
2374
2375static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002376PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002377{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378 PyObject *temp;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002379 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002380
2381 PyCursesInitialised
2382
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002383 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002384
2385 if (PyInt_Check(temp))
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002386 ch = (int) PyInt_AsLong(temp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002387 else if (PyString_Check(temp))
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002388 ch = (int) *PyString_AsString(temp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002389 else {
2390 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002391 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002392 }
2393
Guido van Rossum85738471995-02-17 13:50:17 +00002394 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002395}
2396
2397static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002398PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002399{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002400 int flag;
2401
2402 PyCursesInitialised
2403
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002404 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002405 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002406 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002407 return NULL;
2408 break;
2409 default:
2410 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002411 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002412 }
2413 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002414 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002415 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002416}
2417
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002418#ifndef STRICT_SYSV_CURSES
2419static PyObject *
2420PyCurses_Use_Default_Colors(PyObject *self)
2421{
2422 int code;
2423
2424 PyCursesInitialised
2425 PyCursesInitialisedColor
2426
2427 code = use_default_colors();
2428 if (code != ERR) {
2429 Py_INCREF(Py_None);
2430 return Py_None;
2431 } else {
2432 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
2433 return NULL;
2434 }
2435}
2436#endif /* STRICT_SYSV_CURSES */
2437
Guido van Rossumf6971e21994-08-30 12:25:20 +00002438/* List of functions defined in the module */
2439
2440static PyMethodDef PyCurses_methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002441 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
2442 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
2443 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
2444 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
2445 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
2446 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
2447 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
2448 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
2449 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
2450 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
2451 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
2452 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
2453 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
2454 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
2455 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
2456 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
2457 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002458#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002459 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002460 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2461#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002462 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
2463 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
2464 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
2465 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
2466 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002467#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002468 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002469#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002470 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
2471 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
2472 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
2473 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
2474 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
2475 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002476#ifdef HAVE_CURSES_IS_TERM_RESIZED
2477 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
2478#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002479#if !defined(__NetBSD__)
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002480 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002481#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002482 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
2483 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
2484 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002485#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002486 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
2487 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002488#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002489 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
2490 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
2491 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
2492 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
2493 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
2494 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
2495 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
2496 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
2497 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
2498 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
2499 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
2500 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
2501 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
2502 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
2503 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
2504 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
2505 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002506#ifdef HAVE_CURSES_RESIZETERM
2507 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
2508#endif
2509#ifdef HAVE_CURSES_RESIZE_TERM
2510 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
2511#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002512 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
2513 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002514 {"setupterm", (PyCFunction)PyCurses_setupterm,
2515 METH_VARARGS|METH_KEYWORDS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002516 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
2517 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
2518 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002519 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2520 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2521 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002522 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002523 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
2524 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
2525 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
2526 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002527#ifndef STRICT_SYSV_CURSES
2528 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
2529#endif
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002530 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002531};
2532
2533/* Initialization function for the module */
2534
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002535PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002536init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002537{
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002538 PyObject *m, *d, *v, *c_api_object;
2539 static void *PyCurses_API[PyCurses_API_pointers];
2540
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002541 /* Initialize object type */
2542 PyCursesWindow_Type.ob_type = &PyType_Type;
2543
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002544 /* Initialize the C API pointer array */
2545 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2546 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2547 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2548 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002549
2550 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002551 m = Py_InitModule("_curses", PyCurses_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002552 if (m == NULL)
2553 return;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002554
Guido van Rossumf6971e21994-08-30 12:25:20 +00002555 /* Add some symbolic constants to the module */
2556 d = PyModule_GetDict(m);
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002557 ModDict = d; /* For PyCurses_InitScr to use later */
2558
2559 /* Add a CObject for the C API */
2560 c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
2561 PyDict_SetItemString(d, "_C_API", c_api_object);
Martin v. Löwis00ff10c2001-11-11 14:24:05 +00002562 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002563
Guido van Rossum85738471995-02-17 13:50:17 +00002564 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002565 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002566 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002567
Guido van Rossum85738471995-02-17 13:50:17 +00002568 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002569 v = PyString_FromString(PyCursesVersion);
2570 PyDict_SetItemString(d, "version", v);
2571 PyDict_SetItemString(d, "__version__", v);
2572 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002573
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002574 SetDictInt("ERR", ERR);
2575 SetDictInt("OK", OK);
2576
Guido van Rossumf6971e21994-08-30 12:25:20 +00002577 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002578
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002579 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002580 SetDictInt("A_NORMAL", A_NORMAL);
2581 SetDictInt("A_STANDOUT", A_STANDOUT);
2582 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2583 SetDictInt("A_REVERSE", A_REVERSE);
2584 SetDictInt("A_BLINK", A_BLINK);
2585 SetDictInt("A_DIM", A_DIM);
2586 SetDictInt("A_BOLD", A_BOLD);
2587 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002588#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002589 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002590#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002591 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002592 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2593 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002594
2595 /* The following are never available with strict SYSV curses */
2596#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002597 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002598#endif
2599#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002600 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002601#endif
2602#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002603 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002604#endif
2605#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002606 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002607#endif
2608#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002609 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002610#endif
2611#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002612 SetDictInt("A_VERTICAL", A_VERTICAL);
2613#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002614
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002615 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2616 SetDictInt("COLOR_RED", COLOR_RED);
2617 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2618 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2619 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2620 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2621 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2622 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002623
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002624#ifdef NCURSES_MOUSE_VERSION
2625 /* Mouse-related constants */
2626 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2627 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2628 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2629 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2630 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2631
2632 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2633 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2634 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2635 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2636 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2637
2638 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2639 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2640 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2641 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2642 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2643
2644 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2645 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2646 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2647 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2648 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2649
2650 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2651 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2652 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2653
2654 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2655 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2656#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002657 /* Now set everything up for KEY_ variables */
2658 {
2659 int key;
2660 char *key_n;
2661 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002662#if !defined(__NetBSD__)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002663 for (key=KEY_MIN;key < KEY_MAX; key++) {
2664 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002665 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002666 continue;
2667 if (strncmp(key_n,"KEY_F(",6)==0) {
2668 char *p1, *p2;
2669 key_n2 = malloc(strlen(key_n)+1);
2670 p1 = key_n;
2671 p2 = key_n2;
2672 while (*p1) {
2673 if (*p1 != '(' && *p1 != ')') {
2674 *p2 = *p1;
2675 p2++;
2676 }
2677 p1++;
2678 }
2679 *p2 = (char)0;
2680 } else
2681 key_n2 = key_n;
Guido van Rossum85738471995-02-17 13:50:17 +00002682 PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002683 if (key_n2 != key_n)
2684 free(key_n2);
2685 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002686#endif
Guido van Rossum85738471995-02-17 13:50:17 +00002687 SetDictInt("KEY_MIN", KEY_MIN);
2688 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002689 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002690}