Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cpp-terminal/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
# configure version information
configure_file(version.hpp.in version.hpp)
configure_file(version.cpp.in version.cpp)

add_subdirectory(platforms)

# create and configure library target
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)
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")
target_link_libraries(cpp-terminal PRIVATE Warnings::Warnings cpp-terminal::cpp-terminal-platforms)
target_compile_options(cpp-terminal PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
target_include_directories(cpp-terminal PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> $<INSTALL_INTERFACE:include>)

set_target_properties(cpp-terminal PROPERTIES
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"
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"
PRIVATE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/platforms/conversion.hpp;${CMAKE_CURRENT_SOURCE_DIR}/platforms/macros.hpp")

add_library(cpp-terminal::cpp-terminal ALIAS cpp-terminal)
Expand Down
20 changes: 8 additions & 12 deletions cpp-terminal/cursor.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
#include "cpp-terminal/cursor.hpp"

#include "cpp-terminal/input.hpp"

#include <iostream>

Term::Cursor::Cursor(const std::size_t& row, const std::size_t& column) : m_position({row, column}) {}

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

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

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

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

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

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

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

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

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

std::string Term::cursor_position_report() { return "\033[6n"; }
std::string Term::cursor_position_report() { return "\x1b[6n"; }

std::string Term::clear_eol() { return "\033[K"; }
std::string Term::clear_eol() { return "\x1b[K"; }
2 changes: 1 addition & 1 deletion cpp-terminal/cursor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class Cursor
std::size_t column() const;
void setRow(const std::size_t&);
void setColum(const std::size_t&);
bool empty();
bool empty() const;

private:
std::pair<std::size_t, std::size_t> m_position{0, 0};
Expand Down
4 changes: 0 additions & 4 deletions cpp-terminal/event.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
#include "cpp-terminal/event.hpp"

#include "cpp-terminal/cursor.hpp"

#include <iostream>

bool Term::Event::empty()
{
if(m_Type == Type::Empty) return true;
Expand Down
23 changes: 23 additions & 0 deletions cpp-terminal/io.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "cpp-terminal/io.hpp"

#include "cpp-terminal/terminal.hpp"

#include <new>

namespace Term
{
static char termbuf[sizeof(Term::Terminal)];
Terminal& terminal = reinterpret_cast<Term::Terminal&>(termbuf);
} // namespace Term

int Term::TerminalInitializer::m_counter{0};

Term::TerminalInitializer::TerminalInitializer()
{
if(m_counter++ == 0) new(&Term::terminal) Terminal();
}

Term::TerminalInitializer::~TerminalInitializer()
{
if(--m_counter == 0) { (&Term::terminal)->~Terminal(); }
}
21 changes: 21 additions & 0 deletions cpp-terminal/io.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

namespace Term
{

class Terminal;
extern Terminal& terminal;

class TerminalInitializer
{
public:
TerminalInitializer();
~TerminalInitializer();

private:
static int m_counter;
};

static TerminalInitializer m_terminalInitializer;

} // namespace Term
3 changes: 3 additions & 0 deletions cpp-terminal/options.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#include "cpp-terminal/options.hpp"

#include <algorithm>

Term::Options::Options(const std::vector<Option>& options) : m_Options(options) {}

std::vector<Term::Options::Option> Term::Options::getOptions() { return m_Options; }

// Return true is the option is set and not its opposite (* + No* = false)
bool Term::Options::has(const Option& option)
{
Expand Down
19 changes: 12 additions & 7 deletions cpp-terminal/options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,21 @@ class Options
enum class Option : int
{
// Don't use 0!
ClearScreen = 1,
NoClearScreen = -1,
SignalKeys = 2,
NoSignalKeys = -2,
Cursor = 3,
NoCursor = -3,
Default = 0,
Raw = 1,
Cooked = -1,
ClearScreen = 2,
NoClearScreen = -2,
SignalKeys = 3,
NoSignalKeys = -3,
Cursor = 4,
NoCursor = -4,
};
Options(const std::vector<Option>& options);
Options() = default;
explicit Options(const std::vector<Option>& options);
bool has(const Option& option);
~Options() {}
std::vector<Option> getOptions();

private:
std::vector<Option> m_Options;
Expand Down
2 changes: 1 addition & 1 deletion cpp-terminal/platforms/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
add_library(cpp-terminal-platforms terminal.cpp tty.cpp terminfo.cpp input.cpp screen.cpp cursor.cpp)
target_link_libraries(cpp-terminal-platforms PRIVATE Warnings::Warnings)
target_compile_options(cpp-terminal-platforms PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
target_compile_options(cpp-terminal-platforms PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8 /wd4668 /wd4514>)
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>)
add_library(cpp-terminal::cpp-terminal-platforms ALIAS cpp-terminal-platforms)
11 changes: 4 additions & 7 deletions cpp-terminal/platforms/cursor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@
#if defined(_WIN32)
#include "windows.h"
#else
#include "cpp-terminal/event.hpp"
#include "cpp-terminal/input.hpp"

#include <iostream>
#include "cpp-terminal/terminal.hpp"
#endif

Term::Cursor Term::cursor_position()
Expand All @@ -19,10 +17,9 @@ Term::Cursor Term::cursor_position()
CloseHandle(hConOut);
return ret;
#else
std::cout << Term::cursor_position_report() << std::flush;
Term::Event c;
while((c = Platform::read_raw()).empty())
;
Term::terminal << Term::cursor_position_report();
Term::Cursor c;
while((c = Platform::read_raw()).empty()) continue;
return c;
#endif
}
18 changes: 1 addition & 17 deletions cpp-terminal/platforms/input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,11 @@
#else
#include <cerrno>
#include <csignal>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#endif

#include "cpp-terminal/exception.hpp"
#include "cpp-terminal/input.hpp"
#include "cpp-terminal/tty.hpp"

#include <string>

Expand Down Expand Up @@ -43,8 +40,6 @@ char Term::Platform::read_raw_stdin()

Term::Event Term::Platform::read_raw()
{
// do nothing when TTY is not connected
if(!is_stdin_a_tty()) { return Event(); }
#ifdef _WIN32
DWORD nread{0};
GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &nread);
Expand Down Expand Up @@ -142,18 +137,8 @@ Term::Event Term::Platform::read_raw()

if(gSignalStatus == 1)
{
struct winsize ws
{
};
ws.ws_row = 0;
ws.ws_col = 0;
ws.ws_xpixel = 0;
ws.ws_ypixel = 0;
int fd{open("/dev/tty", O_RDWR, O_NOCTTY)};
ioctl(fd, TIOCGWINSZ, &ws);
close(fd);
gSignalStatus = 0;
if(ws.ws_row != 0 && ws.ws_col != 0) return Event(Screen(ws.ws_row, ws.ws_col));
return Event(screen_size());
}
else
{
Expand All @@ -165,6 +150,5 @@ Term::Event Term::Platform::read_raw()
else
return Event();
}
return Event();
#endif
}
5 changes: 1 addition & 4 deletions cpp-terminal/platforms/screen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,8 @@ Term::Screen Term::screen_size()
Term::Screen ret;
struct winsize window
{
0, 0, 0, 0
};
window.ws_row = 0;
window.ws_col = 0;
window.ws_xpixel = 0;
window.ws_ypixel = 0;
int fd{open("/dev/tty", O_RDWR, O_NOCTTY)};
if(ioctl(fd, TIOCGWINSZ, &window) != -1) ret = {window.ws_row, window.ws_col};
close(fd);
Expand Down
Loading