Руководство программиста для Linux

         

Использование опций


Поговорим об использовании опций окна и режимов терминала.

Прежде всего, под Linux-ом вам следует подключить keypad. Это позволит пользоваться цифровым блоком и клавишами перемещения курсора на клавиатуре ПК. keypad(stdscr,TRUE);

Теперь имеется 2 основных типа ввода:

  1. программа ожидает нажатия клавиши, чтобы вызвать соответствующую функцию (например, что-нибудь вроде "press 'q' for quit" и ждет q);
  2. ожидается, что пользователь напечатает строку символов в маску на экране (например, каталог или адрес в базе данных).
  3. Для первого случая мы установим следующие опции и режимы, и цикл while сработает корректно:

    char c; noecho(); timeout(-1); nonl(); cbreak(); keypad(stdscr,TRUE); while(c=getch()){ switch(c){ case 'q': your_quit_function(); default: break; } }

    Эта программа повиснет до нажатия клавиши. Если нажата q, мы вызываем your_quit_function(), иначе - ждем другого ввода.

    Выражение switch может быть расширено по нашему желанию. Макросы KEY_* служат для учета специальных клавиш. Например,

    KEY_UP KEY_RIGHT KEY_A1 KEY_B2 KEY_C1 KEY_DOWN KEY_LEFT KEY_A3 KEY_C3

    для клавиш перемещения курсора.

    Для просмотра файла цикл может выглядеть примерно так:

    int loop=TRUE; char c; enum{UP,DOWN,RIGHT,LEFT}; noecho(); timeout(-1); nonl(); cbreak(); keypad(stdscr,TRUE); while(loop==TRUE){ c=getch(); switch(c){ case KEY_UP: case 'u': case 'U': scroll_s(UP); break; case KEY_DOWN: case 'd': case 'D': scroll_s(DOWN); break; case KEY_LEFT: case 'l': case 'L': scroll_s(LEFT); break; case KEY_RIGHT: case 'r': case 'R': scroll_s(RIGHT); break; case 'q': case 'Q': loop=FALSE; default: break; } }

    Для второго случая, нам достаточно установить echo(), и символы, набираемые пользователем, будут напечатаны на экране. Место печати задается функциями move(...) или wmove(...).

    Или вы можете открыть окно с маской (выделяемой другими цветами) и попросить пользователя ввести строку:

    WINDOW *maskwin; WINDOW *mainwin; char *ptr=(char *)malloc(255); ... mainwin=newwin(3,37,9,21); maskwin=newwin(1,21,10,35); ... werase(mainwin); werase(maskwin); ... box(mainwin,0,0) mvwaddstr(mainwin,1,2,"Inputstring:"); ... wnoutrefresh(mainwin); wnoutrefresh(maskwin); doupdate(); ... mvwgetstr(maskwin,0,0,ptr); ... delwin(maskwin); delwin(mainwin); endwin(); free(ptr);

    Более подробно см. input.c в директории примеров.



    Содержание раздела