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ů. Ve v0.3 je zpracování vstupu ve výchozí builder pipeline automatické.
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í. Ve standardním použití v0.3 snapshoty automaticky spotřebovává frame loop a builder callbacky.
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.
# Automatic path (v0.3 default)
while running:
engine.main_loop()Snapshoty jsou stále mostem mezi vstupním vláknem a logikou widgetů. V případě potřeby můžete input.get_snapshot() volat ručně, ale výchozí builder flow ve v0.3 to dělá za vás.
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.
| Pole | Typ | Popis |
|---|---|---|
| btn | int | Identifikátor klávesy |
| code | int | Kód klávesy |
| scancode | int | Hardwarový scancode |
| modifiers | int | Modifikační příznaky (Shift, Ctrl, Alt) |
| pressed | int | 1 pokud je klávesa stisknutá, 0 pokud není |
| repeat | int | 1 pokud jde o opakovanou událost |
| timestamp | double | Časové razítko události |
| has_event | int | 1 pokud je událost přítomná |
| text | char[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álosti | Hodnota | Popis |
|---|---|---|
| TUIX_MOUSE_NONE | 0 | Žádná událost |
| TUIX_MOUSE_PRESS | 1 | Tlačítko stisknuto |
| TUIX_MOUSE_RELEASE | 2 | Tlačítko uvolněno |
| TUIX_MOUSE_HOVER | 3 | Pohyb myši (bez tlačítka) |
| TUIX_MOUSE_DRAG | 4 | Pohyb myši se stisknutým tlačítkem |
| TUIX_MOUSE_SCROLL_UP | 5 | Scroll kolečka nahoru |
| TUIX_MOUSE_SCROLL_DOWN | 6 | Scroll kolečka dolů |
| TUIX_MOUSE_DOUBLE_CLICK | 7 | Detekován dvojklik |
| TUIX_MOUSE_HSCROLL_LEFT | 8 | Horizontální scroll doleva |
| TUIX_MOUSE_HSCROLL_RIGHT | 9 | Horizontální scroll doprava |
| Tlačítko | Hodnota |
|---|---|
| TUIX_BTN_LEFT | 0 |
| TUIX_BTN_MIDDLE | 1 |
| TUIX_BTN_RIGHT | 2 |
| TUIX_BTN_X1 | 3 |
| TUIX_BTN_X2 | 4 |
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 engine, input
input.listen()
while running:
engine.main_loop()
input.stop()