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

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

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

#include <curses.h>

#define LOCAL_ESCAPE_KEY 27

int main() {

Β int key;

Β initscr();

Β crmode();

Β keypad(stdscr, TRUE);

2.Β ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ символов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ курсора ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиш управлСния курсором. Π­ΠΊΡ€Π°Π½ очищаСтся, ΠΈ выводится Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ тСкст. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΆΠ΄Π΅Ρ‚ наТатия клавиши ΠΈ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° клавиша <Q> ΠΈΠ»ΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка. Π‘ΠΈΠΌΠ²ΠΎΠ» Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши выводится Π½Π° экран. Если Π½Π°ΠΆΠ°Ρ‚Ρ‹Π΅ клавиши ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, вмСсто символа выводится эта ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Β noecho();

Β clear();

Β mvprintw(5, 5, &quot;Key pad demonstration. Press 'q' to quit&quot;);

Β move(7, 5);

Β refresh();

Β key = getch();

Β while (key != ERR &amp;&amp; key i= 'q') {

Β Β move(7, 5);

Β Β clrtoeol();

Β  if ((key &gt;= 'A' &amp;&amp; key &lt;= 'Z') || (key &gt;= 'a' &amp;&amp; key &lt;= 'z')) {

Β Β  printw(&quot;Key was%c&quot;, (char)key);

Β Β } else {

Β Β  switch(key) {

Β Β  case LOCAL_ESCAPE_KEY:

Β Β  Β printw(&quot;%s&quot;,Β &quot;Escape key&quot;);

Β Β  Β break;

Β Β  case KEY_END:

Β Β  Β printw(&quot;%s&quot;, &quot;END key&quot;);

Β Β  Β break;

Β Β  case KEY_BEG:

Β Β  Β printw(&quot;%s&quot;, &quot;BEGINNING key&quot;);

Β Β Β  break;

Β Β  case KEY_RIGHT:

Β Β  Β printw(&quot;%s&quot;, &quot;RIGHT key&quot;);

Β Β  Β break;

Β Β  case KEY_LEFT:

Β Β  Β printw(&quot;%s&quot;, &quot;LEFT key&quot;);

Β Β  Β break;

Β Β  case KEY_UP:

Β Β  Β printw(&quot;%s&quot;, &quot;UP key&quot;);

Β Β  Β break;

Β Β  case KEY_DOWN:

Β Β  Β printw(&quot;%s&quot;, &quot;DOWN key&quot;);

Β Β Β  break;

Β Β  default:

Β Β  Β printw(&quot;Unmatched β€” %d&quot;, key);

Β Β  Β break;

Β Β  } /* switch */

Β  } /* else */

Β  refresh();

Β Β key = getch();

Β } /* while */

Β endwin();

Β exit(EXIT_SUCCESS);

}

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

Π’ΠΊΠ»ΡŽΡ‡ΠΈΠ² Ρ€Π΅ΠΆΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ клавиши Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ escape-ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, сумССтС Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ распознаваниС клавиши <Esc> Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… клавиш.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π°

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈ Ρ†Π²Π΅Ρ‚Π°, поэтому Ρƒ большСй части самых старых вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ². Π¦Π²Π΅Ρ‚Π° появились Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ncurses ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… соврСмСнных рСализациях curses. К соТалСнию, Π½Π° "Π½Π΅ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ экран", пСрвооснову Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses, повлиял API, ΠΈ curses ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ†Π²Π΅Ρ‚Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ способом, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΠΈΠΌ слабыС характСристики старых Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ².

КаТдая символьная ячСйка Π½Π° экранС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записана ΠΎΠ΄Π½ΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² Π½Π° Ρ„ΠΎΠ½Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² Ρ„ΠΎΠ½Π°. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ вывСсти Π·Π΅Π»Π΅Π½Ρ‹ΠΉ тСкст Π½Π° красном Ρ„ΠΎΠ½Π΅.

ЦвСтовая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ curses Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Π°, Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ Ρ†Π²Π΅Ρ‚ символа Π½Π΅ опрСдСляСтся нСзависимо ΠΎΡ‚ Ρ†Π²Π΅Ρ‚Π° Ρ„ΠΎΠ½Π°. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΏΠ»Π°Π½Π° ΠΈ Ρ„ΠΎΠ½Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Ρƒ, ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡƒΡŽ, Ρ‡Ρ‚ΠΎ Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€ΠΎΠΉ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° Π² curses, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ†Π²Π΅Ρ‚Π°, ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ управлСния Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses. Для этого ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

has_colors
ΠΈ
start_color
.

<b>#include &lt;curses.h&gt;</b>

<b>bool has_colors(void);</b>

<b>int start_color(void);</b>

Ѐункция

has_colors
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
true
, Ссли Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ†Π²Π΅Ρ‚Π°. Π”Π°Π»Π΅Π΅ слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
start_color
, которая Π²Π΅Ρ€Π½Π΅Ρ‚
OK
, Ссли цвСтовая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°. ПослС Π²Ρ‹Π·ΠΎΠ²Π°
start_color
ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ² пСрСмСнная
COLOR_PAIRS
ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ количСству Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ
COLORS
опрСдСляСт максимальноС число доступных Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, восСмь. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° числа ΠΎΡ‚ 0 Π΄ΠΎ 63 Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ID для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· доступных Ρ†Π²Π΅Ρ‚ΠΎΠ².

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΊΠ°ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ДСлаСтся это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

init_pair
. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΌ Ρ†Π²Π΅Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
COLOR_PAIR
.

<b>#include &lt;curses.h&gt;</b>

<b>int init_pair(short pair_number, short foreground, short background);</b>

<b>int COLOR_PAIR(int pair_number);</b>

<b>int pair_content(short pair_number, short *foreground, short *background);</b>

Π’ Ρ„Π°ΠΉΠ»Π΅ curses.h ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π°, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с прСфикса

COLOR_
. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ функция
pair_content
позволяСт ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ свСдСния ΠΎ Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π΅.