Эта функция сохраняет текущее состояние
uses linux;
Function TCGetAttr(ttyfd:longint; var tsaved:TermIOS):Boolean;
Эта функция сохраняет текущее состояние терминала, связанного с дескриптором файла ttyfd в структуре tsaved типа termios. Параметр ttyfd должен быть дескриптором файла, описывающим терминал.
uses linux;
Function TCSetAttr(ttyfd:longint; actions:longint; var tnew:TermIOS):
Boolean;
Вызов tcsetattr установит новое состояние дисциплины связи, заданное структурой tnew. Второй параметр вызова tcsetattr, переменная actions, определяет, как и когда будут установлены новые атрибуты терминала. Существует три возможных варианта, определенных в файле linux:
ТСSANOW |
Немедленное выполнение изменений, что может вызвать проблемы, если в момент изменения флагов драйвер терминала выполняет вывод на терминал |
TCSADRAIN |
Выполняет ту же функцию, что и TCSANOW, но перед установкой новых параметров ждет опустошения очереди вывода |
TCSAFLUSH |
Аналогично TCSADRAIN ждет, пока очередь вывода не опустеет, а затем также очищает и очередь ввода перед установкой для параметров дисциплины линии связи значений, заданных в структуре tnew |
Следующие две функции используют описанные вызовы. Функция tsave сохраняет текущие параметры, связанные с управляющим терминалом процесса, а функция tback восстанавливает последний набор сохраненных параметров. Флаг saved используется для предотвращения восстановления установок функцией tback, если перед этим не была использована функция tsave.
(* Структура tsaved будет содержать параметры терминала *)
var
tsaved:termios;
(* Равно TRUE если параметры сохранены *)
const
saved:boolean=false;
function tsave:boolean;
begin
if isatty(0) and tcgetattr(0,tsaved) then
begin
saved := true;
tsave := true;
exit;
end;
tsave := false;
end;
function tback:boolean; (* Восстанавливает состояние терминала *)
begin
if not isatty(0) or not saved then
tback:=false
else
tback:=tcsetattr(0, TCSAFLUSH, tsaved);
end;
Между этими двумя процедурами может быть заключен участок кода, который временно изменяет состояние терминала, например:
uses linux;
begin
if not tsave then
begin
writeln(stderr, 'Невозможно сохранить параметры терминала');
halt(1);
end;
(* Интересующий нас участок *)
tback;
halt(0);
end.