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 char *encoding; 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 const char catchall_ERR[] = "curses function returned ERR"; 107 static const 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 PyLong_FromLong((long) X()); } 144 145 146 #define NoArgReturnStringFunction(X) \ 147 static PyObject *PyCurses_ ## X (PyObject *self) \ 148 { \ 149 PyCursesInitialised \ 150 return PyBytes_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