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