Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Когда curses стартует, преобразование последовательностей в логические клавиши отключено, и его следует включить вызовом функции keypad
. Если вызов успешен, функция вернет OK
, в противном случае ERR
.
#include
int keypad(WINDOW *window_ptr, bool keypad_on);
Когда режим дополнительной клавиатуры включен с помощью вызова функции keypad
с параметром keypad_on
, равным true
, библиотека curses принимает на себя обработку клавиатурных последовательностей, так что чтение с клавиатуры может вернуть не только нажатую клавишу, но и одно из определений вида KEY_
для логических клавиш.
Отметьте три незначительных ограничения, налагаемых при использовании режима дополнительной клавиатуры.
□ Распознавание escape-последовательностей требует разного времени, и многие сетевые протоколы сгруппируют символы в пакеты (что приведет к неверному распознаванию escape-последовательностей) или разделят их (что приведет к распознаванию последовательностей функциональных клавиш, как клавиши и отдельных символов). Такое поведение чаще всего наблюдается в региональных сетях (Wide-Area Network, WAN) и других медленных линиях связи. Единственный выход — попытаться запрограммировать терминалы так, чтобы они отправляли единичные уникальные символы в ответ на нажатие каждой функциональной клавиши, используемой вами, хотя это ограничит количество управляющих символов.
□ Для того чтобы библиотека curses могла отличить нажатие клавиши от клавиатурной последовательности, начинающейся с символа Esc
, ей требуется ожидание в течение короткого промежутка времени. Иногда при включенном режиме дополнительной клавиатуры можно заметить легкую задержку при обработке клавиши .
□ Библиотека curses не может обрабатывать неуникальные escape-последовательности. Если у вашего терминала есть две разные клавиши, отправляющие одну и ту же последовательность, библиотека просто не будет ее обрабатывать, поскольку не может решить, какую логическую клавишу следует вернуть.
Выполните упражнение 6.6.
Далее приведена короткая программа keypad.c, демонстрирующая применение режима дополнительной клавиатуры. После запуска программы нажмите клавишу и отметьте незначительную задержку, в течение которой программа пытается понять: Esc — это начало управляющей последовательности или просто нажатие одной клавиши,
1. Инициализировав программу и библиотеку curses, включите режим дополнительной клавиатуры:
#include
#include
#include
#define LOCAL_ESCAPE_KEY 27
int main() {
int key;
initscr();
crmode();
keypad(stdscr, TRUE);
2. Отключите отображение символов, чтобы помешать перемещению курсора при нажатии клавиш управления курсором. Экран очищается, и выводится некоторый текст. Программа ждет нажатия клавиши и до тех пор, пока не нажата клавиша или не возникла ошибка. Символ нажатой клавиши выводится на экран. Если нажатые клавиши соответствуют одной из последовательностей для дополнительной клавиатуры терминала, вместо символа выводится эта последовательность.
noecho();
clear();
mvprintw(5, 5, "Key pad demonstration. Press 'q' to quit");
move(7, 5);
refresh();
key = getch();
while (key != ERR && key i= 'q') {
move(7, 5);
clrtoeol();
if ((key >= 'A' && key <= 'Z') || (key >= 'a' && key <= 'z')) {
printw("Key was%c", (char)key);
} else {
switch(key) {
case LOCAL_ESCAPE_KEY:
printw("%s", "Escape key");
break;
case KEY_END:
printw("%s", "END key");
break;
case KEY_BEG:
printw("%s", "BEGINNING key");
break;
case KEY_RIGHT:
printw("%s", "RIGHT key");
break;
case KEY_LEFT:
printw("%s", "LEFT key");
break;
case KEY_UP:
printw("%s", "UP key");
break;
case KEY_DOWN:
printw("%s", "DOWN key");
break;
default:
printw("Unmatched — %d", key);
break;
} /* switch */
} /* else */
refresh();
key = getch();
} /* while */
endwin();
exit(EXIT_SUCCESS);
}
Как это работает
Включив режим дополнительной клавиатуры, вы увидите, как можно распознать различные функциональные клавиши на дополнительной клавиатуре, генерирующие escape-последовательности. Вы, возможно, сумеете заметить, что распознавание клавиши немного медленнее, чем других клавиш.
Применение цвета
В прошлом очень немногие терминалы ввода/вывода поддерживали цвета, поэтому у большей части самых старых версий библиотеки curses не было поддержки цветов. Цвета появились в библиотеке ncurses и других современных реализациях curses. К сожалению, на "неинтеллектуальный экран", первооснову библиотеки curses, повлиял API, и curses используют цвета очень ограниченным способом, отражающим слабые характеристики старых цветных терминалов.
Каждая символьная ячейка на экране может быть записана одним цветом из набора разных цветов на фоне одного цвета из набора различных цветов фона. Например, можно вывести зеленый текст на красном фоне.
Цветовая поддержка в библиотеке curses немного необычна, в том смысле, что цвет символа не определяется независимо от цвета фона. Вы должны задать цвет переднего плана и фона как пару, именуемую, что неудивительно, цветовой парой.
Прежде чем применять цвета в curses, нужно убедиться в том, что текущий терминал поддерживает цвета, и инициализировать подпрограммы управления цветом библиотеки curses. Для этого примените две функции: has_colors
и start_color
.
#include
bool has_colors(void);
int start_color(void);
Функция has_colors
возвращает true
, если терминал поддерживает цвета. Далее следует вызвать функцию start_color
, которая вернет OK
, если цветовая поддержка успешно инициализирована. После вызова start_color
и инициализации цветов переменная COLOR_PAIRS
принимает значение, равное максимальному количеству цветовых пар, которые может поддерживать терминал. Переменная COLORS
определяет максимальное число доступных цветов, которых, как правило, восемь. Внутри компьютера числа от 0 до 63 действуют как уникальные ID для каждого из доступных цветов.
Прежде чем применять цвета как атрибуты, вы должны инициализировать цветовые пары, которые хотите использовать. Делается это с помощью функции init_pair
. Обратиться к атрибутам, задающим цвет, можно с помощью функции COLOR_PAIR
.
#include
int init_pair(short pair_number, short foreground, short background);
int COLOR_PAIR(int pair_number);
int pair_content(short pair_number, short *foreground, short *background);
В файле curses.h обычно определены некоторые базовые цвета, начинающиеся с префикса COLOR_
. Дополнительная функция pair_content
позволяет извлечь сведения о ранее определенной цветовой паре.
Интервал:
Закладка: