Skip to content

Commit d9a0807

Browse files
committed
Rows columns
1 parent cb22be8 commit d9a0807

File tree

10 files changed

+109
-51
lines changed

10 files changed

+109
-51
lines changed

cpp-terminal/private/screen.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@ Term::Screen Term::screen_size()
2525
{
2626
#ifdef _WIN32
2727
CONSOLE_SCREEN_BUFFER_INFO inf;
28-
if(GetConsoleScreenBufferInfo(Private::out.handle(), &inf)) return Term::Screen(static_cast<std::size_t>(inf.srWindow.Bottom - inf.srWindow.Top + 1), static_cast<std::size_t>(inf.srWindow.Right - inf.srWindow.Left + 1));
29-
return Term::Screen();
28+
if(GetConsoleScreenBufferInfo(Private::out.handle(), &inf)) return Term::Screen({Term::Rows(inf.srWindow.Bottom - inf.srWindow.Top + 1), Term::Columns(inf.srWindow.Right - inf.srWindow.Left + 1)});
29+
return {};
3030
#else
31-
Term::Screen ret;
3231
struct winsize window{0, 0, 0, 0};
33-
if(ioctl(Private::out.fd(), TIOCGWINSZ, &window) != -1) ret = {window.ws_row, window.ws_col};
34-
return ret;
32+
if(ioctl(Private::out.fd(), TIOCGWINSZ, &window) != -1) return Term::Screen({Term::Rows(window.ws_row), Term::Columns(window.ws_col)});
33+
return {};
3534
#endif
3635
}

cpp-terminal/prompt.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "cpp-terminal/screen.hpp"
2121
#include "cpp-terminal/terminal.hpp"
2222
#include "cpp-terminal/tty.hpp"
23+
#include "size.hpp"
2324

2425
#include <iostream>
2526

@@ -209,7 +210,7 @@ void Term::render(Term::Window& scr, const Model& model, const std::size_t& cols
209210
std::string Term::prompt_multiline(const std::string& prompt_string, std::vector<std::string>& m_history, std::function<bool(std::string)>& iscomplete)
210211
{
211212
Term::Cursor cursor;
212-
Term::Screen screen(25, 80);
213+
Term::Screen screen({Term::Rows(25), Term::Columns(80)});
213214
bool term_attached = Term::is_stdin_a_tty();
214215
if(is_stdin_a_tty())
215216
{
@@ -226,7 +227,7 @@ std::string Term::prompt_multiline(const std::string& prompt_string, std::vector
226227
std::size_t history_pos = history.size();
227228
history.push_back(concat(model.lines)); // Push back empty input
228229

229-
Term::Window scr(screen.columns(), 1);
230+
Term::Window scr({Term::Columns(screen.columns()), Term::Rows(1)});
230231
Term::Key key;
231232
render(scr, model, screen.columns());
232233
std::cout << scr.render(1, cursor.row(), term_attached) << std::flush;
@@ -306,7 +307,7 @@ std::string Term::prompt_multiline(const std::string& prompt_string, std::vector
306307
model.lines = split(history[history_pos]);
307308
model.cursor_row = model.lines.size();
308309
if(model.cursor_col > model.lines[model.cursor_row - 1].size() + 1) { model.cursor_col = model.lines[model.cursor_row - 1].size() + 1; }
309-
if(model.lines.size() > scr.get_h()) { scr.set_h(model.lines.size()); }
310+
if(model.lines.size() > scr.columns()) { scr.set_h(model.lines.size()); }
310311
}
311312
}
312313
else
@@ -325,7 +326,7 @@ std::string Term::prompt_multiline(const std::string& prompt_string, std::vector
325326
model.lines = split(history[history_pos]);
326327
model.cursor_row = 1;
327328
if(model.cursor_col > model.lines[model.cursor_row - 1].size() + 1) { model.cursor_col = model.lines[model.cursor_row - 1].size() + 1; }
328-
if(model.lines.size() > scr.get_h()) { scr.set_h(model.lines.size()); }
329+
if(model.lines.size() > scr.columns()) { scr.set_h(model.lines.size()); }
329330
}
330331
}
331332
else
@@ -347,17 +348,17 @@ std::string Term::prompt_multiline(const std::string& prompt_string, std::vector
347348
else { model.lines.push_back(after); }
348349
model.cursor_col = 1;
349350
model.cursor_row++;
350-
if(model.lines.size() > scr.get_h()) { scr.set_h(model.lines.size()); }
351+
if(model.lines.size() > scr.columns()) { scr.set_h(model.lines.size()); }
351352
break;
352353
}
353354
default: break;
354355
}
355356
}
356357
render(scr, model, screen.columns());
357358
std::cout << scr.render(1, cursor.row(), term_attached) << std::flush;
358-
if(cursor.row() + (int)scr.get_h() - 1 > screen.rows())
359+
if(cursor.row() + scr.columns() - 1 > screen.rows())
359360
{
360-
cursor.setRow(static_cast<std::uint16_t>(static_cast<long>(screen.rows()) - (static_cast<long>(scr.get_h()) - 1)));
361+
cursor.setRow(static_cast<std::uint16_t>(screen.rows() - (scr.columns() - 1)));
361362
std::cout << scr.render(1, cursor.row(), term_attached) << std::flush;
362363
}
363364
}

cpp-terminal/screen.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99

1010
#include "cpp-terminal/screen.hpp"
1111

12-
Term::Screen::Screen(const std::size_t& rows, const std::size_t& columns) : m_size({rows, columns}) {}
12+
#include "size.hpp"
1313

14-
std::size_t Term::Screen::rows() const { return m_size.first; }
14+
Term::Screen::Screen(const Term::Size& size) : m_size(size) {}
1515

16-
std::size_t Term::Screen::columns() const { return m_size.second; }
16+
const Term::Rows& Term::Screen::rows() const noexcept { return m_size.rows(); }
1717

18-
bool Term::Screen::empty() const { return (0 == m_size.second) && (0 == m_size.first); }
18+
const Term::Columns& Term::Screen::columns() const noexcept { return m_size.columns(); }
19+
20+
bool Term::Screen::empty() const { return (0 == m_size.rows()) && (0 == m_size.columns()); }
1921

2022
std::string Term::clear_screen() { return "\u001b[2J"; }
2123

cpp-terminal/screen.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
#pragma once
1111

12-
#include <cstdint>
12+
#include "cpp-terminal/size.hpp"
13+
1314
#include <string>
14-
#include <utility>
1515

1616
namespace Term
1717
{
@@ -20,15 +20,15 @@ class Screen
2020
{
2121
public:
2222
Screen() = default;
23-
Screen(const std::size_t& rows, const std::size_t& columns);
24-
std::size_t rows() const;
25-
std::size_t columns() const;
26-
bool empty() const;
27-
bool operator==(const Term::Screen& screen) const;
28-
bool operator!=(const Term::Screen& screen) const;
23+
explicit Screen(const Size& size);
24+
const Rows& rows() const noexcept;
25+
const Columns& columns() const noexcept;
26+
bool empty() const;
27+
bool operator==(const Term::Screen& screen) const;
28+
bool operator!=(const Term::Screen& screen) const;
2929

3030
private:
31-
std::pair<std::size_t, std::size_t> m_size;
31+
Size m_size;
3232
};
3333

3434
// clear the screen
@@ -37,7 +37,7 @@ std::string clear_screen();
3737
std::string screen_save();
3838
// load a previously saved terminal state
3939
std::string screen_load();
40-
// get the terminal size (row, column) / (Y, X)
40+
// get the terminal size
4141
Screen screen_size();
4242

4343
} // namespace Term

cpp-terminal/size.hpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* cpp-terminal
3+
* C++ library for writing multi-platform terminal applications.
4+
*
5+
* SPDX-FileCopyrightText: 2019-2024 cpp-terminal
6+
*
7+
* SPDX-License-Identifier: MIT
8+
*/
9+
10+
#pragma once
11+
12+
#include <cstddef>
13+
#include <cstdint>
14+
15+
namespace Term
16+
{
17+
18+
class Rows
19+
{
20+
public:
21+
Rows() = default;
22+
explicit Rows(const std::uint16_t& rows) : m_rows(rows) {}
23+
operator std::size_t() const noexcept { return m_rows; }
24+
25+
private:
26+
std::uint16_t m_rows{0};
27+
};
28+
29+
class Columns
30+
{
31+
public:
32+
Columns() = default;
33+
explicit Columns(const std::uint16_t& columns) : m_columns(columns) {}
34+
operator std::size_t() const noexcept { return m_columns; }
35+
36+
private:
37+
std::uint16_t m_columns{0};
38+
};
39+
40+
class Size
41+
{
42+
public:
43+
Size() = default;
44+
Size(const Rows& rows, const Columns& columns) : m_rows(rows), m_columns(columns) {};
45+
Size(const Columns& columns, const Rows& rows) : m_rows(rows), m_columns(columns) {};
46+
std::size_t area() const noexcept { return static_cast<std::size_t>(m_rows) * static_cast<std::size_t>(m_columns); }
47+
const Rows& rows() const noexcept { return m_rows; }
48+
const Columns& columns() const noexcept { return m_columns; }
49+
50+
private:
51+
Rows m_rows;
52+
Columns m_columns;
53+
};
54+
55+
} // namespace Term

cpp-terminal/window.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515
#include "cpp-terminal/private/conversion.hpp"
1616
#include "cpp-terminal/private/unicode.hpp"
1717
#include "cpp-terminal/prompt.hpp"
18+
#include "cpp-terminal/screen.hpp"
19+
#include "cpp-terminal/size.hpp"
1820
#include "cpp-terminal/terminal.hpp"
1921
#include "cpp-terminal/terminfo.hpp"
2022

21-
#include <cstddef>
22-
2323
namespace Term
2424
{
2525

26-
Term::Window::Window(const std::size_t& columns, const std::size_t& rows) : m_size({rows, columns}) { clear(); }
26+
Term::Window::Window(const Term::Size& size) : m_size(size) { clear(); }
27+
28+
Term::Window::Window(const Term::Screen& screen) : m_size({screen.rows(), screen.columns()}) { clear(); }
2729

2830
char32_t Term::Window::get_char(const std::size_t& column, const std::size_t& row) { return m_chars[index(column, row)]; }
2931

@@ -37,9 +39,9 @@ Term::Color Term::Window::get_bg(const std::size_t& column, const std::size_t& r
3739

3840
Term::Style Term::Window::get_style(const std::size_t& column, const std::size_t& row) { return m_style[index(column, row)]; }
3941

40-
std::size_t Term::Window::get_w() const { return m_size.columns(); }
42+
const Columns& Term::Window::columns() const noexcept { return m_size.columns(); }
4143

42-
std::size_t Term::Window::get_h() const { return m_size.rows(); }
44+
const Rows& Term::Window::rows() const noexcept { return m_size.rows(); }
4345

4446
void Term::Window::set_char(const std::size_t& column, const std::size_t& row, const char32_t& character)
4547
{
@@ -87,7 +89,7 @@ void Term::Window::set_h(const std::size_t& new_h)
8789
m_fg.insert(m_fg.end(), dc, {0, 0, 0});
8890
m_bg.insert(m_bg.end(), dc, {0, 0, 0});
8991
m_style.insert(m_style.end(), dc, Style::Reset);
90-
m_size = {m_size.columns(), new_h};
92+
m_size = {Term::Columns(m_size.columns()), Term::Rows(new_h)};
9193
}
9294
else { throw Term::Exception("Shrinking height not supported."); }
9395
}
@@ -186,13 +188,12 @@ void Term::Window::print_rect(const std::size_t& x1, const std::size_t& y1, cons
186188

187189
void Term::Window::clear()
188190
{
189-
const std::size_t area{m_size.rows() * m_size.columns()};
190-
m_style.assign(area, Style::Reset);
191-
m_bg_reset.assign(area, true);
192-
m_bg.assign(area, Term::Color::Name::Default);
193-
m_fg_reset.assign(area, true);
194-
m_fg.assign(area, Term::Color::Name::Default);
195-
m_chars.assign(area, ' ');
191+
m_style.assign(m_size.area(), Style::Reset);
192+
m_bg_reset.assign(m_size.area(), true);
193+
m_bg.assign(m_size.area(), Term::Color::Name::Default);
194+
m_fg_reset.assign(m_size.area(), true);
195+
m_fg.assign(m_size.area(), Term::Color::Name::Default);
196+
m_chars.assign(m_size.area(), ' ');
196197
}
197198

198199
std::string Term::Window::render(const std::size_t& x0, const std::size_t& y0, bool term)

cpp-terminal/window.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include "cpp-terminal/color.hpp"
1313
#include "cpp-terminal/cursor.hpp"
14-
#include "cpp-terminal/screen.hpp"
14+
#include "cpp-terminal/size.hpp"
1515
#include "cpp-terminal/style.hpp"
1616

1717
#include <cstddef>
@@ -20,6 +20,7 @@
2020
namespace Term
2121
{
2222

23+
class Screen;
2324
///
2425
/// @brief Represents a rectangular window, as a 2D array of characters and their attributes.
2526
///
@@ -32,11 +33,10 @@ namespace Term
3233
class Window
3334
{
3435
public:
35-
Window(const std::size_t& columns, const std::size_t& rows);
36-
37-
std::size_t get_w() const;
38-
39-
std::size_t get_h() const;
36+
explicit Window(const Size& size);
37+
explicit Window(const Screen& screen);
38+
const Columns& columns() const noexcept;
39+
const Rows& rows() const noexcept;
4040

4141
void set_char(const std::size_t& column, const std::size_t& row, const char32_t& character);
4242

@@ -78,7 +78,7 @@ class Window
7878

7979
private:
8080
std::size_t index(const std::size_t& column, const std::size_t& row) const;
81-
Term::Screen m_size{0, 0};
81+
Term::Size m_size;
8282
Term::Cursor m_cursor{1, 1};
8383
std::vector<char32_t> m_chars; // the characters in row first order
8484
std::vector<Term::Color> m_fg;

examples/menu_window.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ int main()
6565
std::size_t h{10};
6666
std::size_t w{10};
6767
bool on = true;
68-
Term::Window scr(term_size.columns(), term_size.rows());
68+
Term::Window scr(term_size);
6969
bool need_to_render{true};
7070
while(on)
7171
{

tests/events.test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ TEST_CASE("default Event")
3535

3636
TEST_CASE("Event with Screen")
3737
{
38-
Term::Event event(Term::Screen(4, 2));
38+
Term::Event event(Term::Screen({Term::Rows(4), Term::Columns(2)}));
3939
CHECK(event.empty() == false);
40-
CHECK(*event.get_if_screen() == Term::Screen(4, 2));
40+
CHECK(*event.get_if_screen() == Term::Screen({Term::Rows(4), Term::Columns(2)}));
4141
CHECK(event.get_if_focus() == nullptr);
4242
CHECK(event.get_if_cursor() == nullptr);
4343
CHECK(event.get_if_key() == nullptr);
@@ -46,7 +46,7 @@ TEST_CASE("Event with Screen")
4646
CHECK(event.type() == Term::Event::Type::Screen);
4747
const Term::Event event2 = event;
4848
CHECK(event2.empty() == false);
49-
CHECK(*event.get_if_screen() == Term::Screen(4, 2));
49+
CHECK(*event.get_if_screen() == Term::Screen({Term::Rows(4), Term::Columns(2)}));
5050
CHECK(event2.get_if_focus() == nullptr);
5151
CHECK(event2.get_if_cursor() == nullptr);
5252
CHECK(event2.get_if_key() == nullptr);

tests/screen.test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ TEST_CASE("Test Term::Screen")
2121

2222
TEST_CASE("Test Term::Screen(5,10)")
2323
{
24-
Term::Screen screen(5, 10);
24+
Term::Screen screen({Term::Rows(5), Term::Columns(10)});
2525
CHECK(screen.rows() == 5);
2626
CHECK(screen.columns() == 10);
2727
CHECK(screen.empty() == false);

0 commit comments

Comments
 (0)