Use a full fledged nested main loop while waiting and pulsing progress bars (#685740)
Win_Gparted and Dialog_Progress were looping on Gtk::Main::events_pending() and iteration() with usleeps in between. Use a full mainloop instead and a proper timeout to trigger pulsebar updates instead of usleeps. Part of Bug 685740 - Refactor to use asynchronous command execution
This commit is contained in:
parent
f5a5c9cdb9
commit
124342e979
|
@ -57,6 +57,7 @@ private:
|
||||||
|
|
||||||
void on_response( int response_id ) ;
|
void on_response( int response_id ) ;
|
||||||
bool on_delete_event( GdkEventAny * event ) ;
|
bool on_delete_event( GdkEventAny * event ) ;
|
||||||
|
bool pulsebar_pulse();
|
||||||
|
|
||||||
Gtk::Label label_current ;
|
Gtk::Label label_current ;
|
||||||
Gtk::Label label_current_sub ;
|
Gtk::Label label_current_sub ;
|
||||||
|
@ -91,11 +92,11 @@ private:
|
||||||
|
|
||||||
std::vector<Operation *> operations ;
|
std::vector<Operation *> operations ;
|
||||||
OperationDetail operationdetail ;
|
OperationDetail operationdetail ;
|
||||||
bool running, succes, cancel, pulse ;
|
bool succes, cancel;
|
||||||
pthread_t pthread ;
|
pthread_t pthread ;
|
||||||
double fraction ;
|
double fraction ;
|
||||||
unsigned int t, warnings ;
|
unsigned int t, warnings ;
|
||||||
|
sigc::connection pulsetimer;
|
||||||
Glib::Dispatcher dispatcher_update_gui_elements ;
|
Glib::Dispatcher dispatcher_update_gui_elements ;
|
||||||
Glib::ustring label_current_sub_text ;
|
Glib::ustring label_current_sub_text ;
|
||||||
};
|
};
|
||||||
|
|
|
@ -259,8 +259,7 @@ private:
|
||||||
std::vector<Gtk::Label *> device_info ;
|
std::vector<Gtk::Label *> device_info ;
|
||||||
|
|
||||||
//stuff for progress overview and pulsebar
|
//stuff for progress overview and pulsebar
|
||||||
Glib::Thread *thread ;
|
bool pulsebar_pulse();
|
||||||
bool pulse ;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} //GParted
|
} //GParted
|
||||||
|
|
|
@ -152,8 +152,6 @@ void Dialog_Progress::on_signal_update( const OperationDetail & operationdetail
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
pulse = operationdetail .fraction < 0 ;
|
|
||||||
|
|
||||||
//update the gui elements..
|
//update the gui elements..
|
||||||
this ->operationdetail = operationdetail ;
|
this ->operationdetail = operationdetail ;
|
||||||
|
|
||||||
|
@ -161,6 +159,11 @@ void Dialog_Progress::on_signal_update( const OperationDetail & operationdetail
|
||||||
label_current_sub_text = operationdetail .get_description() ;
|
label_current_sub_text = operationdetail .get_description() ;
|
||||||
|
|
||||||
dispatcher_update_gui_elements() ;
|
dispatcher_update_gui_elements() ;
|
||||||
|
if ( operationdetail.fraction >= 0 ) {
|
||||||
|
pulsetimer.disconnect();
|
||||||
|
progressbar_current.set_fraction( operationdetail.fraction > 1.0 ? 1.0 : operationdetail.fraction );
|
||||||
|
} else if( !pulsetimer.connected() )
|
||||||
|
pulsetimer = Glib::signal_timeout().connect( sigc::mem_fun(*this, &Dialog_Progress::pulsebar_pulse), 100 );
|
||||||
}
|
}
|
||||||
else//it's an new od which needs to be added to the model.
|
else//it's an new od which needs to be added to the model.
|
||||||
{
|
{
|
||||||
|
@ -183,13 +186,16 @@ void Dialog_Progress::dispatcher_on_update_gui_elements()
|
||||||
{
|
{
|
||||||
label_current_sub .set_markup( "<i>" + label_current_sub_text + "</i>\n" ) ;
|
label_current_sub .set_markup( "<i>" + label_current_sub_text + "</i>\n" ) ;
|
||||||
|
|
||||||
if ( operationdetail .fraction >= 0 )
|
|
||||||
progressbar_current .set_fraction( operationdetail .fraction > 1.0 ? 1.0 : operationdetail .fraction ) ;
|
|
||||||
|
|
||||||
//To ensure progress bar height remains the same, add a space in case message is empty
|
//To ensure progress bar height remains the same, add a space in case message is empty
|
||||||
progressbar_current .set_text( operationdetail .progress_text + " " ) ;
|
progressbar_current .set_text( operationdetail .progress_text + " " ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Dialog_Progress::pulsebar_pulse()
|
||||||
|
{
|
||||||
|
progressbar_current.pulse();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Dialog_Progress::on_signal_show()
|
void Dialog_Progress::on_signal_show()
|
||||||
{
|
{
|
||||||
for ( t = 0 ; t < operations .size() && succes && ! cancel ; t++ )
|
for ( t = 0 ; t < operations .size() && succes && ! cancel ; t++ )
|
||||||
|
@ -211,19 +217,8 @@ void Dialog_Progress::on_signal_show()
|
||||||
treeview_operations .set_cursor( static_cast<Gtk::TreePath>( treerow ) ) ;
|
treeview_operations .set_cursor( static_cast<Gtk::TreePath>( treerow ) ) ;
|
||||||
|
|
||||||
//and start..
|
//and start..
|
||||||
running = true ;
|
|
||||||
pthread_create( & pthread, NULL, Dialog_Progress::static_pthread_apply_operation, this );
|
pthread_create( & pthread, NULL, Dialog_Progress::static_pthread_apply_operation, this );
|
||||||
|
Gtk::Main::run();
|
||||||
while ( running )
|
|
||||||
{
|
|
||||||
if ( pulse )
|
|
||||||
progressbar_current .pulse() ;
|
|
||||||
|
|
||||||
while ( Gtk::Main::events_pending() )
|
|
||||||
Gtk::Main::iteration();
|
|
||||||
usleep( 100000 ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
//set status (succes/error) for this operation
|
//set status (succes/error) for this operation
|
||||||
operations[ t ] ->operation_detail .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
operations[ t ] ->operation_detail .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
|
||||||
}
|
}
|
||||||
|
@ -236,6 +231,8 @@ void Dialog_Progress::on_signal_show()
|
||||||
this ->get_action_area() ->remove( * children .back() ) ;
|
this ->get_action_area() ->remove( * children .back() ) ;
|
||||||
this ->add_button( Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE );
|
this ->add_button( Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE );
|
||||||
|
|
||||||
|
pulsetimer.disconnect();
|
||||||
|
|
||||||
if ( cancel )
|
if ( cancel )
|
||||||
{
|
{
|
||||||
progressbar_current .set_text( _("Operation cancelled") ) ;
|
progressbar_current .set_text( _("Operation cancelled") ) ;
|
||||||
|
@ -299,13 +296,19 @@ void Dialog_Progress::on_cell_data_description( Gtk::CellRenderer * renderer, co
|
||||||
static_cast<Gtk::TreeRow>( *iter )[ treeview_operations_columns .operation_description ] ;
|
static_cast<Gtk::TreeRow>( *iter )[ treeview_operations_columns .operation_description ] ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _mainquit( void *dummy )
|
||||||
|
{
|
||||||
|
Gtk::Main::quit();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void * Dialog_Progress::static_pthread_apply_operation( void * p_dialog_progress )
|
void * Dialog_Progress::static_pthread_apply_operation( void * p_dialog_progress )
|
||||||
{
|
{
|
||||||
Dialog_Progress *dp = static_cast<Dialog_Progress *>( p_dialog_progress ) ;
|
Dialog_Progress *dp = static_cast<Dialog_Progress *>( p_dialog_progress ) ;
|
||||||
|
|
||||||
dp ->succes = dp ->signal_apply_operation .emit( dp ->operations[ dp ->t ] ) ;
|
dp ->succes = dp ->signal_apply_operation .emit( dp ->operations[ dp ->t ] ) ;
|
||||||
|
|
||||||
dp ->running = false ;
|
g_idle_add( (GSourceFunc)_mainquit, NULL );
|
||||||
|
|
||||||
return NULL ;
|
return NULL ;
|
||||||
}
|
}
|
||||||
|
@ -328,7 +331,7 @@ void Dialog_Progress::on_cancel()
|
||||||
{
|
{
|
||||||
pthread_cancel( pthread ) ;
|
pthread_cancel( pthread ) ;
|
||||||
cancel = true ;
|
cancel = true ;
|
||||||
running = false ;
|
Gtk::Main::quit();
|
||||||
succes = false ;
|
succes = false ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,6 @@ Win_GParted::Win_GParted( const std::vector<Glib::ustring> & user_devices )
|
||||||
selected_partition .Reset() ;
|
selected_partition .Reset() ;
|
||||||
new_count = 1;
|
new_count = 1;
|
||||||
current_device = 0 ;
|
current_device = 0 ;
|
||||||
pulse = false ;
|
|
||||||
OPERATIONSLIST_OPEN = true ;
|
OPERATIONSLIST_OPEN = true ;
|
||||||
gparted_core .set_user_devices( user_devices ) ;
|
gparted_core .set_user_devices( user_devices ) ;
|
||||||
|
|
||||||
|
@ -608,8 +607,22 @@ void Win_GParted::refresh_combo_devices()
|
||||||
combo_devices .set_active( current_device ) ;
|
combo_devices .set_active( current_device ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Win_GParted::pulsebar_pulse()
|
||||||
|
{
|
||||||
|
pulsebar.pulse();
|
||||||
|
Glib::ustring tmp_msg = gparted_core .get_thread_status_message() ;
|
||||||
|
if ( tmp_msg != "" ) {
|
||||||
|
statusbar.pop();
|
||||||
|
statusbar.push( tmp_msg );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
|
void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
|
||||||
{
|
{
|
||||||
|
sigc::connection pulsetimer;
|
||||||
|
|
||||||
pulsebar .show();
|
pulsebar .show();
|
||||||
statusbar .push( status_message) ;
|
statusbar .push( status_message) ;
|
||||||
|
|
||||||
|
@ -621,20 +634,10 @@ void Win_GParted::show_pulsebar( const Glib::ustring & status_message )
|
||||||
treeview_detail .set_sensitive( false ) ;
|
treeview_detail .set_sensitive( false ) ;
|
||||||
drawingarea_visualdisk .set_sensitive( false ) ;
|
drawingarea_visualdisk .set_sensitive( false ) ;
|
||||||
|
|
||||||
//the actual 'pulsing'
|
// connect pulse update timer
|
||||||
while ( pulse )
|
pulsetimer = Glib::signal_timeout().connect( sigc::mem_fun(*this, &Win_GParted::pulsebar_pulse), 100 );
|
||||||
{
|
Gtk::Main::run();
|
||||||
pulsebar .pulse();
|
pulsetimer.disconnect();
|
||||||
while ( Gtk::Main::events_pending() )
|
|
||||||
Gtk::Main::iteration();
|
|
||||||
usleep( 100000 );
|
|
||||||
Glib::ustring tmp_msg = gparted_core .get_thread_status_message() ;
|
|
||||||
if ( tmp_msg != "" )
|
|
||||||
statusbar .push( tmp_msg ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
thread ->join() ;
|
|
||||||
|
|
||||||
pulsebar .hide();
|
pulsebar .hide();
|
||||||
statusbar .pop() ;
|
statusbar .pop() ;
|
||||||
|
|
||||||
|
@ -1199,13 +1202,12 @@ void Win_GParted::on_show()
|
||||||
void Win_GParted::thread_refresh_devices()
|
void Win_GParted::thread_refresh_devices()
|
||||||
{
|
{
|
||||||
gparted_core .set_devices( devices ) ;
|
gparted_core .set_devices( devices ) ;
|
||||||
pulse = false ;
|
Gtk::Main::quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::menu_gparted_refresh_devices()
|
void Win_GParted::menu_gparted_refresh_devices()
|
||||||
{
|
{
|
||||||
pulse = true ;
|
Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_refresh_devices ), false );
|
||||||
thread = Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_refresh_devices ), true ) ;
|
|
||||||
|
|
||||||
show_pulsebar( _("Scanning all devices...") ) ;
|
show_pulsebar( _("Scanning all devices...") ) ;
|
||||||
|
|
||||||
|
@ -2012,7 +2014,7 @@ void Win_GParted::thread_unmount_partition( bool * succes, Glib::ustring * error
|
||||||
else
|
else
|
||||||
*error = "<i>" + Glib::build_path( "\n", errors ) + "</i>" ;
|
*error = "<i>" + Glib::build_path( "\n", errors ) + "</i>" ;
|
||||||
|
|
||||||
pulse = false ;
|
Gtk::Main::quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::thread_mount_partition( Glib::ustring mountpoint, bool * succes, Glib::ustring * error )
|
void Win_GParted::thread_mount_partition( Glib::ustring mountpoint, bool * succes, Glib::ustring * error )
|
||||||
|
@ -2023,8 +2025,7 @@ void Win_GParted::thread_mount_partition( Glib::ustring mountpoint, bool * succe
|
||||||
*succes = ! Utils::execute_command( "mount -v " + selected_partition .get_path() + " \"" + mountpoint + "\"",
|
*succes = ! Utils::execute_command( "mount -v " + selected_partition .get_path() + " \"" + mountpoint + "\"",
|
||||||
dummy,
|
dummy,
|
||||||
*error ) ;
|
*error ) ;
|
||||||
|
Gtk::Main::quit();
|
||||||
pulse = false ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::thread_toggle_swap( bool * succes, Glib::ustring * error )
|
void Win_GParted::thread_toggle_swap( bool * succes, Glib::ustring * error )
|
||||||
|
@ -2039,8 +2040,7 @@ void Win_GParted::thread_toggle_swap( bool * succes, Glib::ustring * error )
|
||||||
*succes = ! Utils::execute_command( "swapon -v " + selected_partition .get_path() + " && sync",
|
*succes = ! Utils::execute_command( "swapon -v " + selected_partition .get_path() + " && sync",
|
||||||
dummy,
|
dummy,
|
||||||
*error ) ;
|
*error ) ;
|
||||||
|
Gtk::Main::quit();
|
||||||
pulse = false ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::thread_toggle_lvm2_pv( bool * success, Glib::ustring * error )
|
void Win_GParted::thread_toggle_lvm2_pv( bool * success, Glib::ustring * error )
|
||||||
|
@ -2056,8 +2056,7 @@ void Win_GParted::thread_toggle_lvm2_pv( bool * success, Glib::ustring * error )
|
||||||
*success = ! Utils::execute_command( "lvm vgchange -a y " + selected_partition .get_mountpoint(),
|
*success = ! Utils::execute_command( "lvm vgchange -a y " + selected_partition .get_mountpoint(),
|
||||||
dummy,
|
dummy,
|
||||||
*error ) ;
|
*error ) ;
|
||||||
|
Gtk::Main::quit();
|
||||||
pulse = false ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Runs gpart in a thread
|
// Runs gpart in a thread
|
||||||
|
@ -2065,7 +2064,7 @@ void Win_GParted::thread_guess_partition_table()
|
||||||
{
|
{
|
||||||
this->gpart_output="";
|
this->gpart_output="";
|
||||||
this->gparted_core.guess_partition_table(devices[ current_device ], this->gpart_output);
|
this->gparted_core.guess_partition_table(devices[ current_device ], this->gpart_output);
|
||||||
pulse=false;
|
Gtk::Main::quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Win_GParted::toggle_busy_state()
|
void Win_GParted::toggle_busy_state()
|
||||||
|
@ -2116,12 +2115,10 @@ void Win_GParted::toggle_busy_state()
|
||||||
bool succes = false ;
|
bool succes = false ;
|
||||||
Glib::ustring error ;
|
Glib::ustring error ;
|
||||||
|
|
||||||
pulse = true ;
|
|
||||||
|
|
||||||
if ( selected_partition .filesystem == GParted::FS_LINUX_SWAP )
|
if ( selected_partition .filesystem == GParted::FS_LINUX_SWAP )
|
||||||
{
|
{
|
||||||
thread = Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
||||||
sigc::mem_fun( *this, &Win_GParted::thread_toggle_swap ), &succes, &error ), true ) ;
|
sigc::mem_fun( *this, &Win_GParted::thread_toggle_swap ), &succes, &error ), false );
|
||||||
|
|
||||||
show_pulsebar(
|
show_pulsebar(
|
||||||
String::ucompose(
|
String::ucompose(
|
||||||
|
@ -2145,8 +2142,8 @@ void Win_GParted::toggle_busy_state()
|
||||||
}
|
}
|
||||||
else if ( selected_partition .filesystem == GParted::FS_LVM2_PV )
|
else if ( selected_partition .filesystem == GParted::FS_LVM2_PV )
|
||||||
{
|
{
|
||||||
thread = Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
||||||
sigc::mem_fun( *this, &Win_GParted::thread_toggle_lvm2_pv ), &succes, &error ), true ) ;
|
sigc::mem_fun( *this, &Win_GParted::thread_toggle_lvm2_pv ), &succes, &error ), false );
|
||||||
|
|
||||||
show_pulsebar(
|
show_pulsebar(
|
||||||
String::ucompose(
|
String::ucompose(
|
||||||
|
@ -2173,8 +2170,8 @@ void Win_GParted::toggle_busy_state()
|
||||||
}
|
}
|
||||||
else if ( selected_partition .busy )
|
else if ( selected_partition .busy )
|
||||||
{
|
{
|
||||||
thread = Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
Glib::Thread::create( sigc::bind<bool *, Glib::ustring *>(
|
||||||
sigc::mem_fun( *this, &Win_GParted::thread_unmount_partition ), &succes, &error ), true ) ;
|
sigc::mem_fun( *this, &Win_GParted::thread_unmount_partition ), &succes, &error ), false );
|
||||||
|
|
||||||
show_pulsebar( String::ucompose( _("Unmounting %1"), selected_partition .get_path() ) ) ;
|
show_pulsebar( String::ucompose( _("Unmounting %1"), selected_partition .get_path() ) ) ;
|
||||||
|
|
||||||
|
@ -2228,14 +2225,12 @@ void Win_GParted::activate_mount_partition( unsigned int index )
|
||||||
bool succes = false ;
|
bool succes = false ;
|
||||||
Glib::ustring error ;
|
Glib::ustring error ;
|
||||||
|
|
||||||
pulse = true ;
|
Glib::Thread::create( sigc::bind<Glib::ustring, bool *, Glib::ustring *>(
|
||||||
|
|
||||||
thread = Glib::Thread::create( sigc::bind<Glib::ustring, bool *, Glib::ustring *>(
|
|
||||||
sigc::mem_fun( *this, &Win_GParted::thread_mount_partition ),
|
sigc::mem_fun( *this, &Win_GParted::thread_mount_partition ),
|
||||||
selected_partition .get_mountpoints()[ index ],
|
selected_partition .get_mountpoints()[ index ],
|
||||||
&succes,
|
&succes,
|
||||||
&error ),
|
&error ),
|
||||||
true ) ;
|
false );
|
||||||
|
|
||||||
show_pulsebar( String::ucompose( _("mounting %1 on %2"),
|
show_pulsebar( String::ucompose( _("mounting %1 on %2"),
|
||||||
selected_partition .get_path(),
|
selected_partition .get_path(),
|
||||||
|
@ -2380,8 +2375,7 @@ void Win_GParted::activate_attempt_rescue_data()
|
||||||
|
|
||||||
messageDialog.hide();
|
messageDialog.hide();
|
||||||
|
|
||||||
pulse=true;
|
Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_guess_partition_table ), false );
|
||||||
this->thread = Glib::Thread::create( sigc::mem_fun( *this, &Win_GParted::thread_guess_partition_table ), true ) ;
|
|
||||||
|
|
||||||
/*TO TRANSLATORS: looks like Searching for file systems on /deb/sdb */
|
/*TO TRANSLATORS: looks like Searching for file systems on /deb/sdb */
|
||||||
show_pulsebar(String::ucompose( _("Searching for file systems on %1"), devices[ current_device ] .get_path()));
|
show_pulsebar(String::ucompose( _("Searching for file systems on %1"), devices[ current_device ] .get_path()));
|
||||||
|
|
Loading…
Reference in New Issue