diff libgui/src/m-editor/file-editor.cc @ 31619:ad014fc78bd6

use individual local gui_settings objects Previously, we created a single gui_settings object (derived from QSettings) and accessed it from the resource_manager object. That design is not necessary and is not the way QSettings was designed to be used. Instead of managing a single object, we should be using individual QSettings objects where needed. Each individual QSettings object manages thread-safe access to a single global collection of settings. The Qt docs say that operations on QSettings are not thread safe, but that means that you can't create a QSettings object in one thread and use it in another without some locking. I'm not sure whether we were doing that correctly, but with this change it no longer matters. Each QSettings object does perform locking when reading or writing the underlying global data. * resource-manager.h, resource-manager.cc (resource_manager::m_settings): Delete data member. (resource_manager::get_settings): Delete. * annotation-dialog.cc, QTerminal.cc, QTerminal.h, command-widget.cc, command-widget.h, community-news.cc, dialog.cc, documentation-bookmarks.cc, documentation-bookmarks.h, documentation-dock-widget.cc, documentation-dock-widget.h, documentation.cc, documentation.h, dw-main-window.cc, dw-main-window.h, external-editor-interface.cc, files-dock-widget.cc, files-dock-widget.h, find-files-dialog.cc, history-dock-widget.cc, history-dock-widget.h, file-editor-interface.h, file-editor-tab.cc, file-editor-tab.h, file-editor.cc, file-editor.h, find-dialog.cc, octave-qscintilla.cc, main-window.cc, main-window.h, news-reader.cc, octave-dock-widget.cc, octave-dock-widget.h, qt-interpreter-events.cc, qt-interpreter-events.h, release-notes.cc, resource-manager.cc, resource-manager.h, set-path-dialog.cc, settings-dialog.cc, settings-dialog.h, shortcut-manager.cc, shortcut-manager.h, terminal-dock-widget.cc, terminal-dock-widget.h, variable-editor.cc, variable-editor.h, welcome-wizard.cc, workspace-model.cc, workspace-model.h, workspace-view.cc: Use local gui_settings objects instead of accessing a pointer to a single gui_settings object owned by the resource_manager object.
author John W. Eaton <jwe@octave.org>
date Fri, 02 Dec 2022 14:23:53 -0500
parents c6c4c6f04170
children 0645ea65ca6b
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor.cc	Fri Dec 02 15:51:44 2022 -0500
+++ b/libgui/src/m-editor/file-editor.cc	Fri Dec 02 14:23:53 2022 -0500
@@ -50,6 +50,7 @@
 #include "gui-preferences-ed.h"
 #include "gui-preferences-sc.h"
 #include "gui-preferences-global.h"
+#include "gui-settings.h"
 #include "main-window.h"
 #include "octave-qobject.h"
 #include "octave-qtutils.h"
@@ -181,10 +182,10 @@
 
   void file_editor::handle_enter_debug_mode (void)
   {
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-    QString sc_run = settings->sc_value (sc_edit_run_run_file);
-    QString sc_cont = settings->sc_value (sc_main_debug_continue);
+    gui_settings settings;
+
+    QString sc_run = settings.sc_value (sc_edit_run_run_file);
+    QString sc_cont = settings.sc_value (sc_main_debug_continue);
 
     if (sc_run == sc_cont)
       m_run_action->setShortcut (QKeySequence ());  // prevent ambiguous shortcuts
@@ -265,10 +266,10 @@
           return;  // not yet ready but got visibility changed signals
       }
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-    if (settings->value (global_use_custom_editor.key,
-                         global_use_custom_editor.def).toBool ())
+    gui_settings settings;
+
+    if (settings.value (global_use_custom_editor.key,
+                        global_use_custom_editor.def).toBool ())
       return;  // do not open an empty script in the external editor
 
     bool real_visible;
@@ -318,27 +319,29 @@
     request_new_file ("");
   }
 
-  void file_editor::restore_session (gui_settings *settings)
+  void file_editor::restore_session (void)
   {
+    gui_settings settings;
+
     //restore previous session
-    if (! settings->value (ed_restore_session).toBool ())
+    if (! settings.value (ed_restore_session).toBool ())
       return;
 
     // get the data from the settings file
     QStringList sessionFileNames
-      = settings->value (ed_session_names).toStringList ();
+      = settings.value (ed_session_names).toStringList ();
 
     QStringList session_encodings
-      = settings->value (ed_session_enc).toStringList ();
+      = settings.value (ed_session_enc).toStringList ();
 
     QStringList session_index
-      = settings->value (ed_session_ind).toStringList ();
+      = settings.value (ed_session_ind).toStringList ();
 
     QStringList session_lines
-      = settings->value (ed_session_lines).toStringList ();
+      = settings.value (ed_session_lines).toStringList ();
 
     QStringList session_bookmarks
-      = settings->value (ed_session_bookmarks).toStringList ();
+      = settings.value (ed_session_bookmarks).toStringList ();
 
     // fill a list of the struct and sort it (depending on index)
     QList<session_data> s_data;
@@ -440,8 +443,7 @@
   // together with encoding and the tab index
   void file_editor::save_session (void)
   {
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
+    gui_settings settings;
 
     QStringList fetFileNames;
     QStringList fet_encodings;
@@ -473,12 +475,13 @@
           }
       }
 
-    settings->setValue (ed_session_names.key, fetFileNames);
-    settings->setValue (ed_session_enc.key, fet_encodings);
-    settings->setValue (ed_session_ind.key, fet_index);
-    settings->setValue (ed_session_lines.key, fet_lines);
-    settings->setValue (ed_session_bookmarks.key, fet_bookmarks);
-    settings->sync ();
+    settings.setValue (ed_session_names.key, fetFileNames);
+    settings.setValue (ed_session_enc.key, fet_encodings);
+    settings.setValue (ed_session_ind.key, fet_index);
+    settings.setValue (ed_session_lines.key, fet_lines);
+    settings.setValue (ed_session_bookmarks.key, fet_bookmarks);
+
+    settings.sync ();
   }
 
   bool file_editor::check_closing (void)
@@ -1273,9 +1276,11 @@
     m_tmp_closed_files.clear ();
   }
 
-  void file_editor::notice_settings (const gui_settings *settings)
+  void file_editor::notice_settings (void)
   {
-    int size_idx = settings->value (global_icon_size).toInt ();
+    gui_settings settings;
+
+    int size_idx = settings.value (global_icon_size).toInt ();
     size_idx = (size_idx > 0) - (size_idx < 0) + 1;  // Make valid index from 0 to 2
 
     QStyle *st = style ();
@@ -1284,8 +1289,8 @@
 
     // Tab position and rotation
     QTabWidget::TabPosition pos
-      = static_cast<QTabWidget::TabPosition> (settings->value (ed_tab_position).toInt ());
-    bool rotated = settings->value (ed_tabs_rotated).toBool ();
+      = static_cast<QTabWidget::TabPosition> (settings.value (ed_tab_position).toInt ());
+    bool rotated = settings.value (ed_tabs_rotated).toBool ();
 
     m_tab_widget->setTabPosition (pos);
 
@@ -1308,7 +1313,7 @@
       height = is;
 
     // Calculate possibly limited width and set the elide mode
-    int chars = settings->value (ed_tabs_max_width).toInt ();
+    int chars = settings.value (ed_tabs_max_width).toInt ();
     int width = 9999;
     if (chars > 0)
       width = chars * QFontMetrics (m_tab_widget->font ()).averageCharWidth ();
@@ -1349,23 +1354,23 @@
     m_tab_widget->setStyleSheet (style_sheet);
 
     bool show_it;
-    show_it = settings->value (ed_show_line_numbers).toBool ();
+    show_it = settings.value (ed_show_line_numbers).toBool ();
     m_show_linenum_action->setChecked (show_it);
-    show_it = settings->value (ed_show_white_space).toBool ();
+    show_it = settings.value (ed_show_white_space).toBool ();
     m_show_whitespace_action->setChecked (show_it);
-    show_it = settings->value (ed_show_eol_chars).toBool ();
+    show_it = settings.value (ed_show_eol_chars).toBool ();
     m_show_eol_action->setChecked (show_it);
-    show_it = settings->value (ed_show_indent_guides).toBool ();
+    show_it = settings.value (ed_show_indent_guides).toBool ();
     m_show_indguide_action->setChecked (show_it);
-    show_it = settings->value (ed_long_line_marker).toBool ();
+    show_it = settings.value (ed_long_line_marker).toBool ();
     m_show_longline_action->setChecked (show_it);
 
-    show_it = settings->value (ed_show_toolbar).toBool ();
+    show_it = settings.value (ed_show_toolbar).toBool ();
     m_show_toolbar_action->setChecked (show_it);
     m_tool_bar->setVisible (show_it);
-    show_it = settings->value (ed_show_edit_status_bar).toBool ();
+    show_it = settings.value (ed_show_edit_status_bar).toBool ();
     m_show_statusbar_action->setChecked (show_it);
-    show_it = settings->value (ed_show_hscroll_bar).toBool ();
+    show_it = settings.value (ed_show_hscroll_bar).toBool ();
     m_show_hscrollbar_action->setChecked (show_it);
 
     set_shortcuts ();
@@ -1375,7 +1380,7 @@
       m_find_dialog->setWindowIcon (windowIcon ());
 
     // Relay signal to file editor tabs.
-    emit fetab_settings_changed (settings);
+    emit fetab_settings_changed ();
   }
 
   void file_editor::set_shortcuts (void)
@@ -1483,9 +1488,8 @@
     if (m_closed && visible)
       {
         m_closed = false;
-        resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-        gui_settings *settings = rmgr.get_settings ();
-        restore_session (settings);
+
+        restore_session ();
       }
 
     empty_script (false, visible);
@@ -1549,10 +1553,9 @@
                                        const QString& cond, int index,
                                        const QString& bookmarks)
   {
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    if (settings->value (global_use_custom_editor).toBool ())
+    gui_settings settings;
+
+    if (settings.value (global_use_custom_editor).toBool ())
       {
         // Custom editor
         if (debug_pointer || breakpoint_marker)
@@ -1562,8 +1565,7 @@
           return;   // Custom editor called
       }
 
-    bool show_dbg_file
-      = settings->value (ed_show_dbg_file).toBool ();
+    bool show_dbg_file = settings.value (ed_show_dbg_file).toBool ();
 
     if (openFileName.isEmpty ())
       {
@@ -1677,7 +1679,7 @@
                     bool create_file = true;
                     QMessageBox *msgBox;
 
-                    if (! settings->value (ed_create_new_file).toBool ())
+                    if (! settings.value (ed_create_new_file).toBool ())
                       {
                         msgBox = new QMessageBox (QMessageBox::Question,
                                                   tr ("Octave Editor"),
@@ -1849,9 +1851,9 @@
   // handler for the close event
   void file_editor::closeEvent (QCloseEvent *e)
   {
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-    if (settings->value (ed_hiding_closes_files).toBool ())
+    gui_settings settings;
+
+    if (settings.value (ed_hiding_closes_files).toBool ())
       {
         if (check_closing ())
           {
@@ -1931,12 +1933,11 @@
 
     m_tab_widget = new file_editor_tab_widget (editor_widget, this);
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-
     // the mru-list and an empty array of actions
-    gui_settings *settings = rmgr.get_settings ();
-    m_mru_files = settings->value (ed_mru_file_list).toStringList ();
-    m_mru_files_encodings = settings->value (ed_mru_file_encodings)
+    gui_settings settings;
+
+    m_mru_files = settings.value (ed_mru_file_list).toStringList ();
+    m_mru_files_encodings = settings.value (ed_mru_file_encodings)
                             .toStringList ();
 
     if (m_mru_files_encodings.count () != m_mru_files.count ())
@@ -1974,6 +1975,8 @@
 
     m_fileMenu->addSeparator ();
 
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+
     m_save_action
       = add_action (m_fileMenu, rmgr.icon ("document-save"),
                     tr ("&Save File"), SLOT (request_save_file (bool)));
@@ -2493,7 +2496,7 @@
 
     // Signals from the file_editor or main-win non-trivial operations
     connect (this, &file_editor::fetab_settings_changed,
-             f, [=] (const gui_settings *settings) { f->notice_settings (settings); });
+             f, [=] () { f->notice_settings (); });
 
     connect (this, &file_editor::fetab_change_request,
              f, &file_editor_tab::change_editor_state);
@@ -2677,21 +2680,22 @@
       }
 
     // save actual mru-list in settings
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    settings->setValue (ed_mru_file_list.key,  m_mru_files);
-    settings->setValue (ed_mru_file_encodings.key,  m_mru_files_encodings);
-    settings->sync ();
+
+    gui_settings settings;
+
+    settings.setValue (ed_mru_file_list.key,  m_mru_files);
+    settings.setValue (ed_mru_file_encodings.key,  m_mru_files_encodings);
+
+    settings.sync ();
   }
 
   bool file_editor::call_custom_editor (const QString& file_name, int line)
   {
     // Check if the user wants to use a custom file editor.
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    if (settings->value (global_use_custom_editor.key,
+
+    gui_settings settings;
+
+    if (settings.value (global_use_custom_editor.key,
                          global_use_custom_editor.def).toBool ())
       {
         // use the external editor interface for handling the call
@@ -2709,12 +2713,11 @@
 
   void file_editor::toggle_preference (const gui_pref& preference)
   {
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    bool old = settings->value (preference).toBool ();
-    settings->setValue (preference.key, ! old);
-    notice_settings (settings);
+    gui_settings settings;
+
+    bool old = settings.value (preference).toBool ();
+    settings.setValue (preference.key, ! old);
+    notice_settings ();
   }
 
   // Function for closing the files in a removed directory