From 248cf8a0ba6418ed8255b34ac7c3a2f7549441a2 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sun, 18 Aug 2019 21:35:36 +0200 Subject: [PATCH] Update VTerm information only in case of changes --- examples/calculator.cpp | 2 +- src/ffiledialog.cpp | 5 ++--- src/fvterm.cpp | 42 +++++++++++++++++++++++++++++++++++-- src/include/final/fsystem.h | 4 ++-- src/include/final/fvterm.h | 1 + src/include/final/fwidget.h | 2 +- test/ftermfreebsd-test.cpp | 10 +++++---- test/ftermlinux-test.cpp | 10 +++++---- test/ftermopenbsd-test.cpp | 10 +++++---- 9 files changed, 65 insertions(+), 21 deletions(-) diff --git a/examples/calculator.cpp b/examples/calculator.cpp index 23b72934..af97ee2f 100644 --- a/examples/calculator.cpp +++ b/examples/calculator.cpp @@ -838,7 +838,7 @@ void Calc::tangent (lDouble& x) void Calc::draw() { setBold(); - setColor (fc::Blue, fc::Cyan); + setColor (fc::LightBlue, fc::Cyan); clearArea (vdesktop, fc::MediumShade); unsetBold(); finalcut::FDialog::draw(); diff --git a/src/ffiledialog.cpp b/src/ffiledialog.cpp index 3a8190d9..d57ef93e 100644 --- a/src/ffiledialog.cpp +++ b/src/ffiledialog.cpp @@ -35,9 +35,6 @@ namespace finalcut { -// static class attributes -FSystem* FFileDialog::fsystem = nullptr; - // non-member functions //---------------------------------------------------------------------- bool sortByName ( const FFileDialog::dir_entry& lhs @@ -92,6 +89,8 @@ const FString fileChooser ( FWidget* parent return ret; } +// static class attributes +FSystem* FFileDialog::fsystem = nullptr; //---------------------------------------------------------------------- // class FFileDialog diff --git a/src/fvterm.cpp b/src/fvterm.cpp index c3a388b1..032b479f 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -262,18 +262,31 @@ void FVTerm::updateTerminal() } } - // Check terminal size has changed auto data = getFTerm().getFTermData(); - if ( data->hasTermResized() ) + // Checks if the resizing of the terminal is not finished + if ( data && data->hasTermResized() ) return; + // Monitor whether the terminal size has changed + if ( isTermSizeChanged() ) + { + raise (SIGWINCH); // Send SIGWINCH + return; + } + // Update data on VTerm updateVTerm(); + // Checks if VTerm has changes + if ( ! vterm->has_changes ) + return; + for (uInt y = 0; y < uInt(vterm->height); y++) updateTerminalLine (y); + vterm->has_changes = false; + // sets the new input cursor position updateTerminalCursor(); } @@ -852,6 +865,8 @@ void FVTerm::restoreVTerm (const FRect& box) if ( int(vterm->changes[ypos].xmax) < x + w - 1 ) vterm->changes[ypos].xmax = uInt(x + w - 1); } + + vterm->has_changes = true; } //---------------------------------------------------------------------- @@ -1251,6 +1266,7 @@ void FVTerm::updateVTerm (term_area* area) area->changes[y].xmax = 0; } + vterm->has_changes = true; updateVTermCursor(area); } @@ -1286,6 +1302,7 @@ bool FVTerm::updateVTermCursor (term_area* area) vterm->input_cursor_x = x; vterm->input_cursor_y = y; vterm->input_cursor_visible = true; + vterm->has_changes = true; return true; } } @@ -1472,6 +1489,8 @@ void FVTerm::putArea (const FPoint& pos, term_area* area) if ( ax + length - 1 > int(vterm->changes[ay + y].xmax) ) vterm->changes[ay + y].xmax = uInt(ax + length - 1); } + + vterm->has_changes = true; } //---------------------------------------------------------------------- @@ -2609,6 +2628,25 @@ bool FVTerm::isInsideTerminal (const FPoint& pos) return false; } +//---------------------------------------------------------------------- +inline bool FVTerm::isTermSizeChanged() +{ + auto data = getFTerm().getFTermData(); + + if ( ! data ) + return false; + + auto old_term_geometry = data->getTermGeometry(); + getFTerm().detectTermSize(); + auto term_geometry = data->getTermGeometry(); + term_geometry.move (-1, -1); + + if ( old_term_geometry.getSize() != term_geometry.getSize() ) + return true; + + return false; +} + //---------------------------------------------------------------------- inline void FVTerm::markAsPrinted (uInt pos, uInt line) { diff --git a/src/include/final/fsystem.h b/src/include/final/fsystem.h index 122f9138..09f4163a 100644 --- a/src/include/final/fsystem.h +++ b/src/include/final/fsystem.h @@ -70,8 +70,8 @@ class FSystem virtual int tputs (const char*, int, int (*)(int)) = 0; virtual uid_t getuid() = 0; virtual uid_t geteuid() = 0; - virtual int getpwuid_r ( uid_t, struct passwd*, char*, size_t , - struct passwd**) = 0; + virtual int getpwuid_r ( uid_t, struct passwd*, char* + , size_t, struct passwd**) = 0; virtual char* realpath (const char*, char*) = 0; }; #pragma pack(pop) diff --git a/src/include/final/fvterm.h b/src/include/final/fvterm.h index fea9eb68..7d27a1d9 100644 --- a/src/include/final/fvterm.h +++ b/src/include/final/fvterm.h @@ -454,6 +454,7 @@ class FVTerm void updateTerminalLine (uInt); bool updateTerminalCursor(); bool isInsideTerminal (const FPoint&); + bool isTermSizeChanged(); static void markAsPrinted (uInt, uInt); static void markAsPrinted (uInt, uInt, uInt); static void newFontChanges (charData*&); diff --git a/src/include/final/fwidget.h b/src/include/final/fwidget.h index 83f99d30..3f25cd76 100644 --- a/src/include/final/fwidget.h +++ b/src/include/final/fwidget.h @@ -333,7 +333,7 @@ class FWidget : public FVTerm, public FObject virtual bool focusLastChild(); FPoint termToWidgetPos (const FPoint&); void detectTermSize(); - void print (const FPoint& p) override; + void print (const FPoint&) override; virtual void move (const FPoint&); void drawShadow(); void clearShadow(); diff --git a/test/ftermfreebsd-test.cpp b/test/ftermfreebsd-test.cpp index c4f9996a..1a5cb614 100644 --- a/test/ftermfreebsd-test.cpp +++ b/test/ftermfreebsd-test.cpp @@ -67,6 +67,8 @@ class FSystemTest : public finalcut::FSystem int tputs (const char*, int, int (*)(int)) override; uid_t getuid() override; uid_t geteuid() override; + int getpwuid_r (uid_t, struct passwd*, char* + , size_t, struct passwd** ) override; char* realpath (const char*, char*) override; std::string& getCharacters(); int& getCursorType(); @@ -543,16 +545,16 @@ uid_t FSystemTest::geteuid() } //---------------------------------------------------------------------- -int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char*, size_t - , struct passwd** ) +int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char* + , size_t, struct passwd** ) { return 0; } //---------------------------------------------------------------------- -char* FSystemTest::realpath (const char*, char*); +char* FSystemTest::realpath (const char*, char*) { - return ""; + return const_cast(""); } //---------------------------------------------------------------------- diff --git a/test/ftermlinux-test.cpp b/test/ftermlinux-test.cpp index 8b9e78d5..dec33acc 100644 --- a/test/ftermlinux-test.cpp +++ b/test/ftermlinux-test.cpp @@ -117,6 +117,8 @@ class FSystemTest : public finalcut::FSystem int tputs (const char*, int, int (*)(int)) override; uid_t getuid() override; uid_t geteuid() override; + int getpwuid_r (uid_t, struct passwd*, char* + , size_t, struct passwd** ) override; char* realpath (const char*, char*) override; rgb& getRGB (std::size_t); console_font_op& getConsoleFont(); @@ -1357,16 +1359,16 @@ uid_t FSystemTest::geteuid() } //---------------------------------------------------------------------- -int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char*, size_t - , struct passwd** ) +int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char* + , size_t, struct passwd** ) { return 0; } //---------------------------------------------------------------------- -char* FSystemTest::realpath (const char*, char*); +char* FSystemTest::realpath (const char*, char*) { - return ""; + return const_cast(""); } //---------------------------------------------------------------------- diff --git a/test/ftermopenbsd-test.cpp b/test/ftermopenbsd-test.cpp index 341fdd1b..2fb02867 100644 --- a/test/ftermopenbsd-test.cpp +++ b/test/ftermopenbsd-test.cpp @@ -85,6 +85,8 @@ class FSystemTest : public finalcut::FSystem int tputs (const char*, int, int (*)(int)) override; uid_t getuid() override; uid_t geteuid() override; + int getpwuid_r (uid_t, struct passwd*, char* + , size_t, struct passwd** ) override; char* realpath (const char*, char*) override; wskbd_bell_data& getBell(); @@ -283,16 +285,16 @@ uid_t FSystemTest::geteuid() } //---------------------------------------------------------------------- -int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char*, size_t - , struct passwd** ) +int FSystemTest::getpwuid_r ( uid_t, struct passwd*, char* + , size_t, struct passwd** ) { return 0; } //---------------------------------------------------------------------- -char* FSystemTest::realpath (const char*, char*); +char* FSystemTest::realpath (const char*, char*) { - return ""; + return const_cast(""); } //----------------------------------------------------------------------