1 2 #ifndef Py_CURSES_H 3 #define Py_CURSES_H 4 5 #ifdef __APPLE__ 6 /* 7 ** On Mac OS X 10.2 [n]curses.h and stdlib.h use different guards 8 ** against multiple definition of wchar_t. 9 */ 10 #ifdef _BSD_WCHAR_T_DEFINED_ 11 #define _WCHAR_T 12 #endif 13 14 /* the following define is necessary for OS X 10.6; without it, the 15 Apple-supplied ncurses.h sets NCURSES_OPAQUE to 1, and then Python 16 can't get at the WINDOW flags field. */ 17 #define NCURSES_OPAQUE 0 18 #endif /* __APPLE__ */ 19 20 #ifdef __FreeBSD__ 21 /* 22 ** On FreeBSD, [n]curses.h and stdlib.h/wchar.h use different guards 23 ** against multiple definition of wchar_t and wint_t. 24 */ 25 #ifdef _XOPEN_SOURCE_EXTENDED 26 #ifndef __FreeBSD_version 27 #include <osreldate.h> 28 #endif 29 #if __FreeBSD_version >= 500000 30 #ifndef __wchar_t 31 #define __wchar_t 32 #endif 33 #ifndef __wint_t 34 #define __wint_t 35 #endif 36 #else 37 #ifndef _WCHAR_T 38 #define _WCHAR_T 39 #endif 40 #ifndef _WINT_T 41 #define _WINT_T 42 #endif 43 #endif 44 #endif 45 #endif 46 47 #ifdef HAVE_NCURSES_H 48 #include <ncurses.h> 49 #else 50 #include <curses.h> 51 #ifdef HAVE_TERM_H 52 /* for tigetstr, which is not declared in SysV curses */ 53 #include <term.h> 54 #endif 55 #endif 56 57 #ifdef HAVE_NCURSES_H 58 /* configure was checking <curses.h>, but we will 59 use <ncurses.h>, which has all these features. */ 60 #ifndef WINDOW_HAS_FLAGS 61 #define WINDOW_HAS_FLAGS 1 62 #endif 63 #ifndef MVWDELCH_IS_EXPRESSION 64 #define MVWDELCH_IS_EXPRESSION 1 65 #endif 66 #endif 67 68 #ifdef __cplusplus 69 extern "C" { 70 #endif 71 72 #define PyCurses_API_pointers 4 73 74 /* Type declarations */ 75 76 typedef struct { 77 PyObject_HEAD 78 WINDOW *win; 79 } PyCursesWindowObject; 80 81 #define PyCursesWindow_Check(v) (Py_TYPE(v) == &PyCursesWindow_Type) 82 83 #define PyCurses_CAPSULE_NAME "_curses._C_API" 84 85 86 #ifdef CURSES_MODULE 87 /* This section is used when compiling _cursesmodule.c */ 88 89 #else 90 /* This section is used in modules that use the _cursesmodule API */ 91 92 static void **PyCurses_API; 93 94 #define PyCursesWindow_Type (*(PyTypeObject *) PyCurses_API[0]) 95 #define PyCursesSetupTermCalled {if (! ((int (*)(void))PyCurses_API[1]) () ) return NULL;} 96 #define PyCursesInitialised {if (! ((int (*)(void))PyCurses_API[2]) () ) return NULL;} 97 #define PyCursesInitialisedColor {if (! ((int (*)(void))PyCurses_API[3]) () ) return NULL;} 98 99 #define import_curses() \ 100 PyCurses_API = (void **)PyCapsule_Import(PyCurses_CAPSULE_NAME, 1); 101 102 #endif 103 104 /* general error messages */ 105 static char *catchall_ERR = "curses function returned ERR"; 106 static char *catchall_NULL = "curses function returned NULL"; 107 108 /* Function Prototype Macros - They are ugly but very, very useful. ;-) 109 110 X - function name 111 TYPE - parameter Type 112 ERGSTR - format string for construction of the return value 113 PARSESTR - format string for argument parsing 114 */ 115 116 #define NoArgNoReturnFunction(X) \ 117 static PyObject *PyCurses_ ## X (PyObject *self) \ 118 { \ 119 PyCursesInitialised \ 120 return PyCursesCheckERR(X(), # X); } 121 122 #define NoArgOrFlagNoReturnFunction(X) \ 123 static PyObject *PyCurses_ ## X (PyObject *self, PyObject *args) \ 124 { \ 125 int flag = 0; \ 126 PyCursesInitialised \ 127 switch(PyTuple_Size(args)) { \ 128 case 0: \ 129 return PyCursesCheckERR(X(), # X); \ 130 case 1: \ 131 if (!PyArg_ParseTuple(args, "i;True(1) or False(0)", &flag)) return NULL; \ 132 if (flag) return PyCursesCheckERR(X(), # X); \ 133 else return PyCursesCheckERR(no ## X (), # X); \ 134 default: \ 135 PyErr_SetString(PyExc_TypeError, # X " requires 0 or 1 arguments"); \ 136 return NULL; } } 137 138 #define NoArgReturnIntFunction(X) \ 139 static PyObject *PyCurses_ ## X (PyObject *self) \ 140 { \ 141 PyCursesInitialised \ 142 return PyInt_FromLong((long) X()); } 143 144 145 #define NoArgReturnStringFunction(X) \ 146 static PyObject *PyCurses_ ## X (PyObject *self) \ 147 { \ 148 PyCursesInitialised \ 149 return PyString_FromString(X()); } 150 151 #define NoArgTrueFalseFunction(X) \ 152 static PyObject *PyCurses_ ## X (PyObject *self) \ 153 { \ 154 PyCursesInitialised \ 155 if (X () == FALSE) { \ 156 Py_INCREF(Py_False); \ 157 return Py_False; \ 158 } \ 159 Py_INCREF(Py_True); \ 160 return Py_True; } 161 162 #define NoArgNoReturnVoidFunction(X) \ 163 static PyObject *PyCurses_ ## X (PyObject *self) \ 164 { \ 165 PyCursesInitialised \ 166 X(); \ 167 Py_INCREF(Py_None); \ 168 return Py_None; } 169 170 #ifdef __cplusplus 171 } 172 #endif 173 174 #endif /* !defined(Py_CURSES_H) */ 175 176 177