Skip to content

Commit 65a9f28

Browse files
authored
Merge pull request #238 from flagarde/detached2
Fixes and cleaning
2 parents 0a686ff + 49d7dca commit 65a9f28

30 files changed

+338
-251
lines changed

cpp-terminal/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ configure_file(version.hpp.in version.hpp)
44
add_subdirectory(platforms)
55

66
# create and configure library target
7-
add_library(cpp-terminal base.cpp prompt.cpp window.cpp input.cpp terminal.cpp color.cpp key.cpp event.cpp screen.cpp options.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)
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}/base.hpp;${CMAKE_CURRENT_SOURCE_DIR}/prompt.hpp;${CMAKE_CURRENT_SOURCE_DIR}/window.hpp;${CMAKE_CURRENT_BINARY_DIR}/version.hpp"
14-
PRIVATE_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/platforms/conversion.hpp;${CMAKE_CURRENT_SOURCE_DIR}/platforms/macros.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_BINARY_DIR}/version.hpp"
14+
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)
1717

cpp-terminal/base.cpp

Lines changed: 0 additions & 67 deletions
This file was deleted.

cpp-terminal/base.hpp

Lines changed: 0 additions & 70 deletions
This file was deleted.

cpp-terminal/cursor.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "cpp-terminal/cursor.hpp"
2+
3+
#include "cpp-terminal/input.hpp"
4+
5+
#include <iostream>
6+
7+
Term::Cursor::Cursor(const std::size_t& row, const std::size_t& column) : m_position({row, column}) {}
8+
9+
std::size_t Term::Cursor::row() const { return m_position.first; }
10+
11+
std::size_t Term::Cursor::column() const { return m_position.second; }
12+
13+
bool Term::Cursor::empty()
14+
{
15+
if(m_position.first == 0 && m_position.second == 0) return true;
16+
else
17+
return false;
18+
}
19+
20+
void Term::Cursor::setRow(const std::size_t& row) { m_position.first = row; }
21+
22+
void Term::Cursor::setColum(const std::size_t& column) { m_position.second = column; }
23+
24+
std::string Term::cursor_off() { return "\x1b[?25l"; }
25+
26+
std::string Term::cursor_on() { return "\x1b[?25h"; }
27+
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'; }
29+
30+
std::string Term::cursor_up(std::size_t rows) { return "\033[" + std::to_string(rows) + 'A'; }
31+
32+
std::string Term::cursor_down(std::size_t rows) { return "\033[" + std::to_string(rows) + 'B'; }
33+
34+
std::string Term::cursor_right(std::size_t columns) { return "\033[" + std::to_string(columns) + 'C'; }
35+
36+
std::string Term::cursor_left(std::size_t columns) { return "\033[" + std::to_string(columns) + 'D'; }
37+
38+
std::string Term::cursor_position_report() { return "\033[6n"; }
39+
40+
std::string Term::clear_eol() { return "\033[K"; }

cpp-terminal/cursor.hpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
3+
#include <cstddef>
4+
#include <string>
5+
#include <utility>
6+
7+
namespace Term
8+
{
9+
10+
class Cursor
11+
{
12+
public:
13+
Cursor() = default;
14+
Cursor(const std::size_t&, const std::size_t&);
15+
std::size_t row() const;
16+
std::size_t column() const;
17+
void setRow(const std::size_t&);
18+
void setColum(const std::size_t&);
19+
bool empty();
20+
21+
private:
22+
std::pair<std::size_t, std::size_t> m_position{0, 0};
23+
};
24+
25+
// returns the current cursor position (row, column) (Y, X)
26+
Term::Cursor cursor_position();
27+
28+
// move the cursor to the given (row, column) / (Y, X)
29+
std::string cursor_move(std::size_t row, std::size_t column);
30+
// move the cursor the given rows up
31+
std::string cursor_up(std::size_t rows);
32+
// move the cursor the given rows down
33+
std::string cursor_down(std::size_t rows);
34+
// move the cursor the given columns left
35+
std::string cursor_left(std::size_t columns);
36+
// move the cursor the given columns right
37+
std::string cursor_right(std::size_t columns);
38+
// the ANSI code to generate a cursor position report
39+
std::string cursor_position_report();
40+
// turn off the cursor
41+
std::string cursor_off();
42+
// turn on the cursor
43+
std::string cursor_on();
44+
45+
// clears the screen from the current cursor position to the end of the screen
46+
std::string clear_eol();
47+
48+
} // namespace Term

cpp-terminal/event.cpp

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

3+
#include "cpp-terminal/cursor.hpp"
4+
5+
#include <iostream>
6+
37
bool Term::Event::empty()
48
{
59
if(m_Type == Type::Empty) return true;
@@ -39,6 +43,22 @@ void Term::Event::parse()
3943
if(m_Key == Term::Key::Value::DEL) m_Key = Term::Key::Value::BACKSPACE;
4044
m_str.clear();
4145
}
46+
else if(m_str.size() == 2 && m_str[0] == '\033')
47+
{
48+
m_Key = static_cast<Term::Key::Value>(Term::Key::Value::ALT + static_cast<Term::Key::Value>(m_str[1]));
49+
m_Type = Type::Key;
50+
m_str.clear();
51+
}
52+
else if(m_str[0] == '\033' && m_str[1] == '[' && m_str[m_str.size() - 1] == 'R')
53+
{
54+
std::size_t found = m_str.find(';', 2);
55+
if(found != std::string::npos)
56+
{
57+
m_Type = Type::Cursor;
58+
59+
m_Cursor = Cursor(std::stoi(m_str.substr(2, found - 2)), std::stoi(m_str.substr(found + 1, m_str.size() - (found + 2))));
60+
}
61+
}
4262
else if(m_str.size() <= 10)
4363
{
4464
//https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
@@ -189,3 +209,10 @@ Term::Event::operator Term::Key()
189209
else
190210
return Key();
191211
}
212+
213+
Term::Event::operator Term::Cursor()
214+
{
215+
if(m_Type == Type::Cursor) return m_Cursor;
216+
else
217+
return Cursor();
218+
}

cpp-terminal/event.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "cpp-terminal/cursor.hpp"
34
#include "cpp-terminal/key.hpp"
45
#include "cpp-terminal/screen.hpp"
56

@@ -17,6 +18,7 @@ class Event
1718
Empty,
1819
Key,
1920
Screen,
21+
Cursor,
2022
CopyPaste,
2123
};
2224
Event() = default;
@@ -28,13 +30,15 @@ class Event
2830

2931
operator Term::Key();
3032
operator Term::Screen();
33+
operator Term::Cursor();
3134
operator std::string();
3235

3336
private:
3437
void parse();
3538
Type m_Type{Type::Empty};
3639
std::string m_str;
3740
Key m_Key{Key::Value::NO_KEY};
41+
Cursor m_Cursor;
3842
Term::Screen m_Screen;
3943
};
4044

cpp-terminal/key.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ bool Term::Key::is_CTRL()
2828

2929
bool Term::Key::is_ALT()
3030
{
31-
if((m_value & Key::ALT) == Key::ALT) return true;
31+
if(m_value >= Key::ALT && Key::ALT < (Key::ALT << 1)) return true;
3232
else
3333
return false;
3434
}

cpp-terminal/key.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ class Key
145145
DEL = 127,
146146
// End ASCII
147147
// Extended ANSII goes up to 255
148-
ALT_ENTER = 256,
149-
ARROW_LEFT,
148+
ARROW_LEFT = 256,
150149
ARROW_RIGHT,
151150
ARROW_UP,
152151
ARROW_DOWN,

cpp-terminal/platforms/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
add_library(cpp-terminal-platforms terminal.cpp tty.cpp terminfo.cpp input.cpp base.cpp)
1+
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)
33
target_compile_options(cpp-terminal-platforms PRIVATE $<$<CXX_COMPILER_ID:MSVC>:/utf-8>)
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>)

0 commit comments

Comments
 (0)