Bugfix for sending multiple SIGWINCH signals from gnome-terminal under Wayland
This commit is contained in:
parent
24553aa7d0
commit
3cf1ae0134
|
@ -1,3 +1,7 @@
|
|||
2021-05-02 Markus Gans <guru.mail@muenster.de>
|
||||
* Bugfix for sending multiple SIGWINCH signals from
|
||||
gnome-terminal under Wayland
|
||||
|
||||
2021-05-01 Markus Gans <guru.mail@muenster.de>
|
||||
* Replace some std::bind with lambda functions
|
||||
|
||||
|
|
|
@ -123,7 +123,6 @@ else
|
|||
AM_CONDITIONAL(CPPUNIT_TEST, [test "1" = "0"])
|
||||
fi
|
||||
|
||||
|
||||
# code coverage
|
||||
AC_ARG_WITH([gcov],
|
||||
[AS_HELP_STRING([--with-gcov], [build for code coverage testing])],
|
||||
|
|
|
@ -821,9 +821,9 @@ inline bool FApplication::hasDataInQueue() const
|
|||
const auto& keyboard = FTerm::getFKeyboard();
|
||||
const auto& mouse = FTerm::getFMouseControl();
|
||||
|
||||
if ( keyboard->hasDataInQueue() )
|
||||
return true;
|
||||
else if ( mouse->hasDataInQueue() )
|
||||
if ( keyboard->hasDataInQueue()
|
||||
|| mouse->hasDataInQueue()
|
||||
|| FTerm::hasChangedTermSize() )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -832,7 +832,9 @@ inline bool FApplication::hasDataInQueue() const
|
|||
//----------------------------------------------------------------------
|
||||
void FApplication::queuingKeyboardInput() const
|
||||
{
|
||||
if ( quit_now || internal::var::exit_loop )
|
||||
if ( quit_now
|
||||
|| internal::var::exit_loop
|
||||
|| FTerm::hasChangedTermSize() )
|
||||
return;
|
||||
|
||||
findKeyboardWidget();
|
||||
|
@ -849,7 +851,10 @@ void FApplication::queuingMouseInput() const
|
|||
{
|
||||
const auto& mouse = FTerm::getFMouseControl();
|
||||
|
||||
if ( quit_now || internal::var::exit_loop || ! mouse->hasData() )
|
||||
if ( quit_now
|
||||
|| internal::var::exit_loop
|
||||
|| ! mouse->hasData()
|
||||
|| FTerm::hasChangedTermSize() )
|
||||
return;
|
||||
|
||||
const auto& keyboard = FTerm::getFKeyboard();
|
||||
|
@ -862,7 +867,9 @@ void FApplication::queuingMouseInput() const
|
|||
//----------------------------------------------------------------------
|
||||
void FApplication::processKeyboardEvent() const
|
||||
{
|
||||
if ( quit_now || internal::var::exit_loop )
|
||||
if ( quit_now
|
||||
|| internal::var::exit_loop
|
||||
|| FTerm::hasChangedTermSize() )
|
||||
return;
|
||||
|
||||
const auto& keyboard = FTerm::getFKeyboard();
|
||||
|
@ -872,7 +879,9 @@ void FApplication::processKeyboardEvent() const
|
|||
//----------------------------------------------------------------------
|
||||
void FApplication::processMouseEvent() const
|
||||
{
|
||||
if ( quit_now || internal::var::exit_loop )
|
||||
if ( quit_now
|
||||
|| internal::var::exit_loop
|
||||
|| FTerm::hasChangedTermSize() )
|
||||
return;
|
||||
|
||||
FTerm::getFMouseControl()->processQueuedInput();
|
||||
|
|
|
@ -41,7 +41,6 @@ FLog::~FLog() // destructor
|
|||
//----------------------------------------------------------------------
|
||||
FLog& FLog::operator << (LogLevel l)
|
||||
{
|
||||
using std::placeholders::_1;
|
||||
sync();
|
||||
std::lock_guard<std::mutex> lock_guard(current_log_mutex);
|
||||
|
||||
|
|
|
@ -2406,9 +2406,6 @@ void FTerm::terminalSizeChange()
|
|||
{
|
||||
const auto& data = FTerm::getFTermData();
|
||||
|
||||
if ( data->hasTermResized() )
|
||||
return;
|
||||
|
||||
// Initialize a resize event to the root element
|
||||
data->setTermResized(true);
|
||||
}
|
||||
|
|
|
@ -1272,19 +1272,10 @@ void FVTerm::forceTerminalUpdate() const
|
|||
//----------------------------------------------------------------------
|
||||
bool FVTerm::processTerminalUpdate() const
|
||||
{
|
||||
const auto& data = FTerm::getFTermData();
|
||||
|
||||
// Checks if the resizing of the terminal is not finished
|
||||
if ( data && data->hasTermResized() )
|
||||
if ( FTerm::hasChangedTermSize() )
|
||||
return false;
|
||||
|
||||
// Monitor whether the terminal size has changed
|
||||
if ( isTermSizeChanged() )
|
||||
{
|
||||
raise (SIGWINCH); // Send SIGWINCH
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update data on VTerm
|
||||
updateVTerm();
|
||||
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#error "Only <final/final.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
|
||||
|
@ -99,7 +101,7 @@ class FTermData final
|
|||
bool isNewFont() const;
|
||||
bool isVGAFont() const;
|
||||
bool isMonochron() const;
|
||||
bool hasTermResized() const;
|
||||
bool hasTermResized();
|
||||
|
||||
// Mutators
|
||||
void setTermEncoding (Encoding);
|
||||
|
@ -146,6 +148,8 @@ class FTermData final
|
|||
uInt baudrate{0};
|
||||
std::string termtype{};
|
||||
std::string termfilename{};
|
||||
std::mutex resize_mutex{};
|
||||
std::atomic<int> resize_count{0};
|
||||
bool shadow_character{true};
|
||||
bool half_block_character{true};
|
||||
bool cursor_optimisation{true};
|
||||
|
@ -159,7 +163,6 @@ class FTermData final
|
|||
bool new_font{false};
|
||||
bool vga_font{false};
|
||||
bool monochron{false};
|
||||
bool resize_term{false};
|
||||
};
|
||||
|
||||
// FTermData inline functions
|
||||
|
@ -270,8 +273,11 @@ inline bool FTermData::isMonochron() const
|
|||
{ return monochron; }
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline bool FTermData::hasTermResized() const
|
||||
{ return resize_term; }
|
||||
inline bool FTermData::hasTermResized()
|
||||
{
|
||||
std::lock_guard<std::mutex> resize_lock_guard(resize_mutex);
|
||||
return resize_count.load() > 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline void FTermData::setTermEncoding (Encoding enc)
|
||||
|
@ -339,7 +345,14 @@ inline void FTermData::setMonochron (bool mono)
|
|||
|
||||
//----------------------------------------------------------------------
|
||||
inline void FTermData::setTermResized (bool resize)
|
||||
{ resize_term = resize; }
|
||||
{
|
||||
std::lock_guard<std::mutex> resize_lock_guard(resize_mutex);
|
||||
|
||||
if ( resize )
|
||||
++resize_count;
|
||||
else if ( resize_count.load() > 0 )
|
||||
--resize_count;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
inline void FTermData::setTermType (const std::string& name)
|
||||
|
|
Loading…
Reference in New Issue