Skip to content

Commit

Permalink
Implemented is_control_key.
Browse files Browse the repository at this point in the history
  • Loading branch information
KazDragon committed Aug 18, 2021
1 parent a898505 commit 7b9b6bc
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 78 deletions.
22 changes: 22 additions & 0 deletions include/terminalpp/virtual_key.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ enum class vk : byte
// ...
esc = terminalpp::detail::ascii::esc,
// ...
us = terminalpp::detail::ascii::us,
space = terminalpp::detail::ascii::space,
exclamation_mark = terminalpp::detail::ascii::exclamation_mark,
quotes = terminalpp::detail::ascii::quotes,
Expand Down Expand Up @@ -241,4 +242,25 @@ constexpr vk_modifier &operator&=(vk_modifier &lhs, vk_modifier const &rhs)
return lhs;
}

//* =========================================================================
/// \brief Streaming output operator
//* =========================================================================
TERMINALPP_EXPORT
std::ostream &operator<<(std::ostream &out, vk const &key);

// ==========================================================================
/// \brief Returns true iff the key is a control key.
// ==========================================================================
constexpr bool is_control_key(vk const &key)
{
constexpr vk control_set_begin = vk::nul;
constexpr vk control_set_end = vk::us;

constexpr vk abstract_set_begin = vk::del;
constexpr vk abstract_set_end = vk::f12;

return (key >= control_set_begin && key <= control_set_end)
|| (key >= abstract_set_begin && key <= abstract_set_end);
}

}
133 changes: 55 additions & 78 deletions src/virtual_key.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,84 +67,6 @@ std::ostream &operator<<(std::ostream &out, vk_modifier const &vkm)
return out;
}

// ==========================================================================
// OPERATOR<<(VK)
// ==========================================================================
std::ostream &operator<<(std::ostream &out, vk const &key)
{
auto is_control_key = [](vk const &control_key)
{
static constexpr vk control_set_begin = vk::nul;
static constexpr vk control_set_end = vk::space;

return control_key >= control_set_begin && control_key < control_set_end;
};

auto is_abstract_key = [](vk const &abstract_key)
{
static constexpr vk abstract_key_start = vk::cursor_up;

return abstract_key >= abstract_key_start;
};

if (is_control_key(key))
{
switch (key)
{
case vk::cr : out << "'\\r'"; break;
case vk::lf : out << "'\\n'"; break;
case vk::ht : out << "'\\t'"; break;
default :
{
boost::io::ios_all_saver ias(out);
out << "'\\x"
<< std::hex << std::setfill('0') << std::setw(2) << std::uppercase
<< int(static_cast<unsigned char>(key))
<< "'";
}
}
}
else if (is_abstract_key(key))
{
switch (key)
{
case vk::cursor_up : out << "cursor_up"; break;
case vk::cursor_down : out << "cursor_down"; break;
case vk::cursor_left : out << "cursor_left"; break;
case vk::cursor_right : out << "cursor_right"; break;

case vk::home : out << "home"; break;
case vk::ins : out << "ins"; break;
case vk::end : out << "end"; break;
case vk::pgup : out << "pgup"; break;
case vk::pgdn : out << "pgdn"; break;

case vk::bt : out << "bt"; break;
case vk::enter : out << "enter"; break;

case vk::f1 : out << "f1"; break;
case vk::f2 : out << "f2"; break;
case vk::f3 : out << "f3"; break;
case vk::f4 : out << "f4"; break;
case vk::f5 : out << "f5"; break;
case vk::f6 : out << "f6"; break;
case vk::f7 : out << "f7"; break;
case vk::f8 : out << "f8"; break;
case vk::f9 : out << "f9"; break;
case vk::f10 : out << "f10"; break;
case vk::f11 : out << "f11"; break;
case vk::f12 : out << "f12"; break;
default : out << "unk"; break;
}
}
else
{
out << "'" << static_cast<char>(key) << "'";
}

return out;
}

// ==========================================================================
// OUTPUT_COMMA
// ==========================================================================
Expand Down Expand Up @@ -232,4 +154,59 @@ std::ostream &operator<<(std::ostream &out, virtual_key const &vk)
return out << "]";
}

// ==========================================================================
// OPERATOR<<(VK)
// ==========================================================================
std::ostream &operator<<(std::ostream &out, vk const &key)
{
if (is_control_key(key))
{
switch (key)
{
case vk::cr : out << "'\\r'"; break;
case vk::lf : out << "'\\n'"; break;
case vk::ht : out << "'\\t'"; break;

case vk::cursor_up : out << "cursor_up"; break;
case vk::cursor_down : out << "cursor_down"; break;
case vk::cursor_left : out << "cursor_left"; break;
case vk::cursor_right : out << "cursor_right"; break;

case vk::home : out << "home"; break;
case vk::ins : out << "ins"; break;
case vk::end : out << "end"; break;
case vk::pgup : out << "pgup"; break;
case vk::pgdn : out << "pgdn"; break;

case vk::bt : out << "bt"; break;
case vk::enter : out << "enter"; break;

case vk::f1 : out << "f1"; break;
case vk::f2 : out << "f2"; break;
case vk::f3 : out << "f3"; break;
case vk::f4 : out << "f4"; break;
case vk::f5 : out << "f5"; break;
case vk::f6 : out << "f6"; break;
case vk::f7 : out << "f7"; break;
case vk::f8 : out << "f8"; break;
case vk::f9 : out << "f9"; break;
case vk::f10 : out << "f10"; break;
case vk::f11 : out << "f11"; break;
case vk::f12 : out << "f12"; break;
default :
boost::io::ios_all_saver ias(out);
out << "'\\x"
<< std::hex << std::setfill('0') << std::setw(2) << std::uppercase
<< int(static_cast<unsigned char>(key))
<< "'";
}
}
else
{
out << "'" << static_cast<char>(key) << "'";
}

return out;
}

}
24 changes: 24 additions & 0 deletions test/virtual_key_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,27 @@ INSTANTIATE_TEST_SUITE_P(
virtual_keys_with_strings,
ValuesIn(virtual_key_strings)
);

TEST(keys_that_are_not_alphanumeric_or_punctuation, are_control_keys)
{
for (terminalpp::vk key = terminalpp::vk::nul;
key < terminalpp::vk::space;
key = static_cast<terminalpp::vk>(static_cast<int>(key) + 1))
{
ASSERT_TRUE(is_control_key(key)) << "vk = " << key;
}

for (terminalpp::vk key = terminalpp::vk::space;
key < terminalpp::vk::del;
key = static_cast<terminalpp::vk>(static_cast<int>(key) + 1))
{
ASSERT_FALSE(is_control_key(key)) << "vk = " << key;
}

for (terminalpp::vk key = terminalpp::vk::del;
key <= terminalpp::vk::f12;
key = static_cast<terminalpp::vk>(static_cast<int>(key) + 1))
{
ASSERT_TRUE(is_control_key(key)) << "vk = " << key;
}
}

0 comments on commit 7b9b6bc

Please sign in to comment.