Using std::string for the attribute buffer
This commit is contained in:
parent
920daaba1f
commit
95c0717589
|
@ -1,3 +1,6 @@
|
||||||
|
2021-05-24 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* Using std::string for the attribute buffer
|
||||||
|
|
||||||
2021-05-22 Markus Gans <guru.mail@muenster.de>
|
2021-05-22 Markus Gans <guru.mail@muenster.de>
|
||||||
* Convert FOptiMove from char[] to std::string
|
* Convert FOptiMove from char[] to std::string
|
||||||
|
|
||||||
|
|
|
@ -167,22 +167,21 @@ void tcapNumeric (const std::string& name, int cap_num)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void tcapString (const std::string& name, const char cap_str[])
|
void tcapString (const std::string& name, const char cap_string[])
|
||||||
{
|
{
|
||||||
std::string sequence{};
|
std::string sequence{};
|
||||||
|
std::string cap_str{cap_string ? cap_string : std::string{}};
|
||||||
std::cout << name << ": ";
|
std::cout << name << ": ";
|
||||||
|
|
||||||
if ( cap_str == nullptr )
|
if ( cap_str.empty() )
|
||||||
{
|
{
|
||||||
std::cout << "\r\n";
|
std::cout << "\r\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto len = uInt(std::strlen(cap_str));
|
for (auto&& ch : cap_str)
|
||||||
|
|
||||||
for (uInt i{0}; i < len; i++)
|
|
||||||
{
|
{
|
||||||
const auto c = uChar(cap_str[i]);
|
const auto c = uChar(ch);
|
||||||
|
|
||||||
if ( c > 127 )
|
if ( c > 127 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -372,18 +372,16 @@ void FFileDialog::initCallbacks()
|
||||||
inline bool FFileDialog::patternMatch ( const char* const pattern
|
inline bool FFileDialog::patternMatch ( const char* const pattern
|
||||||
, const char fname[] ) const
|
, const char fname[] ) const
|
||||||
{
|
{
|
||||||
std::array<char, 128> search{};
|
std::string search{};
|
||||||
|
search.reserve(128);
|
||||||
|
|
||||||
if ( show_hidden && fname[0] == '.' && fname[1] != '\0' ) // hidden files
|
if ( show_hidden && fname[0] == '.' && fname[1] != '\0' ) // hidden files
|
||||||
{
|
{
|
||||||
search[0] = '.';
|
search = ".";
|
||||||
search[1] = '\0';
|
search.append(pattern);
|
||||||
std::strncat(search.data(), pattern, search.size() - std::strlen(search.data()) - 1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
std::strncpy(search.data(), pattern, search.size() - 1);
|
search = pattern;
|
||||||
|
|
||||||
search[search.size() - 1] = '\0';
|
|
||||||
|
|
||||||
if ( fnmatch (search.data(), fname, FNM_PERIOD) == 0 )
|
if ( fnmatch (search.data(), fname, FNM_PERIOD) == 0 )
|
||||||
return true;
|
return true;
|
||||||
|
@ -550,16 +548,11 @@ void FFileDialog::followSymLink (const char* const dir, FDirEntry& entry) const
|
||||||
return; // No symbolic link
|
return; // No symbolic link
|
||||||
|
|
||||||
std::array<char, MAXPATHLEN> resolved_path{};
|
std::array<char, MAXPATHLEN> resolved_path{};
|
||||||
std::array<char, MAXPATHLEN> symLink{};
|
std::string symLink{};
|
||||||
|
symLink.reserve(MAXPATHLEN);
|
||||||
struct stat sb{};
|
struct stat sb{};
|
||||||
|
|
||||||
const auto& fsystem = FTerm::getFSystem();
|
const auto& fsystem = FTerm::getFSystem();
|
||||||
std::strncpy (symLink.data(), dir, symLink.size() - 1);
|
symLink = dir + entry.name;
|
||||||
symLink[symLink.size() - 1] = '\0';
|
|
||||||
std::strncat ( symLink.data()
|
|
||||||
, entry.name.c_str()
|
|
||||||
, symLink.size() - std::strlen(symLink.data()) - 1);
|
|
||||||
symLink[symLink.size() - 1] = '\0';
|
|
||||||
|
|
||||||
if ( fsystem->realpath(symLink.data(), resolved_path.data()) == nullptr )
|
if ( fsystem->realpath(symLink.data(), resolved_path.data()) == nullptr )
|
||||||
return; // Cannot follow the symlink
|
return; // Cannot follow the symlink
|
||||||
|
|
|
@ -396,18 +396,18 @@ inline bool FKeyboard::isKeypressTimeout()
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
FKey FKeyboard::UTF8decode (const char utf8[]) const
|
FKey FKeyboard::UTF8decode (const std::string& utf8) const
|
||||||
{
|
{
|
||||||
|
using distance_type = std::iterator_traits<std::string::iterator>::difference_type;
|
||||||
FKey ucs{FKey::None}; // Universal coded character
|
FKey ucs{FKey::None}; // Universal coded character
|
||||||
constexpr std::size_t max = 4;
|
constexpr std::size_t max = 4;
|
||||||
std::size_t len = std::strlen(utf8);
|
const auto len = utf8.length();
|
||||||
|
auto end = utf8.begin()
|
||||||
|
+ static_cast<distance_type>(std::min(len, max));
|
||||||
|
|
||||||
if ( len > max )
|
for (auto iter{utf8.begin()}; iter < end; ++iter)
|
||||||
len = max;
|
|
||||||
|
|
||||||
for (std::size_t i{0}; i < len; ++i)
|
|
||||||
{
|
{
|
||||||
const auto ch = uChar(utf8[i]);
|
const auto ch = uChar(*iter);
|
||||||
|
|
||||||
if ( (ch & 0xc0) == 0x80 )
|
if ( (ch & 0xc0) == 0x80 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,6 +39,8 @@ namespace finalcut
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
FOptiAttr::FOptiAttr()
|
FOptiAttr::FOptiAttr()
|
||||||
{
|
{
|
||||||
|
attr_buf.reserve(SGRoptimizer::ATTR_BUF_SIZE);
|
||||||
|
|
||||||
// Set bits that must not be reset
|
// Set bits that must not be reset
|
||||||
reset_byte_mask.attr.bit.transparent = true;
|
reset_byte_mask.attr.bit.transparent = true;
|
||||||
reset_byte_mask.attr.bit.color_overlay = true;
|
reset_byte_mask.attr.bit.color_overlay = true;
|
||||||
|
@ -543,11 +545,11 @@ FColor FOptiAttr::vga2ansi (FColor color)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const char* FOptiAttr::changeAttribute (FChar& term, FChar& next)
|
std::string FOptiAttr::changeAttribute (FChar& term, FChar& next)
|
||||||
{
|
{
|
||||||
const bool next_has_color = hasColor(next);
|
const bool next_has_color = hasColor(next);
|
||||||
fake_reverse = false;
|
fake_reverse = false;
|
||||||
attr_buf[0] = '\0';
|
attr_buf.clear();
|
||||||
prevent_no_color_video_attributes (term, next_has_color);
|
prevent_no_color_video_attributes (term, next_has_color);
|
||||||
prevent_no_color_video_attributes (next);
|
prevent_no_color_video_attributes (next);
|
||||||
detectSwitchOn (term, next);
|
detectSwitchOn (term, next);
|
||||||
|
@ -559,7 +561,7 @@ const char* FOptiAttr::changeAttribute (FChar& term, FChar& next)
|
||||||
|
|
||||||
// Look for no changes
|
// Look for no changes
|
||||||
if ( ! (switchOn() || switchOff() || hasColorChanged(term, next)) )
|
if ( ! (switchOn() || switchOff() || hasColorChanged(term, next)) )
|
||||||
return nullptr;
|
return {};
|
||||||
|
|
||||||
if ( hasNoAttribute(next) )
|
if ( hasNoAttribute(next) )
|
||||||
{
|
{
|
||||||
|
@ -578,7 +580,7 @@ const char* FOptiAttr::changeAttribute (FChar& term, FChar& next)
|
||||||
if ( FStartOptions::getFStartOptions().sgr_optimizer )
|
if ( FStartOptions::getFStartOptions().sgr_optimizer )
|
||||||
sgr_optimizer.optimize();
|
sgr_optimizer.optimize();
|
||||||
|
|
||||||
return attr_buf.data();
|
return attr_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1537,9 +1539,7 @@ inline bool FOptiAttr::append_sequence (const char seq[])
|
||||||
if ( ! seq )
|
if ( ! seq )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char* attr_ptr{attr_buf.data()};
|
attr_buf.append(seq);
|
||||||
std::strncat (attr_ptr, seq, attr_buf.size() - std::strlen(attr_ptr));
|
|
||||||
attr_buf[attr_buf.size() - 1] = '\0';
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -428,9 +428,9 @@ bool FTerm::isInitialized()
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
bool FTerm::isCursorHideable()
|
bool FTerm::isCursorHideable()
|
||||||
{
|
{
|
||||||
const char* cursor_off_str = disableCursorString();
|
const auto& cursor_off_str = disableCursorString();
|
||||||
|
|
||||||
if ( cursor_off_str && std::strlen(cursor_off_str) > 0 )
|
if ( ! cursor_off_str.empty() )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -732,28 +732,28 @@ std::string FTerm::moveCursorString (int xold, int yold, int xnew, int ynew)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const char* FTerm::cursorsVisibilityString (bool enable)
|
std::string FTerm::cursorsVisibilityString (bool enable)
|
||||||
{
|
{
|
||||||
// Hides or shows the input cursor on the terminal
|
// Hides or shows the input cursor on the terminal
|
||||||
|
|
||||||
const char* visibility_str{nullptr};
|
std::string visibility_str{};
|
||||||
auto& data = FTerm::getFTermData();
|
auto& data = FTerm::getFTermData();
|
||||||
|
|
||||||
if ( data.isCursorHidden() == enable )
|
if ( data.isCursorHidden() == enable )
|
||||||
return nullptr;
|
return {};
|
||||||
|
|
||||||
if ( enable )
|
if ( enable )
|
||||||
{
|
{
|
||||||
visibility_str = disableCursorString();
|
visibility_str = disableCursorString();
|
||||||
|
|
||||||
if ( visibility_str )
|
if ( ! visibility_str.empty() )
|
||||||
data.setCursorHidden (true); // Global state
|
data.setCursorHidden (true); // Global state
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
visibility_str = enableCursorString();
|
visibility_str = enableCursorString();
|
||||||
|
|
||||||
if ( visibility_str )
|
if ( ! visibility_str.empty() )
|
||||||
data.setCursorHidden (false); // Global state
|
data.setCursorHidden (false); // Global state
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1157,7 +1157,7 @@ void FTerm::initScreenSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const char* FTerm::changeAttribute (FChar& term_attr, FChar& next_attr)
|
std::string FTerm::changeAttribute (FChar& term_attr, FChar& next_attr)
|
||||||
{
|
{
|
||||||
auto& opti_attr = FTerm::getFOptiAttr();
|
auto& opti_attr = FTerm::getFOptiAttr();
|
||||||
return opti_attr.changeAttribute (term_attr, next_attr);
|
return opti_attr.changeAttribute (term_attr, next_attr);
|
||||||
|
@ -1837,19 +1837,20 @@ void FTerm::setOverwriteCursorStyle()
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const char* FTerm::enableCursorString()
|
std::string FTerm::enableCursorString()
|
||||||
{
|
{
|
||||||
// Returns the cursor enable string
|
// Returns the cursor enable string
|
||||||
|
|
||||||
static constexpr std::size_t SIZE = 32;
|
static constexpr std::string::size_type SIZE{32u};
|
||||||
static std::array<char, SIZE> enable_str{};
|
std::string enable_str{};
|
||||||
|
enable_str.reserve(SIZE);
|
||||||
const auto& vs = TCAP(t_cursor_visible);
|
const auto& vs = TCAP(t_cursor_visible);
|
||||||
const auto& ve = TCAP(t_cursor_normal);
|
const auto& ve = TCAP(t_cursor_normal);
|
||||||
|
|
||||||
if ( ve )
|
if ( ve )
|
||||||
std::strncpy (enable_str.data(), ve, SIZE - 1);
|
enable_str = ve;
|
||||||
else if ( vs )
|
else if ( vs )
|
||||||
std::strncpy (enable_str.data(), vs, SIZE - 1);
|
enable_str = vs;
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
if ( isLinuxTerm() )
|
if ( isLinuxTerm() )
|
||||||
|
@ -1857,13 +1858,10 @@ const char* FTerm::enableCursorString()
|
||||||
// Restore the last used Linux console cursor style
|
// Restore the last used Linux console cursor style
|
||||||
auto& linux_console = FTerm::getFTermLinux();
|
auto& linux_console = FTerm::getFTermLinux();
|
||||||
const char* cstyle = linux_console.getCursorStyleString();
|
const char* cstyle = linux_console.getCursorStyleString();
|
||||||
std::size_t length = std::strlen(enable_str.data());
|
enable_str.append(cstyle);
|
||||||
std::strncat (enable_str.data(), cstyle, SIZE - length - 1);
|
|
||||||
}
|
}
|
||||||
#endif // defined(__linux__)
|
#endif // defined(__linux__)
|
||||||
|
|
||||||
enable_str[SIZE - 1] = '\0';
|
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
||||||
if ( isFreeBSDTerm() )
|
if ( isFreeBSDTerm() )
|
||||||
{
|
{
|
||||||
|
@ -1873,11 +1871,11 @@ const char* FTerm::enableCursorString()
|
||||||
}
|
}
|
||||||
#endif // defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
#endif // defined(__FreeBSD__) || defined(__DragonFly__) || defined(UNIT_TEST)
|
||||||
|
|
||||||
return enable_str.data();
|
return enable_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const char* FTerm::disableCursorString()
|
std::string FTerm::disableCursorString()
|
||||||
{
|
{
|
||||||
// Returns the cursor disable string
|
// Returns the cursor disable string
|
||||||
|
|
||||||
|
@ -1886,7 +1884,7 @@ const char* FTerm::disableCursorString()
|
||||||
if ( vi )
|
if ( vi )
|
||||||
return vi;
|
return vi;
|
||||||
|
|
||||||
return nullptr;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
|
@ -689,10 +689,10 @@ FPoint readCursorPos()
|
||||||
const int stdout_no{FTermios::getStdOut()};
|
const int stdout_no{FTermios::getStdOut()};
|
||||||
fd_set ifds{};
|
fd_set ifds{};
|
||||||
struct timeval tv{};
|
struct timeval tv{};
|
||||||
constexpr auto& DECXCPR{ESC "[6n"};
|
const std::string DECXCPR{ESC "[6n"};
|
||||||
|
|
||||||
// Report Cursor Position (DECXCPR)
|
// Report Cursor Position (DECXCPR)
|
||||||
if ( write(stdout_no, DECXCPR, std::strlen(DECXCPR)) < 1 )
|
if ( write(stdout_no, DECXCPR.data(), DECXCPR.length()) < 1 )
|
||||||
return {x, y};
|
return {x, y};
|
||||||
|
|
||||||
std::fflush(stdout);
|
std::fflush(stdout);
|
||||||
|
|
|
@ -330,9 +330,9 @@ void FTermDetection::termtypeAnalysis()
|
||||||
if ( std::strncmp(termtype, "screen", 6) == 0 )
|
if ( std::strncmp(termtype, "screen", 6) == 0 )
|
||||||
{
|
{
|
||||||
terminal_type.screen = true;
|
terminal_type.screen = true;
|
||||||
const char* tmux = std::getenv("TMUX");
|
std::string tmux = std::getenv("TMUX");
|
||||||
|
|
||||||
if ( tmux && std::strlen(tmux) != 0 )
|
if ( tmux.length() != 0 )
|
||||||
terminal_type.tmux = true;
|
terminal_type.tmux = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -813,10 +813,10 @@ FString FTermDetection::getSecDA()
|
||||||
const int stdout_no{FTermios::getStdOut()};
|
const int stdout_no{FTermios::getStdOut()};
|
||||||
fd_set ifds{};
|
fd_set ifds{};
|
||||||
struct timeval tv{};
|
struct timeval tv{};
|
||||||
constexpr auto& SECDA{ESC "[>c"};
|
const std::string SECDA{ESC "[>c"};
|
||||||
|
|
||||||
// Get the secondary device attributes
|
// Get the secondary device attributes
|
||||||
if ( write(stdout_no, SECDA, std::strlen(SECDA)) == -1 )
|
if ( write(stdout_no, SECDA.data(), SECDA.length()) == -1 )
|
||||||
return sec_da_str;
|
return sec_da_str;
|
||||||
|
|
||||||
std::fflush(stdout);
|
std::fflush(stdout);
|
||||||
|
|
|
@ -769,12 +769,12 @@ FString FTermXTerminal::captureXTermFont() const
|
||||||
&& temp[3] == '0' && temp[4] == ';' )
|
&& temp[3] == '0' && temp[4] == ';' )
|
||||||
{
|
{
|
||||||
// Skip leading Esc ] 5 0 ;
|
// Skip leading Esc ] 5 0 ;
|
||||||
char* str = &temp[5];
|
std::string str = &temp[5];
|
||||||
const std::size_t n = std::strlen(str);
|
const std::size_t n = str.length();
|
||||||
|
|
||||||
// BEL + '\0' = string terminator
|
// BEL + '\0' = string terminator
|
||||||
if ( n >= 5 && str[n - 1] == BEL[0] && str[n] == '\0' )
|
if ( n >= 5 && str[n - 1] == BEL[0] && str[n] == '\0' )
|
||||||
str[n - 1] = '\0';
|
str.erase(n - 1);
|
||||||
|
|
||||||
return {str};
|
return {str};
|
||||||
}
|
}
|
||||||
|
@ -822,8 +822,8 @@ FString FTermXTerminal::captureXTermTitle() const
|
||||||
if ( pos > 6 && temp[0] == ESC[0] && temp[1] == ']' && temp[2] == 'l' )
|
if ( pos > 6 && temp[0] == ESC[0] && temp[1] == ']' && temp[2] == 'l' )
|
||||||
{
|
{
|
||||||
// Skip leading Esc + ] + l = OSC l
|
// Skip leading Esc + ] + l = OSC l
|
||||||
char* str = &temp[3];
|
std::string str = &temp[3];
|
||||||
const std::size_t n = std::strlen(str);
|
const std::size_t n = str.length();
|
||||||
|
|
||||||
// Esc + \ = OSC string terminator
|
// Esc + \ = OSC string terminator
|
||||||
if ( n >= 2 && str[n - 2] == ESC[0] && str[n - 1] == '\\' )
|
if ( n >= 2 && str[n - 2] == ESC[0] && str[n - 1] == '\\' )
|
||||||
|
@ -831,7 +831,7 @@ FString FTermXTerminal::captureXTermTitle() const
|
||||||
if ( n < 4 )
|
if ( n < 4 )
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
str[n - 2] = '\0';
|
str.erase(n - 2);
|
||||||
return {str};
|
return {str};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,9 +185,9 @@ void FVTerm::hideCursor (bool enable) const
|
||||||
if ( ! cursor_hideable )
|
if ( ! cursor_hideable )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const char* visibility_str = FTerm::cursorsVisibilityString (enable);
|
auto visibility_str = FTerm::cursorsVisibilityString (enable);
|
||||||
|
|
||||||
if ( ! visibility_str ) // Exit the function if the string is empty
|
if ( visibility_str.empty() ) // Exit the function if the string is empty
|
||||||
return;
|
return;
|
||||||
|
|
||||||
appendOutputBuffer(FTermControl{visibility_str});
|
appendOutputBuffer(FTermControl{visibility_str});
|
||||||
|
@ -1764,8 +1764,8 @@ FChar FVTerm::getCharacter ( CharacterType char_type
|
||||||
|
|
||||||
const int x = pos.getX();
|
const int x = pos.getX();
|
||||||
const int y = pos.getY();
|
const int y = pos.getY();
|
||||||
int xx = ( x > 0 ) ? x : 0;
|
int xx = std::max(x, 0);
|
||||||
int yy = ( y > 0 ) ? y : 0;
|
int yy = std::max(y, 0);
|
||||||
|
|
||||||
if ( xx >= vterm->width )
|
if ( xx >= vterm->width )
|
||||||
xx = vterm->width - 1;
|
xx = vterm->width - 1;
|
||||||
|
@ -3080,7 +3080,7 @@ inline void FVTerm::appendAttributes (FChar& next_attr) const
|
||||||
// generate attribute string for the next character
|
// generate attribute string for the next character
|
||||||
const auto& attr_str = FTerm::changeAttribute (term_attribute, next_attr);
|
const auto& attr_str = FTerm::changeAttribute (term_attribute, next_attr);
|
||||||
|
|
||||||
if ( attr_str )
|
if ( ! attr_str.empty() )
|
||||||
appendOutputBuffer (FTermControl{attr_str});
|
appendOutputBuffer (FTermControl{attr_str});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
* <http://www.gnu.org/licenses/>. *
|
* <http://www.gnu.org/licenses/>. *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "final/fapplication.h"
|
#include "final/fapplication.h"
|
||||||
|
@ -405,7 +406,7 @@ void FWidget::setPos (const FPoint& p, bool adjust)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! isWindowWidget() )
|
if ( ! isWindowWidget() ) // A widgets must be inside the client area
|
||||||
{
|
{
|
||||||
if ( pos.getX() < 1 )
|
if ( pos.getX() < 1 )
|
||||||
pos.setX(1);
|
pos.setX(1);
|
||||||
|
@ -430,7 +431,7 @@ void FWidget::setWidth (std::size_t width, bool adjust)
|
||||||
if ( getWidth() == width && wsize.getWidth() == width )
|
if ( getWidth() == width && wsize.getWidth() == width )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( width < 1 )
|
if ( width < 1 ) // A width can never be narrower than 1 character
|
||||||
width = 1;
|
width = 1;
|
||||||
|
|
||||||
wsize.setWidth(width);
|
wsize.setWidth(width);
|
||||||
|
@ -452,7 +453,7 @@ void FWidget::setHeight (std::size_t height, bool adjust)
|
||||||
if ( getHeight() == height && wsize.getHeight() == height )
|
if ( getHeight() == height && wsize.getHeight() == height )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( height < 1 )
|
if ( height < 1 ) // A height can never be narrower than 1 character
|
||||||
height = 1;
|
height = 1;
|
||||||
|
|
||||||
wsize.setHeight(height);
|
wsize.setHeight(height);
|
||||||
|
@ -479,10 +480,10 @@ void FWidget::setSize (const FSize& size, bool adjust)
|
||||||
&& getHeight() == height && wsize.getHeight() == height )
|
&& getHeight() == height && wsize.getHeight() == height )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( width < 1 )
|
if ( width < 1 ) // A width can never be narrower than 1 character
|
||||||
width = 1;
|
width = 1;
|
||||||
|
|
||||||
if ( height < 1 )
|
if ( height < 1 ) // A height can never be narrower than 1 character
|
||||||
height = 1;
|
height = 1;
|
||||||
|
|
||||||
wsize.setWidth(width);
|
wsize.setWidth(width);
|
||||||
|
@ -624,20 +625,19 @@ void FWidget::setGeometry (const FPoint& p, const FSize& s, bool adjust)
|
||||||
if ( getPos() == p && getWidth() == w && getHeight() == h )
|
if ( getPos() == p && getWidth() == w && getHeight() == h )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( ! isWindowWidget() )
|
if ( isWindowWidget() ) // A window widget can be outside
|
||||||
{
|
|
||||||
( x < 1 ) ? wsize.setX(1) : wsize.setX(x);
|
|
||||||
( y < 1 ) ? wsize.setY(1) : wsize.setY(y);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
wsize.setX(x);
|
wsize.setX(x);
|
||||||
wsize.setY(y);
|
wsize.setY(y);
|
||||||
}
|
}
|
||||||
|
else // A normal widget must be inside the client area
|
||||||
|
{
|
||||||
|
wsize.setX(std::max(x, 1));
|
||||||
|
wsize.setY(std::max(y, 1));
|
||||||
|
}
|
||||||
|
|
||||||
( w < 1 ) ? wsize.setWidth(1) : wsize.setWidth(w);
|
wsize.setWidth(std::max(w, std::size_t(1u)));
|
||||||
( h < 1 ) ? wsize.setHeight(1) : wsize.setHeight(h);
|
wsize.setHeight(std::max(h, std::size_t(1u)));
|
||||||
|
|
||||||
adjust_wsize = wsize;
|
adjust_wsize = wsize;
|
||||||
const int term_x = getTermX();
|
const int term_x = getTermX();
|
||||||
const int term_y = getTermY();
|
const int term_y = getTermY();
|
||||||
|
|
|
@ -162,7 +162,7 @@ class FKeyboard final
|
||||||
static bool isIntervalTimeout();
|
static bool isIntervalTimeout();
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
FKey UTF8decode (const char[]) const;
|
FKey UTF8decode (const std::string&) const;
|
||||||
ssize_t readKey();
|
ssize_t readKey();
|
||||||
void parseKeyBuffer();
|
void parseKeyBuffer();
|
||||||
FKey parseKeyString();
|
FKey parseKeyString();
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* *
|
* *
|
||||||
* This file is part of the FINAL CUT widget toolkit *
|
* This file is part of the FINAL CUT widget toolkit *
|
||||||
* *
|
* *
|
||||||
* Copyright 2016-2020 Markus Gans *
|
* Copyright 2016-2021 Markus Gans *
|
||||||
* *
|
* *
|
||||||
* FINAL CUT is free software; you can redistribute it and/or modify *
|
* FINAL CUT is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU Lesser General Public License as *
|
* it under the terms of the GNU Lesser General Public License as *
|
||||||
|
@ -156,7 +156,7 @@ class FOptiAttr final
|
||||||
// Methods
|
// Methods
|
||||||
void initialize();
|
void initialize();
|
||||||
static FColor vga2ansi (FColor);
|
static FColor vga2ansi (FColor);
|
||||||
const char* changeAttribute (FChar&, FChar&);
|
std::string changeAttribute (FChar&, FChar&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Capability
|
struct Capability
|
||||||
|
@ -165,9 +165,6 @@ class FOptiAttr final
|
||||||
bool caused_reset;
|
bool caused_reset;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Using-declaration
|
|
||||||
using AttributeBuffer = SGRoptimizer::AttributeBuffer;
|
|
||||||
|
|
||||||
// Enumerations
|
// Enumerations
|
||||||
enum init_reset_tests
|
enum init_reset_tests
|
||||||
{
|
{
|
||||||
|
@ -303,8 +300,8 @@ class FOptiAttr final
|
||||||
FChar off{};
|
FChar off{};
|
||||||
FChar reset_byte_mask{};
|
FChar reset_byte_mask{};
|
||||||
|
|
||||||
|
std::string attr_buf{};
|
||||||
SGRoptimizer sgr_optimizer{attr_buf};
|
SGRoptimizer sgr_optimizer{attr_buf};
|
||||||
AttributeBuffer attr_buf{};
|
|
||||||
|
|
||||||
int max_color{1};
|
int max_color{1};
|
||||||
int attr_without_color{0};
|
int attr_without_color{0};
|
||||||
|
|
|
@ -268,7 +268,7 @@ class FTerm final
|
||||||
static int openConsole();
|
static int openConsole();
|
||||||
static int closeConsole();
|
static int closeConsole();
|
||||||
static std::string moveCursorString (int, int, int, int);
|
static std::string moveCursorString (int, int, int, int);
|
||||||
static const char* cursorsVisibilityString (bool = true);
|
static std::string cursorsVisibilityString (bool = true);
|
||||||
static void detectTermSize();
|
static void detectTermSize();
|
||||||
static void setTermSize (const FSize&);
|
static void setTermSize (const FSize&);
|
||||||
static void setTermTitle (const FString&);
|
static void setTermTitle (const FString&);
|
||||||
|
@ -301,7 +301,7 @@ class FTerm final
|
||||||
|
|
||||||
void initTerminal();
|
void initTerminal();
|
||||||
static void initScreenSettings();
|
static void initScreenSettings();
|
||||||
static const char* changeAttribute (FChar&, FChar&);
|
static std::string changeAttribute (FChar&, FChar&);
|
||||||
static void changeTermSizeFinished();
|
static void changeTermSizeFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -336,8 +336,8 @@ class FTerm final
|
||||||
static void restoreColorPalette();
|
static void restoreColorPalette();
|
||||||
static void setInsertCursorStyle();
|
static void setInsertCursorStyle();
|
||||||
static void setOverwriteCursorStyle();
|
static void setOverwriteCursorStyle();
|
||||||
static const char* enableCursorString();
|
static std::string enableCursorString();
|
||||||
static const char* disableCursorString();
|
static std::string disableCursorString();
|
||||||
static void enableMouse();
|
static void enableMouse();
|
||||||
static void disableMouse();
|
static void disableMouse();
|
||||||
static void enableApplicationEscKey();
|
static void enableApplicationEscKey();
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* *
|
* *
|
||||||
* This file is part of the FINAL CUT widget toolkit *
|
* This file is part of the FINAL CUT widget toolkit *
|
||||||
* *
|
* *
|
||||||
* Copyright 2019-2020 Markus Gans *
|
* Copyright 2019-2021 Markus Gans *
|
||||||
* *
|
* *
|
||||||
* FINAL CUT is free software; you can redistribute it and/or modify *
|
* FINAL CUT is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU Lesser General Public License as *
|
* it under the terms of the GNU Lesser General Public License as *
|
||||||
|
@ -49,13 +49,10 @@ class SGRoptimizer final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Constants
|
// Constants
|
||||||
static constexpr std::size_t ATTR_BUF_SIZE{8192};
|
static constexpr std::string::size_type ATTR_BUF_SIZE{8192u};
|
||||||
|
|
||||||
// Using-declaration
|
|
||||||
using AttributeBuffer = std::array<char, ATTR_BUF_SIZE>;
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
explicit SGRoptimizer (AttributeBuffer&);
|
explicit SGRoptimizer (std::string&);
|
||||||
|
|
||||||
// Disable copy constructor
|
// Disable copy constructor
|
||||||
SGRoptimizer (const SGRoptimizer&) = delete;
|
SGRoptimizer (const SGRoptimizer&) = delete;
|
||||||
|
@ -78,7 +75,7 @@ class SGRoptimizer final
|
||||||
void combineParameter();
|
void combineParameter();
|
||||||
|
|
||||||
// Data member
|
// Data member
|
||||||
AttributeBuffer& seq;
|
std::string& seq;
|
||||||
|
|
||||||
struct parameter
|
struct parameter
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* *
|
* *
|
||||||
* This file is part of the FINAL CUT widget toolkit *
|
* This file is part of the FINAL CUT widget toolkit *
|
||||||
* *
|
* *
|
||||||
* Copyright 2019-2020 Markus Gans *
|
* Copyright 2019-2021 Markus Gans *
|
||||||
* *
|
* *
|
||||||
* FINAL CUT is free software; you can redistribute it and/or modify *
|
* FINAL CUT is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU Lesser General Public License as *
|
* it under the terms of the GNU Lesser General Public License as *
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
* License along with this program. If not, see *
|
* License along with this program. If not, see *
|
||||||
* <http://www.gnu.org/licenses/>. *
|
* <http://www.gnu.org/licenses/>. *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
#include <iostream>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -35,9 +35,11 @@ namespace finalcut
|
||||||
|
|
||||||
// constructors and destructor
|
// constructors and destructor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
SGRoptimizer::SGRoptimizer (AttributeBuffer& sequence)
|
SGRoptimizer::SGRoptimizer (std::string& sequence)
|
||||||
: seq{sequence}
|
: seq{sequence}
|
||||||
{ }
|
{
|
||||||
|
seq.reserve(ATTR_BUF_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// public methods of SGRoptimizer
|
// public methods of SGRoptimizer
|
||||||
|
@ -55,7 +57,7 @@ void SGRoptimizer::findParameter()
|
||||||
{
|
{
|
||||||
// Find ANSI X3.64 terminal SGR (Select Graphic Rendition) strings
|
// Find ANSI X3.64 terminal SGR (Select Graphic Rendition) strings
|
||||||
|
|
||||||
const std::size_t len = std::strlen(seq.data());
|
const std::size_t len = seq.length();
|
||||||
csi_parameter.clear();
|
csi_parameter.clear();
|
||||||
|
|
||||||
if ( len < 6 )
|
if ( len < 6 )
|
||||||
|
@ -105,6 +107,7 @@ void SGRoptimizer::combineParameter()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto& first = csi_parameter.front();
|
const auto& first = csi_parameter.front();
|
||||||
|
const std::size_t len = seq.length();
|
||||||
std::size_t count = 1;
|
std::size_t count = 1;
|
||||||
std::size_t read_pos{};
|
std::size_t read_pos{};
|
||||||
std::size_t write_pos = first.end;
|
std::size_t write_pos = first.end;
|
||||||
|
@ -146,12 +149,14 @@ void SGRoptimizer::combineParameter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( seq[write_pos] != '\0' )
|
while ( read_pos < len )
|
||||||
{
|
{
|
||||||
seq[write_pos] = seq[read_pos];
|
seq[write_pos] = seq[read_pos];
|
||||||
read_pos++;
|
read_pos++;
|
||||||
write_pos++;
|
write_pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seq.erase(write_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace finalcut
|
} // namespace finalcut
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue