Add ncurses project to fuck around with TUI

This commit is contained in:
t0xa 2025-10-14 22:44:08 +03:00
parent e8806547bb
commit 0dd9280818
5 changed files with 95 additions and 0 deletions

40
ncurses/DESCRIPTION.md Normal file
View 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
View file

29
ncurses/main.c Normal file
View 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
View 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
View file

@ -0,0 +1,5 @@
#ifndef MODES_H
#define MODES_H
void ncurses_modes();
#endif