Add ncurses project to fuck around with TUI
This commit is contained in:
parent
e8806547bb
commit
0dd9280818
5 changed files with 95 additions and 0 deletions
40
ncurses/DESCRIPTION.md
Normal file
40
ncurses/DESCRIPTION.md
Normal file
|
|
@ -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
|
||||||
|
Это когда:
|
||||||
|
- Ввод передается немедленно;
|
||||||
|
- Полный контроль над всеми клавишами;
|
||||||
|
- Не работают сигналы
|
||||||
0
ncurses/README.md
Normal file
0
ncurses/README.md
Normal file
29
ncurses/main.c
Normal file
29
ncurses/main.c
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include "modes.h"
|
||||||
|
#include <ncurses.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
/* Инициализация curses режима. Необходимо перед использованием приложения с
|
||||||
|
* этой библиотекой. Она инициализирует curses систему и выделяет память для
|
||||||
|
* текущего окна (stdscr в этой библиотеке)*/
|
||||||
|
initscr();
|
||||||
|
|
||||||
|
/*Функция вызова печати символов в stdscr на текущей x, y позиции. По
|
||||||
|
* умолчанию координаты = 0,0 => печать произойдет в левом верхнем углу*/
|
||||||
|
// printw("Hello world!");
|
||||||
|
|
||||||
|
/*Для того, чтобы символы выше напечатались на экране (на данный момент
|
||||||
|
* получена инструкция печати, но выполнение еще не инициализировано). Нужно
|
||||||
|
* вызывать функцию refresh, которая "Обновляет некоторые флаги и структуры
|
||||||
|
* данных и пишет данные в буфер, который относится к stdscr". Собственно эта
|
||||||
|
* функции дампит буфер на экран*/
|
||||||
|
// refresh();
|
||||||
|
|
||||||
|
// Ждем инпута от пользователя
|
||||||
|
// getch();
|
||||||
|
|
||||||
|
ncurses_modes();
|
||||||
|
// Завершаем curses режим
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
21
ncurses/modes.c
Normal file
21
ncurses/modes.c
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "modes.h"
|
||||||
|
#include <ncurses.h>
|
||||||
|
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();
|
||||||
|
}
|
||||||
5
ncurses/modes.h
Normal file
5
ncurses/modes.h
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#ifndef MODES_H
|
||||||
|
#define MODES_H
|
||||||
|
|
||||||
|
void ncurses_modes();
|
||||||
|
#endif
|
||||||
Loading…
Reference in a new issue