Zpět na projekty
TUIX v0.2.0Beta

Naposledy aktualizováno: 2026-05-20

Zpracování vstupu

TUIX zachytává vstup z klávesnice a myši ve vyhrazeném vlákně na pozadí a předává události widgetům pomocí snímků.

Architektura

Vstupní systém běží jako vlákno na pozadí spuštěné pomocí input.listen(). Čte surové události platformy a ukládá je do dvou kruhových bufferů: jeden pro klávesnici a jeden pro myš. Každý buffer pojme až 128 událostí. Hlavní vlákno události spotřebovává voláním input.get_snapshot(), které odebere po jedné události z každé fronty a vrátí je ve struktuře TuixInputSnapshot.

Snímky vstupu

Snímek je okamžitý záznam stavu vstupu. Obsahuje aktuální rozměry terminálu a ukazatele na data událostí klávesnice a myši.

snap = input.get_snapshot()

# Feed to interactive widgets
objects.tuix_choice_feed_input(obj, snap)
# or
objects.tuix_input_feed_input(obj, snap)

Snímky jsou mostem mezi vstupním vláknem a logikou widgetů. get_snapshot() voláte jednou za snímek a výsledek předáte každému widgetu, který potřebuje vstup.

Události klávesnice

Události klávesnice obsahují kód klávesy, scancode, modifikační příznaky, stav stisku/opakování, časové razítko a až 8 bajtů UTF-8 textu.

PoleTypPopis
btnintIdentifikátor klávesy
codeintKód klávesy
scancodeintHardwarový scancode
modifiersintModifikační příznaky (Shift, Ctrl, Alt)
pressedint1 pokud je klávesa stisknutá, 0 pokud není
repeatint1 pokud jde o opakovanou událost
timestampdoubleČasové razítko události
has_eventint1 pokud je událost přítomná
textchar[8]UTF-8 text generovaný klávesou

Události myši

Události myši zachycují pozici, tlačítko a typ události. Systém podporuje stisk, uvolnění, hover, drag, scrollování a dvojklik.

Typ událostiHodnotaPopis
TUIX_MOUSE_NONE0Žádná událost
TUIX_MOUSE_PRESS1Tlačítko stisknuto
TUIX_MOUSE_RELEASE2Tlačítko uvolněno
TUIX_MOUSE_HOVER3Pohyb myši (bez tlačítka)
TUIX_MOUSE_DRAG4Pohyb myši se stisknutým tlačítkem
TUIX_MOUSE_SCROLL_UP5Scroll kolečka nahoru
TUIX_MOUSE_SCROLL_DOWN6Scroll kolečka dolů
TUIX_MOUSE_DOUBLE_CLICK7Detekován dvojklik
TUIX_MOUSE_HSCROLL_LEFT8Horizontální scroll doleva
TUIX_MOUSE_HSCROLL_RIGHT9Horizontální scroll doprava
TlačítkoHodnota
TUIX_BTN_LEFT0
TUIX_BTN_MIDDLE1
TUIX_BTN_RIGHT2
TUIX_BTN_X13
TUIX_BTN_X24

Implementace na platformách

Na Windows používá vstupní vlákno ReadConsoleInputW pro příjem nativních struktur KEY_EVENT_RECORD a MOUSE_EVENT_RECORD. Stavový automat tlačítek sleduje hrany stisku/uvolnění pro přesnou detekci kliknutí. ENABLE_VIRTUAL_TERMINAL_INPUT se záměrně nepoužívá kvůli chybě Windows, kdy jsou SGR kódované události myši mylně vyhodnoceny jako klávesnicový vstup.

Na POSIX systémech (Linux, macOS) se terminál přepne do raw režimu a jedno vlákno pthread čte ze stdin. Události myši se parsují ze SGR escape sekvencí. Režim terminálu se obnoví po zavolání input.stop().

Vzor použití

from tuix.core import input, objects

# Start listening
input.listen()

# In your render loop
while running:
    snap = input.get_snapshot()
    objects.tuix_choice_feed_input(choice_obj, snap)
    objects.tuix_input_feed_input(input_obj, snap)
    # ... render ...

# Stop listening
input.stop()
Vstup pro více widgetů (omezení v0.2.0)Ve verzi v0.2.0 se stejný snímek předává všem widgetům. Neexistuje systém focusu — každý interaktivní widget zpracovává stejný stisk klávesy. Mechanismus routování focusu je plánován pro v0.2.1.