Skip to content

Commit f498906

Browse files
authored
Merge pull request #239 from flagarde/io
Fixes and new features
2 parents 65a9f28 + ae328e2 commit f498906

33 files changed

+317
-176
lines changed

cpp-terminal/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
# configure version information
2-
configure_file(version.hpp.in version.hpp)
2+
configure_file(version.cpp.in version.cpp)
33

44
add_subdirectory(platforms)
55

66
# create and configure library target
7-
add_library(cpp-terminal prompt.cpp window.cpp input.cpp terminal.cpp color.cpp key.cpp event.cpp screen.cpp options.cpp cursor.cpp style.cpp)
7+
add_library(cpp-terminal prompt.cpp window.cpp input.cpp terminal.cpp color.cpp key.cpp event.cpp screen.cpp options.cpp cursor.cpp style.cpp io.cpp "${CMAKE_CURRENT_BINARY_DIR}/version.cpp")
88
target_link_libraries(cpp-terminal PRIVATE Warnings::Warnings cpp-terminal::cpp-terminal-platforms)
99
target_compile_options(cpp-terminal PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
1010
target_include_directories(cpp-terminal PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)
1111

1212
set_target_properties(cpp-terminal PROPERTIES
13-
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/options.hpp;${CMAKE_CURRENT_SOURCE_DIR}/event.hpp;${CMAKE_CURRENT_SOURCE_DIR}/key.hpp;${CMAKE_CURRENT_SOURCE_DIR}/tty.hpp;${CMAKE_CURRENT_SOURCE_DIR}/terminal.hpp;${CMAKE_CURRENT_SOURCE_DIR}/cursor.hpp;${CMAKE_CURRENT_SOURCE_DIR}/style.hpp;${CMAKE_CURRENT_SOURCE_DIR}/prompt.hpp;${CMAKE_CURRENT_SOURCE_DIR}/window.hpp;${CMAKE_CURRENT_BINARY_DIR}/version.hpp"
13+
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/options.hpp;${CMAKE_CURRENT_SOURCE_DIR}/event.hpp;${CMAKE_CURRENT_SOURCE_DIR}/key.hpp;${CMAKE_CURRENT_SOURCE_DIR}/tty.hpp;${CMAKE_CURRENT_SOURCE_DIR}/terminal.hpp;${CMAKE_CURRENT_SOURCE_DIR}/cursor.hpp;${CMAKE_CURRENT_SOURCE_DIR}/style.hpp;${CMAKE_CURRENT_SOURCE_DIR}/prompt.hpp;${CMAKE_CURRENT_SOURCE_DIR}/window.hpp;${CMAKE_CURRENT_SOURCE_DIR}/version.hpp"
1414
PRIVATE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/platforms/conversion.hpp;${CMAKE_CURRENT_SOURCE_DIR}/platforms/macros.hpp")
1515

1616
add_library(cpp-terminal::cpp-terminal ALIAS cpp-terminal)

cpp-terminal/cursor.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
#include "cpp-terminal/cursor.hpp"
22

3-
#include "cpp-terminal/input.hpp"
4-
5-
#include <iostream>
6-
73
Term::Cursor::Cursor(const std::size_t& row, const std::size_t& column) : m_position({row, column}) {}
84

95
std::size_t Term::Cursor::row() const { return m_position.first; }
106

117
std::size_t Term::Cursor::column() const { return m_position.second; }
128

13-
bool Term::Cursor::empty()
9+
bool Term::Cursor::empty() const
1410
{
1511
if(m_position.first == 0 && m_position.second == 0) return true;
1612
else
@@ -25,16 +21,16 @@ std::string Term::cursor_off() { return "\x1b[?25l"; }
2521

2622
std::string Term::cursor_on() { return "\x1b[?25h"; }
2723

28-
std::string Term::cursor_move(std::size_t row, std::size_t column) { return "\033[" + std::to_string(row) + ';' + std::to_string(column) + 'H'; }
24+
std::string Term::cursor_move(std::size_t row, std::size_t column) { return "\x1b[" + std::to_string(row) + ';' + std::to_string(column) + 'H'; }
2925

30-
std::string Term::cursor_up(std::size_t rows) { return "\033[" + std::to_string(rows) + 'A'; }
26+
std::string Term::cursor_up(std::size_t rows) { return "\x1b[" + std::to_string(rows) + 'A'; }
3127

32-
std::string Term::cursor_down(std::size_t rows) { return "\033[" + std::to_string(rows) + 'B'; }
28+
std::string Term::cursor_down(std::size_t rows) { return "\x1b[" + std::to_string(rows) + 'B'; }
3329

34-
std::string Term::cursor_right(std::size_t columns) { return "\033[" + std::to_string(columns) + 'C'; }
30+
std::string Term::cursor_right(std::size_t columns) { return "\x1b[" + std::to_string(columns) + 'C'; }
3531

36-
std::string Term::cursor_left(std::size_t columns) { return "\033[" + std::to_string(columns) + 'D'; }
32+
std::string Term::cursor_left(std::size_t columns) { return "\x1b[" + std::to_string(columns) + 'D'; }
3733

38-
std::string Term::cursor_position_report() { return "\033[6n"; }
34+
std::string Term::cursor_position_report() { return "\x1b[6n"; }
3935

40-
std::string Term::clear_eol() { return "\033[K"; }
36+
std::string Term::clear_eol() { return "\x1b[K"; }

cpp-terminal/cursor.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class Cursor
1616
std::size_t column() const;
1717
void setRow(const std::size_t&);
1818
void setColum(const std::size_t&);
19-
bool empty();
19+
bool empty() const;
2020

2121
private:
2222
std::pair<std::size_t, std::size_t> m_position{0, 0};

cpp-terminal/event.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
#include "cpp-terminal/event.hpp"
22

3-
#include "cpp-terminal/cursor.hpp"
4-
5-
#include <iostream>
6-
73
bool Term::Event::empty()
84
{
95
if(m_Type == Type::Empty) return true;

cpp-terminal/io.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "cpp-terminal/io.hpp"
2+
3+
#include "cpp-terminal/terminal.hpp"
4+
5+
#include <new>
6+
7+
namespace Term
8+
{
9+
static char termbuf[sizeof(Term::Terminal)];
10+
Terminal& terminal = reinterpret_cast<Term::Terminal&>(termbuf);
11+
} // namespace Term
12+
13+
int Term::TerminalInitializer::m_counter{0};
14+
15+
Term::TerminalInitializer::TerminalInitializer()
16+
{
17+
if(m_counter++ == 0) new(&Term::terminal) Terminal();
18+
}
19+
20+
Term::TerminalInitializer::~TerminalInitializer()
21+
{
22+
if(--m_counter == 0) { (&Term::terminal)->~Terminal(); }
23+
}

cpp-terminal/io.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
namespace Term
4+
{
5+
6+
class Terminal;
7+
extern Terminal& terminal;
8+
9+
class TerminalInitializer
10+
{
11+
public:
12+
TerminalInitializer();
13+
~TerminalInitializer();
14+
15+
private:
16+
static int m_counter;
17+
};
18+
19+
static TerminalInitializer m_terminalInitializer;
20+
21+
} // namespace Term

cpp-terminal/options.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
#include "cpp-terminal/options.hpp"
22

33
#include <algorithm>
4+
45
Term::Options::Options(const std::vector<Option>& options) : m_Options(options) {}
56

7+
std::vector<Term::Options::Option> Term::Options::getOptions() { return m_Options; }
8+
69
// Return true is the option is set and not its opposite (* + No* = false)
710
bool Term::Options::has(const Option& option)
811
{

cpp-terminal/options.hpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,21 @@ class Options
1212
enum class Option : int
1313
{
1414
// Don't use 0!
15-
ClearScreen = 1,
16-
NoClearScreen = -1,
17-
SignalKeys = 2,
18-
NoSignalKeys = -2,
19-
Cursor = 3,
20-
NoCursor = -3,
15+
Default = 0,
16+
Raw = 1,
17+
Cooked = -1,
18+
ClearScreen = 2,
19+
NoClearScreen = -2,
20+
SignalKeys = 3,
21+
NoSignalKeys = -3,
22+
Cursor = 4,
23+
NoCursor = -4,
2124
};
22-
Options(const std::vector<Option>& options);
25+
Options() = default;
26+
explicit Options(const std::vector<Option>& options);
2327
bool has(const Option& option);
2428
~Options() {}
29+
std::vector<Option> getOptions();
2530

2631
private:
2732
std::vector<Option> m_Options;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
add_library(cpp-terminal-platforms terminal.cpp tty.cpp terminfo.cpp input.cpp screen.cpp cursor.cpp)
22
target_link_libraries(cpp-terminal-platforms PRIVATE Warnings::Warnings)
3-
target_compile_options(cpp-terminal-platforms PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
3+
target_compile_options(cpp-terminal-platforms PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8 /wd4668 /wd4514>)
44
target_include_directories(cpp-terminal-platforms PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)
55
add_library(cpp-terminal::cpp-terminal-platforms ALIAS cpp-terminal-platforms)

cpp-terminal/platforms/cursor.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
#if defined(_WIN32)
44
#include "windows.h"
55
#else
6-
#include "cpp-terminal/event.hpp"
76
#include "cpp-terminal/input.hpp"
8-
9-
#include <iostream>
7+
#include "cpp-terminal/terminal.hpp"
108
#endif
119

1210
Term::Cursor Term::cursor_position()
@@ -19,10 +17,9 @@ Term::Cursor Term::cursor_position()
1917
CloseHandle(hConOut);
2018
return ret;
2119
#else
22-
std::cout << Term::cursor_position_report() << std::flush;
23-
Term::Event c;
24-
while((c = Platform::read_raw()).empty())
25-
;
20+
Term::terminal << Term::cursor_position_report();
21+
Term::Cursor c;
22+
while((c = Platform::read_raw()).empty()) continue;
2623
return c;
2724
#endif
2825
}

0 commit comments

Comments
 (0)