From 2ef3d84829b54278df450c7f1d7aa3b14fec2c40 Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sat, 3 Feb 2018 00:04:24 +0100 Subject: [PATCH] Avoids flickering when redrawing a focused widget --- ChangeLog | 3 +++ include/final/fvterm.h | 9 ++++++++- src/fapplication.cpp | 4 ++-- src/fmenu.cpp | 34 +++++++++++++++++----------------- src/fmenubar.cpp | 10 +++++----- src/fvterm.cpp | 15 ++++++++++++--- src/fwindow.cpp | 10 +++++++++- 7 files changed, 56 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4bd84fe8..2959bfa0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2017-02-02 Markus Gans + * Avoids flickering when redrawing a focused widget + 2017-01-31 Markus Gans * Refactoring FSwitch::drawCheckButton * Refactoring FWidget::redraw diff --git a/include/final/fvterm.h b/include/final/fvterm.h index 24840297..ddd312cf 100644 --- a/include/final/fvterm.h +++ b/include/final/fvterm.h @@ -102,6 +102,13 @@ class FVTerm : public FTerm fully_covered }; + enum terminal_update + { + stop_refresh, + continue_refresh, + start_refresh + }; + // Constructor explicit FVTerm (bool, bool = false); @@ -220,7 +227,7 @@ class FVTerm : public FTerm static void resizeVTerm (const FRect&); static void resizeVTerm (int, int); static void putVTerm(); - static void updateTerminal (bool); + static void updateTerminal (terminal_update); static void updateTerminal(); virtual void addPreprocessingHandler ( FVTerm* , FPreprocessingHandler ); diff --git a/src/fapplication.cpp b/src/fapplication.cpp index 7e28fa58..c613bac8 100644 --- a/src/fapplication.cpp +++ b/src/fapplication.cpp @@ -1542,7 +1542,7 @@ int FApplication::processTimerEvent() //---------------------------------------------------------------------- void FApplication::processCloseWidget() { - updateTerminal(false); + updateTerminal (FVTerm::stop_refresh); if ( close_widget && ! close_widget->empty() ) { @@ -1558,7 +1558,7 @@ void FApplication::processCloseWidget() close_widget->clear(); } - updateTerminal(true); + updateTerminal (FVTerm::start_refresh); } //---------------------------------------------------------------------- diff --git a/src/fmenu.cpp b/src/fmenu.cpp index dae2baa9..b9901643 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -78,7 +78,7 @@ FMenu::~FMenu() // destructor FApplication* fapp = static_cast(getRootWidget()); if ( ! fapp->isQuit() ) - switchToPrevWindow(); + switchToPrevWindow(); // Switch to previous window } @@ -118,26 +118,26 @@ void FMenu::show() //---------------------------------------------------------------------- void FMenu::hide() { - if ( isVisible() ) + if ( ! isVisible() ) + return; + + FWindow::hide(); + const FRect& t_geometry = getTermGeometryWithShadow(); + restoreVTerm (t_geometry); + updateTerminal(); + flush_out(); + + if ( ! isSubMenu() ) { - FWindow::hide(); - const FRect& t_geometry = getTermGeometryWithShadow(); - restoreVTerm (t_geometry); - updateTerminal(); - flush_out(); + FMenu* open_menu = static_cast(getOpenMenu()); - if ( ! isSubMenu() ) - { - FMenu* open_menu = static_cast(getOpenMenu()); + if ( open_menu && open_menu != this ) + open_menu->hide(); - if ( open_menu && open_menu != this ) - open_menu->hide(); - - setOpenMenu(0); - } - - mouse_down = false; + setOpenMenu(0); } + + mouse_down = false; } //---------------------------------------------------------------------- diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index 5724381e..be469baa 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2015-2017 Markus Gans * +* Copyright 2015-2018 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -330,7 +330,7 @@ bool FMenuBar::selectNextItem() if ( next == *iter ) return false; - updateTerminal(false); + updateTerminal (FVTerm::stop_refresh); unselectItem(); next->setSelected(); setSelectedItem(next); @@ -354,7 +354,7 @@ bool FMenuBar::selectNextItem() getStatusBar()->drawMessage(); redraw(); - updateTerminal(true); + updateTerminal (FVTerm::start_refresh); break; } @@ -397,7 +397,7 @@ bool FMenuBar::selectPrevItem() if ( prev == *iter ) return false; - updateTerminal(false); + updateTerminal (FVTerm::stop_refresh); unselectItem(); prev->setSelected(); prev->setFocus(); @@ -421,7 +421,7 @@ bool FMenuBar::selectPrevItem() setSelectedItem(prev); redraw(); - updateTerminal(true); + updateTerminal (FVTerm::stop_refresh); break; } } diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 417c5888..ec2b03d7 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -230,11 +230,20 @@ void FVTerm::putVTerm() } //---------------------------------------------------------------------- -void FVTerm::updateTerminal (bool on) +void FVTerm::updateTerminal (terminal_update refresh_state) { - stop_terminal_updates = bool(! on); + switch ( refresh_state ) + { + case stop_refresh: + stop_terminal_updates = true; + break; - if ( on ) + case continue_refresh: + case start_refresh: + stop_terminal_updates = false; + } + + if ( refresh_state == start_refresh ) updateTerminal(); } diff --git a/src/fwindow.cpp b/src/fwindow.cpp index 1698bf4b..b607575d 100644 --- a/src/fwindow.cpp +++ b/src/fwindow.cpp @@ -3,7 +3,7 @@ * * * This file is part of the Final Cut widget toolkit * * * -* Copyright 2015-2017 Markus Gans * +* Copyright 2015-2018 Markus Gans * * * * The Final Cut is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public License * @@ -719,6 +719,11 @@ bool FWindow::zoomWindow() void FWindow::switchToPrevWindow() { // switch to previous window + + // Disable terminal updates to avoid flickering + // when redrawing the focused widget + updateTerminal (FVTerm::stop_refresh); + bool is_activated = activatePrevWindow(); FWindow* active_window = getActiveWindow(); @@ -765,6 +770,9 @@ void FWindow::switchToPrevWindow() focus_widget->redraw(); } } + + // Enable terminal updates again + updateTerminal (FVTerm::continue_refresh); } //----------------------------------------------------------------------