diff libgui/src/m-editor/file-editor-tab.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 5cc53fd090c3
children 431f80aba37a
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Fri Dec 02 15:51:44 2022 -0500
+++ b/libgui/src/m-editor/file-editor-tab.cc	Fri Dec 02 14:23:53 2022 -0500
@@ -71,6 +71,7 @@
 #include "gui-preferences-cs.h"
 #include "gui-preferences-ed.h"
 #include "gui-preferences-global.h"
+#include "gui-settings.h"
 #include "gui-utils.h"
 #include "marker.h"
 #include "octave-qobject.h"
@@ -266,13 +267,12 @@
     connect (this, &file_editor_tab::do_save_file_signal,
              this, &file_editor_tab::do_save_file);
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-    if (settings)
-      notice_settings (settings, true);
+    notice_settings (true);
+
+    gui_settings settings;
 
     // encoding, not updated with the settings
-    m_encoding = settings->value (ed_default_enc.key, "UTF-8").toString ();
+    m_encoding = settings.value (ed_default_enc.key, "UTF-8").toString ();
     m_enc_indicator->setText (m_encoding);
     // no changes in encoding yet
     m_new_encoding = m_encoding;
@@ -713,8 +713,7 @@
   {
     QsciLexer *lexer = m_edit_area->lexer ();
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
+    gui_settings settings;
 
     if (m_lexer_apis)
       {
@@ -743,9 +742,9 @@
 
         // get settings which infos are used for octave
         bool octave_builtins
-          = settings->value (ed_code_completion_octave_builtins).toBool ();
+          = settings.value (ed_code_completion_octave_builtins).toBool ();
         bool octave_functions
-          = settings->value (ed_code_completion_octave_functions).toBool ();
+          = settings.value (ed_code_completion_octave_functions).toBool ();
 
         QCoreApplication::setApplicationName (tmp_app_name);  // Restore name
 
@@ -883,8 +882,9 @@
     if (update_apis_only)
       return;   // We are done here
 
-    int mode = settings->value (ed_color_mode).toInt ();
-    rmgr.read_lexer_settings (lexer, settings, mode);
+    int mode = settings.value (ed_color_mode).toInt ();
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    rmgr.read_lexer_settings (lexer, mode);
 
     m_edit_area->setCaretForegroundColor (lexer->color (0));
     m_edit_area->setIndentationGuidesForegroundColor (lexer->color (0));
@@ -908,7 +908,7 @@
     m_edit_area->setFoldMarginColors (bgm, fgm);
 
     QColor current_line_bg
-      = settings->color_value (ed_highlight_current_line_color, mode);
+      = settings.color_value (ed_highlight_current_line_color, mode);
     if (current_line_bg == settings_color_no_change)
        bgm = interpolate_color (bg, fg, 0.5, 0.1);  // It is the "auto" color
      else
@@ -923,7 +923,7 @@
 
     // fix line number width with respect to the font size of the lexer and
     // set the line numbers font depending on the lexer's font
-    if (settings->value (ed_show_line_numbers).toBool ())
+    if (settings.value (ed_show_line_numbers).toBool ())
       {
         // Line numbers width
         auto_margin_width ();
@@ -932,7 +932,7 @@
         QFont line_numbers_font = lexer->defaultFont ();
         int font_size = line_numbers_font.pointSize ();
         font_size = font_size
-                    + settings->value (ed_line_numbers_size).toInt ();
+                    + settings.value (ed_line_numbers_size).toInt ();
         if (font_size < 4)
           font_size = 4;
         line_numbers_font.setPointSize (font_size);
@@ -1535,20 +1535,19 @@
         if (input_str)
           {
             bool ok;
-            resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-            gui_settings *settings = rmgr.get_settings ();
+            gui_settings settings;
 
             used_comment_str
               = QInputDialog::getText (this, tr ("Comment selected text"),
                                        tr ("Comment string to use:\n"),
                                        QLineEdit::Normal,
-                                       settings->value (ed_last_comment_str, comment_str.at (0)).toString (),
+                                       settings.value (ed_last_comment_str, comment_str.at (0)).toString (),
                                        &ok);
 
             if ((! ok) || used_comment_str.isEmpty ())
               return;  // No input, do nothing
             else
-              settings->setValue (ed_last_comment_str, used_comment_str);  // Store last
+              settings.setValue (ed_last_comment_str, used_comment_str);  // Store last
           }
       }
     else
@@ -1824,10 +1823,10 @@
     QByteArray text_data = file.readAll ();
 
     // remove newline at end of file if we add one again when saving
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    if (settings->value (ed_force_newline).toBool ())
+
+    gui_settings settings;
+
+    if (settings.value (ed_force_newline).toBool ())
       {
         const QByteArray eol_lf = QByteArray (1, 0x0a);
         const QByteArray eol_cr = QByteArray (1, 0x0d);
@@ -1968,10 +1967,10 @@
     int count_lf = text.count (eol_lf) - count_crlf;  // isolated lf
     int count_cr = text.count (eol_cr) - count_crlf;  // isolated cr
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
+    gui_settings settings;
+
     QsciScintilla::EolMode eol_mode
-      = static_cast<QsciScintilla::EolMode> (settings->value (ed_default_eol_mode).toInt ());
+      = static_cast<QsciScintilla::EolMode> (settings.value (ed_default_eol_mode).toInt ());
 
     int count_max = 0;
 
@@ -2052,12 +2051,11 @@
   {
     update_window_title (false); // window title (no modification)
 
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
+    gui_settings settings;
 
     // set the eol mode from the settings or depending on the OS if the entry is
     // missing in the settings
-    m_edit_area->setEolMode (static_cast<QsciScintilla::EolMode> (settings->value (ed_default_eol_mode).toInt ()));
+    m_edit_area->setEolMode (static_cast<QsciScintilla::EolMode> (settings.value (ed_default_eol_mode).toInt ()));
 
     update_eol_indicator ();
 
@@ -2229,10 +2227,10 @@
       m_file_system_watcher.removePath (file_to_save);
 
     // Remove trailing white spaces if desired
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-
-    if (settings->value (ed_rm_trailing_spaces).toBool ())
+
+    gui_settings settings;
+
+    if (settings.value (ed_rm_trailing_spaces).toBool ())
       {
         // Replace trailing spaces, make sure edit area is writable,
         // which is not the case when saving at exit or when closing
@@ -2280,7 +2278,7 @@
     QApplication::setOverrideCursor (Qt::WaitCursor);
 
     out << m_edit_area->text ();
-    if (settings->value (ed_force_newline).toBool ()
+    if (settings.value (ed_force_newline).toBool ()
         && m_edit_area->text ().length ())
       out << m_edit_area->eol_string ();   // Add newline if desired
 
@@ -2385,9 +2383,10 @@
     fileDialog->setOption (QFileDialog::HideNameFilterDetails, false);
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
-    gui_settings *settings = rmgr.get_settings ();
-    if (! settings->value (global_use_native_dialogs).toBool ())
+
+    gui_settings settings;
+
+    if (! settings.value (global_use_native_dialogs).toBool ())
       {
         // Qt file dialogs
         fileDialog->setOption(QFileDialog::DontUseNativeDialog);
@@ -2688,16 +2687,15 @@
       }
   }
 
-  void file_editor_tab::notice_settings (const gui_settings *settings, bool init)
+  void file_editor_tab::notice_settings (bool init)
   {
-    if (! settings)
-      return;
+    gui_settings settings;
 
     if (! init)
       update_lexer_settings ();
 
     // code folding
-    if (settings->value (ed_code_folding).toBool ())
+    if (settings.value (ed_code_folding).toBool ())
       {
         m_edit_area->setMarginType (3, QsciScintilla::SymbolMargin);
         m_edit_area->setFolding (QsciScintilla::BoxedTreeFoldStyle, 3);
@@ -2708,19 +2706,19 @@
       }
 
     // status bar
-    if (settings->value (ed_show_edit_status_bar).toBool ())
+    if (settings.value (ed_show_edit_status_bar).toBool ())
       m_status_bar->show ();
     else
       m_status_bar->hide ();
 
     //highlight current line color
     m_edit_area->setCaretLineVisible
-      (settings->value (ed_highlight_current_line).toBool ());
+      (settings.value (ed_highlight_current_line).toBool ());
 
     // auto completion
-    bool match_keywords = settings->value
+    bool match_keywords = settings.value
                           (ed_code_completion_keywords).toBool ();
-    bool match_document = settings->value
+    bool match_document = settings.value
                           (ed_code_completion_document).toBool ();
 
     QsciScintilla::AutoCompletionSource source = QsciScintilla::AcsNone;
@@ -2734,30 +2732,30 @@
     m_edit_area->setAutoCompletionSource (source);
 
     m_edit_area->setAutoCompletionReplaceWord
-      (settings->value (ed_code_completion_replace).toBool ());
+      (settings.value (ed_code_completion_replace).toBool ());
     m_edit_area->setAutoCompletionCaseSensitivity
-      (settings->value (ed_code_completion_case).toBool ());
-
-    if (settings->value (ed_code_completion).toBool ())
+      (settings.value (ed_code_completion_case).toBool ());
+
+    if (settings.value (ed_code_completion).toBool ())
       m_edit_area->setAutoCompletionThreshold
-        (settings->value (ed_code_completion_threshold).toInt ());
+        (settings.value (ed_code_completion_threshold).toInt ());
     else
       m_edit_area->setAutoCompletionThreshold (-1);
 
-    if (settings->value (ed_show_white_space).toBool ())
-      if (settings->value (ed_show_white_space_indent).toBool ())
+    if (settings.value (ed_show_white_space).toBool ())
+      if (settings.value (ed_show_white_space_indent).toBool ())
         m_edit_area->setWhitespaceVisibility (QsciScintilla::WsVisibleAfterIndent);
       else
         m_edit_area->setWhitespaceVisibility (QsciScintilla::WsVisible);
     else
       m_edit_area->setWhitespaceVisibility (QsciScintilla::WsInvisible);
 
-    m_edit_area->setEolVisibility (settings->value (ed_show_eol_chars).toBool ());
+    m_edit_area->setEolVisibility (settings.value (ed_show_eol_chars).toBool ());
 
     m_save_as_desired_eol = static_cast<QsciScintilla::EolMode>
-                              (settings->value (ed_default_eol_mode).toInt ());
-
-    if (settings->value (ed_show_line_numbers).toBool ())
+                              (settings.value (ed_default_eol_mode).toInt ());
+
+    if (settings.value (ed_show_line_numbers).toBool ())
       {
         m_edit_area->setMarginLineNumbers (2, true);
         auto_margin_width ();
@@ -2770,46 +2768,46 @@
         disconnect (m_edit_area, SIGNAL (linesChanged ()), nullptr, nullptr);
       }
 
-    m_smart_indent = settings->value (ed_auto_indent).toBool ();
+    m_smart_indent = settings.value (ed_auto_indent).toBool ();
     m_edit_area->setAutoIndent (m_smart_indent);
     m_edit_area->setTabIndents
-      (settings->value (ed_tab_indents_line).toBool ());
+      (settings.value (ed_tab_indents_line).toBool ());
     m_edit_area->setBackspaceUnindents
-      (settings->value (ed_backspace_unindents_line).toBool ());
+      (settings.value (ed_backspace_unindents_line).toBool ());
     m_edit_area->setIndentationGuides
-      (settings->value (ed_show_indent_guides).toBool ());
+      (settings.value (ed_show_indent_guides).toBool ());
     m_edit_area->setIndentationsUseTabs
-      (settings->value (ed_indent_uses_tabs).toBool ());
+      (settings.value (ed_indent_uses_tabs).toBool ());
     m_edit_area->setIndentationWidth
-      (settings->value (ed_indent_width).toInt ());
+      (settings.value (ed_indent_width).toInt ());
 
     m_edit_area->setTabWidth
-      (settings->value (ed_tab_width).toInt ());
+      (settings.value (ed_tab_width).toInt ());
 
     m_ind_char_width = 1;
     if (m_edit_area->indentationsUseTabs ())
       m_ind_char_width = m_edit_area->tabWidth ();
 
     m_edit_area->SendScintilla (QsciScintillaBase::SCI_SETHSCROLLBAR,
-                                settings->value (ed_show_hscroll_bar).toBool ());
+                                settings.value (ed_show_hscroll_bar).toBool ());
     m_edit_area->SendScintilla (QsciScintillaBase::SCI_SETSCROLLWIDTH,-1);
     m_edit_area->SendScintilla (QsciScintillaBase::SCI_SETSCROLLWIDTHTRACKING,true);
 
     update_window_title (m_edit_area->isModified ());
 
-    m_auto_endif = settings->value (ed_auto_endif).toInt ();
+    m_auto_endif = settings.value (ed_auto_endif).toInt ();
 
     // long line marker
-    int line_length = settings->value (ed_long_line_column).toInt ();
+    int line_length = settings.value (ed_long_line_column).toInt ();
     m_edit_area->setEdgeColumn (line_length);
 
-    if (settings->value (ed_long_line_marker).toBool ())
+    if (settings.value (ed_long_line_marker).toBool ())
       {
-        if (settings->value (ed_long_line_marker_line).toBool ())
+        if (settings.value (ed_long_line_marker_line).toBool ())
           m_edit_area->setEdgeMode (QsciScintilla::EdgeLine);
         else
           {
-            if (settings->value (ed_long_line_marker_background)
+            if (settings.value (ed_long_line_marker_background)
                 .toBool ())
               m_edit_area->setEdgeMode (QsciScintilla::EdgeBackground);
             else
@@ -2823,36 +2821,36 @@
     m_edit_area->setWrapVisualFlags (QsciScintilla::WrapFlagByBorder);
     m_edit_area->setWrapIndentMode (QsciScintilla::WrapIndentSame);
 
-    if (settings->value (ed_wrap_lines).toBool ())
+    if (settings.value (ed_wrap_lines).toBool ())
       m_edit_area->setWrapMode (QsciScintilla::WrapWord);
     else
       m_edit_area->setWrapMode (QsciScintilla::WrapNone);
 
-    if (settings->value (ed_break_lines).toBool ())
+    if (settings.value (ed_break_lines).toBool ())
       m_line_break = line_length;
     else
       m_line_break = 0;
 
     m_line_break_comments =
-      settings->value (ed_break_lines_comments).toBool ();
+      settings.value (ed_break_lines_comments).toBool ();
 
     // highlight all occurrences of a word selected by a double click
     m_highlight_all_occurrences =
-      settings->value (ed_highlight_all_occurrences).toBool ();
+      settings.value (ed_highlight_all_occurrences).toBool ();
 
     // reload changed files
     m_always_reload_changed_files =
-      settings->value (ed_always_reload_changed_files).toBool ();
+      settings.value (ed_always_reload_changed_files).toBool ();
 
     // Set cursor blinking depending on the settings.
     // QScintilla ignores the application global settings, so some special
     // handling is required
     bool cursor_blinking;
 
-    if (settings->contains (global_cursor_blinking.key))
-      cursor_blinking = settings->value (global_cursor_blinking).toBool ();
+    if (settings.contains (global_cursor_blinking.key))
+      cursor_blinking = settings.value (global_cursor_blinking).toBool ();
     else
-      cursor_blinking = settings->value (cs_cursor_blinking).toBool ();
+      cursor_blinking = settings.value (cs_cursor_blinking).toBool ();
 
     if (cursor_blinking)
       m_edit_area->SendScintilla (QsciScintillaBase::SCI_SETCARETPERIOD, 500);