Инициализация сессии ncurses с установкой параметров сессии
This commit is contained in:
parent
4e850fd21c
commit
d65b3f78bb
1 changed files with 140 additions and 0 deletions
140
source/ncui/core/session.d
Normal file
140
source/ncui/core/session.d
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
module ncui.core.session;
|
||||||
|
|
||||||
|
import core.stdc.locale : setlocale, LC_ALL;
|
||||||
|
import std.exception : enforce;
|
||||||
|
|
||||||
|
import deimos.ncurses;
|
||||||
|
|
||||||
|
import ncui.core.ncwin;
|
||||||
|
import ncui.lib.common;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Уровень видимости/типа курсора.
|
||||||
|
*
|
||||||
|
* - `hidden` — курсор скрыт.
|
||||||
|
* - `normal` — обычный видимый курсор.
|
||||||
|
* - `high` — курсор повышенной заметности (зависит от терминала).
|
||||||
|
*/
|
||||||
|
enum Cursor : int
|
||||||
|
{
|
||||||
|
/// Курсор скрыт.
|
||||||
|
hidden = 0,
|
||||||
|
/// Обычный курсор.
|
||||||
|
normal = 1,
|
||||||
|
/// Курсор повышенной заметности.
|
||||||
|
high = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Режим обработки ввода терминалом.
|
||||||
|
*
|
||||||
|
* - `common` — канонический (построчный) режим — ввод приходит после Enter.
|
||||||
|
* - `cbreak` — посимвольный режим — символы доступны сразу, но часть спец-клавиш/
|
||||||
|
* управляющих символов всё ещё может обрабатываться терминалом (сигналы).
|
||||||
|
* - `raw` — "сырой" посимвольный режим — минимальная обработка терминалом,
|
||||||
|
* управляющие символы обычно передаются программе как есть.
|
||||||
|
*/
|
||||||
|
enum InputMode
|
||||||
|
{
|
||||||
|
/// Посимвольный ввод, часть обработки tty сохраняется.
|
||||||
|
cbreak,
|
||||||
|
/// Сырой посимвольный ввод с минимальной обработкой терминалом.
|
||||||
|
raw,
|
||||||
|
/// Канонический построчный ввод (поведение "как в обычной консоли").
|
||||||
|
common
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Режим эхо терминала (отображение вводимых символов).
|
||||||
|
*
|
||||||
|
* Типичное соответствие ncurses:
|
||||||
|
* - `on` -> отображение вводимых символов.
|
||||||
|
* - `off` -> скрытие вводимых символов.
|
||||||
|
*/
|
||||||
|
enum Echo
|
||||||
|
{
|
||||||
|
/// Отображать вводимые символы.
|
||||||
|
on,
|
||||||
|
/// Скрывать вводимые символы.
|
||||||
|
off
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конфигурация терминальной сессии.
|
||||||
|
*
|
||||||
|
* Поля:
|
||||||
|
* - `mode` — режим ввода.
|
||||||
|
* - `cursor` — видимость/тип курсора.
|
||||||
|
* - `echo` — отображать ли вводимые символы.
|
||||||
|
*/
|
||||||
|
struct SessionConfig
|
||||||
|
{
|
||||||
|
/// Режим ввода терминала. По умолчанию `raw` (посимвольный ввод без обработки).
|
||||||
|
InputMode mode = InputMode.raw;
|
||||||
|
/// Режим курсора. По умолчанию виден (`normal`).
|
||||||
|
Cursor cursor = Cursor.normal;
|
||||||
|
/// Эхо ввода. По умолчанию отображает вводимые символы (`on`).
|
||||||
|
Echo echo = Echo.on;
|
||||||
|
}
|
||||||
|
|
||||||
|
final class Session
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
NCWin _root;
|
||||||
|
bool _ended;
|
||||||
|
|
||||||
|
void setup(ref const(SessionConfig) config)
|
||||||
|
{
|
||||||
|
// Настройка режима обработки ввода терминалом.
|
||||||
|
final switch (config.mode)
|
||||||
|
{
|
||||||
|
case InputMode.raw:
|
||||||
|
ncuiCall!nocbreak(OK);
|
||||||
|
ncuiCall!raw(OK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case InputMode.cbreak:
|
||||||
|
ncuiCall!noraw(OK);
|
||||||
|
ncuiCall!cbreak(OK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case InputMode.common:
|
||||||
|
ncuiCall!noraw(OK);
|
||||||
|
ncuiCall!nocbreak(OK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Настройка отображения вводимых символов.
|
||||||
|
final switch (config.echo)
|
||||||
|
{
|
||||||
|
case Echo.on:
|
||||||
|
ncuiCall!echo(OK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Echo.off:
|
||||||
|
ncuiCall!noecho(OK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
this(const SessionConfig config)
|
||||||
|
{
|
||||||
|
// Адекватное чтение юникода.
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
_root = NCWin(ncuiNotNull!initscr());
|
||||||
|
setup(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
void close()
|
||||||
|
{
|
||||||
|
if (_ended)
|
||||||
|
return;
|
||||||
|
endwin();
|
||||||
|
_ended = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
~this()
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue