Skip to content

Commit b13b0ef

Browse files
committed
Terminal: RawTerminal
1 parent dead4f8 commit b13b0ef

4 files changed

Lines changed: 78 additions & 61 deletions

File tree

modules/Terminal/RawTerminal.mpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module;
2+
3+
#include <CppUtils/System/Windows.hpp>
4+
5+
#if defined(OS_MAC) or defined(OS_LINUX)
6+
# include <unistd.h>
7+
# include <termios.h>
8+
#endif
9+
10+
export module CppUtils.Terminal.RawTerminal;
11+
12+
import std;
13+
14+
export namespace CppUtils::Terminal
15+
{
16+
#if defined(OS_MAC) or defined(OS_LINUX)
17+
class RawTerminal final
18+
{
19+
public:
20+
inline RawTerminal()
21+
{
22+
tcgetattr(STDIN_FILENO, &m_oldTerminalState);
23+
24+
auto rawTerminal = m_oldTerminalState;
25+
rawTerminal.c_lflag &= static_cast<tcflag_t>(~(ICANON | ECHO));
26+
tcsetattr(STDIN_FILENO, TCSANOW, &rawTerminal);
27+
}
28+
29+
inline ~RawTerminal()
30+
{
31+
tcsetattr(STDIN_FILENO, TCSANOW, &m_oldTerminalState);
32+
}
33+
34+
[[nodiscard]] inline auto readChar() const -> char
35+
{
36+
auto c = char{};
37+
if (::read(STDIN_FILENO, &c, 1) == 1)
38+
return c;
39+
return '\0';
40+
}
41+
42+
[[nodiscard]] inline auto read(char sentinel) const -> std::string
43+
{
44+
using namespace std::literals;
45+
46+
auto string = ""s;
47+
auto c = readChar();
48+
while (c != '\0' and c != sentinel)
49+
{
50+
string += c;
51+
c = readChar();
52+
}
53+
return string;
54+
}
55+
56+
private:
57+
termios m_oldTerminalState;
58+
};
59+
#endif
60+
}

modules/Terminal/Terminal.mpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export module CppUtils.Terminal;
22

33
export import CppUtils.Terminal.BackgroundColor;
44
export import CppUtils.Terminal.Canvas;
5+
export import CppUtils.Terminal.RawTerminal;
56
export import CppUtils.Terminal.TextColor;
67
export import CppUtils.Terminal.TextModifier;
78
export import CppUtils.Terminal.TextStyle;

modules/Terminal/Utility.mpp

Lines changed: 16 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import std;
1616
import CppUtils.Container.Size2d;
1717
import CppUtils.System.Type;
1818
import CppUtils.String.Concept;
19+
import CppUtils.Terminal.RawTerminal;
1920

2021
export namespace CppUtils::Terminal
2122
{
@@ -78,59 +79,14 @@ export namespace CppUtils::Terminal
7879
}
7980
#endif
8081

81-
#if defined(OS_MAC) or defined(OS_LINUX)
82-
class RawTerminal final
83-
{
84-
public:
85-
inline RawTerminal()
86-
{
87-
tcgetattr(STDIN_FILENO, &m_oldTerminalState);
88-
89-
auto rawTerminal = m_oldTerminalState;
90-
rawTerminal.c_lflag &= static_cast<tcflag_t>(~(ICANON | ECHO));
91-
tcsetattr(STDIN_FILENO, TCSANOW, &rawTerminal);
92-
}
93-
94-
inline ~RawTerminal()
95-
{
96-
tcsetattr(STDIN_FILENO, TCSANOW, &m_oldTerminalState);
97-
}
98-
99-
[[nodiscard]] inline auto readChar() const -> char
100-
{
101-
auto c = char{};
102-
if (::read(STDIN_FILENO, &c, 1) == 1)
103-
return c;
104-
return '\0';
105-
}
106-
107-
[[nodiscard]] inline auto read(char sentinel) const -> std::string
108-
{
109-
using namespace std::literals;
110-
111-
auto string = ""s;
112-
auto c = readChar();
113-
while (c != '\0' and c != sentinel)
114-
{
115-
string += c;
116-
c = readChar();
117-
}
118-
return string;
119-
}
120-
121-
private:
122-
termios m_oldTerminalState;
123-
};
124-
#endif
125-
126-
inline auto getTerminalName() -> std::wstring
82+
inline auto getTerminalTitle() -> std::wstring
12783
{
12884
#if defined(OS_WINDOWS)
129-
auto name = std::wstring{};
85+
auto title = std::wstring{};
13086
constexpr auto size = 256uz;
131-
name.resize(size);
132-
::GetConsoleTitleW(std::data(name), size);
133-
return name;
87+
title.resize(size);
88+
::GetConsoleTitleW(std::data(title), size);
89+
return title;
13490
#elif defined(OS_MAC) or defined(OS_LINUX)
13591
using namespace std::literals;
13692

@@ -145,33 +101,33 @@ export namespace CppUtils::Terminal
145101
#endif
146102
}
147103

148-
inline auto setTerminalName(const String::GenericText auto& name) -> void
104+
inline auto setTerminalTitle(const String::GenericText auto& title) -> void
149105
{
150106
#if defined(OS_WINDOWS)
151-
::SetConsoleTitleW(std::data(name));
107+
::SetConsoleTitleW(std::data(title));
152108
#elif defined(OS_MAC) or defined(OS_LINUX)
153-
std::print("\x1B]0;{}\a", name);
109+
std::print("\x1B]0;{}\a", title);
154110
std::fflush(stdout);
155111
#endif
156112
}
157113

158114
template<class String>
159-
class TerminalName final
115+
class TerminalTitle final
160116
{
161117
public:
162-
inline TerminalName(String name):
163-
m_oldName{getTerminalName()}
118+
inline TerminalTitle(String title):
119+
m_oldTitle{getTerminalTitle()}
164120
{
165-
setTerminalName(name);
121+
setTerminalTitle(title);
166122
}
167123

168-
inline ~TerminalName()
124+
inline ~TerminalTitle()
169125
{
170-
setTerminalName(m_oldName);
126+
setTerminalTitle(m_oldTitle);
171127
}
172128

173129
private:
174-
String m_oldName;
130+
String m_oldTitle;
175131
};
176132

177133
#if defined(OS_WINDOWS)

tests/Terminal/Canvas.mpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export namespace CppUtils::UnitTest::Terminal::Canvas
3636
for (auto i = 0uz; i < 5; ++i)
3737
for (auto c : chars)
3838
{
39-
std::this_thread::sleep_for(100ms);
39+
std::this_thread::sleep_for(50ms);
4040
canvas.fill(c);
4141
canvas.update();
4242
}

0 commit comments

Comments
 (0)