ITookAPill's picture
PyComp First Commit
9273228
|
Raw
History Blame Contribute Delete
4.02 kB
# Curses C API
`curses`{.interpreted-text role="mod"} exposes a small C interface for extension modules. Consumers must include the header file `py_curses.h`{.interpreted-text role="file"} (which is not included by default by `Python.h`{.interpreted-text role="file"}) and `import_curses`{.interpreted-text role="c:func"} must be invoked, usually as part of the module initialisation function, to populate `PyCurses_API`{.interpreted-text role="c:var"}.
:::: warning
::: title
Warning
:::
Neither the C API nor the pure Python `curses`{.interpreted-text role="mod"} module are compatible with subinterpreters.
::::
> Import the curses C API. The macro does not need a semi-colon to be called.
>
> On success, populate the `PyCurses_API`{.interpreted-text role="c:var"} pointer.
>
> On failure, set `PyCurses_API`{.interpreted-text role="c:var"} to NULL and set an exception. The caller must check if an error occurred via `PyErr_Occurred`{.interpreted-text role="c:func"}:
>
> ```
> import_curses(); // semi-colon is optional but recommended
> if (PyErr_Occurred()) { /* cleanup */ }
> ```
> Dynamically allocated object containing the curses C API. This variable is only available once `import_curses`{.interpreted-text role="c:macro"} succeeds.
>
> `PyCurses_API[0]` corresponds to `PyCursesWindow_Type`{.interpreted-text role="c:data"}.
>
> `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`{.interpreted-text role="func"}, `curses.initscr`{.interpreted-text role="func"}, and `curses.start_color`{.interpreted-text role="func"} have been called respectively.
>
> See also the convenience macros `PyCursesSetupTermCalled`{.interpreted-text role="c:macro"}, `PyCursesInitialised`{.interpreted-text role="c:macro"}, and `PyCursesInitialisedColor`{.interpreted-text role="c:macro"}.
>
> :::: note
> ::: title
> Note
> :::
>
> The number of entries in this structure is subject to changes. Consider using `PyCurses_API_pointers`{.interpreted-text role="c:macro"} to check if new fields are available or not.
> ::::
> The number of accessible fields (`4`) in `PyCurses_API`{.interpreted-text role="c:var"}. This number is incremented whenever new fields are added.
> The `heap type <heap-types>`{.interpreted-text role="ref"} corresponding to `curses.window`{.interpreted-text role="class"}.
> Return true if *op* is a `curses.window`{.interpreted-text role="class"} 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();`.
> Macro checking if `curses.setupterm`{.interpreted-text role="func"} 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;
> }
> }
> ```
> Macro checking if `curses.initscr`{.interpreted-text role="func"} 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;
> }
> }
> ```
> Macro checking if `curses.start_color`{.interpreted-text role="func"} 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.
> Name of the curses capsule to pass to `PyCapsule_Import`{.interpreted-text role="c:func"}.
>
> Internal usage only. Use `import_curses`{.interpreted-text role="c:macro"} instead.