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