Skip to main content

libcurses

Framework and tools for multi-threaded, curses(3)-based, terminal applications.

  • Write to screen from multiple threads.

    • Use libcurses.wrapper instead of curses.wrapper.
    • Use libcurses.getkey instead of curses.getch.
    • Use libcurses.getline instead of curses.getstr.
    • Preserve the cursor with context manager libcurses.preserve_cursor.
  • Register callbacks with register_fkey to handle function-keys pressed during getkey and getline processing.

  • Register callbacks with add_mouse_handler to handle mouse events during getkey and getline processing.

  • Manage a logger destination, LogSink, to write to a curses window.

  • A Grid framework.

class Grid

Grid of windows.

A rectangular collection of windows with shared (collapsed) borders that resize the windows to either side (syncronized shrink/expand) when moused upon.

    +-------+---+------+    example `Grid`, 9 windows.
    |       |   |      |
    +-------+---+------+
    |           |      |
    +------+----+------+
    |      |           |
    +------+--+--------+
    |         |        |
    +---------+--------+

Drag and drop an interior border to resize the windows on either side.

Double-click an interior border to enter Resize Mode: * scroll-wheel and arrow-keys move the border, and * click anywhere, Enter and Esc to exit Resize Mode.

Grids also provide a wrapper around curses.newwin that takes positioning parameters that describe the spatial-relationship to other windows on the screen, instead of (y,x) coordinates:

      +--------+                 +--------+
      |        |                 |  ^     |
      |        |<------ left2r --|  |     |
      |        |                 |  |     |
      |<---------------- left ---|  |     |
      |        |                 |  |     |
      +--------+                 +--|-----+
         |  |                       |  ^
bottom2t |  | bottom            top |  | top2b
         v  |                       |  |
      +-----|--+                 +--------+
      |     |  |                 |        |
      |     |  |-- right ---------------->|
      |     |  |                 |        |
      |     |  |-- right2l ----->|        |
      |     v  |                 |        |
      +--------+                 +--------+

For example, this 3x13 grid with three 3x5 boxes may be described at least three different ways:

        +---+---+---+
        | a | b | c |
        +---+---+---+

grid = Grid(curses.newwin(3, 13))

1)  a = grid.box('a', 3, 5)
    b = grid.box('b', 3, 5, left2r=a)
    c = grid.box('c', 3, 5, left2r=b)

2)  c = grid.box('c', 3, 5, right=grid)
    b = grid.box('b', 3, 5, right=c)
    a = grid.box('a', 3, 5, right=b)

3)  a = grid.box('a', 3, 5, left=grid)
    c = grid.box('c', 3, 5, right=grid)
    b = grid.box('b', 3, 0, left2r=a, right=c)

If two endpoints are given (such as 3b), the length will be calculated to fill the gap between the endpoints.

class LogSink

Logger sink to curses window.

The LogSink class provides a logger destination that writes log messages to a curses window, and methods that control various logging features.

class MouseEvent

Wrap curses.getmouse with additional, convenience-properties.

MouseEvent encapsulates the results of curses.getmouse,

x               x-coordinate.
y               y-coordinate.
bstate          bitmask describing the type of event.

and provides these additional properties:

button          button number (1-5).
nclicks         number of clicks (1-3).
is_pressed      True if button is pressed.
is_released     True if button was just released.
is_alt          True if Alt key is held.
is_ctrl         True if Ctrl key is held.
is_shift        True if Shift key is held.
is_moving       True if mouse is moving.

method add_mouse_handler

Call func with args when mouse event happens at (y, x).

method clear_mouse_handlers

Remove all mouse handlers.

function get_colormap

get_colormap() -> dict[str, int]
Return map of `loguru-level-name` to `curses-color/attr`.

Call after creating all custom levels with `logger.level()`.
Map is build once and cached; repeated calls return same map.

function getkey

getkey(win: _curses.window | None = None, no_mouse: bool = False) -> int | None
Read and return a character from window.

Args:
    win: curses window to read from.
    no_mouse: ignore mouse events (for internal use).

Return:
    -1 when no-input in no-delay mode, or
    None on end of file, or
    >=0 int character read.

function getline

getline(win: _curses.window) -> str | None
Read and return a line of input from window.

A line is terminated with CR, LF or KEY_ENTER.
Backspace deletes the previous character.
NAK (ctrl-U) kills the line.
Mouse events are handled.

function preserve_cursor

preserve_cursor() -> Iterator[tuple[int, int]]
Context manager to save and restore the cursor.

function register_fkey

register_fkey(func: Callable[[int], NoneType], key: int = 0) -> None
Register `func` to be called when `key` is pressed.

Args:
    func: callable, to be called on receipt of `key`.
    key: the key to be captured, e.g., `curses.KEY_F1`,
    or zero (0) for all keys.

`func` is appended to a list for the `key`;
pass func=None to remove list of funcs for `key` from registry.

function wrapper

wrapper(func: Callable[[_curses.window], NoneType]) -> None
Use instead of `curses.wrapper`.

Release files for rlane-libcurses 1.0.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rlane-libcurses 1.0.12
File Size Uploaded
rlane_libcurses-1.0.12.tar.gz 52.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rlane-libcurses 1.0.12
File Interpreter ABI Platform
rlane_libcurses-1.0.12-py3-none-any.whl Python 3 none any Details

Total release size: 77.6 kB

Release files / rlane_libcurses-1.0.12.tar.gz

Download URL rlane_libcurses-1.0.12.tar.gz
Size 52.4 kB
Tags Source
SHA-256 checksum
How to use checksums
678924aa69c5bc81d796a1226b0c54c41e18cc70d6fb6de6357f923c1ded78f5
BLAKE2b-256 checksum
How to use checksums
d6465b0de283f9c8fe824a33b2fea1816fe24a0b291ee2537e71087027cb56bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.13.0

Release files / rlane_libcurses-1.0.12-py3-none-any.whl

Download URL rlane_libcurses-1.0.12-py3-none-any.whl
Size 25.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
45973c5fec454a02bc1e98e9163dd53b595061651e9ad513f4cf56f2ffaf58ba
BLAKE2b-256 checksum
How to use checksums
cef007a3ab719304b116ea1c4efee5f565b818cdcb21972fd9ef177dbf7259a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.13.0

Release history Release notifications | RSS feed

This release

1.0.12 This release

2 release files

1.0.11

2 release files

1.0.10

2 release files

1.0.9

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page