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.
| 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 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()