diff --git a/.travis.yml b/.travis.yml index b2a31ff1..331fe5e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -164,6 +164,7 @@ jobs: before_install: - uname -a - g++ --version + - sudo pkg install -y autoconf-archive script: - autoreconf -v --install --force - ./configure --prefix=/usr diff --git a/src/flabel.cpp b/src/flabel.cpp index 6ed4c1d0..c678f9e3 100644 --- a/src/flabel.cpp +++ b/src/flabel.cpp @@ -258,10 +258,9 @@ std::size_t FLabel::getAlignOffset (const std::size_t length) const if ( length < width ) return (width - length) / 2; } - else if ( alignment == Align::Right ) + else if ( alignment == Align::Right && length < width ) { - if ( length < width ) - return width - length; + return width - length; } return 0; diff --git a/src/flistview.cpp b/src/flistview.cpp index a643907d..b2a23538 100644 --- a/src/flistview.cpp +++ b/src/flistview.cpp @@ -1484,10 +1484,9 @@ std::size_t FListView::getAlignOffset ( const Align align if ( column_width < width ) return (width - column_width) / 2; } - else if ( align == Align::Right ) + else if ( align == Align::Right && column_width < width ) { - if ( column_width < width ) - return width - column_width; + return width - column_width; } return 0; diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 8cbc2a95..d0173ed3 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -1880,7 +1880,7 @@ void FVTerm::init_characterLengths() if ( clr_eol_length == 0 ) clr_eol_length = INT_MAX; } -#include + //---------------------------------------------------------------------- void FVTerm::init_combined_character() { diff --git a/src/include/final/fstring.h b/src/include/final/fstring.h index 1b77b994..5eb64645 100644 --- a/src/include/final/fstring.h +++ b/src/include/final/fstring.h @@ -178,10 +178,10 @@ class FString iterator end() noexcept; const_iterator begin() const noexcept; const_iterator end() const noexcept; - reference front() noexcept; - reference back() noexcept; - const_reference front() const noexcept; - const_reference back() const noexcept; + reference front(); + reference back(); + const_reference front() const; + const_reference back() const; template FString& sprintf (const FString&, Args&&...); @@ -403,28 +403,28 @@ inline FString::const_iterator FString::end() const noexcept { return string + length; } //---------------------------------------------------------------------- -inline FString::reference FString::front() noexcept +inline FString::reference FString::front() { assert ( ! isEmpty() ); return (*this)[0]; } //---------------------------------------------------------------------- -inline FString::reference FString::back() noexcept +inline FString::reference FString::back() { assert( ! isEmpty() ); return (*this)[length - 1]; } //---------------------------------------------------------------------- -inline FString::const_reference FString::front() const noexcept +inline FString::const_reference FString::front() const { assert ( ! isEmpty() ); return (*this)[0]; } //---------------------------------------------------------------------- -inline FString::const_reference FString::back() const noexcept +inline FString::const_reference FString::back() const { assert( ! isEmpty() ); return (*this)[length - 1]; diff --git a/test/ftermbuffer-test.cpp b/test/ftermbuffer-test.cpp index 40135f9e..0e067fcc 100644 --- a/test/ftermbuffer-test.cpp +++ b/test/ftermbuffer-test.cpp @@ -287,6 +287,7 @@ void FTermBufferTest::writeTest() } // Write with style + auto multi_color_emojis = bool( wcswidth(L"β˜•β›„πŸ§ΈπŸ¦‘", 4) == 8 ); term_buf.clear(); auto style = finalcut::FStyle(finalcut::Style::Italic | finalcut::Style::Reverse); term_buf.write (style); @@ -339,20 +340,25 @@ void FTermBufferTest::writeTest() CPPUNIT_ASSERT ( term_buf.getBuffer()[i].encoded_char[2] == L'\0' ); CPPUNIT_ASSERT ( term_buf.getBuffer()[i].encoded_char[3] == L'\0' ); CPPUNIT_ASSERT ( term_buf.getBuffer()[i].encoded_char[4] == L'\0' ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[i].attr.byte[2] != 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[i].attr.byte[3] == 0 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[i].attr.bit.char_width == 2 ); + + if ( multi_color_emojis ) + { + CPPUNIT_ASSERT ( term_buf.getBuffer()[i].attr.byte[2] != 0 ); + CPPUNIT_ASSERT ( term_buf.getBuffer()[i].attr.bit.char_width == 2 ); + } } } //---------------------------------------------------------------------- void FTermBufferTest::streamTest() { + auto multi_color_emojis = bool( wcswidth(L"πŸš§πŸš€πŸš΄", 3) == 6 ); const auto& data = finalcut::FTerm::getFTermData(); data->setTermEncoding (finalcut::Encoding::UTF8); finalcut::FTermBuffer::FCharVector fchar_vec = { finalcut::FChar{} }; CPPUNIT_ASSERT ( fchar_vec.size() == 1 ); - fchar_vec.front().ch[0] = L'πŸ₯¨'; + fchar_vec.front().ch[0] = L'🚧'; fchar_vec.front().fg_color = finalcut::FColor::White; fchar_vec.front().bg_color = finalcut::FColor::Cyan; finalcut::addColumnWidth(fchar_vec.front()); @@ -365,7 +371,7 @@ void FTermBufferTest::streamTest() << finalcut::UniChar::NF_Bullet << finalcut::FStyle(finalcut::Style::Blink) << fchar_vec - << std::string("🧭") + << std::string("πŸš€") << finalcut::FStyle(finalcut::Style::None) << finalcut::FStyle(finalcut::Style::DoubleUnderline) << finalcut::FColorPair{finalcut::FColor::Black, finalcut::FColor::White} @@ -394,28 +400,37 @@ void FTermBufferTest::streamTest() CPPUNIT_ASSERT ( term_buf.getBuffer()[2].attr.byte[0] != 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[2].attr.byte[1] == 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[2].attr.bit.char_width == 1 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[3].ch[0] == L'πŸ₯¨' ); + CPPUNIT_ASSERT ( term_buf.getBuffer()[3].ch[0] == L'🚧' ); CPPUNIT_ASSERT ( term_buf.getBuffer()[3].fg_color == finalcut::FColor::White ); CPPUNIT_ASSERT ( term_buf.getBuffer()[3].bg_color == finalcut::FColor::Cyan ); CPPUNIT_ASSERT ( term_buf.getBuffer()[3].attr.byte[0] == 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[3].attr.byte[1] == 0 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[3].attr.bit.char_width == 2 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[4].ch[0] == L'🧭' ); + + if ( multi_color_emojis ) + CPPUNIT_ASSERT ( term_buf.getBuffer()[3].attr.bit.char_width == 2 ); + + CPPUNIT_ASSERT ( term_buf.getBuffer()[4].ch[0] == L'πŸš€' ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].fg_color == finalcut::FColor::Cyan ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].bg_color == finalcut::FColor::White ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.bit.dim == 1 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.bit.blink == 1 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.byte[0] != 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.byte[1] == 0 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.bit.char_width == 2 ); + + if ( multi_color_emojis ) + CPPUNIT_ASSERT ( term_buf.getBuffer()[4].attr.bit.char_width == 2 ); + CPPUNIT_ASSERT ( term_buf.getBuffer()[5].ch[0] == L'🚴' ); CPPUNIT_ASSERT ( term_buf.getBuffer()[5].fg_color == finalcut::FColor::Black ); CPPUNIT_ASSERT ( term_buf.getBuffer()[5].bg_color == finalcut::FColor::White ); CPPUNIT_ASSERT ( term_buf.getBuffer()[5].attr.bit.dbl_underline == 1 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[5].attr.byte[0] == 0 ); CPPUNIT_ASSERT ( term_buf.getBuffer()[5].attr.byte[1] != 0 ); - CPPUNIT_ASSERT ( term_buf.getBuffer()[5].attr.bit.char_width == 2 ); - CPPUNIT_ASSERT ( term_buf.toString() == "a1\U0000e1f9πŸ₯¨πŸ§­πŸš΄" ); + + if ( multi_color_emojis ) + CPPUNIT_ASSERT ( term_buf.getBuffer()[5].attr.bit.char_width == 2 ); + + CPPUNIT_ASSERT ( term_buf.toString() == "a1\U0000e1f9πŸš§πŸš€πŸš΄" ); for (std::size_t i{0}; i < 6; i++) {