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