blob: 12b496f8ad4ee44b4663ba0e86d3a2459b11dd29 [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
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +000046 mvwinchnstr mvwinchstr mvwinnstr newterm
Walter Dörwald4994d952006-06-19 08:07:50 +000047 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
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000315Window_OneArgNoReturnFunction(clearok, int, "i;True(1) or False(0)")
316Window_OneArgNoReturnFunction(idlok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000317#if defined(__NetBSD__)
318Window_OneArgNoReturnVoidFunction(keypad, int, "i;True(1) or False(0)")
319#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000320Window_OneArgNoReturnFunction(keypad, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000321#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000322Window_OneArgNoReturnFunction(leaveok, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000323#if defined(__NetBSD__)
324Window_OneArgNoReturnVoidFunction(nodelay, int, "i;True(1) or False(0)")
325#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000326Window_OneArgNoReturnFunction(nodelay, int, "i;True(1) or False(0)")
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000327#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000328Window_OneArgNoReturnFunction(notimeout, int, "i;True(1) or False(0)")
329Window_OneArgNoReturnFunction(scrollok, int, "i;True(1) or False(0)")
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000330Window_OneArgNoReturnFunction(winsdelln, int, "i;nlines")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000331Window_OneArgNoReturnFunction(syncok, int, "i;True(1) or False(0)")
332
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000333Window_TwoArgNoReturnFunction(mvwin, int, "ii;y,x")
334Window_TwoArgNoReturnFunction(mvderwin, int, "ii;y,x")
335Window_TwoArgNoReturnFunction(wmove, int, "ii;y,x")
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000336#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000337Window_TwoArgNoReturnFunction(wresize, int, "ii;lines,columns")
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000338#endif
339
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000340/* Allocation and deallocation of Window Objects */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000341
Guido van Rossumf6971e21994-08-30 12:25:20 +0000342static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000343PyCursesWindow_New(WINDOW *win)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000344{
345 PyCursesWindowObject *wo;
Guido van Rossum85738471995-02-17 13:50:17 +0000346
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000347 wo = PyObject_NEW(PyCursesWindowObject, &PyCursesWindow_Type);
348 if (wo == NULL) return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000349 wo->win = win;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000350 return (PyObject *)wo;
351}
352
353static void
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000354PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000355{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000356 if (wo->win != stdscr) delwin(wo->win);
Michael W. Hudson67fb0c32002-01-30 15:39:28 +0000357 PyObject_DEL(wo);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000358}
359
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000360/* Addch, Addstr, Addnstr */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000361
362static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000363PyCursesWindow_AddCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000364{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000365 int rtn, x, y, use_xy = FALSE;
366 PyObject *temp;
367 chtype ch = 0;
368 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000369 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000370
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000371 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000372 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000373 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000374 return NULL;
375 break;
376 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000377 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
Guido van Rossum85738471995-02-17 13:50:17 +0000378 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000379 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000380 break;
381 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000382 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000383 return NULL;
384 use_xy = TRUE;
385 break;
386 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000387 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr",
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000388 &y, &x, &temp, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000389 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000390 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000391 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;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000418 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000419 int use_xy = FALSE, use_attr = FALSE;
Guido van Rossum85738471995-02-17 13:50:17 +0000420
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000421 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000422 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000423 if (!PyArg_ParseTuple(args,"s;str", &str))
Guido van Rossum85738471995-02-17 13:50:17 +0000424 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000425 break;
426 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000427 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000428 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000429 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000430 use_attr = TRUE;
431 break;
432 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000433 if (!PyArg_ParseTuple(args,"iis;int,int,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000434 return NULL;
435 use_xy = TRUE;
436 break;
437 case 4:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000438 if (!PyArg_ParseTuple(args,"iisl;int,int,str,attr", &y, &x, &str, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000439 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000440 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000441 use_xy = use_attr = TRUE;
442 break;
443 default:
444 PyErr_SetString(PyExc_TypeError, "addstr requires 1 to 4 arguments");
445 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000446 }
Guido van Rossum85738471995-02-17 13:50:17 +0000447
Guido van Rossumf6971e21994-08-30 12:25:20 +0000448 if (use_attr == TRUE) {
449 attr_old = getattrs(self->win);
450 wattrset(self->win,attr);
451 }
452 if (use_xy == TRUE)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000453 rtn = mvwaddstr(self->win,y,x,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000454 else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000455 rtn = waddstr(self->win,str);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000456 if (use_attr == TRUE)
457 wattrset(self->win,attr_old);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000458 return PyCursesCheckERR(rtn, "addstr");
459}
Guido van Rossum85738471995-02-17 13:50:17 +0000460
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000461static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000462PyCursesWindow_AddNStr(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000463{
464 int rtn, x, y, n;
465 char *str;
466 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000467 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000468 int use_xy = FALSE, use_attr = FALSE;
469
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000470 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000471 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000472 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000473 return NULL;
474 break;
475 case 3:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000476 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000477 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000478 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000479 use_attr = TRUE;
480 break;
481 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000482 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000483 return NULL;
484 use_xy = TRUE;
485 break;
486 case 5:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000487 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000488 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000489 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000490 use_xy = use_attr = TRUE;
491 break;
492 default:
493 PyErr_SetString(PyExc_TypeError, "addnstr requires 2 to 5 arguments");
494 return NULL;
495 }
496
497 if (use_attr == TRUE) {
498 attr_old = getattrs(self->win);
499 wattrset(self->win,attr);
500 }
501 if (use_xy == TRUE)
502 rtn = mvwaddnstr(self->win,y,x,str,n);
503 else
504 rtn = waddnstr(self->win,str,n);
505 if (use_attr == TRUE)
506 wattrset(self->win,attr_old);
507 return PyCursesCheckERR(rtn, "addnstr");
508}
509
510static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000511PyCursesWindow_Bkgd(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000512{
513 PyObject *temp;
514 chtype bkgd;
515 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000516 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000517
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000518 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000519 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000520 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000521 return NULL;
522 break;
523 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000524 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000525 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000526 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000527 break;
528 default:
529 PyErr_SetString(PyExc_TypeError, "bkgd requires 1 or 2 arguments");
530 return NULL;
531 }
532
533 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
534 PyErr_SetString(PyExc_TypeError, "argument 1 or 3 must be a ch or an int");
535 return NULL;
536 }
537
Andrew M. Kuchling4a596e32001-09-04 19:34:32 +0000538 return PyCursesCheckERR(wbkgd(self->win, bkgd | attr), "bkgd");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000539}
540
541static PyObject *
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000542PyCursesWindow_AttrOff(PyCursesWindowObject *self, PyObject *args)
543{
544 long lattr;
545 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
546 return NULL;
547 return PyCursesCheckERR(wattroff(self->win, (attr_t)lattr), "attroff");
548}
549
550static PyObject *
551PyCursesWindow_AttrOn(PyCursesWindowObject *self, PyObject *args)
552{
553 long lattr;
554 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
555 return NULL;
556 return PyCursesCheckERR(wattron(self->win, (attr_t)lattr), "attron");
557}
558
559static PyObject *
560PyCursesWindow_AttrSet(PyCursesWindowObject *self, PyObject *args)
561{
562 long lattr;
563 if (!PyArg_ParseTuple(args,"l;attr", &lattr))
564 return NULL;
565 return PyCursesCheckERR(wattrset(self->win, (attr_t)lattr), "attrset");
566}
567
568static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000569PyCursesWindow_BkgdSet(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000570{
571 PyObject *temp;
572 chtype bkgd;
573 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000574 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000575
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000576 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000577 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000578 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000579 return NULL;
580 break;
581 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000582 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000583 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000584 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000585 break;
586 default:
587 PyErr_SetString(PyExc_TypeError, "bkgdset requires 1 or 2 arguments");
588 return NULL;
589 }
590
591 if (!PyCurses_ConvertToChtype(temp, &bkgd)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000592 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000593 return NULL;
594 }
595
596 wbkgdset(self->win, bkgd | attr);
597 return PyCursesCheckERR(0, "bkgdset");
598}
599
600static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000601PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000602{
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000603 PyObject *temp[8];
604 chtype ch[8];
605 int i;
606
607 /* Clear the array of parameters */
608 for(i=0; i<8; i++) {
609 temp[i] = NULL;
610 ch[i] = 0;
611 }
612
613 if (!PyArg_ParseTuple(args,"|OOOOOOOO;ls,rs,ts,bs,tl,tr,bl,br",
614 &temp[0], &temp[1], &temp[2], &temp[3],
615 &temp[4], &temp[5], &temp[6], &temp[7]))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000616 return NULL;
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000617
618 for(i=0; i<8; i++) {
619 if (temp[i] != NULL && !PyCurses_ConvertToChtype(temp[i], &ch[i])) {
620 PyErr_Format(PyExc_TypeError,
621 "argument %i must be a ch or an int", i+1);
622 return NULL;
623 }
624 }
625
626 wborder(self->win,
627 ch[0], ch[1], ch[2], ch[3],
628 ch[4], ch[5], ch[6], ch[7]);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000629 Py_INCREF(Py_None);
630 return Py_None;
631}
632
633static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000634PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000635{
636 chtype ch1=0,ch2=0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000637 switch(PyTuple_Size(args)){
638 case 0: break;
639 default:
640 if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000641 return NULL;
642 }
643 box(self->win,ch1,ch2);
644 Py_INCREF(Py_None);
645 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000646}
647
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000648#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION)
649#define py_mvwdelch mvwdelch
650#else
651int py_mvwdelch(WINDOW *w, int y, int x)
652{
653 mvwdelch(w,y,x);
654 /* On HP/UX, mvwdelch already returns. On other systems,
655 we may well run into this return statement. */
656 return 0;
657}
658#endif
659
660
Guido van Rossumf6971e21994-08-30 12:25:20 +0000661static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000662PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000663{
664 int rtn;
665 int x, y;
Guido van Rossum85738471995-02-17 13:50:17 +0000666
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000667 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000668 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000669 rtn = wdelch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000670 break;
671 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000672 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Guido van Rossum85738471995-02-17 13:50:17 +0000673 return NULL;
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000674 rtn = py_mvwdelch(self->win,y,x);
Guido van Rossum85738471995-02-17 13:50:17 +0000675 break;
676 default:
677 PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments");
678 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000679 }
Guido van Rossum85738471995-02-17 13:50:17 +0000680 return PyCursesCheckERR(rtn, "[mv]wdelch");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000681}
682
683static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000684PyCursesWindow_DerWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000685{
686 WINDOW *win;
687 int nlines, ncols, begin_y, begin_x;
688
689 nlines = 0;
690 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000691 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000692 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000693 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000694 return NULL;
695 break;
696 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000697 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000698 &nlines,&ncols,&begin_y,&begin_x))
699 return NULL;
700 break;
701 default:
702 PyErr_SetString(PyExc_TypeError, "derwin requires 2 or 4 arguments");
703 return NULL;
704 }
705
706 win = derwin(self->win,nlines,ncols,begin_y,begin_x);
707
708 if (win == NULL) {
709 PyErr_SetString(PyCursesError, catchall_NULL);
710 return NULL;
711 }
712
713 return (PyObject *)PyCursesWindow_New(win);
714}
715
716static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000717PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000718{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000719 PyObject *temp;
720 chtype ch;
721 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000722 long lattr;
Guido van Rossum85738471995-02-17 13:50:17 +0000723
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000724 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000725 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000726 if (!PyArg_ParseTuple(args,"O;ch or int", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +0000727 return NULL;
Guido van Rossum85738471995-02-17 13:50:17 +0000728 break;
729 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000730 if (!PyArg_ParseTuple(args,"Ol;ch or int,attr", &temp, &lattr))
Guido van Rossum85738471995-02-17 13:50:17 +0000731 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000732 attr = lattr;
Guido van Rossum85738471995-02-17 13:50:17 +0000733 break;
734 default:
735 PyErr_SetString(PyExc_TypeError, "echochar requires 1 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000736
737
Guido van Rossum85738471995-02-17 13:50:17 +0000738 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000739 }
Guido van Rossum85738471995-02-17 13:50:17 +0000740
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000741 if (!PyCurses_ConvertToChtype(temp, &ch)) {
742 PyErr_SetString(PyExc_TypeError, "argument 1 must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +0000743 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000744 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000745
Martin v. Löwiseb9b1032001-10-24 17:10:49 +0000746#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000747 if (self->win->_flags & _ISPAD)
748 return PyCursesCheckERR(pechochar(self->win, ch | attr),
749 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000750 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000751#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000752 return PyCursesCheckERR(wechochar(self->win, ch | attr),
753 "echochar");
Guido van Rossumf6971e21994-08-30 12:25:20 +0000754}
755
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000756#ifdef NCURSES_MOUSE_VERSION
757static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000758PyCursesWindow_Enclose(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000759{
760 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000761 if (!PyArg_ParseTuple(args,"ii;y,x", &y, &x))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +0000762 return NULL;
763
764 return PyInt_FromLong( wenclose(self->win,y,x) );
765}
766#endif
767
Guido van Rossumf6971e21994-08-30 12:25:20 +0000768static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000769PyCursesWindow_GetBkgd(PyCursesWindowObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000770{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000771 return PyInt_FromLong((long) getbkgd(self->win));
Guido van Rossumf6971e21994-08-30 12:25:20 +0000772}
773
774static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000775PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000776{
777 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000778 int rtn;
Guido van Rossum85738471995-02-17 13:50:17 +0000779
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000780 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000781 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000782 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf6971e21994-08-30 12:25:20 +0000783 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000784 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000785 break;
786 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000787 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000788 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000789 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000790 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000791 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000792 break;
793 default:
794 PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
795 return NULL;
796 }
Fred Drake0368bc42001-07-19 20:48:32 +0000797 return PyInt_FromLong((long)rtn);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000798}
Guido van Rossum85738471995-02-17 13:50:17 +0000799
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000800static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000801PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000802{
803 int x, y;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000804 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000805
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000806 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000807 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000808 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000809 rtn = wgetch(self->win);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000810 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000811 break;
812 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000813 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000814 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000815 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000816 rtn = mvwgetch(self->win,y,x);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000817 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000818 break;
819 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +0000820 PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000821 return NULL;
822 }
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +0000823 if (rtn == ERR) {
824 /* getch() returns ERR in nodelay mode */
825 PyErr_SetString(PyCursesError, "no input");
826 return NULL;
827 } else if (rtn<=255)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000828 return Py_BuildValue("c", rtn);
829 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000830#if defined(__NetBSD__)
831 return PyString_FromString(unctrl(rtn));
832#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000833 return PyString_FromString((char *)keyname(rtn));
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +0000834#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +0000835}
836
837static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000838PyCursesWindow_GetStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000839{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000840 int x, y, n;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000841 char rtn[1024]; /* This should be big enough.. I hope */
842 int rtn2;
Guido van Rossum85738471995-02-17 13:50:17 +0000843
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000844 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000845 case 0:
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000846 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000847 rtn2 = wgetnstr(self->win,rtn, 1023);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000848 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000849 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000850 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000851 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000852 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000853 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000854 rtn2 = wgetnstr(self->win,rtn,MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000855 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000856 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000857 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000858 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000859 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000860 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +0000861#ifdef STRICT_SYSV_CURSES
862 rtn2 = wmove(self->win,y,x)==ERR ? ERR : wgetnstr(self->win, rtn, 1023);
863#else
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000864 rtn2 = mvwgetnstr(self->win,y,x,rtn, 1023);
Andrew M. Kuchling55b0a0e2006-07-26 17:16:52 +0000865#endif
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000866 Py_END_ALLOW_THREADS
Guido van Rossum85738471995-02-17 13:50:17 +0000867 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000868 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000869 if (!PyArg_ParseTuple(args,"iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000870 return NULL;
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +0000871#ifdef STRICT_SYSV_CURSES
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000872 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000873 rtn2 = wmove(self->win,y,x)==ERR ? ERR :
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000874 wgetnstr(self->win, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000875 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000876#else
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000877 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +0000878 rtn2 = mvwgetnstr(self->win, y, x, rtn, MIN(n, 1023));
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +0000879 Py_END_ALLOW_THREADS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000880#endif
881 break;
Guido van Rossum85738471995-02-17 13:50:17 +0000882 default:
Andrew M. Kuchlinga1da2042006-07-26 17:18:01 +0000883 PyErr_SetString(PyExc_TypeError, "getstr requires 0 to 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +0000884 return NULL;
885 }
Guido van Rossumf6971e21994-08-30 12:25:20 +0000886 if (rtn2 == ERR)
887 rtn[0] = 0;
Guido van Rossum85738471995-02-17 13:50:17 +0000888 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000889}
890
891static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000892PyCursesWindow_Hline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000893{
894 PyObject *temp;
895 chtype ch;
896 int n, x, y, code = OK;
897 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000898 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000899
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000900 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000901 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000902 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000903 return NULL;
904 break;
905 case 3:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000906 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000907 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000908 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000909 break;
910 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000911 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000912 return NULL;
913 code = wmove(self->win, y, x);
914 break;
915 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000916 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000917 &y, &x, &temp, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000918 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000919 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000920 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000921 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000922 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +0000923 PyErr_SetString(PyExc_TypeError, "hline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000924 return NULL;
925 }
926
927 if (code != ERR) {
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 return PyCursesCheckERR(whline(self->win, ch | attr, n), "hline");
934 } else
935 return PyCursesCheckERR(code, "wmove");
936}
937
938static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000939PyCursesWindow_InsCh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000940{
941 int rtn, x, y, use_xy = FALSE;
942 PyObject *temp;
943 chtype ch = 0;
944 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000945 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000946
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000947 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000948 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000949 if (!PyArg_ParseTuple(args, "O;ch or int", &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000950 return NULL;
951 break;
952 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000953 if (!PyArg_ParseTuple(args, "Ol;ch or int,attr", &temp, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000954 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000955 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000956 break;
957 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000958 if (!PyArg_ParseTuple(args,"iiO;y,x,ch or int", &y, &x, &temp))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000959 return NULL;
960 use_xy = TRUE;
961 break;
962 case 4:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000963 if (!PyArg_ParseTuple(args,"iiOl;y,x,ch or int, attr", &y, &x, &temp, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000964 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +0000965 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +0000966 use_xy = TRUE;
967 break;
968 default:
969 PyErr_SetString(PyExc_TypeError, "insch requires 1 or 4 arguments");
970 return NULL;
971 }
972
973 if (!PyCurses_ConvertToChtype(temp, &ch)) {
974 PyErr_SetString(PyExc_TypeError,
975 "argument 1 or 3 must be a ch or an int");
976 return NULL;
977 }
978
979 if (use_xy == TRUE)
980 rtn = mvwinsch(self->win,y,x, ch | attr);
981 else {
982 rtn = winsch(self->win, ch | attr);
983 }
984 return PyCursesCheckERR(rtn, "insch");
985}
986
987static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +0000988PyCursesWindow_InCh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000989{
Guido van Rossum85738471995-02-17 13:50:17 +0000990 int x, y, rtn;
991
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000992 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +0000993 case 0:
Guido van Rossumf6971e21994-08-30 12:25:20 +0000994 rtn = winch(self->win);
Guido van Rossum85738471995-02-17 13:50:17 +0000995 break;
996 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +0000997 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +0000998 return NULL;
999 rtn = mvwinch(self->win,y,x);
1000 break;
1001 default:
1002 PyErr_SetString(PyExc_TypeError, "inch requires 0 or 2 arguments");
1003 return NULL;
1004 }
Guido van Rossum85738471995-02-17 13:50:17 +00001005 return PyInt_FromLong((long) rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001006}
1007
1008static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001009PyCursesWindow_InStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001010{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001011 int x, y, n;
1012 char rtn[1024]; /* This should be big enough.. I hope */
1013 int rtn2;
1014
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001015 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001016 case 0:
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001017 rtn2 = winnstr(self->win,rtn, 1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001018 break;
1019 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001020 if (!PyArg_ParseTuple(args,"i;n", &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001021 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001022 rtn2 = winnstr(self->win,rtn,MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001023 break;
1024 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001025 if (!PyArg_ParseTuple(args,"ii;y,x",&y,&x))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001026 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001027 rtn2 = mvwinnstr(self->win,y,x,rtn,1023);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001028 break;
1029 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001030 if (!PyArg_ParseTuple(args, "iii;y,x,n", &y, &x, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001031 return NULL;
Andrew M. Kuchling52a14c32005-06-09 17:53:27 +00001032 rtn2 = mvwinnstr(self->win, y, x, rtn, MIN(n,1023));
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001033 break;
1034 default:
1035 PyErr_SetString(PyExc_TypeError, "instr requires 0 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001036 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001037 }
1038 if (rtn2 == ERR)
1039 rtn[0] = 0;
1040 return PyString_FromString(rtn);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001041}
1042
1043static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001044PyCursesWindow_InsStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001045{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001046 int rtn;
1047 int x, y;
1048 char *str;
1049 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001050 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001051 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 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001055 if (!PyArg_ParseTuple(args,"s;str", &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001056 return NULL;
1057 break;
1058 case 2:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001059 if (!PyArg_ParseTuple(args,"sl;str,attr", &str, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001060 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001061 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001062 use_attr = TRUE;
1063 break;
1064 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001065 if (!PyArg_ParseTuple(args,"iis;y,x,str", &y, &x, &str))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001066 return NULL;
1067 use_xy = TRUE;
1068 break;
1069 case 4:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001070 if (!PyArg_ParseTuple(args,"iisl;y,x,str,attr", &y, &x, &str, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001071 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001072 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001073 use_xy = use_attr = TRUE;
1074 break;
1075 default:
1076 PyErr_SetString(PyExc_TypeError, "insstr requires 1 to 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001077 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001078 }
1079
1080 if (use_attr == TRUE) {
1081 attr_old = getattrs(self->win);
1082 wattrset(self->win,attr);
1083 }
1084 if (use_xy == TRUE)
1085 rtn = mvwinsstr(self->win,y,x,str);
1086 else
1087 rtn = winsstr(self->win,str);
1088 if (use_attr == TRUE)
1089 wattrset(self->win,attr_old);
1090 return PyCursesCheckERR(rtn, "insstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001091}
1092
1093static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001094PyCursesWindow_InsNStr(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001095{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001096 int rtn, x, y, n;
1097 char *str;
1098 attr_t attr = A_NORMAL , attr_old = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001099 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001100 int use_xy = FALSE, use_attr = FALSE;
1101
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001102 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001103 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001104 if (!PyArg_ParseTuple(args,"si;str,n", &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001105 return NULL;
1106 break;
1107 case 3:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001108 if (!PyArg_ParseTuple(args,"sil;str,n,attr", &str, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001109 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001110 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001111 use_attr = TRUE;
1112 break;
1113 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001114 if (!PyArg_ParseTuple(args,"iisi;y,x,str,n", &y, &x, &str, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001115 return NULL;
1116 use_xy = TRUE;
1117 break;
1118 case 5:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001119 if (!PyArg_ParseTuple(args,"iisil;y,x,str,n,attr", &y, &x, &str, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001120 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001121 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001122 use_xy = use_attr = TRUE;
1123 break;
1124 default:
1125 PyErr_SetString(PyExc_TypeError, "insnstr requires 2 to 5 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001126 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001127 }
1128
1129 if (use_attr == TRUE) {
1130 attr_old = getattrs(self->win);
1131 wattrset(self->win,attr);
1132 }
1133 if (use_xy == TRUE)
1134 rtn = mvwinsnstr(self->win,y,x,str,n);
1135 else
1136 rtn = winsnstr(self->win,str,n);
1137 if (use_attr == TRUE)
1138 wattrset(self->win,attr_old);
1139 return PyCursesCheckERR(rtn, "insnstr");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001140}
1141
1142static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001143PyCursesWindow_Is_LineTouched(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001144{
1145 int line, erg;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001146 if (!PyArg_ParseTuple(args,"i;line", &line))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001147 return NULL;
1148 erg = is_linetouched(self->win, line);
1149 if (erg == ERR) {
1150 PyErr_SetString(PyExc_TypeError,
1151 "is_linetouched: line number outside of boundaries");
1152 return NULL;
1153 } else
1154 if (erg == FALSE) {
1155 Py_INCREF(Py_False);
1156 return Py_False;
1157 } else {
1158 Py_INCREF(Py_True);
1159 return Py_True;
1160 }
1161}
1162
1163static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001164PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001165{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001166 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001167 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001168
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001169#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001170 if (0) {
1171#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001172 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001173#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001174 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001175 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001176 if (!PyArg_ParseTuple(args,
1177 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001178 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1179 &pminrow, &pmincol, &sminrow,
1180 &smincol, &smaxrow, &smaxcol))
1181 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001182 Py_BEGIN_ALLOW_THREADS
1183 rtn = pnoutrefresh(self->win,
1184 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001185 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001186 Py_END_ALLOW_THREADS
1187 return PyCursesCheckERR(rtn, "pnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001188 default:
1189 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001190 "noutrefresh() called for a pad "
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001191 "requires 6 arguments");
1192 return NULL;
1193 }
1194 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001195 if (!PyArg_ParseTuple(args, ":noutrefresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001196 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001197
1198 Py_BEGIN_ALLOW_THREADS
1199 rtn = wnoutrefresh(self->win);
1200 Py_END_ALLOW_THREADS
1201 return PyCursesCheckERR(rtn, "wnoutrefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001202 }
1203}
1204
1205static PyObject *
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001206PyCursesWindow_Overlay(PyCursesWindowObject *self, PyObject *args)
1207{
1208 PyCursesWindowObject *temp;
1209 int use_copywin = FALSE;
1210 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1211 int rtn;
1212
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001213 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001214 case 1:
1215 if (!PyArg_ParseTuple(args, "O!;window object",
1216 &PyCursesWindow_Type, &temp))
1217 return NULL;
1218 break;
1219 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001220 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001221 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1222 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1223 return NULL;
1224 use_copywin = TRUE;
1225 break;
1226 default:
1227 PyErr_SetString(PyExc_TypeError,
1228 "overlay requires one or seven arguments");
1229 return NULL;
1230 }
1231
1232 if (use_copywin == TRUE) {
1233 rtn = copywin(self->win, temp->win, sminrow, smincol,
1234 dminrow, dmincol, dmaxrow, dmaxcol, TRUE);
1235 return PyCursesCheckERR(rtn, "copywin");
1236 }
1237 else {
1238 rtn = overlay(self->win, temp->win);
1239 return PyCursesCheckERR(rtn, "overlay");
1240 }
1241}
1242
1243static PyObject *
1244PyCursesWindow_Overwrite(PyCursesWindowObject *self, PyObject *args)
1245{
1246 PyCursesWindowObject *temp;
1247 int use_copywin = FALSE;
1248 int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
1249 int rtn;
1250
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001251 switch (PyTuple_Size(args)) {
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001252 case 1:
1253 if (!PyArg_ParseTuple(args, "O!;window object",
1254 &PyCursesWindow_Type, &temp))
1255 return NULL;
1256 break;
1257 case 7:
Neal Norwitz88bbd732006-01-10 07:05:44 +00001258 if (!PyArg_ParseTuple(args, "O!iiiiii;window object, int, int, int, int, int, int",
Andrew M. Kuchling9de6ffa2000-12-21 16:22:22 +00001259 &PyCursesWindow_Type, &temp, &sminrow, &smincol,
1260 &dminrow, &dmincol, &dmaxrow, &dmaxcol))
1261 return NULL;
1262 use_copywin = TRUE;
1263 break;
1264 default:
1265 PyErr_SetString(PyExc_TypeError,
1266 "overwrite requires one or seven arguments");
1267 return NULL;
1268 }
1269
1270 if (use_copywin == TRUE) {
1271 rtn = copywin(self->win, temp->win, sminrow, smincol,
1272 dminrow, dmincol, dmaxrow, dmaxcol, FALSE);
1273 return PyCursesCheckERR(rtn, "copywin");
1274 }
1275 else {
1276 rtn = overwrite(self->win, temp->win);
1277 return PyCursesCheckERR(rtn, "overwrite");
1278 }
1279}
1280
1281static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001282PyCursesWindow_PutWin(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001283{
1284 PyObject *temp;
1285
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001286 if (!PyArg_ParseTuple(args, "O;fileobj", &temp))
Guido van Rossum85738471995-02-17 13:50:17 +00001287 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001288 if (!PyFile_Check(temp)) {
1289 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1290 return NULL;
1291 }
1292 return PyCursesCheckERR(putwin(self->win, PyFile_AsFile(temp)),
1293 "putwin");
1294}
1295
1296static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001297PyCursesWindow_RedrawLine(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001298{
1299 int beg, num;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001300 if (!PyArg_ParseTuple(args,"ii;beg,num", &beg, &num))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001301 return NULL;
1302 return PyCursesCheckERR(wredrawln(self->win,beg,num), "redrawln");
1303}
1304
1305static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001306PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001307{
1308 int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001309 int rtn;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001310
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001311#ifndef WINDOW_HAS_FLAGS
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001312 if (0) {
1313#else
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001314 if (self->win->_flags & _ISPAD) {
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001315#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001316 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001317 case 6:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001318 if (!PyArg_ParseTuple(args,
1319 "iiiiii;" \
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001320 "pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol",
1321 &pminrow, &pmincol, &sminrow,
1322 &smincol, &smaxrow, &smaxcol))
1323 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001324
1325 Py_BEGIN_ALLOW_THREADS
1326 rtn = prefresh(self->win,
1327 pminrow, pmincol, sminrow,
Andrew M. Kuchlingb6e46872000-06-27 15:01:10 +00001328 smincol, smaxrow, smaxcol);
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001329 Py_END_ALLOW_THREADS
1330 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001331 default:
1332 PyErr_SetString(PyCursesError,
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001333 "refresh() for a pad requires 6 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001334 return NULL;
1335 }
1336 } else {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001337 if (!PyArg_ParseTuple(args, ":refresh"))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001338 return NULL;
Andrew M. Kuchlingf4195722000-06-23 01:36:21 +00001339 Py_BEGIN_ALLOW_THREADS
1340 rtn = wrefresh(self->win);
1341 Py_END_ALLOW_THREADS
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001342 return PyCursesCheckERR(rtn, "prefresh");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001343 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001344}
1345
1346static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001347PyCursesWindow_SetScrollRegion(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001348{
1349 int x, y;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001350 if (!PyArg_ParseTuple(args,"ii;top, bottom",&y,&x))
Guido van Rossum85738471995-02-17 13:50:17 +00001351 return NULL;
1352 return PyCursesCheckERR(wsetscrreg(self->win,y,x), "wsetscrreg");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001353}
1354
1355static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001356PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001357{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001358 WINDOW *win;
1359 int nlines, ncols, begin_y, begin_x;
1360
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001361 nlines = 0;
1362 ncols = 0;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001363 switch (PyTuple_Size(args)) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001364 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001365 if (!PyArg_ParseTuple(args,"ii;begin_y,begin_x",&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001366 return NULL;
1367 break;
1368 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001369 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001370 &nlines,&ncols,&begin_y,&begin_x))
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001371 return NULL;
1372 break;
1373 default:
1374 PyErr_SetString(PyExc_TypeError, "subwin requires 2 or 4 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001375 return NULL;
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001376 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001377
Andrew M. Kuchling8353f622000-07-26 18:36:27 +00001378 /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001379#ifdef WINDOW_HAS_FLAGS
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001380 if (self->win->_flags & _ISPAD)
1381 win = subpad(self->win, nlines, ncols, begin_y, begin_x);
1382 else
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00001383#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001384 win = subwin(self->win, nlines, ncols, begin_y, begin_x);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001385
1386 if (win == NULL) {
1387 PyErr_SetString(PyCursesError, catchall_NULL);
1388 return NULL;
1389 }
1390
1391 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001392}
1393
1394static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001395PyCursesWindow_Scroll(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001396{
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001397 int nlines;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001398 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001399 case 0:
1400 return PyCursesCheckERR(scroll(self->win), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001401 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001402 if (!PyArg_ParseTuple(args, "i;nlines", &nlines))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001403 return NULL;
Andrew M. Kuchlinge1c43522001-01-29 20:31:29 +00001404 return PyCursesCheckERR(wscrl(self->win, nlines), "scroll");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001405 default:
1406 PyErr_SetString(PyExc_TypeError, "scroll requires 0 or 1 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001407 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001408 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00001409}
1410
1411static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001412PyCursesWindow_TouchLine(PyCursesWindowObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001413{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001414 int st, cnt, val;
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001415 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001416 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001417 if (!PyArg_ParseTuple(args,"ii;start,count",&st,&cnt))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001418 return NULL;
1419 return PyCursesCheckERR(touchline(self->win,st,cnt), "touchline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001420 case 3:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001421 if (!PyArg_ParseTuple(args, "iii;start,count,val", &st, &cnt, &val))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001422 return NULL;
1423 return PyCursesCheckERR(wtouchln(self->win, st, cnt, val), "touchline");
1424 default:
1425 PyErr_SetString(PyExc_TypeError, "touchline requires 2 or 3 arguments");
Guido van Rossum85738471995-02-17 13:50:17 +00001426 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001427 }
1428}
1429
1430static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001431PyCursesWindow_Vline(PyCursesWindowObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001432{
1433 PyObject *temp;
1434 chtype ch;
1435 int n, x, y, code = OK;
1436 attr_t attr = A_NORMAL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001437 long lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001438
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001439 switch (PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001440 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001441 if (!PyArg_ParseTuple(args, "Oi;ch or int,n", &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001442 return NULL;
1443 break;
1444 case 3:
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001445 if (!PyArg_ParseTuple(args, "Oil;ch or int,n,attr", &temp, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001446 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001447 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001448 break;
1449 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001450 if (!PyArg_ParseTuple(args, "iiOi;y,x,ch or int,n", &y, &x, &temp, &n))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001451 return NULL;
1452 code = wmove(self->win, y, x);
1453 break;
1454 case 5:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001455 if (!PyArg_ParseTuple(args, "iiOil; y,x,ch or int,n,attr",
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001456 &y, &x, &temp, &n, &lattr))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001457 return NULL;
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001458 attr = lattr;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001459 code = wmove(self->win, y, x);
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001460 break;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001461 default:
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001462 PyErr_SetString(PyExc_TypeError, "vline requires 2 to 5 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001463 return NULL;
1464 }
1465
1466 if (code != ERR) {
1467 if (!PyCurses_ConvertToChtype(temp, &ch)) {
1468 PyErr_SetString(PyExc_TypeError,
1469 "argument 1 or 3 must be a ch or an int");
1470 return NULL;
1471 }
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001472 return PyCursesCheckERR(wvline(self->win, ch | attr, n), "vline");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001473 } else
1474 return PyCursesCheckERR(code, "wmove");
Guido van Rossumf6971e21994-08-30 12:25:20 +00001475}
1476
1477static PyMethodDef PyCursesWindow_Methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001478 {"addch", (PyCFunction)PyCursesWindow_AddCh, METH_VARARGS},
1479 {"addnstr", (PyCFunction)PyCursesWindow_AddNStr, METH_VARARGS},
1480 {"addstr", (PyCFunction)PyCursesWindow_AddStr, METH_VARARGS},
Andrew M. Kuchling7a062c62008-01-08 14:58:52 +00001481 {"attroff", (PyCFunction)PyCursesWindow_AttrOff, METH_VARARGS},
1482 {"attron", (PyCFunction)PyCursesWindow_AttrOn, METH_VARARGS},
1483 {"attrset", (PyCFunction)PyCursesWindow_AttrSet, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001484 {"bkgd", (PyCFunction)PyCursesWindow_Bkgd, METH_VARARGS},
1485 {"bkgdset", (PyCFunction)PyCursesWindow_BkgdSet, METH_VARARGS},
Sjoerd Mullender14ece161995-03-17 12:18:38 +00001486 {"border", (PyCFunction)PyCursesWindow_Border, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001487 {"box", (PyCFunction)PyCursesWindow_Box, METH_VARARGS},
1488 {"clear", (PyCFunction)PyCursesWindow_wclear, METH_NOARGS},
1489 {"clearok", (PyCFunction)PyCursesWindow_clearok, METH_VARARGS},
1490 {"clrtobot", (PyCFunction)PyCursesWindow_wclrtobot, METH_NOARGS},
1491 {"clrtoeol", (PyCFunction)PyCursesWindow_wclrtoeol, METH_NOARGS},
1492 {"cursyncup", (PyCFunction)PyCursesWindow_wcursyncup, METH_NOARGS},
1493 {"delch", (PyCFunction)PyCursesWindow_DelCh, METH_VARARGS},
1494 {"deleteln", (PyCFunction)PyCursesWindow_wdeleteln, METH_NOARGS},
1495 {"derwin", (PyCFunction)PyCursesWindow_DerWin, METH_VARARGS},
1496 {"echochar", (PyCFunction)PyCursesWindow_EchoChar, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001497#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001498 {"enclose", (PyCFunction)PyCursesWindow_Enclose, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001499#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001500 {"erase", (PyCFunction)PyCursesWindow_werase, METH_NOARGS},
1501 {"getbegyx", (PyCFunction)PyCursesWindow_getbegyx, METH_NOARGS},
1502 {"getbkgd", (PyCFunction)PyCursesWindow_GetBkgd, METH_NOARGS},
1503 {"getch", (PyCFunction)PyCursesWindow_GetCh, METH_VARARGS},
1504 {"getkey", (PyCFunction)PyCursesWindow_GetKey, METH_VARARGS},
1505 {"getmaxyx", (PyCFunction)PyCursesWindow_getmaxyx, METH_NOARGS},
1506 {"getparyx", (PyCFunction)PyCursesWindow_getparyx, METH_NOARGS},
1507 {"getstr", (PyCFunction)PyCursesWindow_GetStr, METH_VARARGS},
1508 {"getyx", (PyCFunction)PyCursesWindow_getyx, METH_NOARGS},
1509 {"hline", (PyCFunction)PyCursesWindow_Hline, METH_VARARGS},
1510 {"idcok", (PyCFunction)PyCursesWindow_idcok, METH_VARARGS},
1511 {"idlok", (PyCFunction)PyCursesWindow_idlok, METH_VARARGS},
1512 {"immedok", (PyCFunction)PyCursesWindow_immedok, METH_VARARGS},
1513 {"inch", (PyCFunction)PyCursesWindow_InCh, METH_VARARGS},
1514 {"insch", (PyCFunction)PyCursesWindow_InsCh, METH_VARARGS},
1515 {"insdelln", (PyCFunction)PyCursesWindow_winsdelln, METH_VARARGS},
1516 {"insertln", (PyCFunction)PyCursesWindow_winsertln, METH_NOARGS},
1517 {"insnstr", (PyCFunction)PyCursesWindow_InsNStr, METH_VARARGS},
1518 {"insstr", (PyCFunction)PyCursesWindow_InsStr, METH_VARARGS},
1519 {"instr", (PyCFunction)PyCursesWindow_InStr, METH_VARARGS},
1520 {"is_linetouched", (PyCFunction)PyCursesWindow_Is_LineTouched, METH_VARARGS},
1521 {"is_wintouched", (PyCFunction)PyCursesWindow_is_wintouched, METH_NOARGS},
1522 {"keypad", (PyCFunction)PyCursesWindow_keypad, METH_VARARGS},
1523 {"leaveok", (PyCFunction)PyCursesWindow_leaveok, METH_VARARGS},
1524 {"move", (PyCFunction)PyCursesWindow_wmove, METH_VARARGS},
1525 {"mvderwin", (PyCFunction)PyCursesWindow_mvderwin, METH_VARARGS},
1526 {"mvwin", (PyCFunction)PyCursesWindow_mvwin, METH_VARARGS},
1527 {"nodelay", (PyCFunction)PyCursesWindow_nodelay, METH_VARARGS},
1528 {"notimeout", (PyCFunction)PyCursesWindow_notimeout, METH_VARARGS},
1529 {"noutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
1530 /* Backward compatibility alias -- remove in Python 2.3 */
1531 {"nooutrefresh", (PyCFunction)PyCursesWindow_NoOutRefresh, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001532 {"overlay", (PyCFunction)PyCursesWindow_Overlay, METH_VARARGS},
1533 {"overwrite", (PyCFunction)PyCursesWindow_Overwrite,
1534 METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001535 {"putwin", (PyCFunction)PyCursesWindow_PutWin, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001536 {"redrawln", (PyCFunction)PyCursesWindow_RedrawLine},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001537 {"redrawwin", (PyCFunction)PyCursesWindow_redrawwin, METH_NOARGS},
1538 {"refresh", (PyCFunction)PyCursesWindow_Refresh, METH_VARARGS},
Andrew M. Kuchlinga1e4b052000-06-27 21:49:47 +00001539#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001540 {"resize", (PyCFunction)PyCursesWindow_wresize, METH_VARARGS},
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001541#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001542 {"scroll", (PyCFunction)PyCursesWindow_Scroll, METH_VARARGS},
1543 {"scrollok", (PyCFunction)PyCursesWindow_scrollok, METH_VARARGS},
1544 {"setscrreg", (PyCFunction)PyCursesWindow_SetScrollRegion, METH_VARARGS},
1545 {"standend", (PyCFunction)PyCursesWindow_wstandend, METH_NOARGS},
1546 {"standout", (PyCFunction)PyCursesWindow_wstandout, METH_NOARGS},
1547 {"subpad", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1548 {"subwin", (PyCFunction)PyCursesWindow_SubWin, METH_VARARGS},
1549 {"syncdown", (PyCFunction)PyCursesWindow_wsyncdown, METH_NOARGS},
1550 {"syncok", (PyCFunction)PyCursesWindow_syncok, METH_VARARGS},
1551 {"syncup", (PyCFunction)PyCursesWindow_wsyncup, METH_NOARGS},
1552 {"timeout", (PyCFunction)PyCursesWindow_wtimeout, METH_VARARGS},
1553 {"touchline", (PyCFunction)PyCursesWindow_TouchLine, METH_VARARGS},
1554 {"touchwin", (PyCFunction)PyCursesWindow_touchwin, METH_NOARGS},
1555 {"untouchwin", (PyCFunction)PyCursesWindow_untouchwin, METH_NOARGS},
1556 {"vline", (PyCFunction)PyCursesWindow_Vline, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00001557 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00001558};
1559
1560static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001561PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001562{
Guido van Rossuma597dde1995-01-10 20:56:29 +00001563 return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001564}
1565
Guido van Rossumf6971e21994-08-30 12:25:20 +00001566/* -------------------------------------------------------*/
Guido van Rossum85738471995-02-17 13:50:17 +00001567
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001568PyTypeObject PyCursesWindow_Type = {
Guido van Rossum6915c4d2001-01-19 00:28:08 +00001569 PyObject_HEAD_INIT(NULL)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001570 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00001571 "_curses.curses window", /*tp_name*/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001572 sizeof(PyCursesWindowObject), /*tp_basicsize*/
1573 0, /*tp_itemsize*/
1574 /* methods */
1575 (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
1576 0, /*tp_print*/
1577 (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
1578 (setattrfunc)0, /*tp_setattr*/
1579 0, /*tp_compare*/
1580 0, /*tp_repr*/
1581 0, /*tp_as_number*/
1582 0, /*tp_as_sequence*/
1583 0, /*tp_as_mapping*/
1584 0, /*tp_hash*/
1585};
1586
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001587/*********************************************************************
1588 Global Functions
1589**********************************************************************/
Guido van Rossumf6971e21994-08-30 12:25:20 +00001590
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001591NoArgNoReturnFunction(beep)
1592NoArgNoReturnFunction(def_prog_mode)
1593NoArgNoReturnFunction(def_shell_mode)
1594NoArgNoReturnFunction(doupdate)
1595NoArgNoReturnFunction(endwin)
1596NoArgNoReturnFunction(flash)
1597NoArgNoReturnFunction(nocbreak)
1598NoArgNoReturnFunction(noecho)
1599NoArgNoReturnFunction(nonl)
1600NoArgNoReturnFunction(noraw)
1601NoArgNoReturnFunction(reset_prog_mode)
1602NoArgNoReturnFunction(reset_shell_mode)
1603NoArgNoReturnFunction(resetty)
1604NoArgNoReturnFunction(savetty)
1605
1606NoArgOrFlagNoReturnFunction(cbreak)
1607NoArgOrFlagNoReturnFunction(echo)
1608NoArgOrFlagNoReturnFunction(nl)
1609NoArgOrFlagNoReturnFunction(raw)
1610
1611NoArgReturnIntFunction(baudrate)
1612NoArgReturnIntFunction(termattrs)
1613
1614NoArgReturnStringFunction(termname)
1615NoArgReturnStringFunction(longname)
1616
1617NoArgTrueFalseFunction(can_change_color)
1618NoArgTrueFalseFunction(has_colors)
1619NoArgTrueFalseFunction(has_ic)
1620NoArgTrueFalseFunction(has_il)
1621NoArgTrueFalseFunction(isendwin)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001622NoArgNoReturnVoidFunction(flushinp)
1623NoArgNoReturnVoidFunction(noqiflush)
1624
1625static PyObject *
Georg Brandlee50e3c2008-01-26 14:03:51 +00001626PyCurses_filter(PyObject *self)
1627{
1628 /* not checking for PyCursesInitialised here since filter() must
1629 be called before initscr() */
1630 filter();
1631 Py_INCREF(Py_None);
1632 return Py_None;
1633}
1634
1635static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001636PyCurses_Color_Content(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001637{
1638 short color,r,g,b;
1639
1640 PyCursesInitialised
1641 PyCursesInitialisedColor
1642
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001643 if (!PyArg_ParseTuple(args, "h:color_content", &color)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001644
1645 if (color_content(color, &r, &g, &b) != ERR)
1646 return Py_BuildValue("(iii)", r, g, b);
1647 else {
1648 PyErr_SetString(PyCursesError,
1649 "Argument 1 was out of range. Check value of COLORS.");
1650 return NULL;
1651 }
1652}
1653
1654static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001655PyCurses_color_pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001656{
1657 int n;
1658
1659 PyCursesInitialised
1660 PyCursesInitialisedColor
1661
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001662 if (!PyArg_ParseTuple(args, "i:color_pair", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001663 return PyInt_FromLong((long) (n << 8));
1664}
1665
1666static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001667PyCurses_Curs_Set(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001668{
1669 int vis,erg;
1670
1671 PyCursesInitialised
1672
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001673 if (!PyArg_ParseTuple(args, "i:curs_set", &vis)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001674
1675 erg = curs_set(vis);
1676 if (erg == ERR) return PyCursesCheckERR(erg, "curs_set");
1677
1678 return PyInt_FromLong((long) erg);
1679}
1680
1681static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001682PyCurses_Delay_Output(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001683{
1684 int ms;
1685
1686 PyCursesInitialised
1687
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001688 if (!PyArg_ParseTuple(args, "i:delay_output", &ms)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001689
1690 return PyCursesCheckERR(delay_output(ms), "delay_output");
1691}
1692
1693static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001694PyCurses_EraseChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001695{
1696 char ch;
1697
1698 PyCursesInitialised
1699
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001700 ch = erasechar();
1701
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00001702 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001703}
1704
1705static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001706PyCurses_getsyx(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001707{
1708 int x,y;
1709
1710 PyCursesInitialised
1711
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001712 getsyx(y, x);
1713
1714 return Py_BuildValue("(ii)", y, x);
1715}
1716
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001717#ifdef NCURSES_MOUSE_VERSION
1718static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001719PyCurses_GetMouse(PyObject *self)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001720{
1721 int rtn;
1722 MEVENT event;
1723
1724 PyCursesInitialised
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001725
1726 rtn = getmouse( &event );
1727 if (rtn == ERR) {
1728 PyErr_SetString(PyCursesError, "getmouse() returned ERR");
1729 return NULL;
1730 }
1731 return Py_BuildValue("(hiiil)",
1732 (short)event.id,
1733 event.x, event.y, event.z,
1734 (long) event.bstate);
1735}
1736
1737static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001738PyCurses_UngetMouse(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001739{
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001740 MEVENT event;
1741
1742 PyCursesInitialised
Neal Norwitz88bbd732006-01-10 07:05:44 +00001743 if (!PyArg_ParseTuple(args, "hiiil",
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00001744 &event.id,
1745 &event.x, &event.y, &event.z,
1746 (int *) &event.bstate))
1747 return NULL;
1748
1749 return PyCursesCheckERR(ungetmouse(&event), "ungetmouse");
1750}
1751#endif
1752
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001753static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001754PyCurses_GetWin(PyCursesWindowObject *self, PyObject *temp)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001755{
1756 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001757
1758 PyCursesInitialised
1759
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001760 if (!PyFile_Check(temp)) {
1761 PyErr_SetString(PyExc_TypeError, "argument must be a file object");
1762 return NULL;
1763 }
1764
1765 win = getwin(PyFile_AsFile(temp));
1766
1767 if (win == NULL) {
1768 PyErr_SetString(PyCursesError, catchall_NULL);
1769 return NULL;
1770 }
1771
1772 return PyCursesWindow_New(win);
1773}
1774
1775static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001776PyCurses_HalfDelay(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001777{
1778 unsigned char tenths;
1779
1780 PyCursesInitialised
1781
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001782 if (!PyArg_ParseTuple(args, "b:halfdelay", &tenths)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001783
1784 return PyCursesCheckERR(halfdelay(tenths), "halfdelay");
1785}
1786
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001787#ifndef STRICT_SYSV_CURSES
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001788 /* No has_key! */
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001789static PyObject * PyCurses_has_key(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001790{
1791 int ch;
1792
1793 PyCursesInitialised
1794
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001795 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001796
1797 if (has_key(ch) == FALSE) {
1798 Py_INCREF(Py_False);
1799 return Py_False;
1800 }
1801 Py_INCREF(Py_True);
1802 return Py_True;
1803}
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00001804#endif /* STRICT_SYSV_CURSES */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001805
1806static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001807PyCurses_Init_Color(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001808{
1809 short color, r, g, b;
1810
1811 PyCursesInitialised
1812 PyCursesInitialisedColor
1813
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001814 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001815 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001816 if (!PyArg_ParseTuple(args, "hhhh;color,r,g,b", &color, &r, &g, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001817 break;
1818 default:
1819 PyErr_SetString(PyExc_TypeError, "init_color requires 4 arguments");
1820 return NULL;
1821 }
1822
1823 return PyCursesCheckERR(init_color(color, r, g, b), "init_color");
1824}
1825
1826static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00001827PyCurses_Init_Pair(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001828{
1829 short pair, f, b;
1830
1831 PyCursesInitialised
1832 PyCursesInitialisedColor
1833
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001834 if (PyTuple_Size(args) != 3) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001835 PyErr_SetString(PyExc_TypeError, "init_pair requires 3 arguments");
1836 return NULL;
1837 }
1838
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001839 if (!PyArg_ParseTuple(args, "hhh;pair, f, b", &pair, &f, &b)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001840
1841 return PyCursesCheckERR(init_pair(pair, f, b), "init_pair");
1842}
1843
Andrew M. Kuchling32552682000-12-22 21:52:27 +00001844static PyObject *ModDict;
1845
Guido van Rossumf6971e21994-08-30 12:25:20 +00001846static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00001847PyCurses_InitScr(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00001848{
Guido van Rossum56bf2351994-08-31 22:06:24 +00001849 WINDOW *win;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001850
Guido van Rossum585c6dc1995-02-24 13:45:43 +00001851 if (initialised == TRUE) {
Guido van Rossumf6971e21994-08-30 12:25:20 +00001852 wrefresh(stdscr);
1853 return (PyObject *)PyCursesWindow_New(stdscr);
1854 }
Guido van Rossum56bf2351994-08-31 22:06:24 +00001855
1856 win = initscr();
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00001857
Guido van Rossum85738471995-02-17 13:50:17 +00001858 if (win == NULL) {
1859 PyErr_SetString(PyCursesError, catchall_NULL);
1860 return NULL;
1861 }
1862
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001863 initialised = initialised_setupterm = TRUE;
Guido van Rossum56bf2351994-08-31 22:06:24 +00001864
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001865/* This was moved from initcurses() because it core dumped on SGI,
1866 where they're not defined until you've called initscr() */
1867#define SetDictInt(string,ch) \
Neal Norwitz20745b12006-08-13 18:12:45 +00001868 do { \
1869 PyObject *o = PyInt_FromLong((long) (ch)); \
1870 if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
1871 Py_DECREF(o); \
1872 } \
1873 } while (0)
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001874
1875 /* Here are some graphic symbols you can use */
1876 SetDictInt("ACS_ULCORNER", (ACS_ULCORNER));
1877 SetDictInt("ACS_LLCORNER", (ACS_LLCORNER));
1878 SetDictInt("ACS_URCORNER", (ACS_URCORNER));
1879 SetDictInt("ACS_LRCORNER", (ACS_LRCORNER));
1880 SetDictInt("ACS_LTEE", (ACS_LTEE));
1881 SetDictInt("ACS_RTEE", (ACS_RTEE));
1882 SetDictInt("ACS_BTEE", (ACS_BTEE));
1883 SetDictInt("ACS_TTEE", (ACS_TTEE));
1884 SetDictInt("ACS_HLINE", (ACS_HLINE));
1885 SetDictInt("ACS_VLINE", (ACS_VLINE));
1886 SetDictInt("ACS_PLUS", (ACS_PLUS));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001887#if !defined(__hpux) || defined(HAVE_NCURSES_H)
1888 /* On HP/UX 11, these are of type cchar_t, which is not an
1889 integral type. If this is a problem on more platforms, a
1890 configure test should be added to determine whether ACS_S1
1891 is of integral type. */
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001892 SetDictInt("ACS_S1", (ACS_S1));
1893 SetDictInt("ACS_S9", (ACS_S9));
1894 SetDictInt("ACS_DIAMOND", (ACS_DIAMOND));
1895 SetDictInt("ACS_CKBOARD", (ACS_CKBOARD));
1896 SetDictInt("ACS_DEGREE", (ACS_DEGREE));
1897 SetDictInt("ACS_PLMINUS", (ACS_PLMINUS));
1898 SetDictInt("ACS_BULLET", (ACS_BULLET));
1899 SetDictInt("ACS_LARROW", (ACS_LARROW));
1900 SetDictInt("ACS_RARROW", (ACS_RARROW));
1901 SetDictInt("ACS_DARROW", (ACS_DARROW));
1902 SetDictInt("ACS_UARROW", (ACS_UARROW));
1903 SetDictInt("ACS_BOARD", (ACS_BOARD));
1904 SetDictInt("ACS_LANTERN", (ACS_LANTERN));
1905 SetDictInt("ACS_BLOCK", (ACS_BLOCK));
Martin v. Löwiseb9b1032001-10-24 17:10:49 +00001906#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001907 SetDictInt("ACS_BSSB", (ACS_ULCORNER));
1908 SetDictInt("ACS_SSBB", (ACS_LLCORNER));
1909 SetDictInt("ACS_BBSS", (ACS_URCORNER));
1910 SetDictInt("ACS_SBBS", (ACS_LRCORNER));
1911 SetDictInt("ACS_SBSS", (ACS_RTEE));
1912 SetDictInt("ACS_SSSB", (ACS_LTEE));
1913 SetDictInt("ACS_SSBS", (ACS_BTEE));
1914 SetDictInt("ACS_BSSS", (ACS_TTEE));
1915 SetDictInt("ACS_BSBS", (ACS_HLINE));
1916 SetDictInt("ACS_SBSB", (ACS_VLINE));
1917 SetDictInt("ACS_SSSS", (ACS_PLUS));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001918
1919 /* The following are never available with strict SYSV curses */
1920#ifdef ACS_S3
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001921 SetDictInt("ACS_S3", (ACS_S3));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001922#endif
1923#ifdef ACS_S7
1924 SetDictInt("ACS_S7", (ACS_S7));
1925#endif
1926#ifdef ACS_LEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001927 SetDictInt("ACS_LEQUAL", (ACS_LEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001928#endif
1929#ifdef ACS_GEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001930 SetDictInt("ACS_GEQUAL", (ACS_GEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001931#endif
1932#ifdef ACS_PI
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001933 SetDictInt("ACS_PI", (ACS_PI));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001934#endif
1935#ifdef ACS_NEQUAL
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001936 SetDictInt("ACS_NEQUAL", (ACS_NEQUAL));
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00001937#endif
1938#ifdef ACS_STERLING
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00001939 SetDictInt("ACS_STERLING", (ACS_STERLING));
1940#endif
1941
Neal Norwitz20745b12006-08-13 18:12:45 +00001942 SetDictInt("LINES", LINES);
1943 SetDictInt("COLS", COLS);
Guido van Rossum56bf2351994-08-31 22:06:24 +00001944
1945 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00001946}
1947
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001948static PyObject *
1949PyCurses_setupterm(PyObject* self, PyObject *args, PyObject* keywds)
1950{
1951 int fd = -1;
1952 int err;
1953 char* termstr = NULL;
1954
Martin v. Löwis15e62742006-02-27 16:46:16 +00001955 static char *kwlist[] = {"term", "fd", NULL};
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001956
1957 if (!PyArg_ParseTupleAndKeywords(
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001958 args, keywds, "|zi:setupterm", kwlist, &termstr, &fd)) {
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00001959 return NULL;
1960 }
1961
1962 if (fd == -1) {
1963 PyObject* sys_stdout;
1964
1965 sys_stdout = PySys_GetObject("stdout");
1966
1967 if (sys_stdout == NULL) {
1968 PyErr_SetString(
1969 PyCursesError,
1970 "lost sys.stdout");
1971 return NULL;
1972 }
1973
1974 fd = PyObject_AsFileDescriptor(sys_stdout);
1975
1976 if (fd == -1) {
1977 return NULL;
1978 }
1979 }
1980
1981 if (setupterm(termstr,fd,&err) == ERR) {
1982 char* s = "setupterm: unknown error";
1983
1984 if (err == 0) {
1985 s = "setupterm: could not find terminal";
1986 } else if (err == -1) {
1987 s = "setupterm: could not find terminfo database";
1988 }
1989
1990 PyErr_SetString(PyCursesError,s);
1991 return NULL;
1992 }
1993
1994 initialised_setupterm = TRUE;
1995
1996 Py_INCREF(Py_None);
1997 return Py_None;
1998}
Guido van Rossumf6971e21994-08-30 12:25:20 +00001999
2000static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002001PyCurses_IntrFlush(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002002{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002003 int ch;
2004
2005 PyCursesInitialised
2006
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002007 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002008 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002009 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002010 break;
2011 default:
2012 PyErr_SetString(PyExc_TypeError, "intrflush requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002013 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002014 }
2015
2016 return PyCursesCheckERR(intrflush(NULL,ch), "intrflush");
2017}
2018
Walter Dörwald4994d952006-06-19 08:07:50 +00002019#ifdef HAVE_CURSES_IS_TERM_RESIZED
2020static PyObject *
2021PyCurses_Is_Term_Resized(PyObject *self, PyObject *args)
2022{
2023 int lines;
2024 int columns;
2025 int result;
2026
2027 PyCursesInitialised
2028
2029 if (!PyArg_ParseTuple(args,"ii:is_term_resized", &lines, &columns))
2030 return NULL;
2031 result = is_term_resized(lines, columns);
2032 if (result == TRUE) {
2033 Py_INCREF(Py_True);
2034 return Py_True;
2035 } else {
2036 Py_INCREF(Py_False);
2037 return Py_False;
2038 }
2039}
2040#endif /* HAVE_CURSES_IS_TERM_RESIZED */
2041
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002042#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002043static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002044PyCurses_KeyName(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002045{
2046 const char *knp;
2047 int ch;
2048
2049 PyCursesInitialised
2050
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002051 if (!PyArg_ParseTuple(args,"i",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002052
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002053 if (ch < 0) {
2054 PyErr_SetString(PyExc_ValueError, "invalid key number");
2055 return NULL;
2056 }
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002057 knp = keyname(ch);
2058
2059 return PyString_FromString((knp == NULL) ? "" : (char *)knp);
2060}
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002061#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002062
2063static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002064PyCurses_KillChar(PyObject *self)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002065{
2066 char ch;
2067
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002068 ch = killchar();
2069
Martin v. Löwis43f2dc62001-11-11 14:49:15 +00002070 return PyString_FromStringAndSize(&ch, 1);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002071}
2072
2073static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002074PyCurses_Meta(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002075{
2076 int ch;
2077
2078 PyCursesInitialised
2079
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002080 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002081 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002082 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&ch)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002083 break;
2084 default:
2085 PyErr_SetString(PyExc_TypeError, "meta requires 1 argument");
2086 return NULL;
2087 }
2088
2089 return PyCursesCheckERR(meta(stdscr, ch), "meta");
2090}
2091
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002092#ifdef NCURSES_MOUSE_VERSION
2093static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002094PyCurses_MouseInterval(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002095{
2096 int interval;
2097 PyCursesInitialised
2098
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002099 if (!PyArg_ParseTuple(args,"i;interval",&interval))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002100 return NULL;
2101 return PyCursesCheckERR(mouseinterval(interval), "mouseinterval");
2102}
2103
2104static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002105PyCurses_MouseMask(PyObject *self, PyObject *args)
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002106{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002107 int newmask;
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002108 mmask_t oldmask, availmask;
2109
2110 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002111 if (!PyArg_ParseTuple(args,"i;mousemask",&newmask))
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002112 return NULL;
2113 availmask = mousemask(newmask, &oldmask);
2114 return Py_BuildValue("(ll)", (long)availmask, (long)oldmask);
2115}
2116#endif
2117
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002118static PyObject *
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002119PyCurses_Napms(PyObject *self, PyObject *args)
2120{
2121 int ms;
2122
2123 PyCursesInitialised
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002124 if (!PyArg_ParseTuple(args, "i;ms", &ms)) return NULL;
Andrew M. Kuchling2824d7f2000-12-15 00:44:02 +00002125
2126 return Py_BuildValue("i", napms(ms));
2127}
2128
2129
2130static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002131PyCurses_NewPad(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002132{
2133 WINDOW *win;
2134 int nlines, ncols;
2135
2136 PyCursesInitialised
2137
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002138 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002139
2140 win = newpad(nlines, ncols);
2141
2142 if (win == NULL) {
2143 PyErr_SetString(PyCursesError, catchall_NULL);
2144 return NULL;
2145 }
2146
2147 return (PyObject *)PyCursesWindow_New(win);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002148}
2149
2150static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002151PyCurses_NewWindow(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002152{
2153 WINDOW *win;
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002154 int nlines, ncols, begin_y=0, begin_x=0;
Guido van Rossum85738471995-02-17 13:50:17 +00002155
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002156 PyCursesInitialised
2157
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002158 switch (PyTuple_Size(args)) {
Guido van Rossum85738471995-02-17 13:50:17 +00002159 case 2:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002160 if (!PyArg_ParseTuple(args,"ii;nlines,ncols",&nlines,&ncols))
Guido van Rossum85738471995-02-17 13:50:17 +00002161 return NULL;
2162 break;
2163 case 4:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002164 if (!PyArg_ParseTuple(args, "iiii;nlines,ncols,begin_y,begin_x",
Guido van Rossumf6971e21994-08-30 12:25:20 +00002165 &nlines,&ncols,&begin_y,&begin_x))
Guido van Rossum85738471995-02-17 13:50:17 +00002166 return NULL;
2167 break;
2168 default:
2169 PyErr_SetString(PyExc_TypeError, "newwin requires 2 or 4 arguments");
2170 return NULL;
2171 }
2172
Andrew M. Kuchling5a76c442001-07-14 20:38:30 +00002173 win = newwin(nlines,ncols,begin_y,begin_x);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002174 if (win == NULL) {
Guido van Rossum85738471995-02-17 13:50:17 +00002175 PyErr_SetString(PyCursesError, catchall_NULL);
2176 return NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002177 }
Guido van Rossum85738471995-02-17 13:50:17 +00002178
Guido van Rossumf6971e21994-08-30 12:25:20 +00002179 return (PyObject *)PyCursesWindow_New(win);
2180}
2181
2182static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002183PyCurses_Pair_Content(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002184{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002185 short pair,f,b;
2186
2187 PyCursesInitialised
2188 PyCursesInitialisedColor
2189
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002190 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002191 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002192 if (!PyArg_ParseTuple(args, "h;pair", &pair)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002193 break;
2194 default:
2195 PyErr_SetString(PyExc_TypeError, "pair_content requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002196 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002197 }
2198
Andrew M. Kuchlingb5e7ff42005-06-15 18:46:50 +00002199 if (pair_content(pair, &f, &b)==ERR) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002200 PyErr_SetString(PyCursesError,
2201 "Argument 1 was out of range. (1..COLOR_PAIRS-1)");
2202 return NULL;
2203 }
2204
2205 return Py_BuildValue("(ii)", f, b);
2206}
2207
2208static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002209PyCurses_pair_number(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002210{
2211 int n;
2212
2213 PyCursesInitialised
2214 PyCursesInitialisedColor
2215
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002216 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002217 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002218 if (!PyArg_ParseTuple(args, "i;pairvalue", &n)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002219 break;
2220 default:
2221 PyErr_SetString(PyExc_TypeError,
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002222 "pair_number requires 1 argument");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002223 return NULL;
2224 }
2225
2226 return PyInt_FromLong((long) ((n & A_COLOR) >> 8));
2227}
2228
2229static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002230PyCurses_Putp(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002231{
2232 char *str;
2233
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002234 if (!PyArg_ParseTuple(args,"s;str", &str)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002235 return PyCursesCheckERR(putp(str), "putp");
2236}
2237
2238static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002239PyCurses_QiFlush(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002240{
2241 int flag = 0;
2242
2243 PyCursesInitialised
2244
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002245 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002246 case 0:
2247 qiflush();
2248 Py_INCREF(Py_None);
2249 return Py_None;
2250 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002251 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002252 if (flag) qiflush();
2253 else noqiflush();
2254 Py_INCREF(Py_None);
2255 return Py_None;
2256 default:
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002257 PyErr_SetString(PyExc_TypeError, "qiflush requires 0 or 1 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002258 return NULL;
2259 }
2260}
2261
Walter Dörwald05b5c7f2007-03-06 20:46:26 +00002262/* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES
2263 * and _curses.COLS */
2264static int
2265update_lines_cols(void)
2266{
2267 PyObject *o;
2268 PyObject *m = PyImport_ImportModule("curses");
2269
2270 if (!m)
2271 return 0;
2272
2273 o = PyInt_FromLong(LINES);
2274 if (!o) {
2275 Py_DECREF(m);
2276 return 0;
2277 }
2278 if (PyObject_SetAttrString(m, "LINES", o)) {
2279 Py_DECREF(m);
2280 Py_DECREF(o);
2281 return 0;
2282 }
2283 if (PyDict_SetItemString(ModDict, "LINES", o)) {
2284 Py_DECREF(m);
2285 Py_DECREF(o);
2286 return 0;
2287 }
2288 Py_DECREF(o);
2289 o = PyInt_FromLong(COLS);
2290 if (!o) {
2291 Py_DECREF(m);
2292 return 0;
2293 }
2294 if (PyObject_SetAttrString(m, "COLS", o)) {
2295 Py_DECREF(m);
2296 Py_DECREF(o);
2297 return 0;
2298 }
2299 if (PyDict_SetItemString(ModDict, "COLS", o)) {
2300 Py_DECREF(m);
2301 Py_DECREF(o);
2302 return 0;
2303 }
2304 Py_DECREF(o);
2305 Py_DECREF(m);
2306 return 1;
2307}
2308
Walter Dörwald4994d952006-06-19 08:07:50 +00002309#ifdef HAVE_CURSES_RESIZETERM
2310static PyObject *
2311PyCurses_ResizeTerm(PyObject *self, PyObject *args)
2312{
2313 int lines;
2314 int columns;
Walter Dörwald05b5c7f2007-03-06 20:46:26 +00002315 PyObject *result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002316
2317 PyCursesInitialised
2318
2319 if (!PyArg_ParseTuple(args,"ii:resizeterm", &lines, &columns))
2320 return NULL;
2321
Walter Dörwald05b5c7f2007-03-06 20:46:26 +00002322 result = PyCursesCheckERR(resizeterm(lines, columns), "resizeterm");
2323 if (!result)
2324 return NULL;
2325 if (!update_lines_cols())
2326 return NULL;
2327 return result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002328}
2329
2330#endif
2331
2332#ifdef HAVE_CURSES_RESIZE_TERM
2333static PyObject *
2334PyCurses_Resize_Term(PyObject *self, PyObject *args)
2335{
2336 int lines;
2337 int columns;
2338
Walter Dörwald05b5c7f2007-03-06 20:46:26 +00002339 PyObject *result;
2340
Walter Dörwald4994d952006-06-19 08:07:50 +00002341 PyCursesInitialised
2342
2343 if (!PyArg_ParseTuple(args,"ii:resize_term", &lines, &columns))
2344 return NULL;
2345
Walter Dörwald05b5c7f2007-03-06 20:46:26 +00002346 result = PyCursesCheckERR(resize_term(lines, columns), "resize_term");
2347 if (!result)
2348 return NULL;
2349 if (!update_lines_cols())
2350 return NULL;
2351 return result;
Walter Dörwald4994d952006-06-19 08:07:50 +00002352}
2353#endif /* HAVE_CURSES_RESIZE_TERM */
2354
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002355static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002356PyCurses_setsyx(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002357{
2358 int y,x;
2359
2360 PyCursesInitialised
2361
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002362 if (PyTuple_Size(args)!=2) {
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002363 PyErr_SetString(PyExc_TypeError, "setsyx requires 2 arguments");
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002364 return NULL;
2365 }
2366
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002367 if (!PyArg_ParseTuple(args, "ii;y, x", &y, &x)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002368
2369 setsyx(y,x);
2370
Guido van Rossumf6971e21994-08-30 12:25:20 +00002371 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002372 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002373}
2374
2375static PyObject *
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002376PyCurses_Start_Color(PyObject *self)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002377{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002378 int code;
2379 PyObject *c, *cp;
2380
2381 PyCursesInitialised
2382
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002383 code = start_color();
2384 if (code != ERR) {
2385 initialisedcolors = TRUE;
2386 c = PyInt_FromLong((long) COLORS);
2387 PyDict_SetItemString(ModDict, "COLORS", c);
2388 Py_DECREF(c);
2389 cp = PyInt_FromLong((long) COLOR_PAIRS);
2390 PyDict_SetItemString(ModDict, "COLOR_PAIRS", cp);
2391 Py_DECREF(cp);
2392 Py_INCREF(Py_None);
2393 return Py_None;
2394 } else {
2395 PyErr_SetString(PyCursesError, "start_color() returned ERR");
Guido van Rossum85738471995-02-17 13:50:17 +00002396 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002397 }
2398}
2399
2400static PyObject *
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002401PyCurses_tigetflag(PyObject *self, PyObject *args)
2402{
2403 char *capname;
2404
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002405 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002406
2407 if (!PyArg_ParseTuple(args, "z", &capname))
2408 return NULL;
2409
2410 return PyInt_FromLong( (long) tigetflag( capname ) );
2411}
2412
2413static PyObject *
2414PyCurses_tigetnum(PyObject *self, PyObject *args)
2415{
2416 char *capname;
2417
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002418 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002419
2420 if (!PyArg_ParseTuple(args, "z", &capname))
2421 return NULL;
2422
2423 return PyInt_FromLong( (long) tigetnum( capname ) );
2424}
2425
2426static PyObject *
2427PyCurses_tigetstr(PyObject *self, PyObject *args)
2428{
2429 char *capname;
2430
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002431 PyCursesSetupTermCalled;
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002432
2433 if (!PyArg_ParseTuple(args, "z", &capname))
2434 return NULL;
2435
2436 capname = tigetstr( capname );
2437 if (capname == 0 || capname == (char*) -1) {
2438 Py_INCREF(Py_None);
2439 return Py_None;
2440 }
2441 return PyString_FromString( capname );
2442}
2443
2444static PyObject *
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002445PyCurses_tparm(PyObject *self, PyObject *args)
2446{
2447 char* fmt;
2448 char* result = NULL;
Michael W. Hudson21007982002-11-21 14:17:51 +00002449 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 +00002450
Andrew M. Kuchling26cc66f2000-11-18 17:45:59 +00002451 PyCursesSetupTermCalled;
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002452
2453 if (!PyArg_ParseTuple(args, "s|iiiiiiiii:tparm",
2454 &fmt, &i1, &i2, &i3, &i4,
2455 &i5, &i6, &i7, &i8, &i9)) {
2456 return NULL;
2457 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002458
Michael W. Hudson8f514602002-01-16 15:18:09 +00002459 result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
Neal Norwitz716692f2006-09-05 02:33:44 +00002460 if (!result) {
2461 PyErr_SetString(PyCursesError, "tparm() returned NULL");
2462 return NULL;
2463 }
Michael W. Hudson21007982002-11-21 14:17:51 +00002464
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002465 return PyString_FromString(result);
2466}
2467
2468static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002469PyCurses_TypeAhead(PyObject *self, PyObject *args)
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002470{
Andrew M. Kuchling1a104002000-07-06 18:14:03 +00002471 int fd;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002472
2473 PyCursesInitialised
2474
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002475 if (!PyArg_ParseTuple(args,"i;fd",&fd)) return NULL;
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002476
Michael W. Hudson7d6cc5b2004-08-04 14:33:28 +00002477 return PyCursesCheckERR(typeahead( fd ), "typeahead");
Andrew M. Kuchling97311bb2000-06-21 01:41:48 +00002478}
2479
2480static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002481PyCurses_UnCtrl(PyObject *self, PyObject *args)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002482{
2483 PyObject *temp;
2484 chtype ch;
2485
2486 PyCursesInitialised
2487
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002488 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002489
2490 if (PyInt_Check(temp))
2491 ch = (chtype) PyInt_AsLong(temp);
2492 else if (PyString_Check(temp))
2493 ch = (chtype) *PyString_AsString(temp);
2494 else {
2495 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
2496 return NULL;
2497 }
2498
2499 return PyString_FromString(unctrl(ch));
Guido van Rossumf6971e21994-08-30 12:25:20 +00002500}
2501
2502static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002503PyCurses_UngetCh(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002504{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002505 PyObject *temp;
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002506 int ch;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002507
2508 PyCursesInitialised
2509
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002510 if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002511
2512 if (PyInt_Check(temp))
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002513 ch = (int) PyInt_AsLong(temp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002514 else if (PyString_Check(temp))
Andrew M. Kuchling7e23f002002-11-06 14:15:36 +00002515 ch = (int) *PyString_AsString(temp);
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002516 else {
2517 PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int");
Guido van Rossum85738471995-02-17 13:50:17 +00002518 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002519 }
2520
Guido van Rossum85738471995-02-17 13:50:17 +00002521 return PyCursesCheckERR(ungetch(ch), "ungetch");
Guido van Rossumf6971e21994-08-30 12:25:20 +00002522}
2523
2524static PyObject *
Andrew M. Kuchlingad9b1f82000-07-09 14:35:00 +00002525PyCurses_Use_Env(PyObject *self, PyObject *args)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002526{
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002527 int flag;
2528
2529 PyCursesInitialised
2530
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002531 switch(PyTuple_Size(args)) {
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002532 case 1:
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002533 if (!PyArg_ParseTuple(args,"i;True(1), False(0)",&flag))
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002534 return NULL;
2535 break;
2536 default:
2537 PyErr_SetString(PyExc_TypeError, "use_env requires 1 argument");
Guido van Rossum85738471995-02-17 13:50:17 +00002538 return NULL;
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002539 }
2540 use_env(flag);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002541 Py_INCREF(Py_None);
Guido van Rossum85738471995-02-17 13:50:17 +00002542 return Py_None;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002543}
2544
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002545#ifndef STRICT_SYSV_CURSES
2546static PyObject *
2547PyCurses_Use_Default_Colors(PyObject *self)
2548{
2549 int code;
2550
2551 PyCursesInitialised
2552 PyCursesInitialisedColor
2553
2554 code = use_default_colors();
2555 if (code != ERR) {
2556 Py_INCREF(Py_None);
2557 return Py_None;
2558 } else {
2559 PyErr_SetString(PyCursesError, "use_default_colors() returned ERR");
2560 return NULL;
2561 }
2562}
2563#endif /* STRICT_SYSV_CURSES */
2564
Guido van Rossumf6971e21994-08-30 12:25:20 +00002565/* List of functions defined in the module */
2566
2567static PyMethodDef PyCurses_methods[] = {
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002568 {"baudrate", (PyCFunction)PyCurses_baudrate, METH_NOARGS},
2569 {"beep", (PyCFunction)PyCurses_beep, METH_NOARGS},
2570 {"can_change_color", (PyCFunction)PyCurses_can_change_color, METH_NOARGS},
2571 {"cbreak", (PyCFunction)PyCurses_cbreak, METH_VARARGS},
2572 {"color_content", (PyCFunction)PyCurses_Color_Content, METH_VARARGS},
2573 {"color_pair", (PyCFunction)PyCurses_color_pair, METH_VARARGS},
2574 {"curs_set", (PyCFunction)PyCurses_Curs_Set, METH_VARARGS},
2575 {"def_prog_mode", (PyCFunction)PyCurses_def_prog_mode, METH_NOARGS},
2576 {"def_shell_mode", (PyCFunction)PyCurses_def_shell_mode, METH_NOARGS},
2577 {"delay_output", (PyCFunction)PyCurses_Delay_Output, METH_VARARGS},
2578 {"doupdate", (PyCFunction)PyCurses_doupdate, METH_NOARGS},
2579 {"echo", (PyCFunction)PyCurses_echo, METH_VARARGS},
2580 {"endwin", (PyCFunction)PyCurses_endwin, METH_NOARGS},
2581 {"erasechar", (PyCFunction)PyCurses_EraseChar, METH_NOARGS},
2582 {"filter", (PyCFunction)PyCurses_filter, METH_NOARGS},
2583 {"flash", (PyCFunction)PyCurses_flash, METH_NOARGS},
2584 {"flushinp", (PyCFunction)PyCurses_flushinp, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002585#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002586 {"getmouse", (PyCFunction)PyCurses_GetMouse, METH_NOARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002587 {"ungetmouse", (PyCFunction)PyCurses_UngetMouse, METH_VARARGS},
2588#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002589 {"getsyx", (PyCFunction)PyCurses_getsyx, METH_NOARGS},
2590 {"getwin", (PyCFunction)PyCurses_GetWin, METH_O},
2591 {"has_colors", (PyCFunction)PyCurses_has_colors, METH_NOARGS},
2592 {"has_ic", (PyCFunction)PyCurses_has_ic, METH_NOARGS},
2593 {"has_il", (PyCFunction)PyCurses_has_il, METH_NOARGS},
Andrew M. Kuchlingbf680262000-07-25 12:37:41 +00002594#ifndef STRICT_SYSV_CURSES
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002595 {"has_key", (PyCFunction)PyCurses_has_key, METH_VARARGS},
Guido van Rossumf6971e21994-08-30 12:25:20 +00002596#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002597 {"halfdelay", (PyCFunction)PyCurses_HalfDelay, METH_VARARGS},
2598 {"init_color", (PyCFunction)PyCurses_Init_Color, METH_VARARGS},
2599 {"init_pair", (PyCFunction)PyCurses_Init_Pair, METH_VARARGS},
2600 {"initscr", (PyCFunction)PyCurses_InitScr, METH_NOARGS},
2601 {"intrflush", (PyCFunction)PyCurses_IntrFlush, METH_VARARGS},
2602 {"isendwin", (PyCFunction)PyCurses_isendwin, METH_NOARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002603#ifdef HAVE_CURSES_IS_TERM_RESIZED
2604 {"is_term_resized", (PyCFunction)PyCurses_Is_Term_Resized, METH_VARARGS},
2605#endif
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002606#if !defined(__NetBSD__)
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002607 {"keyname", (PyCFunction)PyCurses_KeyName, METH_VARARGS},
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002608#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002609 {"killchar", (PyCFunction)PyCurses_KillChar, METH_NOARGS},
2610 {"longname", (PyCFunction)PyCurses_longname, METH_NOARGS},
2611 {"meta", (PyCFunction)PyCurses_Meta, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002612#ifdef NCURSES_MOUSE_VERSION
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002613 {"mouseinterval", (PyCFunction)PyCurses_MouseInterval, METH_VARARGS},
2614 {"mousemask", (PyCFunction)PyCurses_MouseMask, METH_VARARGS},
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002615#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002616 {"napms", (PyCFunction)PyCurses_Napms, METH_VARARGS},
2617 {"newpad", (PyCFunction)PyCurses_NewPad, METH_VARARGS},
2618 {"newwin", (PyCFunction)PyCurses_NewWindow, METH_VARARGS},
2619 {"nl", (PyCFunction)PyCurses_nl, METH_VARARGS},
2620 {"nocbreak", (PyCFunction)PyCurses_nocbreak, METH_NOARGS},
2621 {"noecho", (PyCFunction)PyCurses_noecho, METH_NOARGS},
2622 {"nonl", (PyCFunction)PyCurses_nonl, METH_NOARGS},
2623 {"noqiflush", (PyCFunction)PyCurses_noqiflush, METH_NOARGS},
2624 {"noraw", (PyCFunction)PyCurses_noraw, METH_NOARGS},
2625 {"pair_content", (PyCFunction)PyCurses_Pair_Content, METH_VARARGS},
2626 {"pair_number", (PyCFunction)PyCurses_pair_number, METH_VARARGS},
2627 {"putp", (PyCFunction)PyCurses_Putp, METH_VARARGS},
2628 {"qiflush", (PyCFunction)PyCurses_QiFlush, METH_VARARGS},
2629 {"raw", (PyCFunction)PyCurses_raw, METH_VARARGS},
2630 {"reset_prog_mode", (PyCFunction)PyCurses_reset_prog_mode, METH_NOARGS},
2631 {"reset_shell_mode", (PyCFunction)PyCurses_reset_shell_mode, METH_NOARGS},
2632 {"resetty", (PyCFunction)PyCurses_resetty, METH_NOARGS},
Walter Dörwald4994d952006-06-19 08:07:50 +00002633#ifdef HAVE_CURSES_RESIZETERM
2634 {"resizeterm", (PyCFunction)PyCurses_ResizeTerm, METH_VARARGS},
2635#endif
2636#ifdef HAVE_CURSES_RESIZE_TERM
2637 {"resize_term", (PyCFunction)PyCurses_Resize_Term, METH_VARARGS},
2638#endif
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002639 {"savetty", (PyCFunction)PyCurses_savetty, METH_NOARGS},
2640 {"setsyx", (PyCFunction)PyCurses_setsyx, METH_VARARGS},
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002641 {"setupterm", (PyCFunction)PyCurses_setupterm,
2642 METH_VARARGS|METH_KEYWORDS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002643 {"start_color", (PyCFunction)PyCurses_Start_Color, METH_NOARGS},
2644 {"termattrs", (PyCFunction)PyCurses_termattrs, METH_NOARGS},
2645 {"termname", (PyCFunction)PyCurses_termname, METH_NOARGS},
Andrew M. Kuchling70e89c12000-07-26 02:57:20 +00002646 {"tigetflag", (PyCFunction)PyCurses_tigetflag, METH_VARARGS},
2647 {"tigetnum", (PyCFunction)PyCurses_tigetnum, METH_VARARGS},
2648 {"tigetstr", (PyCFunction)PyCurses_tigetstr, METH_VARARGS},
Andrew M. Kuchlingf16e0ed2000-11-07 03:35:24 +00002649 {"tparm", (PyCFunction)PyCurses_tparm, METH_VARARGS},
Martin v. Löwisc0e16712002-01-17 23:08:27 +00002650 {"typeahead", (PyCFunction)PyCurses_TypeAhead, METH_VARARGS},
2651 {"unctrl", (PyCFunction)PyCurses_UnCtrl, METH_VARARGS},
2652 {"ungetch", (PyCFunction)PyCurses_UngetCh, METH_VARARGS},
2653 {"use_env", (PyCFunction)PyCurses_Use_Env, METH_VARARGS},
Andrew M. Kuchling69f31eb2003-08-13 23:11:04 +00002654#ifndef STRICT_SYSV_CURSES
2655 {"use_default_colors", (PyCFunction)PyCurses_Use_Default_Colors, METH_NOARGS},
2656#endif
Andrew M. Kuchling16e65a02001-10-20 16:05:52 +00002657 {NULL, NULL} /* sentinel */
Guido van Rossumf6971e21994-08-30 12:25:20 +00002658};
2659
2660/* Initialization function for the module */
2661
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002662PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002663init_curses(void)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002664{
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002665 PyObject *m, *d, *v, *c_api_object;
2666 static void *PyCurses_API[PyCurses_API_pointers];
2667
Guido van Rossum6915c4d2001-01-19 00:28:08 +00002668 /* Initialize object type */
2669 PyCursesWindow_Type.ob_type = &PyType_Type;
2670
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002671 /* Initialize the C API pointer array */
2672 PyCurses_API[0] = (void *)&PyCursesWindow_Type;
2673 PyCurses_API[1] = (void *)func_PyCursesSetupTermCalled;
2674 PyCurses_API[2] = (void *)func_PyCursesInitialised;
2675 PyCurses_API[3] = (void *)func_PyCursesInitialisedColor;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002676
2677 /* Create the module and add the functions */
Andrew M. Kuchlingb7f198e2000-06-10 23:12:32 +00002678 m = Py_InitModule("_curses", PyCurses_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002679 if (m == NULL)
2680 return;
Guido van Rossumf6971e21994-08-30 12:25:20 +00002681
Guido van Rossumf6971e21994-08-30 12:25:20 +00002682 /* Add some symbolic constants to the module */
2683 d = PyModule_GetDict(m);
Neal Norwitz20745b12006-08-13 18:12:45 +00002684 if (d == NULL)
2685 return;
Andrew M. Kuchling32552682000-12-22 21:52:27 +00002686 ModDict = d; /* For PyCurses_InitScr to use later */
2687
2688 /* Add a CObject for the C API */
2689 c_api_object = PyCObject_FromVoidPtr((void *)PyCurses_API, NULL);
2690 PyDict_SetItemString(d, "_C_API", c_api_object);
Martin v. Löwis00ff10c2001-11-11 14:24:05 +00002691 Py_DECREF(c_api_object);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002692
Guido van Rossum85738471995-02-17 13:50:17 +00002693 /* For exception curses.error */
Fred Drake589c35b2000-07-06 19:38:49 +00002694 PyCursesError = PyErr_NewException("_curses.error", NULL, NULL);
Guido van Rossum85738471995-02-17 13:50:17 +00002695 PyDict_SetItemString(d, "error", PyCursesError);
Guido van Rossumfbea2f31994-08-31 22:05:27 +00002696
Guido van Rossum85738471995-02-17 13:50:17 +00002697 /* Make the version available */
Guido van Rossum8fbf82b1995-02-17 13:54:04 +00002698 v = PyString_FromString(PyCursesVersion);
2699 PyDict_SetItemString(d, "version", v);
2700 PyDict_SetItemString(d, "__version__", v);
2701 Py_DECREF(v);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002702
Andrew M. Kuchlingcaefb372000-12-26 15:57:01 +00002703 SetDictInt("ERR", ERR);
2704 SetDictInt("OK", OK);
2705
Guido van Rossumf6971e21994-08-30 12:25:20 +00002706 /* Here are some attributes you can add to chars to print */
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002707
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002708 SetDictInt("A_ATTRIBUTES", A_ATTRIBUTES);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002709 SetDictInt("A_NORMAL", A_NORMAL);
2710 SetDictInt("A_STANDOUT", A_STANDOUT);
2711 SetDictInt("A_UNDERLINE", A_UNDERLINE);
2712 SetDictInt("A_REVERSE", A_REVERSE);
2713 SetDictInt("A_BLINK", A_BLINK);
2714 SetDictInt("A_DIM", A_DIM);
2715 SetDictInt("A_BOLD", A_BOLD);
2716 SetDictInt("A_ALTCHARSET", A_ALTCHARSET);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002717#if !defined(__NetBSD__)
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002718 SetDictInt("A_INVIS", A_INVIS);
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002719#endif
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002720 SetDictInt("A_PROTECT", A_PROTECT);
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002721 SetDictInt("A_CHARTEXT", A_CHARTEXT);
2722 SetDictInt("A_COLOR", A_COLOR);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002723
2724 /* The following are never available with strict SYSV curses */
2725#ifdef A_HORIZONTAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002726 SetDictInt("A_HORIZONTAL", A_HORIZONTAL);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002727#endif
2728#ifdef A_LEFT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002729 SetDictInt("A_LEFT", A_LEFT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002730#endif
2731#ifdef A_LOW
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002732 SetDictInt("A_LOW", A_LOW);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002733#endif
2734#ifdef A_RIGHT
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002735 SetDictInt("A_RIGHT", A_RIGHT);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002736#endif
2737#ifdef A_TOP
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002738 SetDictInt("A_TOP", A_TOP);
Andrew M. Kuchlinge7d36162000-11-01 19:59:12 +00002739#endif
2740#ifdef A_VERTICAL
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002741 SetDictInt("A_VERTICAL", A_VERTICAL);
2742#endif
Andrew M. Kuchling03e644b2000-05-23 16:24:54 +00002743
Andrew M. Kuchling22b88ce2000-05-23 16:18:03 +00002744 SetDictInt("COLOR_BLACK", COLOR_BLACK);
2745 SetDictInt("COLOR_RED", COLOR_RED);
2746 SetDictInt("COLOR_GREEN", COLOR_GREEN);
2747 SetDictInt("COLOR_YELLOW", COLOR_YELLOW);
2748 SetDictInt("COLOR_BLUE", COLOR_BLUE);
2749 SetDictInt("COLOR_MAGENTA", COLOR_MAGENTA);
2750 SetDictInt("COLOR_CYAN", COLOR_CYAN);
2751 SetDictInt("COLOR_WHITE", COLOR_WHITE);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002752
Andrew M. Kuchling8e9d23b2000-06-27 03:10:38 +00002753#ifdef NCURSES_MOUSE_VERSION
2754 /* Mouse-related constants */
2755 SetDictInt("BUTTON1_PRESSED", BUTTON1_PRESSED);
2756 SetDictInt("BUTTON1_RELEASED", BUTTON1_RELEASED);
2757 SetDictInt("BUTTON1_CLICKED", BUTTON1_CLICKED);
2758 SetDictInt("BUTTON1_DOUBLE_CLICKED", BUTTON1_DOUBLE_CLICKED);
2759 SetDictInt("BUTTON1_TRIPLE_CLICKED", BUTTON1_TRIPLE_CLICKED);
2760
2761 SetDictInt("BUTTON2_PRESSED", BUTTON2_PRESSED);
2762 SetDictInt("BUTTON2_RELEASED", BUTTON2_RELEASED);
2763 SetDictInt("BUTTON2_CLICKED", BUTTON2_CLICKED);
2764 SetDictInt("BUTTON2_DOUBLE_CLICKED", BUTTON2_DOUBLE_CLICKED);
2765 SetDictInt("BUTTON2_TRIPLE_CLICKED", BUTTON2_TRIPLE_CLICKED);
2766
2767 SetDictInt("BUTTON3_PRESSED", BUTTON3_PRESSED);
2768 SetDictInt("BUTTON3_RELEASED", BUTTON3_RELEASED);
2769 SetDictInt("BUTTON3_CLICKED", BUTTON3_CLICKED);
2770 SetDictInt("BUTTON3_DOUBLE_CLICKED", BUTTON3_DOUBLE_CLICKED);
2771 SetDictInt("BUTTON3_TRIPLE_CLICKED", BUTTON3_TRIPLE_CLICKED);
2772
2773 SetDictInt("BUTTON4_PRESSED", BUTTON4_PRESSED);
2774 SetDictInt("BUTTON4_RELEASED", BUTTON4_RELEASED);
2775 SetDictInt("BUTTON4_CLICKED", BUTTON4_CLICKED);
2776 SetDictInt("BUTTON4_DOUBLE_CLICKED", BUTTON4_DOUBLE_CLICKED);
2777 SetDictInt("BUTTON4_TRIPLE_CLICKED", BUTTON4_TRIPLE_CLICKED);
2778
2779 SetDictInt("BUTTON_SHIFT", BUTTON_SHIFT);
2780 SetDictInt("BUTTON_CTRL", BUTTON_CTRL);
2781 SetDictInt("BUTTON_ALT", BUTTON_ALT);
2782
2783 SetDictInt("ALL_MOUSE_EVENTS", ALL_MOUSE_EVENTS);
2784 SetDictInt("REPORT_MOUSE_POSITION", REPORT_MOUSE_POSITION);
2785#endif
Guido van Rossumf6971e21994-08-30 12:25:20 +00002786 /* Now set everything up for KEY_ variables */
2787 {
2788 int key;
2789 char *key_n;
2790 char *key_n2;
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002791#if !defined(__NetBSD__)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002792 for (key=KEY_MIN;key < KEY_MAX; key++) {
2793 key_n = (char *)keyname(key);
Guido van Rossumf5c6d471995-02-07 15:38:32 +00002794 if (key_n == NULL || strcmp(key_n,"UNKNOWN KEY")==0)
Guido van Rossumf6971e21994-08-30 12:25:20 +00002795 continue;
2796 if (strncmp(key_n,"KEY_F(",6)==0) {
2797 char *p1, *p2;
2798 key_n2 = malloc(strlen(key_n)+1);
Neal Norwitz20745b12006-08-13 18:12:45 +00002799 if (!key_n2) {
2800 PyErr_NoMemory();
2801 break;
2802 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002803 p1 = key_n;
2804 p2 = key_n2;
2805 while (*p1) {
2806 if (*p1 != '(' && *p1 != ')') {
2807 *p2 = *p1;
2808 p2++;
2809 }
2810 p1++;
2811 }
2812 *p2 = (char)0;
2813 } else
2814 key_n2 = key_n;
Neal Norwitz20745b12006-08-13 18:12:45 +00002815 SetDictInt(key_n2,key);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002816 if (key_n2 != key_n)
2817 free(key_n2);
2818 }
Andrew M. Kuchling2d339f92001-01-29 20:47:59 +00002819#endif
Guido van Rossum85738471995-02-17 13:50:17 +00002820 SetDictInt("KEY_MIN", KEY_MIN);
2821 SetDictInt("KEY_MAX", KEY_MAX);
Guido van Rossumf6971e21994-08-30 12:25:20 +00002822 }
Guido van Rossumf6971e21994-08-30 12:25:20 +00002823}