terminal.h
Go to the documentation of this file.
1 // Encapsulates terminal control (colors, cursor, ...)
2 // Author: Max Schwarz <max.schwarz@uni-bonn.de>
3 
4 #ifndef TERMINAL_H
5 #define TERMINAL_H
6 
7 #include <stdint.h>
8 #include <chrono>
9 #include <string>
10 #include <map>
11 #include <vector>
12 
13 namespace rosmon
14 {
15 
22 class Terminal
23 {
24 public:
32  {
34  Red,
49 
51  Grayscale = 0xe8
52  };
53 
54  class Color
55  {
56  public:
58  {}
59 
60  void foreground() { fputs(m_fgString.c_str(), stdout); }
61  void background() { fputs(m_bgString.c_str(), stdout); }
62 
63  const std::string& foregroundCode() const { return m_fgString; }
64  const std::string& backgroundCode() const { return m_bgString; }
65  private:
66  friend class Terminal;
67 
68  Color(const std::string& fg, const std::string& bg)
69  : m_fgString{fg}, m_bgString{bg}
70  {}
71 
72  std::string m_fgString;
73  std::string m_bgString;
74  };
75 
76  class Style
77  {
78  public:
80  {}
81 
82  Style(Color fg, Color bg)
83  : m_fg(std::move(fg)), m_bg(std::move(bg))
84  {}
85 
86  void use()
87  {
88  m_fg.foreground();
89  m_bg.background();
90  }
91  private:
94  };
95 
102  class Parser
103  {
104  public:
105  Parser() {}
106  Parser(Terminal* terminal);
107 
109  bool parse(char c);
110 
112  void parse(const std::string& str);
113 
115  void apply();
116 
123  std::vector<std::string> wrap(const std::string& str, unsigned int columns);
124  private:
125  void parseSetAttributes(const std::string& str);
126 
127  enum State
128  {
132  };
133 
134  Terminal* m_term = nullptr;
135 
137  std::string m_buf;
138 
141  bool m_bold = false;
142  };
143 
144  Terminal();
145 
146  Color color(SimpleColor code);
147  Color color(uint32_t truecolor, SimpleColor fallback);
148 
155  void setForegroundColor(uint32_t color);
156 
163  void setBackgroundColor(uint32_t color);
164 
166  void setCursorInvisible();
167 
169  void setCursorVisible();
170 
174  void setEcho(bool on);
175 
176  void setBold(bool on);
177 
179 
184 
186  void setStandardColors();
187 
189  std::string standardColorCode();
190 
192  void clearToEndOfLine();
193 
195  void moveCursorUp(int numLines);
196 
199 
205  bool getSize(int* columns, int* rows);
206 
212  bool has256Colors() const;
213 
217  bool interactive() const
218  { return m_valid; }
219 
220  void setWindowTitle(const std::string& title);
221  void clearWindowTitle(const std::string& backup);
222 
223 
225  {
226  SK_F1 = 0x100, SK_F2, SK_F3, SK_F4,
229 
231 
233  };
234 
235  int readKey();
236  int readLeftover();
237 
241  void setLineWrap(bool on);
242 
243 private:
244  bool m_valid;
247 
248  std::string m_bgColorStr;
249  std::string m_fgColorStr;
250  std::string m_opStr;
251  std::string m_sgr0Str;
252  std::string m_elStr;
253  std::string m_upStr;
254  std::string m_boldStr;
255  std::string m_lineWrapOffStr;
256  std::string m_lineWrapOnStr;
257 
258  std::map<std::string, SpecialKey> m_specialKeys;
259 
260  std::string m_currentEscapeStr;
261  std::chrono::steady_clock::time_point m_escapeStartTime;
263  unsigned int m_currentEscapeAbortIdx = 0;
264 };
265 
266 }
267 
268 #endif
rosmon::Terminal::m_currentEscapeStr
std::string m_currentEscapeStr
Definition: terminal.h:260
rosmon::Terminal::Parser::m_bold
bool m_bold
Definition: terminal.h:141
rosmon::Terminal::readKey
int readKey()
Definition: terminal.cpp:544
rosmon::Terminal::Parser::STATE_CSI
@ STATE_CSI
Definition: terminal.h:131
rosmon::Terminal::m_boldStr
std::string m_boldStr
Definition: terminal.h:254
rosmon::Terminal::Parser::m_term
Terminal * m_term
Definition: terminal.h:134
rosmon::Terminal::m_currentEscapeAborted
bool m_currentEscapeAborted
Definition: terminal.h:262
rosmon::Terminal::moveCursorToStartOfLine
void moveCursorToStartOfLine()
Move cursor to start of the line.
Definition: terminal.cpp:467
rosmon::Terminal::IntenseBlue
@ IntenseBlue
Definition: terminal.h:45
rosmon
Definition: diagnostics_publisher.cpp:34
rosmon::Terminal::Green
@ Green
Definition: terminal.h:35
rosmon::Terminal::m_escapeStartTime
std::chrono::steady_clock::time_point m_escapeStartTime
Definition: terminal.h:261
rosmon::Terminal::IntenseBlack
@ IntenseBlack
Definition: terminal.h:41
rosmon::Terminal::standardColorCode
std::string standardColorCode()
Escape codes for standard colors.
Definition: terminal.cpp:443
rosmon::Terminal::SK_F12
@ SK_F12
Definition: terminal.h:228
rosmon::Terminal::SK_F10
@ SK_F10
Definition: terminal.h:228
rosmon::Terminal::color
Color color(SimpleColor code)
Definition: terminal.cpp:616
rosmon::Terminal::SK_Left
@ SK_Left
Definition: terminal.h:232
rosmon::Terminal::setCursorVisible
void setCursorVisible()
restore cursor
Definition: terminal.cpp:320
rosmon::Terminal::Terminal
Terminal()
Definition: terminal.cpp:180
rosmon::Terminal::SK_F4
@ SK_F4
Definition: terminal.h:226
rosmon::Terminal::Parser::m_fgColor
Color m_fgColor
Definition: terminal.h:139
rosmon::Terminal::setCursorInvisible
void setCursorInvisible()
hide cursor
Definition: terminal.cpp:312
rosmon::Terminal::setEcho
void setEcho(bool on)
Definition: terminal.cpp:377
rosmon::Terminal::Cyan
@ Cyan
Definition: terminal.h:39
rosmon::Terminal::IntenseGreen
@ IntenseGreen
Definition: terminal.h:43
rosmon::Terminal::Parser::parse
bool parse(char c)
parse single character c
Definition: terminal.cpp:71
rosmon::Terminal::Parser::STATE_ESCAPE
@ STATE_ESCAPE
Definition: terminal.h:129
rosmon::Terminal::setBackgroundColor
void setBackgroundColor(uint32_t color)
Set 24-bit background color.
Definition: terminal.cpp:341
rosmon::Terminal::SK_F1
@ SK_F1
Definition: terminal.h:226
rosmon::Terminal::setBold
void setBold(bool on)
Definition: terminal.cpp:398
rosmon::Terminal::Color::foregroundCode
const std::string & foregroundCode() const
Definition: terminal.h:63
rosmon::Terminal::Grayscale
@ Grayscale
24-step grayscale starts here
Definition: terminal.h:51
rosmon::Terminal::Color::backgroundCode
const std::string & backgroundCode() const
Definition: terminal.h:64
rosmon::Terminal::Color::m_bgString
std::string m_bgString
Definition: terminal.h:73
rosmon::Terminal::setForegroundColor
void setForegroundColor(uint32_t color)
Set 24-bit foreground color.
Definition: terminal.cpp:359
rosmon::Terminal::Color::background
void background()
Definition: terminal.h:61
rosmon::Terminal::White
@ White
Definition: terminal.h:40
rosmon::Terminal::IntenseWhite
@ IntenseWhite
Definition: terminal.h:48
rosmon::Terminal::setLineWrap
void setLineWrap(bool on)
Definition: terminal.cpp:472
rosmon::Terminal::clearToEndOfLine
void clearToEndOfLine()
Clear characters from cursor to end of line.
Definition: terminal.cpp:451
rosmon::Terminal::IntenseMagenta
@ IntenseMagenta
Definition: terminal.h:46
rosmon::Terminal::m_truecolor
bool m_truecolor
Definition: terminal.h:246
rosmon::Terminal::Parser::STATE_TYPE
@ STATE_TYPE
Definition: terminal.h:130
rosmon::Terminal::IntenseYellow
@ IntenseYellow
Definition: terminal.h:44
rosmon::Terminal::Magenta
@ Magenta
Definition: terminal.h:38
rosmon::Terminal::Style::Style
Style(Color fg, Color bg)
Definition: terminal.h:82
rosmon::Terminal::SK_Backspace
@ SK_Backspace
Definition: terminal.h:230
rosmon::Terminal::setSimplePair
void setSimplePair(SimpleColor fg, SimpleColor bg)
Definition: terminal.cpp:425
rosmon::Terminal::Color::m_fgString
std::string m_fgString
Definition: terminal.h:72
rosmon::Terminal::Parser
Terminal escape sequence parser.
Definition: terminal.h:102
rosmon::Terminal::m_elStr
std::string m_elStr
Definition: terminal.h:252
rosmon::Terminal::SK_F11
@ SK_F11
Definition: terminal.h:228
rosmon::Terminal::m_sgr0Str
std::string m_sgr0Str
Definition: terminal.h:251
rosmon::Terminal::SpecialKey
SpecialKey
Definition: terminal.h:224
rosmon::Terminal::Style::m_bg
Color m_bg
Definition: terminal.h:93
rosmon::Terminal::Yellow
@ Yellow
Definition: terminal.h:36
rosmon::Terminal::Parser::Parser
Parser()
Definition: terminal.h:105
rosmon::Terminal::Parser::m_state
State m_state
Definition: terminal.h:136
rosmon::Terminal::m_currentEscapeAbortIdx
unsigned int m_currentEscapeAbortIdx
Definition: terminal.h:263
rosmon::Terminal::Style::m_fg
Color m_fg
Definition: terminal.h:92
rosmon::Terminal::readLeftover
int readLeftover()
Definition: terminal.cpp:514
rosmon::Terminal::Red
@ Red
Definition: terminal.h:34
rosmon::Terminal::SK_F6
@ SK_F6
Definition: terminal.h:227
rosmon::Terminal::Parser::State
State
Definition: terminal.h:127
rosmon::Terminal::IntenseCyan
@ IntenseCyan
Definition: terminal.h:47
rosmon::Terminal::m_256colors
bool m_256colors
Definition: terminal.h:245
rosmon::Terminal::m_valid
bool m_valid
Definition: terminal.h:244
rosmon::Terminal::setSimpleBackground
void setSimpleBackground(SimpleColor color)
Definition: terminal.cpp:416
rosmon::Terminal::setStandardColors
void setStandardColors()
Reset fg + bg to standard terminal colors.
Definition: terminal.cpp:434
rosmon::Terminal::Blue
@ Blue
Definition: terminal.h:37
rosmon::Terminal::SK_F7
@ SK_F7
Definition: terminal.h:227
rosmon::Terminal::m_specialKeys
std::map< std::string, SpecialKey > m_specialKeys
Definition: terminal.h:258
rosmon::Terminal::m_lineWrapOffStr
std::string m_lineWrapOffStr
Definition: terminal.h:255
rosmon::Terminal::setWindowTitle
void setWindowTitle(const std::string &title)
Definition: terminal.cpp:493
rosmon::Terminal::SK_Up
@ SK_Up
Definition: terminal.h:232
rosmon::Terminal::SK_F8
@ SK_F8
Definition: terminal.h:227
rosmon::Terminal::moveCursorUp
void moveCursorUp(int numLines)
Move cursor up by numLines.
Definition: terminal.cpp:459
rosmon::Terminal::m_upStr
std::string m_upStr
Definition: terminal.h:253
rosmon::Terminal::Color
Definition: terminal.h:54
rosmon::Terminal::has256Colors
bool has256Colors() const
Definition: terminal.cpp:307
rosmon::Terminal::SK_Down
@ SK_Down
Definition: terminal.h:232
rosmon::Terminal::SK_F5
@ SK_F5
Definition: terminal.h:227
rosmon::Terminal::Parser::m_bgColor
Color m_bgColor
Definition: terminal.h:140
rosmon::Terminal::clearWindowTitle
void clearWindowTitle(const std::string &backup)
Definition: terminal.cpp:506
rosmon::Terminal::SK_F9
@ SK_F9
Definition: terminal.h:228
std
rosmon::Terminal::Parser::m_buf
std::string m_buf
Definition: terminal.h:137
rosmon::Terminal::Color::Color
Color()
Definition: terminal.h:57
rosmon::Terminal::Black
@ Black
Definition: terminal.h:33
rosmon::Terminal::Style::Style
Style()
Definition: terminal.h:79
rosmon::Terminal::m_lineWrapOnStr
std::string m_lineWrapOnStr
Definition: terminal.h:256
rosmon::Terminal::Color::Color
Color(const std::string &fg, const std::string &bg)
Definition: terminal.h:68
rosmon::Terminal
Encapsulates terminal control.
Definition: terminal.h:22
rosmon::Terminal::m_opStr
std::string m_opStr
Definition: terminal.h:250
rosmon::Terminal::Parser::apply
void apply()
Apply the current internal state (colors) on the terminal.
Definition: terminal.cpp:161
rosmon::Terminal::Parser::wrap
std::vector< std::string > wrap(const std::string &str, unsigned int columns)
Apply line wrapping.
Definition: terminal.cpp:120
rosmon::Terminal::SK_F2
@ SK_F2
Definition: terminal.h:226
rosmon::Terminal::m_fgColorStr
std::string m_fgColorStr
Definition: terminal.h:249
rosmon::Terminal::Color::foreground
void foreground()
Definition: terminal.h:60
rosmon::Terminal::Parser::parseSetAttributes
void parseSetAttributes(const std::string &str)
Definition: terminal.cpp:36
rosmon::Terminal::SK_Right
@ SK_Right
Definition: terminal.h:232
rosmon::Terminal::Style
Definition: terminal.h:76
rosmon::Terminal::SK_F3
@ SK_F3
Definition: terminal.h:226
rosmon::Terminal::Style::use
void use()
Definition: terminal.h:86
rosmon::Terminal::setSimpleForeground
void setSimpleForeground(SimpleColor color)
Definition: terminal.cpp:407
rosmon::Terminal::m_bgColorStr
std::string m_bgColorStr
Definition: terminal.h:248
rosmon::Terminal::IntenseRed
@ IntenseRed
Definition: terminal.h:42
rosmon::Terminal::getSize
bool getSize(int *columns, int *rows)
Get current window size.
Definition: terminal.cpp:480
rosmon::Terminal::SimpleColor
SimpleColor
Simple colors.
Definition: terminal.h:31
rosmon::Terminal::interactive
bool interactive() const
Definition: terminal.h:217


rosmon_core
Author(s): Max Schwarz
autogenerated on Wed Feb 21 2024 04:01:14