From dde4f4d709370b6221f0ae2966f46759a4826ca7 Mon Sep 17 00:00:00 2001 From: Bart Hakvoort Date: Sat, 16 Oct 2004 15:42:08 +0000 Subject: [PATCH] First load gui and then scan devices, this resulted in way faster startup * include/Win_GParted.h, src/Win_GParted.cc: First load gui and then scan devices, this resulted in way faster startup and is more satisfactory (imho) Also did some minor code cleanups and rearranged some functions needed for applying operations. * src/Dialog_Progress.cc: few minor code cleanups. --- ChangeLog | 7 +++ include/Win_GParted.h | 6 +-- src/Dialog_Progress.cc | 15 +++--- src/Win_GParted.cc | 105 +++++++++++++++++++++-------------------- 4 files changed, 72 insertions(+), 61 deletions(-) diff --git a/ChangeLog b/ChangeLog index cfb5997c..f9d5bf6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2004-10-16 Bart Hakvoort + + * include/Win_GParted.h, + src/Win_GParted.cc: First load gui and then scan devices, this resulted in way faster startup and is more satisfactory (imho) + Also did some minor code cleanups and rearranged some functions needed for applying operations. + * src/Dialog_Progress.cc: few minor code cleanups. + 2004-10-14 Bart Hakvoort * include/Operation.h, diff --git a/include/Win_GParted.h b/include/Win_GParted.h index 06d6dc71..999ba48b 100644 --- a/include/Win_GParted.h +++ b/include/Win_GParted.h @@ -167,7 +167,6 @@ private: //usefull variables which are used by many different functions... - sigc::connection s2,s3;//used for disconnecting and destroying a connection ( see optionmenu_devices_changed() and activate_apply() ) bool any_logic,any_extended;//used in some checks (e.g. see optionmenu_devices_changed() unsigned short highest_logic_busy ;//highest_logic_busy contains the number of the highest logical which is busy ( 0 if none is busy) unsigned short primary_count ;//primary_count checks for max. of 4 pimary partitions @@ -179,10 +178,11 @@ private: std::vector device_info ; std::vector FILESYSTEMS ; - //stuff for progress overview + //stuff for progress overview and pulsebar Dialog_Progress *dialog_progress; Glib::Thread *thread ; - Glib::Dispatcher dispatcher_next_operation; + Glib::Dispatcher dispatcher; + sigc::connection conn ; bool apply, pulse ; }; diff --git a/src/Dialog_Progress.cc b/src/Dialog_Progress.cc index d9c4c9a8..78e357f8 100644 --- a/src/Dialog_Progress.cc +++ b/src/Dialog_Progress.cc @@ -58,15 +58,11 @@ Dialog_Progress::Dialog_Progress( int count_operations, const Glib::ustring & fi this->get_vbox() ->set_spacing( 5 ) ; this->get_vbox() ->set_border_width( 15 ) ; - this->add_button( Gtk::Stock::CANCEL,Gtk::RESPONSE_CANCEL );//doesn't work for current operation + this->add_button( Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL ); this->show_all_children() ; } -Dialog_Progress::~Dialog_Progress() -{ -} - -void Dialog_Progress::Set_Next_Operation( ) +void Dialog_Progress::Set_Next_Operation( ) { progressbar_all.set_fraction( progressbar_all.get_fraction() + fraction ); @@ -78,7 +74,7 @@ void Dialog_Progress::Set_Next_Operation( ) } void Dialog_Progress::Set_Progress_Current_Operation( ) -{ +{ progressbar_current.set_fraction( fraction_current ); if ( time_left > 59 && time_left < 120 ) @@ -87,4 +83,9 @@ void Dialog_Progress::Set_Progress_Current_Operation( ) progressbar_current.set_text( String::ucompose( _("about %1 minutes and %2 seconds left"), time_left/60, time_left % 60 ) ) ; } +Dialog_Progress::~Dialog_Progress() +{ +} + + }//GParted diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index b0408c6f..7c6ab2eb 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -32,7 +32,7 @@ Win_GParted::Win_GParted( ) Find_Supported_Filesystems() ; //locate all available devices and store them in devices vector - Find_Devices( ) ; + Find_Devices( false ) ; Refresh_OptionMenu( ) ; //==== GUI ========================= @@ -84,6 +84,9 @@ Win_GParted::Win_GParted( ) //make sure harddisk information and operationlist are closed.. hpaned_main .get_child1( ) ->hide( ) ; close_operationslist( ) ; + + conn = dispatcher .connect( sigc::mem_fun( *this, &Win_GParted::menu_gparted_refresh_devices ) ); + dispatcher ( ) ; } void Win_GParted::init_menubar() @@ -367,27 +370,27 @@ void Win_GParted::Find_Supported_Filesystems() void Win_GParted::Find_Devices( bool deep_scan ) { - for ( unsigned int t=0;tpath, &FILESYSTEMS ); if ( temp_device ->Get_Length() > 0 ) { temp_device ->Read_Disk_Layout( deep_scan ) ; - devices.push_back( temp_device ) ; + devices .push_back( temp_device ) ; } else delete temp_device ; - device = ped_device_get_next (device) ; + device = ped_device_get_next ( device ) ; } } @@ -435,6 +438,7 @@ void Win_GParted::Show_Pulsebar( ) } thread ->join( ) ; + conn .disconnect( ) ; pulsebar ->hide( ); statusbar .pop( ) ; @@ -561,15 +565,14 @@ void Win_GParted::Refresh_Visual( ) //vbox visual if ( vbox_visual_disk != NULL ) { - hbox_visual.remove( *vbox_visual_disk ); - s2.disconnect(); + hbox_visual .remove( *vbox_visual_disk ); delete ( vbox_visual_disk ); } - vbox_visual_disk = new VBox_VisualDisk ( partitions, devices[ current_device ] ->Get_Length() ); - s2 = vbox_visual_disk->signal_mouse_click.connect( sigc::mem_fun( this, &Win_GParted::mouse_click) ); - hbox_visual.pack_start( *vbox_visual_disk, Gtk::PACK_EXPAND_PADDING ); - hbox_visual .show_all_children(); + vbox_visual_disk = new VBox_VisualDisk ( partitions, devices[ current_device ] ->Get_Length( ) ) ; + vbox_visual_disk ->signal_mouse_click.connect( sigc::mem_fun( this, &Win_GParted::mouse_click ) ) ; + hbox_visual .pack_start( *vbox_visual_disk, Gtk::PACK_EXPAND_PADDING ) ; + hbox_visual .show_all_children( ) ; //treeview details treeview_detail .Load_Partitions( partitions ) ; @@ -1116,6 +1119,22 @@ void Win_GParted::activate_undo() } + +//-------AFAIK it's not possible to use a C++ memberfunction as a callback for a C libary function (if you know otherwise, PLEASE contact me)------------ +Dialog_Progress *dp; +Glib::Dispatcher dispatcher_set_progress; + +void progress_callback( PedTimer * timer, void *context ) +{ + if ( time(NULL) - timer ->start > 0 ) + { + dp ->time_left = timer ->predicted_end - time(NULL) ; + dp ->fraction_current = timer ->frac ; + dispatcher_set_progress() ; + } +} +//--------------------------------------------------------------------------------------- + void Win_GParted::activate_apply() { str_temp = "" ; @@ -1123,36 +1142,39 @@ void Win_GParted::activate_apply() str_temp += "\n\n" ; str_temp += _( "It is recommended to backup valueable data before proceeding.") ; - Gtk::MessageDialog dialog( *this, str_temp,true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE, true); + Gtk::MessageDialog dialog( *this, str_temp, true, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE, true); dialog.set_title( _( "Apply operations to harddisk" ) ); - dialog.add_button( Gtk::Stock::CANCEL,Gtk::RESPONSE_CANCEL ); + dialog.add_button( Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL ); dialog.add_button( Gtk::Stock::APPLY, Gtk::RESPONSE_OK ); - dialog.show_all_children(); + dialog.show_all_children( ) ; if ( dialog.run() == Gtk::RESPONSE_OK ) { dialog.hide() ; //hide confirmationdialog apply = true; dialog_progress = new Dialog_Progress ( operations.size(), operations.front() .str_operation ) ; - s3 = dispatcher_next_operation.connect( sigc::mem_fun(*dialog_progress, &Dialog_Progress::Set_Next_Operation) ); + dp = dialog_progress ; + conn = dispatcher .connect( sigc::mem_fun(*dialog_progress, &Dialog_Progress::Set_Next_Operation) ); + dispatcher_set_progress .connect( sigc::mem_fun( *dialog_progress, &Dialog_Progress::Set_Progress_Current_Operation ) ); + thread = Glib::Thread::create(SigC::slot_class(*this, &Win_GParted::apply_operations_thread), true); - dialog_progress->set_transient_for( *this ); - while ( dialog_progress->run() != Gtk::RESPONSE_OK ) - apply = false;//finish current operation . then stop applying operations + dialog_progress ->set_transient_for( *this ); + while ( dialog_progress ->run( ) != Gtk::RESPONSE_OK ) + apply = false ;//finish current operation . then stop applying operations //after hiding the progressdialog - s3.disconnect(); delete ( dialog_progress ) ; - thread ->join() ; + thread ->join( ) ; + conn .disconnect( ) ; //make list of involved devices which have at least one busy partition.. std::vector devicenames ; for (unsigned int t=0; tGet_Path() ) == devicenames .end() && - operations[ t ] .device ->Get_any_busy() + operations[ t ] .device ->Get_any_busy() ) devicenames .push_back( operations[ t ] .device ->Get_Path() ) ; @@ -1180,53 +1202,34 @@ void Win_GParted::activate_apply() //wipe operations... - operations.clear(); - liststore_operations ->clear(); - close_operationslist() ; + operations.clear( ) ; + liststore_operations ->clear( ) ; + close_operationslist( ) ; //reset new_count to 1 - new_count = 1; + new_count = 1 ; //reread devices and their layouts... - menu_gparted_refresh_devices() ; + menu_gparted_refresh_devices( ) ; } } -//-------AFAIK it's not possible to use a C++ memberfunction as a callback for a C libary function (if you know otherwise, PLEASE contact me------------ -Dialog_Progress *dp; -Glib::Dispatcher dispatcher_current_operation; -void progress_callback(PedTimer * timer, void *context ) -{ - if ( time(NULL) - timer ->start > 0 ) - { - dp ->time_left = timer ->predicted_end - time(NULL) ; - dp ->fraction_current = timer ->frac ; - dispatcher_current_operation() ; - } -} -//--------------------------------------------------------------------------------------- - -void Win_GParted::apply_operations_thread() +void Win_GParted::apply_operations_thread( ) { - dp = dialog_progress ; - sigc::connection signal = dispatcher_current_operation.connect( sigc::mem_fun(*dialog_progress, &Dialog_Progress::Set_Progress_Current_Operation) ); - PedTimer *timer = ped_timer_new( progress_callback, NULL ) ; - for ( unsigned int t=0;tcurrent_operation = operations[ t +1 ] .str_operation ; - dispatcher_next_operation() ; + dispatcher( ) ; } } - dialog_progress->response( Gtk::RESPONSE_OK ); - signal.disconnect() ; + dialog_progress ->response( Gtk::RESPONSE_OK ); }