Back to Cpython

Curses C API

Doc/c-api/curses.rst

3.15.0a83.8 KB
Original Source

.. highlight:: c

Curses C API

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

.. warning::

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

.. c:macro:: import_curses()

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

On success, populate the :c:var:PyCurses_API pointer.

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

.. code-block::

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

.. c:var:: void **PyCurses_API

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

PyCurses_API[0] corresponds to :c:data: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 :func:curses.setupterm, :func:curses.initscr, and :func:curses.start_color have been called respectively.

See also the convenience macros :c:macro:PyCursesSetupTermCalled, :c:macro:PyCursesInitialised, and :c:macro:PyCursesInitialisedColor.

.. note::

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

.. c:macro:: PyCurses_API_pointers

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

.. c:var:: PyTypeObject PyCursesWindow_Type

The :ref:heap type <heap-types> corresponding to :class:curses.window.

.. c:function:: int PyCursesWindow_Check(PyObject *op)

Return true if op is a :class: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();.

.. c:macro:: PyCursesSetupTermCalled

Macro checking if :func:curses.setupterm has been called.

The macro expansion is roughly equivalent to:

.. code-block::

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

.. c:macro:: PyCursesInitialised

Macro checking if :func:curses.initscr has been called.

The macro expansion is roughly equivalent to:

.. code-block::

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

.. c:macro:: PyCursesInitialisedColor

Macro checking if :func:curses.start_color has been called.

The macro expansion is roughly equivalent to:

.. code-block::

  {
      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.

.. c:macro:: PyCurses_CAPSULE_NAME

Name of the curses capsule to pass to :c:func:PyCapsule_Import.

Internal usage only. Use :c:macro:import_curses instead.