# HG changeset patch # User Daniel J Sebald # Date 1469483042 14400 # Node ID 6e9f5408c0dbfa1aa1c104f1987db2d15ae6d657 # Parent 0f22502738fa1ad1c59119e0108274337847dc03 Save settings in Qt convention, delete all children in destructors (bug #45366) * QUnixTerminalImpl.cpp (QUnixTerminalImpl::~QUnixTerminalImpl): Delete dynamic objects pointed to by m_terminal (TerminalModel), m_kpty (KPty) and m_terminalView (TerminalView). (bug fix) * files-dock-widget.cc: (files_dock_widget::~files_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (files_dock_widget::save_settings): Added. Similar code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * files-dock-widget.h: (files_dock_widget::~files_dock_widget): Provide empty destructor. (files_dock_widget::save_settings): Added, public slot. * find-files-dialog.cc: (find_files_dialog::~find_files_dialog): Moved most of the code, except the statement deleting the directory iterator, to new routine save_settings. (find_files_dialog::save_settings): Added. Large portion of the code that was in the destructor. Return immediately if variable 'settings' is not valid object pointer. * find-files-dialog.h: (find_files_dialog::save_settings): Added, public slot. * history-dock-widget.cc: (history_dock_widget::~history_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (history_dock_widget::save_settings): Similar code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * history-dock-widget.h: (history_dock_widget::~history_dock_widget): Provide empty destructor. (history_dock_widget::save_settings): Added, public slot. * main-window.cc (main_window::prepare_to_exit): If find_files_dlg is valid, call the object's save_settings routine. (main_window::construct): Connect appropriate slot of all objects that must save_settings information to the qApp aboutToQuit signal. (Except for find_files_dlg, see above.) At end of this sequence, connect aboutToQuit to the shortcut_manager and resource_manager function that deletes instance. * octave-dock-widget.cc: (octave_dock_widget::~octave_dock_widget): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (octave_dock_widget::save_settings): Similar code as destructor was. * octave-dock-widget.h: (octave_dock_widget::~octave_dock_widget): Provide empty destructor. (octave_dock_widget::save_settings): Added, public slot. * octave-qt-link.cc (octave_qt_link::do_prompt_new_edit_file): Check that 'settings' pointer is valid before using. * resource-manager.cc: Remove "singleton-cleanup.h" header reference. (resource_manager::instance_ok): Do not add cleanup_instance to worker thread's exit cleanup procedure. * resource-manager.h (resource_manager::instance) Change variable to public for connecting. (resource_manager::cleanup_instance) Change to a public slot for connecting to qApp aboutToQuit signal. (resource_manager::resource_manager): Remove an unused variation of the constructor. (resource_manager::operator =) Removed. * settings-dialog.cc: Add QMessageBox to header file list. (settings_dialog::settings_dialog): If QSettings pointer settings is not valid return immediately. (settings_dialog::show_tab): Condition setting the current index on pointer 'settings' being valid. (settings_dialog::write_changed_settings): Remove FIXME comment. If the settings are not valid, display a dialog about missing file and return. * shortcut-manager.cc: Remove "singleton-cleanup.h" header reference. (shortcut_manager::instance_ok): Do not add cleanup_instance to worker thread's exit cleanup procedure. * shortcut-manager.h (shortcut_manager::instance) Change variable to public for connecting. (shortcut_manager::cleanup_instance) Change to a public slot for connecting to qApp aboutToQuit signal. (shortcut_manager::shortcut_manager): Remove an unused variation of the constructor. (shortcut_manager::operator =) Removed. * terminal-dock-widget.cc (terminal_dock_widget::~terminal_dock_widget): Added. Delete QTerminal terminal. (bug fix) * terminal-dock-widget.h (terminal_dock_widget::~terminal_dock_widget): Added. * workspace-view.cc: (workspace_view::workspace_view): Place code hunk using QSettings pointer 'settings' within a conditional block. (workspace_view::~workspace_view): Rename to save_settings. Return if variable 'settings' is not valid object pointer. (workspace_view::save_settings): Almost same code as destructor was. Call base class octave_dock_widget::save_settings at end of routine. * workspace-view.h: (workspace_view::~workspace_view): Provide empty destructor. (workspace_view::save_settings): Added, public slot. diff -r 0f22502738fa -r 6e9f5408c0db libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp --- a/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/qterminal/libqterminal/unix/QUnixTerminalImpl.cpp Mon Jul 25 17:44:02 2016 -0400 @@ -114,6 +114,10 @@ QUnixTerminalImpl::~QUnixTerminalImpl() { + delete m_terminalModel; + delete m_kpty; + delete m_terminalView; + // Restore stderr so that any errors at exit might appear somewhere. dup2 (fdstderr, STDERR_FILENO); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/files-dock-widget.cc --- a/libgui/src/files-dock-widget.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/files-dock-widget.cc Mon Jul 25 17:44:02 2016 -0400 @@ -272,9 +272,14 @@ _octave_dir = ""; } -files_dock_widget::~files_dock_widget () +void +files_dock_widget::save_settings (void) { QSettings *settings = resource_manager::get_settings (); + + if (! settings) + return; + int sort_column = _file_tree_view->header ()->sortIndicatorSection (); Qt::SortOrder sort_order = _file_tree_view->header ()->sortIndicatorOrder (); settings->setValue ("filesdockwidget/sort_files_by_column", sort_column); @@ -291,6 +296,8 @@ settings->sync (); + octave_dock_widget::save_settings (); + if (_sig_mapper) delete _sig_mapper; } diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/files-dock-widget.h --- a/libgui/src/files-dock-widget.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/files-dock-widget.h Mon Jul 25 17:44:02 2016 -0400 @@ -52,7 +52,7 @@ files_dock_widget (QWidget *parent = 0); - ~files_dock_widget (); + ~files_dock_widget (void) { } public slots: @@ -80,6 +80,8 @@ /** Tells the widget to react on changed settings. */ void notice_settings (const QSettings *settings); + void save_settings (void); + private slots: void headercontextmenu_requested (const QPoint& pos); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/find-files-dialog.cc --- a/libgui/src/find-files-dialog.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/find-files-dialog.cc Mon Jul 25 17:44:02 2016 -0400 @@ -198,10 +198,14 @@ connect (this, SIGNAL (finished (int)), this, SLOT (handle_done (int))); } -find_files_dialog::~find_files_dialog () +void +find_files_dialog::save_settings (void) { QSettings *settings = resource_manager::get_settings (); + if (! settings) + return; + int sort_column = _file_list->horizontalHeader ()->sortIndicatorSection (); Qt::SortOrder sort_order = _file_list->horizontalHeader ()->sortIndicatorOrder (); @@ -225,7 +229,10 @@ _content_case_check->isChecked ()); settings->sync (); +} +find_files_dialog::~find_files_dialog () +{ if (_dir_iterator) delete _dir_iterator; } diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/find-files-dialog.h --- a/libgui/src/find-files-dialog.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/find-files-dialog.h Mon Jul 25 17:44:02 2016 -0400 @@ -40,6 +40,7 @@ public: find_files_dialog (QWidget * parent=0); virtual ~find_files_dialog (); + void save_settings (void); signals: void file_selected (const QString &fileName); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/history-dock-widget.cc --- a/libgui/src/history-dock-widget.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/history-dock-widget.cc Mon Jul 25 17:44:02 2016 -0400 @@ -142,10 +142,14 @@ _history_list_view->setTextElideMode (Qt::ElideRight); } -history_dock_widget::~history_dock_widget () +void +history_dock_widget::save_settings (void) { QSettings *settings = resource_manager::get_settings (); + if (! settings) + return; + settings->setValue ("history_dock_widget/filter_active", _filter_checkbox->isChecked ()); settings->setValue ("history_dock_widget/filter_shown", _filter_shown); @@ -156,6 +160,8 @@ settings->setValue ("history_dock_widget/mru_list", mru); settings->sync (); + + octave_dock_widget::save_settings (); } void diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/history-dock-widget.h --- a/libgui/src/history-dock-widget.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/history-dock-widget.h Mon Jul 25 17:44:02 2016 -0400 @@ -39,13 +39,14 @@ public: history_dock_widget (QWidget *parent = 0); - ~history_dock_widget (); + ~history_dock_widget (void) { } public slots: void set_history (const QStringList& hist); void append_history (const QString& hist_entry); void clear_history (void); + void save_settings (void); signals: diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/main-window.cc --- a/libgui/src/main-window.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/main-window.cc Mon Jul 25 17:44:02 2016 -0400 @@ -822,6 +822,12 @@ void main_window::prepare_to_exit (void) { + // Find files dialog is constructed dynamically, not at time of main_window + // construction. Connecting it to qApp aboutToQuit signal would have + // caused it to run after QSettings deleted. + if (find_files_dlg) + find_files_dlg->save_settings (); + write_settings (); } @@ -1353,8 +1359,24 @@ construct_tool_bar (); + // Order is important. Deleting QSettings must be last. + connect (qApp, SIGNAL (aboutToQuit ()), + command_window, SLOT (save_settings ())); + connect (qApp, SIGNAL (aboutToQuit ()), + history_window, SLOT (save_settings ())); + connect (qApp, SIGNAL (aboutToQuit ()), + file_browser_window, SLOT (save_settings ())); + connect (qApp, SIGNAL (aboutToQuit ()), + doc_browser_window, SLOT (save_settings ())); + connect (qApp, SIGNAL (aboutToQuit ()), + workspace_window, SLOT (save_settings ())); connect (qApp, SIGNAL (aboutToQuit ()), this, SLOT (prepare_to_exit ())); + connect (qApp, SIGNAL (aboutToQuit ()), + shortcut_manager::instance, SLOT (cleanup_instance ())); + // QSettings are saved upon deletion (i.e., cleanup_instance) + connect (qApp, SIGNAL (aboutToQuit ()), + resource_manager::instance, SLOT (cleanup_instance ())); connect (qApp, SIGNAL (focusChanged (QWidget*, QWidget*)), this, SLOT(focus_changed (QWidget*, QWidget*))); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/octave-dock-widget.cc --- a/libgui/src/octave-dock-widget.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/octave-dock-widget.cc Mon Jul 25 17:44:02 2016 -0400 @@ -123,12 +123,16 @@ setFocusPolicy (Qt::StrongFocus); } -octave_dock_widget::~octave_dock_widget () +void +octave_dock_widget::save_settings (void) { // save state of this dock-widget QString name = objectName (); QSettings *settings = resource_manager::get_settings (); + if (! settings) + return; + settings->beginGroup ("DockWidgets"); #if defined (Q_OS_WIN32) diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/octave-dock-widget.h --- a/libgui/src/octave-dock-widget.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/octave-dock-widget.h Mon Jul 25 17:44:02 2016 -0400 @@ -37,7 +37,7 @@ public: octave_dock_widget (QWidget *p = 0); - virtual ~octave_dock_widget (); + virtual ~octave_dock_widget (void) { } virtual void connect_visibility_changed (void); void make_window (void); @@ -84,6 +84,8 @@ QMainWindow *main_win () { return _parent; } + void save_settings (void); + protected slots: /** Slot to steer changing visibility from outside. */ diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/octave-qt-link.cc --- a/libgui/src/octave-qt-link.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/octave-qt-link.cc Mon Jul 25 17:44:02 2016 -0400 @@ -126,7 +126,7 @@ { QSettings *settings = resource_manager::get_settings (); - if (settings->value ("editor/create_new_file",false).toBool ()) + if (! settings || settings->value ("editor/create_new_file",false).toBool ()) return true; QFileInfo file_info (QString::fromStdString (file)); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/resource-manager.cc --- a/libgui/src/resource-manager.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/resource-manager.cc Mon Jul 25 17:44:02 2016 -0400 @@ -37,7 +37,6 @@ #include "file-ops.h" #include "help.h" #include "oct-env.h" -#include "singleton-cleanup.h" #include "defaults.h" @@ -136,13 +135,8 @@ bool retval = true; if (! instance) - { instance = new resource_manager (); - if (instance) - singleton_cleanup_list::add (cleanup_instance); - } - if (! instance) { error ("unable to create resource_manager object!"); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/resource-manager.h --- a/libgui/src/resource-manager.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/resource-manager.h Mon Jul 25 17:44:02 2016 -0400 @@ -106,17 +106,15 @@ static QStringList terminal_color_names (void); static QList terminal_default_colors (void); -private: + static resource_manager *instance; - static resource_manager *instance; +public slots: static void cleanup_instance (void) { delete instance; instance = 0; } - // No copying! +private: - resource_manager (const resource_manager&); - - resource_manager& operator = (const resource_manager&); + // No copying! static bool instance_ok (void); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/settings-dialog.cc --- a/libgui/src/settings-dialog.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/settings-dialog.cc Mon Jul 25 17:44:02 2016 -0400 @@ -34,6 +34,7 @@ #include #include #include +#include #include #if defined (HAVE_QSCINTILLA) @@ -263,6 +264,15 @@ QSettings *settings = resource_manager::get_settings (); + if (! settings) + { + QMessageBox msgBox (QMessageBox::Warning, tr ("Octave Settings"), + tr ("Unable to save settings. Missing settings " + "file or unknown directory.")); + msgBox.exec (); + return; + } + // restore last geometry restoreGeometry (settings->value("settings/geometry").toByteArray ()); @@ -613,8 +623,9 @@ if (tab.isEmpty ()) { QSettings *settings = resource_manager::get_settings (); - ui->tabWidget->setCurrentIndex (settings->value ("settings/last_tab", - 0).toInt ()); + if (settings) + ui->tabWidget->setCurrentIndex (settings->value ("settings/last_tab", + 0).toInt ()); } else { diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/shortcut-manager.cc --- a/libgui/src/shortcut-manager.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/shortcut-manager.cc Mon Jul 25 17:44:02 2016 -0400 @@ -40,7 +40,6 @@ #include "error.h" #include "resource-manager.h" #include "shortcut-manager.h" -#include "singleton-cleanup.h" shortcut_manager *shortcut_manager::instance = 0; @@ -66,13 +65,8 @@ bool retval = true; if (! instance) - { instance = new shortcut_manager (); - if (instance) - singleton_cleanup_list::add (cleanup_instance); - } - if (! instance) { error ("unable to create shortcut_manager object!"); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/shortcut-manager.h --- a/libgui/src/shortcut-manager.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/shortcut-manager.h Mon Jul 25 17:44:02 2016 -0400 @@ -95,8 +95,12 @@ instance->do_import_export (action); } + static shortcut_manager *instance; + public slots: + static void cleanup_instance (void) { delete instance; instance = 0; } + signals: protected: @@ -109,14 +113,8 @@ private: - static shortcut_manager *instance; - static void cleanup_instance (void) { delete instance; instance = 0; } - // No copying! - shortcut_manager (const shortcut_manager&); - shortcut_manager& operator = (const shortcut_manager&); - static bool instance_ok (void); void init (QString, QString, QKeySequence); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/terminal-dock-widget.cc --- a/libgui/src/terminal-dock-widget.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/terminal-dock-widget.cc Mon Jul 25 17:44:02 2016 -0400 @@ -69,3 +69,9 @@ { emit interrupt_signal (); } + +terminal_dock_widget::~terminal_dock_widget (void) +{ + delete terminal; +} + diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/terminal-dock-widget.h --- a/libgui/src/terminal-dock-widget.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/terminal-dock-widget.h Mon Jul 25 17:44:02 2016 -0400 @@ -37,6 +37,8 @@ terminal_dock_widget (QWidget *parent = 0); + ~terminal_dock_widget (void); + bool has_focus (void) const; void focus (void); diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/workspace-view.cc --- a/libgui/src/workspace-view.cc Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/workspace-view.cc Mon Jul 25 17:44:02 2016 -0400 @@ -92,43 +92,43 @@ QSettings *settings = resource_manager::get_settings (); - _filter_shown = settings->value ("workspaceview/filter_shown",true).toBool(); - _filter_widget->setVisible (_filter_shown); - - ws_layout->setMargin (2); + if (settings) + { + _filter_shown = settings->value ("workspaceview/filter_shown",true).toBool(); + _filter_widget->setVisible (_filter_shown); - // Set the empty widget to have our layout. - widget ()->setLayout (ws_layout); + ws_layout->setMargin (2); - // Initialize collapse/expand state of the workspace subcategories. + // Set the empty widget to have our layout. + widget ()->setLayout (ws_layout); + + // Initialize collapse/expand state of the workspace subcategories. - //enable sorting (setting column and order after model was set) - view->setSortingEnabled (true); - // Initialize column order and width of the workspace - view->horizontalHeader ()->restoreState ( - settings->value ("workspaceview/column_state").toByteArray ()); - // Set header properties for sorting - view->horizontalHeader ()->setClickable (true); - view->horizontalHeader ()->setMovable (true); - view->horizontalHeader ()->setSortIndicator ( - settings->value ("workspaceview/sort_by_column",0).toInt (), - static_cast - (settings->value ("workspaceview/sort_order", Qt::AscendingOrder).toUInt ()) - ); - view->horizontalHeader ()->setSortIndicatorShown (true); + //enable sorting (setting column and order after model was set) + view->setSortingEnabled (true); + // Initialize column order and width of the workspace + view->horizontalHeader ()->restoreState (settings->value ("workspaceview/column_state").toByteArray ()); + // Set header properties for sorting + view->horizontalHeader ()->setClickable (true); + view->horizontalHeader ()->setMovable (true); + view->horizontalHeader ()->setSortIndicator (settings->value ("workspaceview/sort_by_column",0).toInt (), + static_cast + (settings->value ("workspaceview/sort_order", Qt::AscendingOrder).toUInt ())); + view->horizontalHeader ()->setSortIndicatorShown (true); - view->horizontalHeader ()->setContextMenuPolicy (Qt::CustomContextMenu); - connect (view->horizontalHeader (), - SIGNAL (customContextMenuRequested (const QPoint &)), - this, SLOT (header_contextmenu_requested (const QPoint &))); + view->horizontalHeader ()->setContextMenuPolicy (Qt::CustomContextMenu); + connect (view->horizontalHeader (), + SIGNAL (customContextMenuRequested (const QPoint &)), + this, SLOT (header_contextmenu_requested (const QPoint &))); - // Init state of the filter - _filter->addItems (settings->value ("workspaceview/mru_list").toStringList ()); + // Init state of the filter + _filter->addItems (settings->value ("workspaceview/mru_list").toStringList ()); - bool filter_state = - settings->value ("workspaceview/filter_active", false).toBool (); - _filter_checkbox->setChecked (filter_state); - filter_activate (filter_state); + bool filter_state = + settings->value ("workspaceview/filter_active", false).toBool (); + _filter_checkbox->setChecked (filter_state); + filter_activate (filter_state); + } // Connect signals and slots. @@ -146,10 +146,14 @@ p, SLOT (execute_command_in_terminal (const QString&))); } -workspace_view::~workspace_view (void) +void +workspace_view::save_settings (void) { QSettings *settings = resource_manager::get_settings (); + if (! settings) + return; + settings->setValue ("workspaceview/column_state", view->horizontalHeader ()->saveState ()); @@ -278,6 +282,8 @@ settings->setValue (key, ! shown); settings->sync (); + + octave_dock_widget::save_settings (); } void diff -r 0f22502738fa -r 6e9f5408c0db libgui/src/workspace-view.h --- a/libgui/src/workspace-view.h Fri Jul 22 18:44:43 2016 +0100 +++ b/libgui/src/workspace-view.h Mon Jul 25 17:44:02 2016 -0400 @@ -43,7 +43,7 @@ workspace_view (QWidget *parent = 0); - ~workspace_view (void); + ~workspace_view (void) { } public slots: @@ -51,6 +51,8 @@ void setModel (workspace_model *model); + void save_settings (void); + signals: /** signal that user had requested a command on a variable */