Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 60

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

$ echo $TERM

xterm

$ ./sizeterm

This terminal has 88 columns and 40 rows

$

Если ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tigetstr для получСния характСристики пСрСмСщСния курсора (cup) Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Ρ‚ΠΈΠΏΠ° xterm, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚: \Π•[%p1%d;%p2%dH.

Π­Ρ‚ΠΎΠΉ характСристикС Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°: Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈ Π½ΠΎΠΌΠ΅Ρ€ столбца, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСмСщаСтся курсор. ОбС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‚ΡΡ, начиная ΠΎΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ экрана.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² характСристикС Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tparm. Π”ΠΎ дСвяти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСниями ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов.

#include <term.h>

char *tparm(char *cap, long p1, long p2, ..., long p9);

ПослС формирования escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tparm, Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ слСдуСт ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°Ρ‚ΡŒ строку Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printf. ВмСсто Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π»ΡŽΠ±Ρ‹Ρ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, выполняСмой Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ. К Π½ΠΈΠΌ относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

#include <term.h>

int putp(char *const str);

int tputs(char *const str, int affcnt, int (*putfunc)(int));

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ функция putp Π²Π΅Ρ€Π½Π΅Ρ‚ константу OK,Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ERR. Π­Ρ‚Π° функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ строку Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ посылаСт Π΅Π΅ Π² стандартный Π²Ρ‹Π²ΠΎΠ΄ stdout.

Π˜Ρ‚Π°ΠΊ, для пСрСмСщСния Π² строку 5 ΠΈ столбСц 30 Π½Π° экранС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅:

char *cursor;

char *esc_sequence;

cursor = tigetstr("cup");

esc_sequence = tparm(cursor, 5, 30);

putp(esc_sequence);

Ѐункция tputs ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ситуаций, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π½Π΅ доступСн Ρ‡Π΅Ρ€Π΅Π· стандартный Π²Ρ‹Π²ΠΎΠ΄ stdout, ΠΈ позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡƒΡŽ для Π²Ρ‹Π²ΠΎΠ΄Π° символов. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ putfunc. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ affcnt ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для обозначСния количСства строк, ΠΏΠΎΠ΄Π²Π΅Ρ€Π³ΡˆΠΈΡ…ΡΡ измСнСнию. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ 1. Ѐункция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для Π²Ρ‹Π²ΠΎΠ΄Π° строки, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ значСния ΠΊΠ°ΠΊ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ putfunc. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ putp(string) эквивалСнтна Π²Ρ‹Π·ΠΎΠ²Ρƒ tputs (string, 1, putchar). Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tputs, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… старых дистрибутивах Linux послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tputs ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ int (*putfunc)(char), Ρ‡Ρ‚ΠΎ заставит вас ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ char_to_terminal ΠΈΠ· упраТнСния 5.6.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ страницам ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ справочного руководства Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ tparm ΠΈ характСристиках Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ², Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ tgoto. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, хотя ΠΎΠ½Π°, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΉ способ пСрСмСщСния курсора, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² стандарт X/Open (Single UNIX Specification Version 2) ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ издания 1997 Π³. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π²Π°ΡˆΠΈΡ… Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

Π’Ρ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ экрана Π² Π²Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΡƒΠ½ΠΊΡ‚Π° мСню. ЕдинствСнно, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, β€” ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ экран просто с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства clear. НСкоторыС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ характСристику clear, которая ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ курсор Π² Π»Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» экрана. Π’ этом случаС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ курсор Π² Π»Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ed β€” ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° экрана.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всю ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ вмСстС, напишСм ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΡƒΠ½ΠΊΡ‚Π° мСню screenmenu.c, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ "нарисуСтС" Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² мСню Π½Π° экранС для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Ρ€Π°Π» Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.6).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.6. ПолноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ getchoice ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ menu4.c для прСдоставлСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ управлСния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ. Π’ этом листингС функция main ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ мСняСтся. Π”Ρ€ΡƒΠ³ΠΈΠ΅ отличия ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ menu4.c Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠΌ.

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <termios.h>

#include <term.h>

#include <curses.h>


static FILE* output_stream = (FILE *)0;

char *menu[] = {

 "a β€” add new record",

 "d β€” delete record",

 "q - quit",

 NULL,

};


int getchoice(char *greet, char *choices[], FILE *in, FILE *out);

int char_to_terminal(int_char_to_write);


int main() {

 ...

}


int getchoice(char *greet, char* choices[], FILE[]* in, FILE* out) {

 int chosen = 0;

 int selected;

 int screenrow, screencol = 10;

 char **option;

 char* cursor, *clear;

 output_stream = out;

 setupterm(NULL, fileno(out), (int*)0);

 cursor = tigetstr("cup");

 clear = tigetstr("clear");

 screenrow =4;

 tputs(clear, 1, (int*)char_to_terminal);

 tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);

 fprintf(out, "Choice: %s", greet);

 screenrow += 2;

 option = choices;

 while (*option) {

  ftputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);

  fprintf(out, "%s", *option);

  screenrow++;

  option++

 }

 fprintf(out, "\n");

 do {

  fflush(out);

  selected = fgetc(in);

  option = choices;

  while (*option) {

   if (selected == *option[0]) {

    chosen = 1;

    break;

   }

   option++;

  }

  if (!chosen) {

   tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);

   fprintf(out, "Incorrect choice, select again\n");

  }

 } while (!chosen);

 tputs(clear, 1, char_to_terminal);

 return selected;

}


int char_to_terminal(int char_to_write) {

 if (output_stream) putc(char_to_write, output_stream);

 return 0;

}

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΊΠ°ΠΊ menu5.с.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Π½Π½Π°Ρ функция getchoice Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎ ΠΆΠ΅ мСню, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, Π½ΠΎ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ характСристиками ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… terminfo. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° экранС сообщСниС "You have chosen:" дольшС, Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎ ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ очисткой экрана ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΎΠΉ Π΅Π³ΠΎ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main Π²Ρ‹Π·ΠΎΠ² sleep:

do {

 choice = getchoice("Please select an action", menu, input, output);

 printf("\nYou have chosen: %c\n", choice);

 sleep(1);

} while (choice != 'q');

ПослСдняя функция Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ char_to_terminal Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ putc, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 3.

Π’ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ этой Π³Π»Π°Π²Ρ‹ Π±Π΅Π³Π»ΠΎ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ опрСдСлСния Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ клавиш.

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ клавиш

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΠ΅ Π² ОБ MS-DOS, часто ΠΈΡ‰ΡƒΡ‚ Π² ОБ Linux эквивалСнт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ kbhit, которая опрСдСляСт, Π±Ρ‹Π»Π° Π»ΠΈ Π½Π°ΠΆΠ°Ρ‚Π° клавиша, Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΅Π΅ считывания. К соТалСнию, ΠΈΡ… поиски ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π΅Π·ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ прямого Π°Π½Π°Π»ΠΎΠ³Π° Π½Π΅Ρ‚. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρ‹ Π² срСдС UNIX Π½Π΅ ΠΎΡ‰ΡƒΡ‰Π°ΡŽΡ‚ этого отсутствия, Ρ‚.ΠΊ. UNIX Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΎ (Ссли ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅) ΠΎΠ·Π°Π±ΠΎΡ‡Π΅Π½Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ события. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ способ примСнСния kbhit, Π΅Π΅ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° Ρ€Π΅Π΄ΠΊΠΎ ощущаСтся Π² систСмах UNIX ΠΈ Linux.

Однако, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ пСрСноситС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· MS-DOS, часто ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ kbhit, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° Π΄Π΅Π»Π΅ Π² нСканоничСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Π²ΠΎΠ΄Π° (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.7).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.7. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ваша собствСнная kbhit

1. ΠΠ°Ρ‡Π½ΠΈΡ‚Π΅ со стандартной Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΠ°Ρ€Ρ‹ структур для установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. peek_character примСняСтся для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наТатия клавиши. Π”Π°Π»Π΅Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅:

#include <stdio.h>

#include <stdlib.h>

#include <termios.h>

#include <term.h>

#include <curses.h>

#include <unistd.h>