From aad29f14c2d887932cb2ba58e35d959a0f04330f Mon Sep 17 00:00:00 2001 From: PartialVolume Date: Mon, 9 Mar 2020 14:16:21 +0000 Subject: [PATCH] This fixes screen flicker seen in the following situations: These apply in full screen mode ONLY: i.e ALT-F2, Shredos etc. 1. When selecting a drive using up/down arrow keys 2. During a wipe the screen flashes at one second intervals. These apply in a terminal window such as konsole, tmux etc. 1. When resizing the terminal there was a flicker. All these problems have been fixed. Most of the causes of the flicker was an excessive use of wrefresh() which calls the wnoutrefresh() and doupdate() functions. This can cause flickering when a number of calls to wrefresh happen at the same time. It is more appropriate to replace the wrefresh() with wnoutrefresh(), then at an appropriate time call doupate() just once. The result is that before doupdate() would have been called multiple times and now it's called once when required. fixes #115 --- src/gui.c | 85 +++++++++++++++++++++++++++++++++---------------------- src/gui.h | 2 +- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/gui.c b/src/gui.c index cd92195f..26879d38 100644 --- a/src/gui.c +++ b/src/gui.c @@ -318,13 +318,14 @@ void nwipe_gui_create_main_window() } /* Clear the main window. */ - wclear( main_window ); + werase( main_window ); /* Add a border. */ box( main_window, 0, 0 ); /* refresh main window */ - wrefresh( main_window ); + wnoutrefresh( main_window ); + } /* nwipe_gui_create_main_window */ @@ -341,10 +342,13 @@ void nwipe_gui_create_header_window() } /* Clear the header window. */ - wclear( header_window ); + werase( header_window ); /* Print the product banner. */ nwipe_gui_title( header_window, banner ); + + /* Refresh the header window */ + wnoutrefresh( header_window ); } /* nwipe_gui_create_header_window */ @@ -360,17 +364,30 @@ void nwipe_gui_create_footer_window( const char* footer_text ) wbkgdset( footer_window, COLOR_PAIR( 4 ) | ' ' ); } - /* Clear the footer window. */ - wclear( footer_window ); + /* Erase the footer window. */ + werase( footer_window ); /* Add help text to the footer */ nwipe_gui_title( footer_window, footer_text ); /* Refresh the footer window */ - wrefresh( footer_window ); + wnoutrefresh( footer_window ); } /* nwipe_gui_create_footer_window */ +void nwipe_gui_amend_footer_window( const char* footer_text ) +{ + /* Clear the footer window. */ + werase( footer_window ); + + /* Add help text to the footer */ + nwipe_gui_title( footer_window, footer_text ); + + /* Refresh the footer window */ + wnoutrefresh( footer_window ); + +} /* nwipe_gui_amend_footer_window */ + void nwipe_gui_create_options_window() { /* Create the options window. */ @@ -387,7 +404,7 @@ void nwipe_gui_create_options_window() } /* Clear the options window. */ - wclear( options_window ); + werase( options_window ); /* Add a border. */ box( options_window, 0, 0 ); @@ -410,7 +427,7 @@ void nwipe_gui_create_stats_window() } /* Clear the new window. */ - wclear( stats_window ); + werase( stats_window ); /* Add a border. */ box( stats_window, 0, 0 ); @@ -533,17 +550,17 @@ void nwipe_gui_select( int count, nwipe_context_t** c ) werase( main_window ); /* Refresh main window */ - wrefresh( main_window ); + wnoutrefresh( main_window ); /* If the user selected an option the footer text would have changed. * Here we set it back to the main key help text */ nwipe_gui_create_footer_window( main_window_footer ); /* Refresh the stats window */ - wrefresh( stats_window ); + wnoutrefresh( stats_window ); /* Refresh the options window */ - wrefresh( options_window ); + wnoutrefresh( options_window ); /* Update the options window. */ nwipe_gui_options(); @@ -636,7 +653,10 @@ void nwipe_gui_select( int count, nwipe_context_t** c ) nwipe_gui_title( main_window, select_title ); /* Refresh the window. */ - wrefresh( main_window ); + wnoutrefresh( main_window ); + + /* Output to physical screen */ + doupdate(); /* Wait 250ms for input from getch, if nothing getch will then continue, * This is necessary so that the while loop can be exited by the @@ -954,7 +974,8 @@ void nwipe_gui_options( void ) nwipe_gui_title( options_window, options_title ); /* Refresh the window. */ - wrefresh( options_window ); + //wrefresh( options_window ); + wnoutrefresh( options_window ); } /* nwipe_gui_options */ @@ -2150,7 +2171,7 @@ void* nwipe_gui_status( void* ptr ) nwipe_time_now = nwipe_time_stopped; } - nwipe_gui_create_all_windows_on_terminal_resize( selection_footer ); + nwipe_gui_create_all_windows_on_terminal_resize( end_wipe_footer ); /* Erase the main window. */ werase( main_window ); @@ -2182,7 +2203,8 @@ void* nwipe_gui_status( void* ptr ) { nwipe_gui_title( footer_window, "Wipe finished - press enter to exit. Logged to STDOUT" ); } - wrefresh( footer_window ); + //wrefresh( footer_window ); + wnoutrefresh( footer_window ); if( terminate_signal == 1 ) { @@ -2191,7 +2213,8 @@ void* nwipe_gui_status( void* ptr ) box( options_window, 0, 0 ); nwipe_gui_title( options_window, options_title ); - wrefresh( options_window ); + //wrefresh( options_window ); + wnoutrefresh( options_window ); /* Try to get a keystroke. */ keystroke = getch(); @@ -2420,7 +2443,8 @@ void* nwipe_gui_status( void* ptr ) box( main_window, 0, 0 ); /* Refresh the main window. */ - wrefresh( main_window ); + //wrefresh( main_window ); + wnoutrefresh( main_window ); /* Update the load average field, but only if we are still wiping */ if( nwipe_active && terminate_signal != 1 ) @@ -2523,25 +2547,17 @@ void* nwipe_gui_status( void* ptr ) mvwprintw( stats_window, 0, ( NWIPE_GUI_STATS_W - strlen( stats_title ) ) / 2, "%s", stats_title ); /* Refresh the stats window. */ - wrefresh( stats_window ); + //wrefresh( stats_window ); + + /* Refresh internal representation of stats window */ + wnoutrefresh( stats_window ); + + /* Output all windows to screen */ + doupdate(); + } // end blank screen if - if( nwipe_options.logfile[0] == '\0' ) - { - - // Logging to STDOUT. Flush log. - - def_prog_mode(); // Save the tty modes. - endwin(); // End curses mode temporarily. - - /* Flush stdout and disable buffering, otherwise output missed new lines. */ - fflush( stdout ); - setbuf( stdout, NULL ); - reset_prog_mode(); // Return to the previous tty mode stored by def_prog_mode(). - refresh(); // Do refresh() to restore the screen contents. - } - /* Stop this function unnecessarily running the CPU or a CPU core at 100% */ if( nanosleep( &tim, &tim2 ) < 0 ) { @@ -2550,7 +2566,8 @@ void* nwipe_gui_status( void* ptr ) /* Test for a thread cancellation request */ pthread_testcancel(); - } + + } /* End of while loop */ if( nwipe_options.logfile[0] == '\0' ) { diff --git a/src/gui.h b/src/gui.h index 3a039246..96b467fd 100644 --- a/src/gui.h +++ b/src/gui.h @@ -27,7 +27,7 @@ void nwipe_gui_free( void ); // Stop the GUI. void nwipe_gui_init( void ); // Start the GUI. void nwipe_gui_create_main_window( void ); // Create the main window void nwipe_gui_create_header_window( void ); // Create the header window -void nwipe_gui_create_footer_window( const char* ); // Create the footer window +void nwipe_gui_create_footer_window( const char* ); // Create the footer window and write text void nwipe_gui_create_options_window( void ); // Create the options window void nwipe_gui_create_stats_window( void ); // Create the stats window void nwipe_gui_create_all_windows_on_terminal_resize(