diff --git a/ncurses/DESCRIPTION.md b/ncurses/DESCRIPTION.md new file mode 100644 index 0000000..c1f1e55 --- /dev/null +++ b/ncurses/DESCRIPTION.md @@ -0,0 +1,40 @@ +# Links +- [Tutorial for ncurses](https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/helloworld.html) +# Построчная буферизация +Построчная буферизация означает, что символы не отправляются программе сразу, а сначала накапливаются в буфере пока пользователь не нажмет `Enter`. +Визуальное описание выглядит примерно так: +*Режим cooked* +``` +Пользователь печатает: h e l l o [backspace] [backspace] i +Что видит пользователь: helli +Буфер терминала: helli + ↓ [Enter] +Программа получает: "helli\n" (только после Enter!) +``` +*Режим cbreak* +``` +Пользователь печатает: h +Программа получает: 'h' ← сразу! + +Пользователь печатает: e +Программа получает: 'e' ← сразу! + +Пользователь печатает: l +Программа получает: 'l' ← сразу! +``` +# Режимы инициализации +## raw() vs cbreak() +У терминалов есть 3 режима работы: +1. Cooked mode (по умолчанию) +Это когда - ввод буферизиуется построчно, пользователь должен нажать Enter, работают сигналы по типу Ctrl-C, Ctrl-Z, работает backspace для редактирования строки. +2. Cbreak mode +Это когда: +- Ввод передается немедленно, без ожидания Enter; +- Сигналы работают; +- Нет буферизации по строкам; +- Каждый символ доступен сразу после нажатия. +3. Raw mode +Это когда: +- Ввод передается немедленно; +- Полный контроль над всеми клавишами; +- Не работают сигналы diff --git a/ncurses/README.md b/ncurses/README.md new file mode 100644 index 0000000..e69de29 diff --git a/ncurses/main.c b/ncurses/main.c new file mode 100644 index 0000000..c3420d6 --- /dev/null +++ b/ncurses/main.c @@ -0,0 +1,29 @@ +#include "modes.h" +#include + +int main() { + /* Инициализация curses режима. Необходимо перед использованием приложения с + * этой библиотекой. Она инициализирует curses систему и выделяет память для + * текущего окна (stdscr в этой библиотеке)*/ + initscr(); + + /*Функция вызова печати символов в stdscr на текущей x, y позиции. По + * умолчанию координаты = 0,0 => печать произойдет в левом верхнем углу*/ + // printw("Hello world!"); + + /*Для того, чтобы символы выше напечатались на экране (на данный момент + * получена инструкция печати, но выполнение еще не инициализировано). Нужно + * вызывать функцию refresh, которая "Обновляет некоторые флаги и структуры + * данных и пишет данные в буфер, который относится к stdscr". Собственно эта + * функции дампит буфер на экран*/ + // refresh(); + + // Ждем инпута от пользователя + // getch(); + + ncurses_modes(); + // Завершаем curses режим + endwin(); + + return 0; +} diff --git a/ncurses/modes.c b/ncurses/modes.c new file mode 100644 index 0000000..3efdfdc --- /dev/null +++ b/ncurses/modes.c @@ -0,0 +1,21 @@ +#include "modes.h" +#include +void ncurses_modes() { + int ch; + raw(); + keypad(stdscr, TRUE); + noecho(); + + printw("Type char to see it in bold\n"); + ch = getch(); + if (ch == KEY_F(1)) + printw("F1 key pressed"); + else { + printw("The pressed key is "); + attron(A_BOLD); + printw("%c", ch); + attroff(A_BOLD); + } + refresh(); + getch(); +} diff --git a/ncurses/modes.h b/ncurses/modes.h new file mode 100644 index 0000000..022b6f2 --- /dev/null +++ b/ncurses/modes.h @@ -0,0 +1,5 @@ +#ifndef MODES_H +#define MODES_H + +void ncurses_modes(); +#endif