Curses C API

curses exposes a small C interface for extension modules. Consumers must include the header file py_curses.h (which is not included by default by Python.h) and import_curses() must be invoked, usually as part of the module initialisation function, to populate PyCurses_API.

Warning

Neither the C API nor the pure Python curses module are compatible with subinterpreters.

import_curses()

Import the curses C API. The macro does not need a semi-colon to be called.

On success, populate the PyCurses_API pointer.

On failure, set PyCurses_API to NULL and set an exception. The caller must check if an error occurred via PyErr_Occurred():

import_curses();  // semi-colon is optional but recommended
if (PyErr_Occurred()) { /* cleanup */ }
void **PyCurses_API

Dynamically allocated object containing the curses C API. This variable is only available once import_curses succeeds.

PyCurses_API[0] corresponds to PyCursesWindow_Type.

PyCurses_API[1], PyCurses_API[2], and PyCurses_API[3] are pointers to predicate functions of type int (*)(void).

When called, these predicates return whether curses.setupterm(), curses.initscr(), and curses.start_color() have been called respectively.

See also the convenience macros PyCursesSetupTermCalled, PyCursesInitialised, and PyCursesInitialisedColor.

Note

The number of entries in this structure is subject to changes. Consider using PyCurses_API_pointers to check if new fields are available or not.

PyCurses_API_pointers

The number of accessible fields (4) in PyCurses_API. This number is incremented whenever new fields are added.

PyTypeObject PyCursesWindow_Type

The heap type corresponding to curses.window.

int PyCursesWindow_Check(PyObject *op)

Return true if op is a curses.window instance, false otherwise.

The following macros are convenience macros expanding into C statements. In particular, they can only be used as macro; or macro, but not macro() or macro();.

PyCursesSetupTermCalled

Macro checking if curses.setupterm() has been called.

The macro expansion is roughly equivalent to:

{
    typedef int (*predicate_t)(void);
    predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];
    if (!was_setupterm_called()) {
        return NULL;
    }
}
PyCursesInitialised

Macro checking if curses.initscr() has been called.

The macro expansion is roughly equivalent to:

{
    typedef int (*predicate_t)(void);
    predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];
    if (!was_initscr_called()) {
        return NULL;
    }
}
PyCursesInitialisedColor

Macro checking if curses.start_color() has been called.

The macro expansion is roughly equivalent to:

{
    typedef int (*predicate_t)(void);
    predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];
    if (!was_start_color_called()) {
        return NULL;
    }
}

Internal data

The following objects are exposed by the C API but should be considered internal-only.

PyCurses_CAPSULE_NAME

Name of the curses capsule to pass to PyCapsule_Import().

Internal usage only. Use import_curses instead.