11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
93 Terminal(
int inputFd,
int outputFd);
98 Terminal(
const Terminal &) =
delete;
99 Terminal &operator=(
const Terminal &) =
delete;
102 int inputFd()
const {
return _inputFd; }
105 int outputFd()
const {
return _outputFd; }
111 Error enableRawMode();
117 Error disableRawMode();
120 bool isRawMode()
const {
return _rawMode; }
129 Result<int> readInput(
char *buf,
int maxLen);
137 Error windowSize(
int &cols,
int &rows)
const;
142 Size2Di32 size()
const;
148 Error enableMouseTracking();
154 Error disableMouseTracking();
157 bool isMouseTrackingEnabled()
const {
return _mouseTracking; }
163 Error enableBracketedPaste();
169 Error disableBracketedPaste();
179 Error enableFocusReporting();
185 Error disableFocusReporting();
188 bool isFocusReportingEnabled()
const {
return _focusReporting; }
194 Error enableAlternateScreen();
200 Error disableAlternateScreen();
218 static ColorSupport colorSupport();
227 Result<int> writeOutput(
const char *data,
int len);
241 AnsiStream &ansiStream();
258 void emergencyRestore();
269 explicit RawModeGuard(Terminal &t) : _t(t) { _t.enableRawMode(); }
271 ~RawModeGuard() { _t.disableRawMode(); }
272 RawModeGuard(
const RawModeGuard &) =
delete;
273 RawModeGuard &operator=(
const RawModeGuard &) =
delete;
280 class AlternateScreenGuard {
283 explicit AlternateScreenGuard(Terminal &t) : _t(t) { _t.enableAlternateScreen(); }
285 ~AlternateScreenGuard() { _t.disableAlternateScreen(); }
286 AlternateScreenGuard(
const AlternateScreenGuard &) =
delete;
287 AlternateScreenGuard &operator=(
const AlternateScreenGuard &) =
delete;
294 class MouseTrackingGuard {
297 explicit MouseTrackingGuard(Terminal &t) : _t(t) { _t.enableMouseTracking(); }
299 ~MouseTrackingGuard() { _t.disableMouseTracking(); }
300 MouseTrackingGuard(
const MouseTrackingGuard &) =
delete;
301 MouseTrackingGuard &operator=(
const MouseTrackingGuard &) =
delete;
308 class BracketedPasteGuard {
311 explicit BracketedPasteGuard(Terminal &t) : _t(t) { _t.enableBracketedPaste(); }
313 ~BracketedPasteGuard() { _t.disableBracketedPaste(); }
314 BracketedPasteGuard(
const BracketedPasteGuard &) =
delete;
315 BracketedPasteGuard &operator=(
const BracketedPasteGuard &) =
delete;
322 class FocusReportingGuard {
325 explicit FocusReportingGuard(Terminal &t) : _t(t) { _t.enableFocusReporting(); }
327 ~FocusReportingGuard() { _t.disableFocusReporting(); }
328 FocusReportingGuard(
const FocusReportingGuard &) =
delete;
329 FocusReportingGuard &operator=(
const FocusReportingGuard &) =
delete;
340 bool _rawMode =
false;
341 bool _mouseTracking =
false;
342 bool _bracketedPaste =
false;
343 bool _alternateScreen =
false;
344 bool _focusReporting =
false;
350 UniquePtr<File> _outDevice;
351 UniquePtr<AnsiStream> _ansi;
355 void *_origState =
nullptr;