libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
terminal.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <functional>
14#include <promeki/function.h>
15#include <promeki/namespace.h>
16#include <promeki/size2d.h>
17#include <promeki/platform.h>
18#include <promeki/error.h>
19#include <promeki/result.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
40class Terminal {
41 public:
43 using ResizeCallback = Function<void(int cols, int rows)>;
44
66 enum ColorSupport {
67 NoColor,
68 Grayscale16,
69 Grayscale256,
70 GrayscaleTrue,
71 Basic,
72 Color256,
73 TrueColor
74 };
75
77 Terminal();
78
84 Terminal(int inputFd, int outputFd);
85
87 ~Terminal();
88
89 Terminal(const Terminal &) = delete;
90 Terminal &operator=(const Terminal &) = delete;
91
93 int inputFd() const { return _inputFd; }
94
96 int outputFd() const { return _outputFd; }
97
102 Error enableRawMode();
103
108 Error disableRawMode();
109
111 bool isRawMode() const { return _rawMode; }
112
120 Result<int> readInput(char *buf, int maxLen);
121
128 Error windowSize(int &cols, int &rows) const;
129
133 Size2Di32 size() const;
134
139 Error enableMouseTracking();
140
145 Error disableMouseTracking();
146
148 bool isMouseTrackingEnabled() const { return _mouseTracking; }
149
154 Error enableBracketedPaste();
155
160 Error disableBracketedPaste();
161
166 Error enableAlternateScreen();
167
172 Error disableAlternateScreen();
173
178 void setResizeCallback(ResizeCallback cb);
179
186 void installSignalHandlers();
187
204 static ColorSupport colorSupport();
205
213 Result<int> writeOutput(const char *data, int len);
214
215 private:
216 void init();
217
218 int _inputFd;
219 int _outputFd;
220 bool _rawMode = false;
221 bool _mouseTracking = false;
222 bool _bracketedPaste = false;
223 bool _alternateScreen = false;
224 ResizeCallback _resizeCallback;
225
226 // Opaque storage for platform-specific terminal state.
227 // On POSIX this holds a struct termios.
228 void *_origState = nullptr;
229};
230
231PROMEKI_NAMESPACE_END
232
233#endif // PROMEKI_ENABLE_CORE