ΠΠ·Π»Π΅Π·Π΅ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° notcurses v1.4.x Β«ΡΠ°Π³Π°ΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°! wu-tang! wu-tang!Β»
Notcurses Π΅ TUI Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π½ΠΈ Π΅ΠΌΡΠ»Π°ΡΠΎΡΠΈ. ΠΡΠΊΠ²Π°Π»Π½ΠΎ ΠΏΡΠ΅Π²Π΅Π΄Π΅Π½ΠΎ β Π½Π΅ ΠΏΡΠΎΠΊΠ»ΡΡΠΈΡ (not curses). ΠΠ°ΠΏΠΈΡΠ°Π½Π° Π΅ Π½Π° C, Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ C++ Π·Π°Π³Π»Π°Π²ΠΈΡ. ΠΠΎΡΡΡΠΏΠ½ΠΈ ΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π·Π° Rust, C++ ΠΈ Python.
ΠΠ°ΠΊΠ²ΠΎ Π΅ ΡΠΎΠ²Π°: Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΡΠ»Π΅ΡΠ½ΡΠ²Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ TUI Π½Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π½ΠΈ Π΅ΠΌΡΠ»Π°ΡΠΎΡΠΈ, ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ° ΡΡΠΊΠΈ ΡΠ²Π΅ΡΠΎΠ²Π΅ ΠΈ Unicode. ΠΠ½ΠΎΠ³ΠΎ Π·Π°Π΄Π°ΡΠΈ, Π΄Π΅Π»Π΅Π³ΠΈΡΠ°Π½ΠΈ Π½Π° curses, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° notcurses (ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ).
ΠΠ°ΠΊΠ²ΠΎ Π½Π΅ Π΅ ΡΠΎΠ²Π°: ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° X/Open curses ΠΈΠ»ΠΈ Π·Π°ΠΌΡΠ½Π° Π½Π° ncurses Π² ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ.
Notcurses ΡΠ΅ ΠΎΡΠΊΠ°Π·Π²Π° ΠΎΡ API X/Open Curses, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½ΠΎ ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Single UNIX Specification. Π’Π°Π·ΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΅ ΠΎΡΡΠ°ΡΡΠ»Π° ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°ΠΊΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°, ΠΊΠ°ΡΠΎ Π½Π΅ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ 24-Π±ΠΈΡΠΎΠ² ΡΠ²ΡΡ. ΠΠΎΡΠ°Π΄ΠΈ ΡΠΎΠ²Π°, notcurses Π½Π΅ Π΅ Π·Π°ΠΌΡΠ½Π° Π½Π° curses. Π’Ρ Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΡΡΠ°ΡΠΈΠ²Π½Π° ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ Π΅ ΡΠ΅ΡΡΠ²Π°Π½Π° Π½Π° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅.
ΠΠΎΠ³Π°ΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, notcurses ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° terminfo, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° Π·Π°Π΅Π΄Π½ΠΎ Ρ ncurses, ΠΈΠ·Π²Π»ΠΈΡΠ°ΠΉΠΊΠΈ Π³ΠΎΠ»ΡΠΌΠ° ΠΏΠΎΠ»Π·Π° ΠΎΡ Π½Π΅ΠΉΠ½Π°ΡΠ° ΠΏΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡ.
Notcurses ΠΎΡΠ²Π°ΡΡ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈ ΡΡΠ°Π½ΡΠΈΠΈ, ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈ, Π»Π°ΠΏΡΠΎΠΏΠΈ ΠΈ ΡΠ°Π±Π»Π΅ΡΠΈ.
ΠΠ°ΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°Π·ΠΈ Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°?
ΠΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΎΡ ΡΠ°ΠΌΠΎΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π±ΡΡ Π° ΠΏΡΠΎΠ΅ΠΊΡΠ½ΠΎ ΡΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
ΠΠΎ-ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΎΡΠΎΡΠΌΠ΅Π½ΠΎ API Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ X/Open:
ΠΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ ΠΈΠΌΠ°Ρ ΠΏΡΠ΅ΡΠΈΠΊΡ, Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π°Ρ ΠΊΠΎΠ»ΠΈΠ·ΠΈΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΡΠ° Π½Π° ΠΈΠΌΠ΅Π½Π°ΡΠ°.
ΠΠ±Π΅ΠΊΡΠ½ΠΈΡΡ ΡΠ°ΠΉΠ» Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ. ΠΡΠ΄Π΅ΡΠΎ Π΅ ΡΠ΅Π»Π΅ΡΡΠΎΠ±ΡΠ°Π·Π½ΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΊΠΎΠ΄ ΡΠ°ΠΌΠΎ Π·Π° ΡΡΡΠΎΡΠ½ΠΈ Π·Π°Π³Π»Π°Π²ΠΈΡ. Π’ΠΎΠ²Π° ΡΠ»Π΅ΡΠ½ΡΠ²Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅.
-
ΠΡΠΈΡΠΊΠΈ API ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ Π½Π°Π±ΠΎΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ (Unicode). API Π·Π° ΠΊΠ»Π΅ΡΠΊΠΈ Π΅ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡΠ° Π Π°Π·ΡΠΈΡΠ΅Π½ ΠΊΠ»Π°ΡΡΠ΅Ρ Π½Π° Π³ΡΠ°ΡΠ΅ΠΌΠΈ Π½Π° Unicode.
ΠΠΈΠ·ΡΠ°Π»Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΡΠΈΡΡΠΎΠ²Π΅, Π²ΠΈΠ΄Π΅ΠΎ, Π²ΠΈΡΠΎΠΊΠΎΠΊΠΎΠ½ΡΡΠ°ΡΡΠ΅Π½ ΡΠ΅ΠΊΡΡ, ΡΠΏΡΠ°ΠΉΡΠΎΠ²Π΅ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΡΠΈΡΠΊΠΈ API ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π½Π°ΡΠΈΠ²Π½ΠΎ 24-Π±ΠΈΡΠ΅Π½ ΡΠ²ΡΡ, ΠΊΠ²Π°Π½ΡΠΎΠ²Π°Π½ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ Π·Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°.
-
ΠΠΈΡΠ΅Π½Π·ΠΈΡ Apache2, Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π΄ΡΠ°ΠΌΠ° Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΡΠΎ Π΅ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΡΠ° Π½Π° ncurses (ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ°Π²Π° ΠΊΠ°ΡΠΎ Β«ΠΏΡΠ΅ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°Π½Π΅ Π½Π° MIT-X11Β»).
ΠΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΎΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ 1.1.0 Π±ΡΡ Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
Π£ΠΈΠ΄ΠΆΠ΅Ρ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π½ΠΈΠ·ΠΎΠ²Π΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅
Π£ΠΈΠ΄ΠΆΠ΅Ρ subprocess Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΏΡΠΎΡΠ΅ΡΠΈ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΡ ΠΈ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
Π Linux 5.3+ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½ΠΎΠ² ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ clone3+pidfd Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈ Π±Π΅Π· race condition.
Π£ΠΈΠ΄ΠΆΠ΅Ρ Fdplane Π·Π° ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π° ΠΏΠ»ΠΎΡΠΊΠΎΡΡ (Π²ΡΡΡ Ρ ΠΊΠΎΡΡΠΎ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΏΠΎΠ΄ΠΏΡΠΎΡΠ΅ΡΡΡ). Π Π΄Π²Π°ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π΄Π° ΡΡΠΈΠ»ΠΈΠ·ΠΈΡΠ°Ρ ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ΅ΠΊΡΡ.
ΠΡΡΡΠ΅Π½Π΅ Π½Π° ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ ΠΈ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΈ Π΅ΡΠ΅ΠΊΡΠΈ. ΠΠ°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ Π±Π»ΠΈΡΠΈΡΠ°Π½Π΅ RGBA/BGRx.
ΠΠ΅Π½ΡΡΠ°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π½Π° ΠΊΠΎΡΡΠΎ ΠΈ Π΄Π° Π΅ (ΠΈΠ»ΠΈ Π½Π° Π΄Π²Π΅ΡΠ΅) ΠΎΡ Π³ΠΎΡΠ½ΠΈΡΠ΅ ΠΈ Π΄ΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ.
ΠΠΎΠ»Π΅ΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ° Direct.
Polyfills, Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ ΠΈ Π²ΠΈΡΠΎΠΊΠΎ ΠΊΠΎΠ½ΡΡΠ°ΡΡΠ΅Π½ ΡΠ΅ΠΊΡΡ.
ΠΠΎΠ±Π°Π²Π΅Π½ ΡΠ΅ΡΡΠΈΡ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ.
C++ ΠΎΠ±Π΅ΡΡΠΊΠΈ ΠΎΡ Marek Habersack ΠΏΠΎΠ»ΡΡΠΈΡ Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Ρ Π²ΡΡΠ»ΡΡ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ).
Python ΠΈ Rust FFI Π±ΡΡ Π° ΠΎΠ±Π½ΠΎΠ²Π΅Π½ΠΈ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½ΠΈ.
ΠΠΈΠ΄Π΅ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ Π½Π° Π°Π²ΡΠΎΡΠ°
ΠΠ½ΠΈΠ³Π°ΡΠ° 'Hacking The Planet! with Notcurses' ΠΎΡ Π°Π²ΡΠΎΡΠ°
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru

