ΠΠ·Π»Π΅Π·Π΅ Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° notcurses v1.4.x Β«ΠΈΡΡΠΎΡΠΈΡΡΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°! wu-tang! wu-tang!Β»
Notcurses Π΅ TUI Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π½ΠΈ Π΅ΠΌΡΠ»Π°ΡΠΎΡΠΈ. ΠΡΠΊΠ²Π°Π»Π½ΠΎ ΠΏΡΠ΅Π²Π΅Π΄Π΅Π½ΠΎ β Π½Π΅ ΠΏΡΠΎΠΊΠ»ΡΡΠΈΡ (not curses). ΠΠ°ΠΏΠΈΡΠ°Π½Π° Π΅ Π½Π° C, Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° C++-safe Π·Π°Π³Π»Π°Π²ΠΈΡ. ΠΠΎΡΡΡΠΏΠ½ΠΈ ΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π·Π° 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 Π·Π° ΡΡΡΠΈΠΉΠΌΠΈΠ½Π³ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π° ΠΏΠ»ΠΎΡΠΊΠΎΡΡ (Π²ΡΡΡ Ρ ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠΎΡΡΡΠΎΠ΅Π½ ΠΏΠΎΠ΄ΠΏΡΠΎΡΠ΅Ρ). Π Π΄Π²Π°ΡΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° callback-ΠΈΡΠ΅ Π΄Π° ΡΡΠΈΠ»ΠΈΠ·ΠΈΡΠ°Ρ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ ΡΠ΅ΠΊΡΡ.
ΠΡΡΡΠ΅Π½Π΅ Π½Π° ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ ΠΈ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΈ Π΅ΡΠ΅ΠΊΡΠΈ. ΠΠ°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ Π±Π»ΠΈΡΠΈΡΠ°Π½Π΅ RGBA/BGRx.
ΠΠ΅Π½ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ Π½Π° ΠΊΠΎΡΡΠΎ ΠΈ Π΄Π° Π΅ (ΠΈΠ»ΠΈ Π½Π° Π΄Π²Π΅ΡΠ΅) ΠΎΡ Π³ΠΎΡΠ½ΠΈΡΠ΅ ΠΈ Π΄ΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ.
ΠΠΎΠ»Π΅ΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌ Direct.
Polyfills, Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ ΠΈ ΡΠ΅ΠΊΡΡ Ρ Π²ΠΈΡΠΎΠΊ ΠΊΠΎΠ½ΡΡΠ°ΡΡ.
ΠΠΎΠ±Π°Π²Π΅Π½ ΡΠ΅ΡΡΠΈΡ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ.
C++ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ ΠΎΡ Marek Habersack ΠΏΠΎΠ»ΡΡΠΈΡ Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Ρ Π²ΡΡΠ»ΡΡ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ).
Python ΠΈ Rust FFI ΡΠ° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈ ΡΠ΅ΡΡΠ²Π°Π½ΠΈ.
ΠΠΈΠ΄Π΅ΠΎ Π΄Π΅ΠΌΠΎ Ρ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ ΠΎΡ Π°Π²ΡΠΎΡΠ°.
ΠΠ½ΠΈΠ³Π°ΡΠ° βHacking The Planet! with Notcursesβ ΠΎΡ Π°Π²ΡΠΎΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru

