Ініціалізація

Ми вже знаємо, що для ініціалізації системи curses потрібно викликати initscr(). Після цієї основної функції можна звернутися до додаткових, для налагодження нашого сеансу curses. Ми можемо попросити curses встановити термінал у необроблений режим, започаткувати колір або взаємодію з мишкою тощо. Давайте обговоримо деякі функції, що викликаються, зазвичай, одразу після initscr().

Функції ініціалізації

raw() і cbreak()

За звичайних обставин, двигун терміналу заносить введені користувачем символи до буферу до тих пір, доки зустрінеться символ повернення каретки або нового рядка. Але більшість програм вимагають, щоб знаки були доступні як тільки користувач надрукував їх. Функції raw() та cbreak() використовуються для того, щоб скасувати буферування рядків. Різниця між цими двома функціями полягає в тому, як передаються програмі символи зависання (CTRL-Z), переривання і виходу (CTRL-C) тощо. В режимі raw() (необробленому режимі), ці символи безпосередньо передаються програмі, без генерації сигналу. В режимі cbreak(), ці керівні символи розглянуто так само як і решту символів двигуном терміналу. Я особисто, надаю перевагу режиму raw(), оскільки це забезпечує кращий контроль над діями користувача.

echo() та noecho()

Ці дві функції керують відлунням символу, введеного користувачем. noecho(), як вказує сама назва, вимикає відлуння. Причина, з якої ви хотіли би скористатися з цього, полягає у можливості керування відлунням, або, щоб позбутися непотрібного відлуння під час надходження користувацького вводу через функції на зразок getch() і подібні. Більшість інтерактивних програм викликають noecho() під час ініціалізації, здійснюючи вивід символів у контрольований спосіб. Це надає можливість гнучкого відлунювання символів у довільному місці вікна, без необхідності оновлення поточної координати (y, x).

keypad()

Це моя улюблена функція ініціалізації. Вона дозволяє читання функціональних клавіш, таких як F1, F2, стрілкових клавіш тощо. Майже кожна інтерактивна програма вмикає їх, оскільки стрілкові клавіші являються важливою частиною користувацького інтерфейсу. Виконайте keypad(stdscr, TRUE), щоб дозволити цю рису для звичайного екрану (stdscr). Ви дізнаєтесь більше про керування ключами у подальших розділах цього документу.

halfdelay()

Ця функція, хоч і не використовується настільки часто, іноді є корисною. Виклик halfdelay() вмикає режим часткової затримки, подібний до режиму cbreak(), у тому, що введені символи одразу доступні програмі. Проте в цьому режимі, програма очікує вводу 'X' десятих секунди, а потім повертає ERR, якщо вводу не було. 'X' - це значення ліміту часу, передане функції halfdelay(). Ця функція корисна, коли ви хочете попросити користувача вводу, і якщо немає відповіді у певний проміжок часу, перейти до чогось іншого. Як можливий приклад - обмеження часу на ввід гасла.

Додаткові функції ініціалізації

Існує ще декілька функцій, що викликаються під час ініціалізації для налагодження поводження curses. Вони не вживаються настільки часто, наскільки вищезгадані. Деякі з них пояснено, де необхідно.

Приклад

Давайте напишемо програму, яка прояснить використання наведених вище функцій.

Приклад 2. Приклад функцій ініціалізації

#include <ncurses.h>

int main()
{
    int ch;

    initscr();          /* Розпочинає режим curses      */
    raw();                          /* Скасовує буферування рядків  */
    keypad(stdscr, TRUE);           /* Дозволяє читання F1, F2 тощо */
    noecho();           /* Без echo() під час getch()   */

    printw("Type any character to see it in bold\n");
    ch = getch();                   /* Якби ми не викликали raw(),  *
                                     * нам довелося би натиснути    *
                                 * Enter, щоб введене надійшло  *
                                     * до програми                  */
    if (ch == KEY_F(1))     /* Без увімкнутого keypad(),    */
        printw("F1 Key pressed");   /* ми це також не отримаємо     */
                                    /* Також, без noecho() деякі    *
                                     * незугарні керівні символи    *
                                     * було би виведено на екран    */
    else {
        printw("The pressed key is ");
        attron(A_BOLD);
        printw("%c", ch);
        attroff(A_BOLD);
    }
    refresh();          /* Виводить усе на дійсний екран  */
    getch();            /* Очікує користувацького вводу   */
    endwin();           /* Завершує режим curses          */

    return 0;
}

Цю програму не важко зрозуміти. Але я застосував деякі ще не розглянуті нами функції. Функція getch() використовується, щоб отримати символ від користувача. Вона еквівалентна звичайній getchar(3), за винятком того, що ми можемо вимкнути буферування рядка, щоб запобігти необхідності натискання <Enter> після вводу.

Подивіться додатково про getch() і читання клавіш у розділі про обробку клавіш. Функції attron() і attroff() використовуються для ввімкнення та вимкнення деяких атрибутів, відповідно. У цьому прикладі, я використав їх, щоб вивести знаки жирним шрифтом. Ці функції докладно описано пізніше.