changeset 27620:45bb5bbaf291

don't use singleton pattern for resource manager in GUI Move ownership of the resource_manager object to the base_qobject class. Store reference to resource_manager object as a member variable in most objects that need to access it. Eliminate static member functions in resource_managar class. Provide a get_resource_manager method in the base_qboject class and a global __get_resource_manager__ function for those instances where we can't easily provide local access to the resource_manager object. There are many changes to many files, but most are straightforward.
author John W. Eaton <jwe@octave.org>
date Fri, 01 Nov 2019 18:16:49 -0400
parents 0053b8e0dc56
children 39fac14ab25a
files libgui/graphics/Canvas.cc libgui/graphics/ToolBarButton.cc libgui/graphics/annotation-dialog.cc libgui/qterminal/libqterminal/QTerminal.h libgui/src/dialog.cc libgui/src/documentation-dock-widget.cc libgui/src/documentation-dock-widget.h libgui/src/documentation.cc libgui/src/documentation.h libgui/src/dw-main-window.cc libgui/src/dw-main-window.h libgui/src/external-editor-interface.cc libgui/src/external-editor-interface.h libgui/src/files-dock-widget.cc libgui/src/files-dock-widget.h libgui/src/find-files-dialog.cc libgui/src/find-files-dialog.h libgui/src/history-dock-widget.cc libgui/src/history-dock-widget.h libgui/src/m-editor/file-editor-interface.h libgui/src/m-editor/file-editor-tab.cc libgui/src/m-editor/file-editor-tab.h libgui/src/m-editor/file-editor.cc libgui/src/m-editor/file-editor.h libgui/src/m-editor/octave-qscintilla.cc libgui/src/m-editor/octave-qscintilla.h libgui/src/main-window.cc libgui/src/main-window.h libgui/src/news-reader.cc libgui/src/news-reader.h libgui/src/octave-dock-widget.cc libgui/src/octave-dock-widget.h libgui/src/octave-qobject.cc libgui/src/octave-qobject.h libgui/src/qt-interpreter-events.cc libgui/src/qt-interpreter-events.h libgui/src/resource-manager.cc libgui/src/resource-manager.h libgui/src/set-path-dialog.cc libgui/src/set-path-dialog.h libgui/src/settings-dialog.cc libgui/src/settings-dialog.h libgui/src/shortcut-manager.cc libgui/src/terminal-dock-widget.cc libgui/src/terminal-dock-widget.h libgui/src/variable-editor.cc libgui/src/variable-editor.h libgui/src/welcome-wizard.cc libgui/src/welcome-wizard.h libgui/src/workspace-model.cc libgui/src/workspace-model.h libgui/src/workspace-view.cc libgui/src/workspace-view.h
diffstat 53 files changed, 538 insertions(+), 497 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/Canvas.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/graphics/Canvas.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -72,6 +72,17 @@
     m_redrawBlocked = block;
   }
 
+  static QCursor
+  make_cursor (const QString& name, int hot_x  = -1, int hot_y = -1)
+  {
+    octave::resource_manager& rmgr
+      = octave::__get_resource_manager__ ("make_cursor");
+
+    QIcon icon = rmgr.icon (name);
+
+    return QCursor (icon.pixmap (22, 22), hot_x, hot_y);
+  }
+
   void
   Canvas::setCursor (MouseMode mode, std::string fallback,
                      QImage cdata, Matrix hotspot)
@@ -89,24 +100,15 @@
               if (fallback == "arrow")
                 cursor = Qt::ArrowCursor;
               else if (fallback == "botl")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("bottom_left_corner").pixmap (22,22),
-                                  5, 16);
+                cursor = make_cursor ("bottom_left_corner", 5, 16);
               else if (fallback == "botr")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("bottom_right_corner").pixmap (22, 22),
-                                  16, 16);
+                cursor = make_cursor ("bottom_right_corner", 16, 16);
               else if (fallback == "bottom")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("bottom_side").pixmap (22, 22),
-                                  11, 16);
+                cursor = make_cursor ("bottom_side", 11, 16);
               else if (fallback == "circle")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("circle").pixmap (22, 22),
-                                  10, 10);
+                cursor = make_cursor ("circle", 10, 10);
               else if (fallback == "cross" || fallback == "crosshair")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("cross").pixmap (22, 22), 10, 10);
+                cursor = make_cursor ("cross", 10, 10);
               else if (fallback == "custom")
                 {
                   if (hotspot(0) > cdata.width () || hotspot(0) < 1.0
@@ -118,31 +120,21 @@
                                     static_cast<int> (hotspot(0) - 1));
                 }
               else if (fallback == "fleur")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("fleur").pixmap (22, 22), 10, 4);
+                cursor = make_cursor ("fleur", 10, 4);
               else if (fallback == "hand")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("hand2").pixmap (22, 22), 7, 3);
+                cursor = make_cursor ("hand2", 7, 3);
               else if (fallback == "ibeam")
                 cursor = Qt::IBeamCursor;
               else if (fallback == "left")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("left_side").pixmap (22, 22), 4, 10);
+                cursor = make_cursor ("left_side", 4, 10);
               else if (fallback == "right")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("right_side").pixmap (22, 22),
-                                  17, 10);
+                cursor = make_cursor ("right_side", 17, 10);
               else if (fallback == "top")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("top_side").pixmap (22, 22), 11, 4);
+                cursor = make_cursor ("top_side", 11, 4);
               else if (fallback == "topl")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("top_left_corner").pixmap (22, 22),
-                                  4, 4);
+                cursor = make_cursor ("top_left_corner", 4, 4);
               else if (fallback == "topr")
-                cursor = QCursor (octave::resource_manager::icon
-                                  ("top_right_corner").pixmap (22, 22),
-                                  16, 4);
+                cursor = make_cursor ("top_right_corner", 16, 4);
               else if (fallback == "watch")
                 cursor = Qt::BusyCursor;
             }
@@ -152,13 +144,11 @@
             break;
 
           case PanMode:
-            cursor = QCursor (octave::resource_manager::icon ("figure-pan")
-                              .pixmap (22, 22));
+            cursor = make_cursor ("figure-pan");
             break;
 
           case RotateMode:
-            cursor = QCursor (octave::resource_manager::icon ("figure-rotate")
-                              .pixmap (22, 22));
+            cursor = make_cursor ("figure-rotate");
             break;
 
           case TextMode:
@@ -166,13 +156,11 @@
             break;
 
           case ZoomInMode:
-            cursor = QCursor (octave::resource_manager::icon ("figure-zoom-in")
-                              .pixmap (22, 22), 9, 9);
+            cursor = make_cursor ("figure-zoom-in", 9, 9);
             break;
 
           case ZoomOutMode:
-            cursor = QCursor (octave::resource_manager::icon ("figure-zoom-out")
-                              .pixmap (22, 22), 9, 9);
+            cursor = make_cursor ("figure-zoom-out", 9, 9);
             break;
 
           default:
--- a/libgui/graphics/ToolBarButton.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/graphics/ToolBarButton.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -33,6 +33,13 @@
 
 namespace QtHandles
 {
+  static QIcon get_icon (const std::string& name)
+  {
+    octave::resource_manager& rmgr
+      = octave::__get_resource_manager__ ("get_icon");
+
+    return rmgr.icon (QString::fromStdString (name));
+  }
 
   template <typename T>
   ToolBarButton<T>::ToolBarButton (const graphics_object& go, QAction *action)
@@ -51,7 +58,7 @@
         QIcon ico;
         std::string name = tp.get___named_icon__ ();
         if (! name.empty ())
-          ico = octave::resource_manager::icon (QString::fromStdString (name));
+          ico = get_icon (name);
 
         action->setIcon (ico);
       }
@@ -106,7 +113,8 @@
               QIcon ico;
               std::string name = tp.get___named_icon__ ();
               if (! name.empty ())
-                ico = octave::resource_manager::icon (QString::fromStdString (name));
+                ico = get_icon (name);
+
               action->setIcon (ico);
             }
           else
--- a/libgui/graphics/annotation-dialog.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/graphics/annotation-dialog.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -50,7 +50,10 @@
 {
   ui->setupUi (this);
 
-  octave::gui_settings *settings = octave::resource_manager::get_settings ();
+  octave::resource_manager& rmgr
+      = octave::__get_resource_manager__ ("annotation_dialog::init");
+
+  octave::gui_settings *settings = rmgr.get_settings ();
 
   // restore last geometry
   if (settings)
@@ -94,7 +97,10 @@
   QDialogButtonBox::ButtonRole button_role
     = ui->button_box->buttonRole (button);
 
-  octave::gui_settings *settings = octave::resource_manager::get_settings ();
+  octave::resource_manager& rmgr
+      = octave::__get_resource_manager__ ("annotation_dialog::button_clicked");
+
+  octave::gui_settings *settings = rmgr.get_settings ();
 
   // save position
   if (settings)
--- a/libgui/qterminal/libqterminal/QTerminal.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/qterminal/libqterminal/QTerminal.h	Fri Nov 01 18:16:49 2019 -0400
@@ -135,18 +135,21 @@
 
   QTerminal (QWidget *xparent = nullptr) : QWidget (xparent)
   {
+    octave::resource_manager& rmgr
+      = octave::__get_resource_manager__ ("QTerminal::QTerminal");
+
     // context menu
     setContextMenuPolicy (Qt::CustomContextMenu);
 
     _contextMenu = new QMenu (this);
 
     _copy_action
-      = _contextMenu->addAction (octave::resource_manager::icon ("edit-copy"),
-                                 tr ("Copy"), this, SLOT (copyClipboard ()));
+      = _contextMenu->addAction (rmgr.icon ("edit-copy"), tr ("Copy"), this,
+                                 SLOT (copyClipboard ()));
 
     _paste_action
-      = _contextMenu->addAction (octave::resource_manager::icon ("edit-paste"),
-                                 tr ("Paste"), this, SLOT (pasteClipboard ()));
+      = _contextMenu->addAction (rmgr.icon ("edit-paste"), tr ("Paste"), this,
+                                 SLOT (pasteClipboard ()));
 
     _contextMenu->addSeparator ();
 
--- a/libgui/src/dialog.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/dialog.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -660,8 +660,10 @@
     setDirectory (dirname);
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
-                                                    true).toBool ())
+    resource_manager& rmgr
+      = __get_resource_manager__ ("FileDialog::FileDialog");
+    gui_settings *settings = rmgr.get_settings ();
+    if (! settings->value ("use_native_file_dialogs", true).toBool ())
       setOption(QFileDialog::DontUseNativeDialog);
 
     if (multimode == "on")         // uigetfile multiselect=on
--- a/libgui/src/documentation-dock-widget.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/documentation-dock-widget.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -30,14 +30,15 @@
 
 namespace octave
 {
-  documentation_dock_widget::documentation_dock_widget (QWidget *p)
-    : octave_dock_widget ("DocumentationDockWidget", p)
+  documentation_dock_widget::documentation_dock_widget (QWidget *p,
+                                                        resource_manager& rmgr)
+    : octave_dock_widget ("DocumentationDockWidget", p, rmgr)
   {
     setWindowIcon (QIcon (":/actions/icons/logo.png"));
     set_title (tr ("Documentation"));
     setStatusTip (tr ("See the documentation for help."));
 
-    m_docs = new documentation (this);
+    m_docs = new documentation (this, rmgr);
     setWidget (m_docs);
 
     connect (p, SIGNAL (show_doc_signal (const QString&)),
--- a/libgui/src/documentation-dock-widget.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/documentation-dock-widget.h	Fri Nov 01 18:16:49 2019 -0400
@@ -28,13 +28,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class documentation_dock_widget : public octave_dock_widget
   {
     Q_OBJECT
 
   public:
 
-    documentation_dock_widget (QWidget *parent = nullptr);
+    documentation_dock_widget (QWidget *parent, resource_manager& rmgr);
     ~documentation_dock_widget (void);
 
   public slots:
--- a/libgui/src/documentation.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/documentation.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -55,9 +55,9 @@
 {
   // The documentation splitter, which is the main widget
   // of the doc dock widget
-  documentation::documentation (QWidget *p)
+  documentation::documentation (QWidget *p, resource_manager& rmgr)
     : QSplitter (Qt::Horizontal, p),
-      m_doc_widget (p),
+      m_resource_manager (rmgr), m_doc_widget (p),
       m_tool_bar (new QToolBar (p)),
       m_query_string (QString ()),
       m_prev_pages_menu (new QMenu (p)),
@@ -140,13 +140,13 @@
     QToolButton *forward_button = new QToolButton (find_footer);
     forward_button->setText (tr ("Search forward"));
     forward_button->setToolTip (tr ("Search forward"));
-    forward_button->setIcon (resource_manager::icon ("go-down"));
+    forward_button->setIcon (m_resource_manager.icon ("go-down"));
     connect (forward_button, SIGNAL (pressed (void)),
              this, SLOT(find (void)));
     QToolButton *backward_button = new QToolButton (find_footer);
     backward_button->setText (tr ("Search backward"));
     backward_button->setToolTip (tr ("Search backward"));
-    backward_button->setIcon (resource_manager::icon ("go-up"));
+    backward_button->setIcon (m_resource_manager.icon ("go-up"));
     connect (backward_button, SIGNAL (pressed (void)),
              this, SLOT(find_backward (void)));
     QHBoxLayout *h_box_find_footer = new QHBoxLayout (find_footer);
@@ -163,7 +163,7 @@
     v_box_browser_find->addWidget (find_footer);
     browser_find->setLayout (v_box_browser_find);
 
-    notice_settings (resource_manager::get_settings ());
+    notice_settings (m_resource_manager.get_settings ());
 
     m_findnext_shortcut->setContext (Qt::WidgetWithChildrenShortcut);
     connect (m_findnext_shortcut, SIGNAL (activated (void)),
@@ -318,10 +318,10 @@
   void documentation::construct_tool_bar (void)
   {
     // Home, Previous, Next
-    m_action_go_home = add_action (resource_manager::icon ("go-home"),
+    m_action_go_home = add_action (m_resource_manager.icon ("go-home"),
                                    tr ("Go home"), SLOT (home (void)),
                                    m_doc_browser, m_tool_bar);
-    m_action_go_prev = add_action (resource_manager::icon ("go-previous"),
+    m_action_go_prev = add_action (m_resource_manager.icon ("go-previous"),
                                    tr ("Go back"), SLOT (backward (void)),
                                    m_doc_browser, m_tool_bar);
     m_action_go_prev->setEnabled (false);
@@ -335,7 +335,7 @@
     popdown_button_prev_pages->setCheckable (false);
     popdown_button_prev_pages->setArrowType(Qt::DownArrow);
     m_tool_bar->addWidget (popdown_button_prev_pages);
-    m_action_go_next = add_action (resource_manager::icon ("go-next"),
+    m_action_go_next = add_action (m_resource_manager.icon ("go-next"),
                                    tr ("Go forward"), SLOT (forward (void)),
                                    m_doc_browser, m_tool_bar);
     m_action_go_next->setEnabled (false);
@@ -378,19 +378,19 @@
 
     // Find
     m_tool_bar->addSeparator ();
-    m_action_find = add_action (resource_manager::icon ("edit-find"),
+    m_action_find = add_action (m_resource_manager.icon ("edit-find"),
                                    tr ("Find"), SLOT (activate_find (void)),
                                    this, m_tool_bar);
 
     // Zoom
     m_tool_bar->addSeparator ();
-    m_action_zoom_in = add_action (resource_manager::icon ("zoom-in"),
+    m_action_zoom_in = add_action (m_resource_manager.icon ("zoom-in"),
                                    tr ("Zoom in"), SLOT (zoom_in (void)),
                                    m_doc_browser, m_tool_bar);
-    m_action_zoom_out = add_action (resource_manager::icon ("zoom-out"),
+    m_action_zoom_out = add_action (m_resource_manager.icon ("zoom-out"),
                                     tr ("Zoom out"), SLOT (zoom_out (void)),
                                     m_doc_browser, m_tool_bar);
-    m_action_zoom_original = add_action (resource_manager::icon ("zoom-original"),
+    m_action_zoom_original = add_action (m_resource_manager.icon ("zoom-original"),
                                    tr ("Zoom original"), SLOT (zoom_original (void)),
                                    m_doc_browser, m_tool_bar);
   }
--- a/libgui/src/documentation.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/documentation.h	Fri Nov 01 18:16:49 2019 -0400
@@ -37,6 +37,8 @@
 
 namespace octave
 {
+  class resource_manager;
+
   //! Documentation browser derived from Textbrowser
 
   class documentation_browser : public QTextBrowser
@@ -93,7 +95,7 @@
 
   public:
 
-    documentation (QWidget *parent = nullptr);
+    documentation (QWidget *parent, resource_manager& rmgr);
     ~documentation (void);
 
   signals:
@@ -141,6 +143,8 @@
     //! Select all occurrences of a string in the doc browser
     void select_all_occurrences (const QString& text);
 
+    resource_manager& m_resource_manager;
+
     QHelpEngine *m_help_engine;
     QString m_internal_search;
     documentation_browser *m_doc_browser;
--- a/libgui/src/dw-main-window.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/dw-main-window.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -39,25 +39,25 @@
 namespace octave
 {
 
-  dw_main_window::dw_main_window (QWidget *p)
-    : QMainWindow (p)
+  dw_main_window::dw_main_window (resource_manager& rmgr, QWidget *p)
+    : QMainWindow (p), m_resource_manager (rmgr)
   {
     // Adding the actions for closing the dock widgets
     m_close_action
       = add_action (nullptr,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("&Close"),
                     SLOT (request_close ()), this);
 
     m_close_all_action
       = add_action (nullptr,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("Close &All"),
                     SLOT (request_close_all ()), this);
 
     m_close_others_action
       = add_action (nullptr,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("Close &Other"),
                     SLOT (request_close_other ()), this);
 
@@ -76,7 +76,7 @@
     m_actions_list << m_switch_left_action;
     m_actions_list << m_switch_right_action;
 
-    notice_settings (resource_manager::get_settings ());
+    notice_settings (m_resource_manager.get_settings ());
   }
 
 
--- a/libgui/src/dw-main-window.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/dw-main-window.h	Fri Nov 01 18:16:49 2019 -0400
@@ -29,6 +29,7 @@
 
 namespace octave
 {
+  class resource_manager;
 
   class dw_main_window : public QMainWindow
   {
@@ -36,7 +37,7 @@
 
   public:
 
-    dw_main_window (QWidget *parent = nullptr);
+    dw_main_window (resource_manager& rmgr, QWidget *parent = nullptr);
 
     ~dw_main_window (void) = default;
 
@@ -69,11 +70,13 @@
 
     void request_switch (int direction);
 
-    QList<QDockWidget *> m_dw_list;
-
     QAction *add_action (QMenu *menu, const QIcon& icon, const QString& text,
                          const char *member, QWidget *receiver);
 
+    resource_manager& m_resource_manager;
+
+    QList<QDockWidget *> m_dw_list;
+
     QAction *m_close_action;
     QAction *m_close_all_action;
     QAction *m_close_others_action;
--- a/libgui/src/external-editor-interface.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/external-editor-interface.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -33,8 +33,9 @@
 
 namespace octave
 {
-  external_editor_interface::external_editor_interface (QWidget *p)
-    : QWidget (p)
+  external_editor_interface::external_editor_interface (QWidget *p,
+                                                        resource_manager& rmgr)
+    : QWidget (p), m_resource_manager (rmgr)
   { }
 
   // Calling the external editor
@@ -97,7 +98,7 @@
   // Get and verify the settings of the external editor program
   QString external_editor_interface::external_editor (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     QString editor = settings->value ("customFileEditor").toString ();
 
     // check the settings (avoid an empty string)
--- a/libgui/src/external-editor-interface.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/external-editor-interface.h	Fri Nov 01 18:16:49 2019 -0400
@@ -29,14 +29,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class external_editor_interface : public QWidget
   {
-
     Q_OBJECT
 
   public:
 
-    external_editor_interface (QWidget *main_win);
+    external_editor_interface (QWidget *main_win, resource_manager& rmgr);
 
     ~external_editor_interface (void) = default;
 
@@ -61,6 +62,8 @@
   private:
 
     QString external_editor (void);
+
+    resource_manager& m_resource_manager;
   };
 }
 
--- a/libgui/src/files-dock-widget.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/files-dock-widget.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -67,8 +67,8 @@
     }
   };
 
-  files_dock_widget::files_dock_widget (QWidget *p)
-    : octave_dock_widget ("FilesDockWidget", p)
+  files_dock_widget::files_dock_widget (QWidget *p, resource_manager& rmgr)
+    : octave_dock_widget ("FilesDockWidget", p, rmgr)
   {
     setWindowIcon (QIcon (":/actions/icons/logo.png"));
     set_title (tr ("File Browser"));
@@ -127,18 +127,18 @@
     QSizePolicy sizePol (QSizePolicy::Expanding, QSizePolicy::Preferred);
     m_current_directory->setSizePolicy (sizePol);
 
-    QAction *directory_up_action = new QAction (resource_manager::icon ("go-up"),
+    QAction *directory_up_action = new QAction (m_resource_manager.icon ("go-up"),
                                                 "", m_navigation_tool_bar);
     directory_up_action->setToolTip (tr ("One directory up"));
 
     m_sync_browser_directory_action
-      = new QAction (resource_manager::icon ("go-first"),
+      = new QAction (m_resource_manager.icon ("go-first"),
                      tr ("Show Octave directory"), m_navigation_tool_bar);
     m_sync_browser_directory_action->setToolTip (tr ("Go to current Octave directory"));
     m_sync_browser_directory_action->setEnabled (false);
 
     m_sync_octave_directory_action
-      = new QAction (resource_manager::icon ("go-last"),
+      = new QAction (m_resource_manager.icon ("go-last"),
                      tr ("Set Octave directory"), m_navigation_tool_bar);
     m_sync_octave_directory_action->setToolTip (tr ("Set Octave directory to current browser directory"));
     m_sync_octave_directory_action->setEnabled (false);
@@ -146,30 +146,30 @@
     QToolButton *popdown_button = new QToolButton ();
     popdown_button->setToolTip (tr ("Actions on current directory"));
     QMenu *popdown_menu = new QMenu ();
-    popdown_menu->addAction (resource_manager::icon ("user-home"),
+    popdown_menu->addAction (m_resource_manager.icon ("user-home"),
                              tr ("Show Home Directory"),
                              this, SLOT (popdownmenu_home (bool)));
     popdown_menu->addAction (m_sync_browser_directory_action);
     popdown_menu->addAction (m_sync_octave_directory_action);
     popdown_button->setMenu (popdown_menu);
     popdown_button->setPopupMode (QToolButton::InstantPopup);
-    popdown_button->setDefaultAction (new QAction (resource_manager::icon ("applications-system"),
+    popdown_button->setDefaultAction (new QAction (m_resource_manager.icon ("applications-system"),
                                                    "",
                                                    m_navigation_tool_bar));
 
     popdown_menu->addSeparator ();
-    popdown_menu->addAction (resource_manager::icon ("folder"),
+    popdown_menu->addAction (m_resource_manager.icon ("folder"),
                              tr ("Set Browser Directory..."),
                              this, SLOT (popdownmenu_search_dir (bool)));
     popdown_menu->addSeparator ();
-    popdown_menu->addAction (resource_manager::icon ("edit-find"),
+    popdown_menu->addAction (m_resource_manager.icon ("edit-find"),
                              tr ("Find Files..."),
                              this, SLOT (popdownmenu_findfiles (bool)));
     popdown_menu->addSeparator ();
-    popdown_menu->addAction (resource_manager::icon ("document-new"),
+    popdown_menu->addAction (m_resource_manager.icon ("document-new"),
                              tr ("New File..."),
                              this, SLOT (popdownmenu_newfile (bool)));
-    popdown_menu->addAction (resource_manager::icon ("folder-new"),
+    popdown_menu->addAction (m_resource_manager.icon ("folder-new"),
                              tr ("New Directory..."),
                              this, SLOT (popdownmenu_newdir (bool)));
 
@@ -184,7 +184,7 @@
     connect (m_sync_browser_directory_action, SIGNAL (triggered ()), this,
              SLOT (do_sync_browser_directory ()));
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     // FIXME: what should happen if settings is 0?
 
     // Create the QFileSystemModel starting in the desired directory
@@ -303,7 +303,7 @@
 
   void files_dock_widget::save_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       return;
@@ -404,7 +404,7 @@
             QString abs_fname = fileInfo.absoluteFilePath ();
 
             QString suffix = fileInfo.suffix ().toLower ();
-            gui_settings *settings = resource_manager::get_settings ();
+            gui_settings *settings = m_resource_manager.get_settings ();
             QString ext = settings->value (fb_txt_file_ext.key,
                                            fb_txt_file_ext.def).toString ();
             QStringList extensions = ext.split (";", QString::SkipEmptyParts);
@@ -432,7 +432,7 @@
 
   void files_dock_widget::toggle_header (int col)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QString key = m_columns_shown_keys.at (col);
     bool shown = settings->value (key,false).toBool ();
@@ -463,7 +463,7 @@
       delete m_sig_mapper;
     m_sig_mapper = new QSignalMapper (this);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     for (int i = 0; i < m_columns_shown.size (); i++)
       {
@@ -507,7 +507,7 @@
           }
 
         // construct the context menu depending on item
-        menu.addAction (resource_manager::icon ("document-open"), tr ("Open"),
+        menu.addAction (m_resource_manager.icon ("document-open"), tr ("Open"),
                         this, SLOT (contextmenu_open (bool)));
 
         if (info.isDir ())
@@ -524,7 +524,7 @@
                         this, SLOT (contextmenu_copy_selection (bool)));
 
         if (info.isFile () && info.suffix () == "m")
-          menu.addAction (resource_manager::icon ("media-playback-start"),
+          menu.addAction (m_resource_manager.icon ("media-playback-start"),
                           tr ("Run"), this, SLOT (contextmenu_run (bool)));
 
         if (info.isFile ())
@@ -533,7 +533,7 @@
         if (info.isDir ())
           {
             menu.addSeparator ();
-            menu.addAction (resource_manager::icon ("go-first"),
+            menu.addAction (m_resource_manager.icon ("go-first"),
                             tr ("Set Current Directory"),
                             this, SLOT (contextmenu_setcurrentdir (bool)));
 
@@ -553,23 +553,23 @@
 
             menu.addSeparator ();
 
-            menu.addAction (resource_manager::icon ("edit-find"),
+            menu.addAction (m_resource_manager.icon ("edit-find"),
                             tr ("Find Files..."), this,
                             SLOT (contextmenu_findfiles (bool)));
           }
 
         menu.addSeparator ();
         menu.addAction (tr ("Rename..."), this, SLOT (contextmenu_rename (bool)));
-        menu.addAction (resource_manager::icon ("edit-delete"),
+        menu.addAction (m_resource_manager.icon ("edit-delete"),
                         tr ("Delete..."), this, SLOT (contextmenu_delete (bool)));
 
         if (info.isDir ())
           {
             menu.addSeparator ();
-            menu.addAction (resource_manager::icon ("document-new"),
+            menu.addAction (m_resource_manager.icon ("document-new"),
                             tr ("New File..."),
                             this, SLOT (contextmenu_newfile (bool)));
-            menu.addAction (resource_manager::icon ("folder-new"),
+            menu.addAction (m_resource_manager.icon ("folder-new"),
                             tr ("New Directory..."),
                             this, SLOT (contextmenu_newdir (bool)));
           }
@@ -914,7 +914,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = QFileDialog::ShowDirsOnly;
-    if (! resource_manager::get_settings ()->value (
+    if (! m_resource_manager.get_settings ()->value (
                                   global_use_native_dialogs.key,
                                   global_use_native_dialogs.def).toBool ())
       opts |= QFileDialog::DontUseNativeDialog;
--- a/libgui/src/files-dock-widget.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/files-dock-widget.h	Fri Nov 01 18:16:49 2019 -0400
@@ -45,6 +45,8 @@
 
 namespace octave
 {
+  class resource_manager;
+
   //!  Dock widget to display files in the current directory.
 
   class files_dock_widget : public octave_dock_widget
@@ -53,7 +55,7 @@
 
   public:
 
-    files_dock_widget (QWidget *parent = nullptr);
+    files_dock_widget (QWidget *parent, resource_manager& rmgr);
 
     ~files_dock_widget (void) = default;
 
--- a/libgui/src/find-files-dialog.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/find-files-dialog.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -48,11 +48,11 @@
 
 namespace octave
 {
-  find_files_dialog::find_files_dialog (QWidget *p)
-    : QDialog (p)
+  find_files_dialog::find_files_dialog (QWidget *p, resource_manager& rmgr)
+    : QDialog (p), m_resource_manager (rmgr)
   {
     setWindowTitle (tr ("Find Files"));
-    setWindowIcon (resource_manager::icon ("edit-find"));
+    setWindowIcon (m_resource_manager.icon ("edit-find"));
 
     m_dir_iterator = nullptr;
 
@@ -60,7 +60,7 @@
     connect (m_timer, SIGNAL (timeout (void)),
              this, SLOT (look_for_files (void)));
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QLabel *file_name_label = new QLabel (tr ("Named:"));
     m_file_name_edit = new QLineEdit;
@@ -210,7 +210,7 @@
 
   void find_files_dialog::save_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       return;
@@ -315,7 +315,7 @@
   {
     int opts = 0;  // No options by default.
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
--- a/libgui/src/find-files-dialog.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/find-files-dialog.h	Fri Nov 01 18:16:49 2019 -0400
@@ -36,13 +36,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class find_files_dialog : public QDialog
   {
     Q_OBJECT
 
   public:
 
-    find_files_dialog (QWidget *parent = nullptr);
+    find_files_dialog (QWidget *parent, resource_manager& rmgr);
 
     virtual ~find_files_dialog (void);
 
@@ -70,6 +72,8 @@
 
     bool is_match (const QFileInfo& info);
 
+    resource_manager& m_resource_manager;
+
     QLineEdit *m_start_dir_edit;
     QLineEdit *m_file_name_edit;
     QPushButton *m_stop_button;
--- a/libgui/src/history-dock-widget.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/history-dock-widget.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -44,8 +44,8 @@
 
 namespace octave
 {
-  history_dock_widget::history_dock_widget (QWidget *p)
-    : octave_dock_widget ("HistoryDockWidget", p)
+  history_dock_widget::history_dock_widget (QWidget *p, resource_manager& rmgr)
+    : octave_dock_widget ("HistoryDockWidget", p, rmgr)
   {
     setStatusTip (tr ("Browse and search the command history."));
 
@@ -90,7 +90,7 @@
 
   void history_dock_widget::save_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       return;
@@ -139,11 +139,11 @@
 
     if (index.isValid () && index.column () == 0)
       {
-        menu.addAction (resource_manager::icon ("edit-copy"),
+        menu.addAction (m_resource_manager.icon ("edit-copy"),
                         tr ("Copy"), this, SLOT (handle_contextmenu_copy (bool)));
         menu.addAction (tr ("Evaluate"), this,
                         SLOT (handle_contextmenu_evaluate (bool)));
-        menu.addAction (resource_manager::icon ("document-new"),
+        menu.addAction (m_resource_manager.icon ("document-new"),
                         tr ("Create script"), this,
                         SLOT (handle_contextmenu_create_script (bool)));
       }
@@ -315,7 +315,7 @@
     widget ()->setLayout (hist_layout);
 
     // Init state of the filter
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     m_filter_shown
       = settings->value (hw_filter_shown.key, hw_filter_shown.def).toBool ();
--- a/libgui/src/history-dock-widget.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/history-dock-widget.h	Fri Nov 01 18:16:49 2019 -0400
@@ -34,13 +34,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class history_dock_widget : public octave_dock_widget
   {
     Q_OBJECT
 
   public:
 
-    history_dock_widget (QWidget *parent = nullptr);
+    history_dock_widget (QWidget *parent, resource_manager& rmgr);
 
     ~history_dock_widget (void) = default;
 
--- a/libgui/src/m-editor/file-editor-interface.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/file-editor-interface.h	Fri Nov 01 18:16:49 2019 -0400
@@ -37,10 +37,9 @@
 
   public:
 
-    file_editor_interface (QWidget *p)
-      : octave_dock_widget ("FileEditor", p)
-    {
-    }
+    file_editor_interface (QWidget *p, resource_manager& rmgr)
+      : octave_dock_widget ("FileEditor", p, rmgr)
+    { }
 
     virtual ~file_editor_interface (void) = default;
 
--- a/libgui/src/m-editor/file-editor-tab.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/file-editor-tab.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -95,7 +95,9 @@
 
   // Make parent null for the file editor tab so that warning WindowModal
   // messages don't affect grandparents.
-  file_editor_tab::file_editor_tab (const QString& directory_arg)
+  file_editor_tab::file_editor_tab (resource_manager& rmgr,
+                                    const QString& directory_arg)
+    : m_resource_manager (rmgr)
   {
     m_lexer_apis = nullptr;
     m_is_octave_file = true;
@@ -106,7 +108,7 @@
     m_file_name = "";
     m_file_system_watcher.setObjectName ("_qt_autotest_force_engine_poller");
 
-    m_edit_area = new octave_qscintilla (this);
+    m_edit_area = new octave_qscintilla (this, m_resource_manager);
     m_line = 0;
     m_col  = 0;
 
@@ -254,7 +256,7 @@
     connect (this, SIGNAL (do_save_file_signal (const QString&, bool, bool)),
              this, SLOT (do_save_file (const QString&, bool, bool)));
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (settings)
       notice_settings (settings, true);
 
@@ -696,7 +698,7 @@
   {
     QsciLexer *lexer = m_edit_area->lexer ();
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (m_lexer_apis)
       {
@@ -1656,7 +1658,7 @@
         if (input_str)
           {
             bool ok;
-            gui_settings *settings = resource_manager::get_settings ();
+            gui_settings *settings = m_resource_manager.get_settings ();
 
             used_comment_str
               = QInputDialog::getText (this, tr ("Comment selected text"),
@@ -2040,7 +2042,7 @@
                             "This does not change the default encoding.\n"));
 
         QComboBox *enc_combo = new QComboBox ();
-        resource_manager::combo_encoding (enc_combo);
+        m_resource_manager.combo_encoding (enc_combo);
         m_new_encoding = enc_combo->currentText ();
         connect (enc_combo, SIGNAL (currentTextChanged (const QString&)),
                  this , SLOT (handle_current_enc_changed (const QString&)));
@@ -2097,7 +2099,7 @@
 #else
     int os_eol_mode = QsciScintilla::EolUnix;
 #endif
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     QsciScintilla::EolMode eol_mode
       = static_cast<QsciScintilla::EolMode> (settings->value ("editor/default_eol_mode",os_eol_mode).toInt ());
 
@@ -2180,7 +2182,7 @@
   {
     update_window_title (false); // window title (no modification)
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     // set the eol mode from the settings or depending on the OS if the entry is
     // missing in the settings
@@ -2482,7 +2484,7 @@
     fileDialog->setViewMode (QFileDialog::Detail);
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       fileDialog->setOption(QFileDialog::DontUseNativeDialog);
 
--- a/libgui/src/m-editor/file-editor-tab.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/file-editor-tab.h	Fri Nov 01 18:16:49 2019 -0400
@@ -40,6 +40,7 @@
 #include "marker.h"
 #include "octave-qscintilla.h"
 #include "qt-interpreter-events.h"
+#include "resource-manager.h"
 
 class octave_value_list;
 
@@ -53,7 +54,7 @@
 
   public:
 
-    file_editor_tab (const QString& directory = "");
+    file_editor_tab (resource_manager& rmgr, const QString& directory = "");
 
     ~file_editor_tab (void);
 
@@ -268,6 +269,8 @@
 
   private:
 
+    resource_manager& m_resource_manager;
+
     struct bp_info
     {
       bp_info (const QString& fname, int l = 0, const QString& cond = "");
--- a/libgui/src/m-editor/file-editor.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/file-editor.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -84,8 +84,8 @@
 
   // File editor
 
-  file_editor::file_editor (QWidget *p)
-    : file_editor_interface (p)
+  file_editor::file_editor (QWidget *p, resource_manager& rmgr)
+    : file_editor_interface (p, rmgr)
   {
     // Set current editing directory before construct because loaded
     // files will change ced accordingly.
@@ -157,7 +157,7 @@
 
   void file_editor::handle_enter_debug_mode (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     QString sc_run = settings->value ("shortcuts/editor_run:run_file").toString ();
     QString sc_cont = settings->value ("shortcuts/main_debug:continue").toString ();
 
@@ -219,7 +219,7 @@
   // 2. When the editor becomes visible when octave is running
   void file_editor::empty_script (bool startup, bool visible)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (settings->value ("useCustomFileEditor",false).toBool ())
       return;  // do not open an empty script in the external editor
 
@@ -426,7 +426,7 @@
     // Here, the application or the editor will be closed -> store the session
 
     // Save open files for restoring in next session; this only is possible
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     // save filenames (even if last session will not be restored next time)
     // together with encoding and the tab index
@@ -819,7 +819,7 @@
                 m_tab_widget->setTabToolTip (i, tip);
                 if (modified)
                   m_tab_widget->setTabIcon (i,
-                                  resource_manager::icon ("document-save"));
+                                  m_resource_manager.icon ("document-save"));
                 else
                   m_tab_widget->setTabIcon (i, QIcon ());
               }
@@ -1321,7 +1321,7 @@
     if (m_closed && visible)
       {
         m_closed = false;
-        gui_settings *settings = resource_manager::get_settings ();
+        gui_settings *settings = m_resource_manager.get_settings ();
         restore_session (settings);
       }
 
@@ -1383,7 +1383,7 @@
     if (call_custom_editor (openFileName, line))
       return;   // custom editor called
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     bool show_dbg_file
       = settings->value (ed_show_dbg_file.key, ed_show_dbg_file.def).toBool ();
 
@@ -1660,7 +1660,7 @@
   // handler for the close event
   void file_editor::closeEvent (QCloseEvent *e)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (settings->value ("editor/hiding_closes_files",false).toBool ())
       {
         if (check_closing ())
@@ -1734,7 +1734,7 @@
     m_tab_widget = new file_editor_tab_widget (editor_widget);
 
     // the mru-list and an empty array of actions
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     m_mru_files = settings->value ("editor/mru_file_list").toStringList ();
     m_mru_files_encodings = settings->value ("editor/mru_file_encodings")
                             .toStringList ();
@@ -1776,13 +1776,13 @@
 
     m_save_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("document-save"),
+                    m_resource_manager.icon ("document-save"),
                     tr ("&Save File"),
                     SLOT (request_save_file (bool)));
 
     m_save_as_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("document-save-as"),
+                    m_resource_manager.icon ("document-save-as"),
                     tr ("Save File &As..."),
                     SLOT (request_save_file_as (bool)));
 
@@ -1790,19 +1790,19 @@
 
     m_close_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("&Close"),
                     SLOT (request_close_file (bool)));
 
     m_close_all_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("Close All"),
                     SLOT (request_close_all_files (bool)));
 
     m_close_others_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("window-close",false),
+                    m_resource_manager.icon ("window-close",false),
                     tr ("Close Other Files"),
                     SLOT (request_close_other_files (bool)));
 
@@ -1810,7 +1810,7 @@
 
     m_print_action
       = add_action (m_fileMenu,
-                    resource_manager::icon ("document-print"),
+                    m_resource_manager.icon ("document-print"),
                     tr ("Print..."),
                     SLOT (request_print_file (bool)));
 
@@ -1820,7 +1820,7 @@
 
     m_redo_action
       = add_action (m_edit_menu,
-                    resource_manager::icon ("edit-redo"),
+                    m_resource_manager.icon ("edit-redo"),
                     tr ("&Redo"),
                     SLOT (request_redo (bool)));
     m_redo_action->setEnabled (false);
@@ -1829,14 +1829,14 @@
 
     m_cut_action
       = add_action (m_edit_menu,
-                    resource_manager::icon ("edit-cut"),
+                    m_resource_manager.icon ("edit-cut"),
                     tr ("Cu&t"),
                     SLOT (request_cut (bool)));
     m_cut_action->setEnabled (false);
 
     m_find_action
       = add_action (m_edit_menu,
-                    resource_manager::icon ("edit-find-replace"),
+                    m_resource_manager.icon ("edit-find-replace"),
                     tr ("&Find and Replace..."),
                     SLOT (request_find (bool)));
 
@@ -2018,12 +2018,12 @@
 
     m_preferences_action
       = add_action (m_edit_menu,
-                    resource_manager::icon ("preferences-system"),
+                    m_resource_manager.icon ("preferences-system"),
                     tr ("&Preferences..."),
                     SLOT (request_preferences (bool)));
 
     m_styles_preferences_action
-      = add_action (m_edit_menu,  resource_manager::icon ("preferences-system"),
+      = add_action (m_edit_menu,  m_resource_manager.icon ("preferences-system"),
                     tr ("&Styles Preferences..."),
                     SLOT (request_styles_preferences (bool)));
 
@@ -2086,12 +2086,12 @@
     view_menu->addSeparator ();
 
     m_zoom_in_action
-      = add_action (view_menu, resource_manager::icon ("zoom-in"),
+      = add_action (view_menu, m_resource_manager.icon ("zoom-in"),
                     tr ("Zoom &In"),
                     SLOT (zoom_in (bool)));
 
     m_zoom_out_action
-      = add_action (view_menu, resource_manager::icon ("zoom-out"),
+      = add_action (view_menu, m_resource_manager.icon ("zoom-out"),
                     tr ("Zoom &Out"),
                     SLOT (zoom_out (bool)));
 
@@ -2115,25 +2115,25 @@
 
     m_toggle_breakpoint_action
       = add_action (m_debug_menu,
-                    resource_manager::icon ("bp-toggle"),
+                    m_resource_manager.icon ("bp-toggle"),
                     tr ("Toggle &Breakpoint"),
                     SLOT (request_toggle_breakpoint (bool)));
 
     m_next_breakpoint_action
       = add_action (m_debug_menu,
-                    resource_manager::icon ("bp-next"),
+                    m_resource_manager.icon ("bp-next"),
                     tr ("&Next Breakpoint"),
                     SLOT (request_next_breakpoint (bool)));
 
     m_previous_breakpoint_action
       = add_action (m_debug_menu,
-                    resource_manager::icon ("bp-prev"),
+                    m_resource_manager.icon ("bp-prev"),
                     tr ("Pre&vious Breakpoint"),
                     SLOT (request_previous_breakpoint (bool)));
 
     m_remove_all_breakpoints_action
       = add_action (m_debug_menu,
-                    resource_manager::icon ("bp-rm-all"),
+                    m_resource_manager.icon ("bp-rm-all"),
                     tr ("&Remove All Breakpoints"),
                     SLOT (request_remove_breakpoint (bool)));
 
@@ -2147,7 +2147,7 @@
 
     m_run_action
       = add_action (_run_menu,
-                    resource_manager::icon ("system-run"),
+                    m_resource_manager.icon ("system-run"),
                     tr ("Save File and Run / Continue"),
                     SLOT (request_run_file (bool)));
 
@@ -2270,7 +2270,7 @@
   file_editor_tab *
   file_editor::make_file_editor_tab (const QString& directory)
   {
-    file_editor_tab *f = new file_editor_tab (directory);
+    file_editor_tab *f = new file_editor_tab (m_resource_manager, directory);
 
     // signals from the qscintilla edit area
     connect (f->qsci_edit_area (), SIGNAL (status_update (bool, bool)),
@@ -2520,7 +2520,7 @@
       }
 
     // save actual mru-list in settings
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     settings->setValue ("editor/mru_file_list", m_mru_files);
     settings->setValue ("editor/mru_file_encodings", m_mru_files_encodings);
@@ -2530,7 +2530,7 @@
   bool file_editor::call_custom_editor (const QString& file_name, int line)
   {
     // Check if the user wants to use a custom file editor.
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings->value ("useCustomFileEditor",false).toBool ())
       {
@@ -2549,7 +2549,7 @@
 
   void file_editor::toggle_preference (const QString& preference, bool def)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     bool old = settings->value (preference,def).toBool ();
     settings->setValue (preference,! old);
     notice_settings (settings);
--- a/libgui/src/m-editor/file-editor.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/file-editor.h	Fri Nov 01 18:16:49 2019 -0400
@@ -88,7 +88,7 @@
       }
     };
 
-    file_editor (QWidget *p);
+    file_editor (QWidget *p, resource_manager& rmgr);
 
     ~file_editor (void);
 
--- a/libgui/src/m-editor/octave-qscintilla.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/octave-qscintilla.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -108,9 +108,9 @@
     return retval;
   }
 
-  octave_qscintilla::octave_qscintilla (QWidget *p)
-    : QsciScintilla (p), m_word_at_cursor (), m_selection (),
-      m_selection_replacement (), m_selection_line (-1),
+  octave_qscintilla::octave_qscintilla (QWidget *p, resource_manager& rmgr)
+    : QsciScintilla (p), m_resource_manager (rmgr), m_word_at_cursor (),
+      m_selection (), m_selection_replacement (), m_selection_line (-1),
       m_selection_col (-1), m_indicator_id (1)
   {
     connect (this, SIGNAL (textChanged (void)),
@@ -397,7 +397,7 @@
       case SCLEX_MATLAB:
 #endif
         {
-          gui_settings *settings = resource_manager::get_settings ();
+          gui_settings *settings = m_resource_manager.get_settings ();
           int comment_string;
 
           if (comment)
@@ -775,11 +775,11 @@
 
     // Create tmp file required for adding command to history
     QPointer<QTemporaryFile> tmp_hist
-        = resource_manager::create_tmp_file (); // empty tmp file for history
+        = m_resource_manager.create_tmp_file (); // empty tmp file for history
 
     // Create tmp file required for the script echoing and adding cmd to hist
     QPointer<QTemporaryFile> tmp_script
-        = resource_manager::create_tmp_file ("m"); // tmp script file
+        = m_resource_manager.create_tmp_file ("m"); // tmp script file
 
     bool tmp = (tmp_hist && tmp_hist->open () &&
                 tmp_script && tmp_script->open());
@@ -850,7 +850,7 @@
 
     // Create tmp file with the code to be executed by the interpreter
     QPointer<QTemporaryFile> tmp_file
-        = resource_manager::create_tmp_file ("m", code);
+        = m_resource_manager.create_tmp_file ("m", code);
 
     tmp = (tmp_file && tmp_file->open ());
     if (! tmp)
@@ -862,7 +862,7 @@
     tmp_file->close ();
 
     // Disable opening a file at a breakpoint in case keyboard () is used
-    gui_settings* settings = resource_manager::get_settings ();
+    gui_settings* settings = m_resource_manager.get_settings ();
     bool show_dbg_file = settings->value (ed_show_dbg_file.key,
                                        ed_show_dbg_file.def).toBool ();
     settings->setValue (ed_show_dbg_file.key, false);
@@ -903,11 +903,11 @@
                                                  QTemporaryFile* tmp_hist,
                                                  QTemporaryFile* tmp_script)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     settings->setValue (ed_show_dbg_file.key, show_dbg_file);
-    resource_manager::remove_tmp_file (tmp_file);
-    resource_manager::remove_tmp_file (tmp_hist);
-    resource_manager::remove_tmp_file (tmp_script);
+    m_resource_manager.remove_tmp_file (tmp_file);
+    m_resource_manager.remove_tmp_file (tmp_hist);
+    m_resource_manager.remove_tmp_file (tmp_script);
   }
 
 
--- a/libgui/src/m-editor/octave-qscintilla.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/m-editor/octave-qscintilla.h	Fri Nov 01 18:16:49 2019 -0400
@@ -36,13 +36,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class octave_qscintilla : public QsciScintilla
   {
     Q_OBJECT
 
   public:
 
-    octave_qscintilla (QWidget *p);
+    octave_qscintilla (QWidget *p, resource_manager& rmgr);
 
     ~octave_qscintilla (void) = default;
 
@@ -124,6 +126,8 @@
     void auto_close (int auto_endif, int l,
                      const QString& line, QString& first_word);
 
+    resource_manager& m_resource_manager;
+
     QString m_word_at_cursor;
 
     QString m_selection;
--- a/libgui/src/main-window.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/main-window.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -89,24 +89,27 @@
 namespace octave
 {
   static file_editor_interface *
-  create_default_editor (QWidget *p)
+  create_default_editor (QWidget *p, resource_manager& rmgr)
   {
 #if defined (HAVE_QSCINTILLA)
-    return new file_editor (p);
+    return new file_editor (p, rmgr);
 #else
     octave_unused_parameter (p);
+    octave_unused_parameter (rmgr);
 
     return 0;
 #endif
   }
 
   main_window::main_window (base_qobject& oct_qobj)
-    : QMainWindow (), m_octave_qobj (oct_qobj), m_workspace_model (nullptr),
+    : QMainWindow (), m_octave_qobj (oct_qobj),
+      m_resource_manager (m_octave_qobj.get_resource_manager ()),
+      m_workspace_model (nullptr),
       m_status_bar (nullptr), m_command_window (nullptr),
       m_history_window (nullptr), m_file_browser_window (nullptr),
       m_doc_browser_window (nullptr), m_editor_window (nullptr),
       m_workspace_window (nullptr), m_variable_editor_window (nullptr),
-      m_external_editor (new external_editor_interface (this)),
+      m_external_editor (new external_editor_interface (this, m_resource_manager)),
       m_active_editor (m_external_editor), m_settings_dlg (nullptr),
       m_find_files_dlg (nullptr), m_set_path_dlg (nullptr),
       m_release_notes_window (nullptr), m_community_news_window (nullptr),
@@ -114,29 +117,29 @@
       m_prevent_readline_conflicts (true), m_suppress_dbg_location (true),
       m_closing (false), m_file_encoding (QString ())
   {
-    if (resource_manager::is_first_run ())
+    if (m_resource_manager.is_first_run ())
       {
         // Before wizard.
         m_octave_qobj.config_translators ();
 
-        welcome_wizard welcomeWizard;
+        welcome_wizard welcomeWizard (m_resource_manager);
 
         if (welcomeWizard.exec () == QDialog::Rejected)
           exit (1);
 
         // Install settings file.
-        resource_manager::reload_settings ();
+        m_resource_manager.reload_settings ();
       }
     else
       {
         // Get settings file.
-        resource_manager::reload_settings ();
+        m_resource_manager.reload_settings ();
 
         // After settings.
         m_octave_qobj.config_translators ();
       }
 
-    resource_manager::update_network_settings ();
+    m_resource_manager.update_network_settings ();
 
     // We provide specific terminal capabilities, so ensure that
     // TERM is always set appropriately.
@@ -151,15 +154,16 @@
 
     construct_central_widget ();
 
-    m_workspace_model = new workspace_model ();
+    m_workspace_model = new workspace_model (m_resource_manager);
     m_status_bar = new QStatusBar ();
-    m_command_window = new terminal_dock_widget (this);
-    m_history_window = new history_dock_widget (this);
-    m_file_browser_window = new files_dock_widget (this);
-    m_doc_browser_window = new documentation_dock_widget (this);
-    m_editor_window = create_default_editor (this);
-    m_variable_editor_window = new variable_editor (this);
-    m_workspace_window = new workspace_view (this);
+    m_command_window = new terminal_dock_widget (this, m_resource_manager);
+    m_history_window = new history_dock_widget (this, m_resource_manager);
+    m_file_browser_window = new files_dock_widget (this, m_resource_manager);
+    m_doc_browser_window
+      = new documentation_dock_widget (this, m_resource_manager);
+    m_editor_window = create_default_editor (this, m_resource_manager);
+    m_variable_editor_window = new variable_editor (this, m_resource_manager);
+    m_workspace_window = new workspace_view (this, m_resource_manager);
 
     // Set active editor depending on editor window. If the latter is
     // not initialized (qscintilla not present), use the external editor.
@@ -176,7 +180,7 @@
 
     m_default_style = qapp->style ()->objectName ();
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     bool connect_to_web = true;
     QDateTime last_checked;
@@ -259,7 +263,7 @@
   {
     bool closenow = true;
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings->value ("prompt_to_exit", false).toBool ())
       {
@@ -347,7 +351,7 @@
 
   void main_window::request_reload_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings)
       emit settings_changed (settings);
@@ -362,7 +366,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = 0;  // No options by default.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -386,7 +390,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = 0;  // No options by default.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -661,7 +665,7 @@
 
   void main_window::load_and_display_community_news (int serial)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     bool connect_to_web
       = (settings
@@ -674,8 +678,8 @@
 
     QThread *worker_thread = new QThread;
 
-    news_reader *reader = new news_reader (base_url, page, serial,
-                                           connect_to_web);
+    news_reader *reader = new news_reader (m_resource_manager, base_url,
+                                           page, serial, connect_to_web);
 
     reader->moveToThread (worker_thread);
 
@@ -782,7 +786,8 @@
         return;
       }
 
-    m_settings_dlg = new settings_dialog (this, desired_tab);
+    m_settings_dlg
+      = new settings_dialog (this, m_resource_manager, desired_tab);
 
     connect (m_settings_dlg, SIGNAL (apply_new_settings (void)),
              this, SLOT (request_reload_settings (void)));
@@ -895,7 +900,7 @@
     m_suppress_dbg_location
       = ! settings->value ("terminal/print_debug_location", false).toBool ();
 
-    resource_manager::update_network_settings ();
+    m_resource_manager.update_network_settings ();
 
     emit active_dock_changed (nullptr, m_active_dock); // update dock widget styles
 
@@ -970,7 +975,7 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = QFileDialog::ShowDirsOnly;
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -1225,7 +1230,7 @@
     // Open file isn't a file_editor_tab or editor function since the file
     // might be opened in an external editor. Hence, functionality is here.
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     bool is_internal = m_editor_window
                        && ! settings->value ("useCustomFileEditor",false).toBool ();
 
@@ -1242,7 +1247,7 @@
     fileDialog->setDirectory (m_current_directory_combo_box->itemText (0));
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       fileDialog->setOption(QFileDialog::DontUseNativeDialog);
 
@@ -1268,7 +1273,7 @@
     // editor window or the main window. The latter is chosen, if a custom
     // editor is used or qscintilla is not available
     QWidget *p = m_editor_window;
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (! p || settings->value ("useCustomFileEditor",false).toBool ())
       p = this;
     QString new_name = QInputDialog::getText (p, tr ("New Function"),
@@ -1427,7 +1432,7 @@
 
   void main_window::read_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       {
@@ -1527,7 +1532,7 @@
 
   void main_window::write_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (! settings)
       {
         qDebug ("Error: gui_settings pointer from resource manager is NULL.");
@@ -1622,7 +1627,7 @@
   void main_window::handle_octave_ready (void)
   {
     // actions after the startup files are executed
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QDir startup_dir = QDir ();    // current octave dir after startup
 
@@ -1675,7 +1680,7 @@
     if (m_set_path_dlg)  // m_set_path_dlg is a guarded pointer!
       return;
 
-    m_set_path_dlg = new set_path_dialog (this);
+    m_set_path_dlg = new set_path_dialog (this, m_resource_manager);
 
     m_set_path_dlg->setModal (false);
     m_set_path_dlg->setAttribute (Qt::WA_DeleteOnClose);
@@ -1712,7 +1717,7 @@
 
     if (! m_find_files_dlg)
       {
-        m_find_files_dlg = new find_files_dialog (this);
+        m_find_files_dlg = new find_files_dialog (this, m_resource_manager);
 
         connect (m_find_files_dlg, SIGNAL (finished (int)),
                  this, SLOT (find_files_finished (int)));
@@ -1837,7 +1842,7 @@
   void main_window::restore_create_file_setting (void)
   {
     // restore the new files creation setting
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     settings->setValue ("editor/create_new_file",false);
     disconnect (m_editor_window, SIGNAL (file_loaded_signal (void)),
                 this, SLOT (restore_create_file_setting (void)));
@@ -1998,10 +2003,6 @@
     connect (qApp, SIGNAL (aboutToQuit (void)),
              shortcut_manager::instance, SLOT (cleanup_instance (void)));
 
-    // gui_settings are saved upon deletion (i.e., cleanup_instance)
-    connect (qApp, SIGNAL (aboutToQuit (void)),
-             resource_manager::instance, SLOT (cleanup_instance (void)));
-
     connect (qApp, SIGNAL (focusChanged (QWidget*, QWidget*)),
              this, SLOT (focus_changed (QWidget*, QWidget*)));
 
@@ -2292,7 +2293,7 @@
     construct_new_menu (file_menu);
 
     m_open_action
-      = file_menu->addAction (resource_manager::icon ("document-open"),
+      = file_menu->addAction (m_resource_manager.icon ("document-open"),
                               tr ("Open..."));
     m_open_action->setShortcutContext (Qt::ApplicationShortcut);
     m_open_action->setToolTip (tr ("Open an existing file in editor"));
@@ -2333,7 +2334,7 @@
     QMenu *new_menu = p->addMenu (tr ("New"));
 
     m_new_script_action
-      = new_menu->addAction (resource_manager::icon ("document-new"),
+      = new_menu->addAction (m_resource_manager.icon ("document-new"),
                              tr ("New Script"));
     m_new_script_action->setShortcutContext (Qt::ApplicationShortcut);
 
@@ -2372,18 +2373,18 @@
     QKeySequence ctrl_shift = Qt::ControlModifier + Qt::ShiftModifier;
 
     m_undo_action
-      = edit_menu->addAction (resource_manager::icon ("edit-undo"), tr ("Undo"));
+      = edit_menu->addAction (m_resource_manager.icon ("edit-undo"), tr ("Undo"));
     m_undo_action->setShortcutContext (Qt::ApplicationShortcut);
 
     edit_menu->addSeparator ();
 
     m_copy_action
-      = edit_menu->addAction (resource_manager::icon ("edit-copy"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-copy"),
                               tr ("Copy"), this, SLOT (copyClipboard (void)));
     m_copy_action->setShortcutContext (Qt::ApplicationShortcut);
 
     m_paste_action
-      = edit_menu->addAction (resource_manager::icon ("edit-paste"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-paste"),
                               tr ("Paste"), this, SLOT (pasteClipboard (void)));
     m_paste_action->setShortcutContext (Qt::ApplicationShortcut);
 
@@ -2398,7 +2399,7 @@
     edit_menu->addSeparator ();
 
     m_find_files_action
-      = edit_menu->addAction (resource_manager::icon ("edit-find"),
+      = edit_menu->addAction (m_resource_manager.icon ("edit-find"),
                               tr ("Find Files..."));
 
     edit_menu->addSeparator ();
@@ -2418,7 +2419,7 @@
       = edit_menu->addAction (tr ("Set Path"));
 
     m_preferences_action
-      = edit_menu->addAction (resource_manager::icon ("preferences-system"),
+      = edit_menu->addAction (m_resource_manager.icon ("preferences-system"),
                               tr ("Preferences..."));
 
     connect (m_find_files_action, SIGNAL (triggered (void)),
@@ -2457,7 +2458,7 @@
                                                     const char *member)
   {
     QAction *action = add_action (m_debug_menu,
-                                  resource_manager::icon (QString (icon)),
+                                  m_resource_manager.icon (QString (icon)),
                                   item, member);
 
     action->setEnabled (false);
@@ -2679,10 +2680,10 @@
     m_main_tool_bar->addWidget (new QLabel (tr ("Current Directory: ")));
     m_main_tool_bar->addWidget (m_current_directory_combo_box);
     QAction *current_dir_up
-      = m_main_tool_bar->addAction (resource_manager::icon ("go-up"),
+      = m_main_tool_bar->addAction (m_resource_manager.icon ("go-up"),
                                     tr ("One directory up"));
     QAction *current_dir_search
-      = m_main_tool_bar->addAction (resource_manager::icon ("folder"),
+      = m_main_tool_bar->addAction (m_resource_manager.icon ("folder"),
                                     tr ("Browse directories"));
 
     connect (m_current_directory_combo_box, SIGNAL (activated (QString)),
@@ -2703,7 +2704,7 @@
 
   void main_window::focus_console_after_command (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     if (settings->value ("terminal/focus_after_command",false).toBool ())
       focus_command_window ();
   }
--- a/libgui/src/main-window.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/main-window.h	Fri Nov 01 18:16:49 2019 -0400
@@ -289,6 +289,8 @@
 
     base_qobject& m_octave_qobj;
 
+    resource_manager& m_resource_manager;
+
     workspace_model *m_workspace_model;
 
     QHash<QMenu*, QStringList> m_hash_menu_text;
--- a/libgui/src/news-reader.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/news-reader.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -66,7 +66,7 @@
           {
             if (m_serial >= 0)
               {
-                gui_settings *settings = resource_manager::get_settings ();
+                gui_settings *settings = m_resource_manager.get_settings ();
 
                 if (settings)
                   {
--- a/libgui/src/news-reader.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/news-reader.h	Fri Nov 01 18:16:49 2019 -0400
@@ -29,16 +29,19 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class news_reader : public QObject
   {
     Q_OBJECT
 
   public:
 
-    news_reader (const QString& base_url, const QString& page,
-                 int serial = -1, bool connect_to_web = false)
-      : QObject (), m_base_url (base_url), m_page (page), m_serial (serial),
-        m_connect_to_web (connect_to_web)
+    news_reader (resource_manager& rmgr, const QString& base_url,
+                 const QString& page, int serial = -1,
+                 bool connect_to_web = false)
+      : QObject (), m_resource_manager (rmgr), m_base_url (base_url),
+        m_page (page), m_serial (serial), m_connect_to_web (connect_to_web)
     { }
 
   signals:
@@ -53,6 +56,8 @@
 
   private:
 
+    resource_manager& m_resource_manager;
+
     QString m_base_url;
     QString m_page;
     int m_serial;
--- a/libgui/src/octave-dock-widget.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/octave-dock-widget.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -42,9 +42,9 @@
 
 namespace octave
 {
-  label_dock_widget::label_dock_widget (QWidget *p)
-    : QDockWidget (p), m_default_float_button (nullptr),
-      m_default_close_button (nullptr)
+  label_dock_widget::label_dock_widget (QWidget *p, resource_manager& rmgr)
+    : QDockWidget (p), m_resource_manager (rmgr),
+      m_default_float_button (nullptr), m_default_close_button (nullptr)
   {
     QStyle *st = style ();
     m_icon_size = 0.75*st->pixelMetric (QStyle::PM_SmallIconSize);
@@ -176,9 +176,10 @@
                      .arg ((icon_size*2)/3). arg((icon_size*7)/3);
   }
 
-  octave_dock_widget::octave_dock_widget (const QString& obj_name, QWidget *p)
-    : label_dock_widget (p), m_recent_float_geom (), m_recent_dock_geom (),
-      m_waiting_for_mouse_button_release (false)
+  octave_dock_widget::octave_dock_widget (const QString& obj_name, QWidget *p,
+                                          resource_manager& rmgr)
+    : label_dock_widget (p, rmgr), m_recent_float_geom (),
+      m_recent_dock_geom (), m_waiting_for_mouse_button_release (false)
   {
     setObjectName (obj_name);
 
@@ -244,7 +245,7 @@
 
     setFeatures (QDockWidget::AllDockWidgetFeatures);
 
-    handle_settings (resource_manager::get_settings ());
+    handle_settings (m_resource_manager.get_settings ());
   }
 
   // connect signal visibility changed to related slot (called from main-window)
@@ -325,7 +326,7 @@
     bool vis = isVisible ();
 
     // Since floating widget has no parent, we have to read it
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     settings->setValue (mw_state.key, m_parent->saveState ());
     // Stay window, otherwise will bounce back to window by default because
@@ -516,7 +517,7 @@
   {
     // save state of this dock-widget
     QString name = objectName ();
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       return;
@@ -757,13 +758,13 @@
     // The keys are also used in the settings dialog, but
     // octave_dock_widget::handle_settings is already called at program start.
     // These tests can be removed in a future version of Octave (version 6).
-    resource_manager::update_settings_key ("Dockwidgets/title_bg_color",
+    m_resource_manager.update_settings_key ("Dockwidgets/title_bg_color",
                                            "DockWidgets/title_bg_color");
-    resource_manager::update_settings_key ("Dockwidgets/title_bg_color_active",
+    m_resource_manager.update_settings_key ("Dockwidgets/title_bg_color_active",
                                            "DockWidgets/title_bg_color_active");
-    resource_manager::update_settings_key ("Dockwidgets/title_fg_color",
+    m_resource_manager.update_settings_key ("Dockwidgets/title_fg_color",
                                            "DockWidgets/title_fg_color");
-    resource_manager::update_settings_key ("Dockwidgets/title_fg_color_active",
+    m_resource_manager.update_settings_key ("Dockwidgets/title_fg_color_active",
                                            "DockWidgets/title_fg_color_active");
   }
 }
--- a/libgui/src/octave-dock-widget.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/octave-dock-widget.h	Fri Nov 01 18:16:49 2019 -0400
@@ -34,6 +34,7 @@
 
 namespace octave
 {
+  class resource_manager;
 
   // The few decoration items common to both main window and variable editor.
 
@@ -43,7 +44,7 @@
 
   public:
 
-    label_dock_widget (QWidget *p = nullptr);
+    label_dock_widget (QWidget *p, resource_manager& rmgr);
 
     // set_title() uses the custom title bar while setWindowTitle() uses
     // the default title bar (with style sheets)
@@ -64,6 +65,8 @@
 
   protected:
 
+    resource_manager& m_resource_manager;
+
     int m_icon_size;
     QWidget *m_title_widget;
     QToolButton *m_dock_button;
@@ -81,7 +84,8 @@
 
   public:
 
-    octave_dock_widget (const QString& obj_name, QWidget *p = nullptr);
+    octave_dock_widget (const QString& obj_name, QWidget *p,
+                        resource_manager& rmgr);
 
     virtual ~octave_dock_widget (void) = default;
 
--- a/libgui/src/octave-qobject.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/octave-qobject.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -106,6 +106,7 @@
       m_argc (m_app_context.sys_argc ()),
       m_argv (m_app_context.sys_argv ()),
       m_qapplication (new octave_qapplication (m_argc, m_argv)),
+      m_resource_manager (),
       m_qt_tr (new QTranslator ()), m_gui_tr (new QTranslator ()),
       m_qsci_tr (new QTranslator ()), m_translators_installed (false),
       m_qt_interpreter_events (new qt_interpreter_events (*this)),
@@ -254,7 +255,7 @@
     if (m_translators_installed)
       return;
 
-    resource_manager::config_translators (m_qt_tr, m_qsci_tr, m_gui_tr);
+    m_resource_manager.config_translators (m_qt_tr, m_qsci_tr, m_gui_tr);
 
     m_qapplication->installTranslator (m_qt_tr);
     m_qapplication->installTranslator (m_gui_tr);
@@ -343,7 +344,7 @@
     : base_qobject (app_context)
   {
     // Get settings file.
-    resource_manager::reload_settings ();
+    m_resource_manager.reload_settings ();
 
     // After settings.
     config_translators ();
--- a/libgui/src/octave-qobject.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/octave-qobject.h	Fri Nov 01 18:16:49 2019 -0400
@@ -33,6 +33,7 @@
 #include <QStringList>
 
 #include "interpreter-qobject.h"
+#include "resource-manager.h"
 
 namespace octave
 {
@@ -94,6 +95,11 @@
     // The Qt QApplication.
     QApplication * qapplication (void) { return m_qapplication; };
 
+    resource_manager& get_resource_manager (void)
+    {
+      return m_resource_manager;
+    }
+
     std::shared_ptr<qt_interpreter_events> get_qt_interpreter_events (void)
     {
       return m_qt_interpreter_events;
@@ -137,6 +143,8 @@
 
     octave_qapplication *m_qapplication;
 
+    resource_manager m_resource_manager;
+
     QTranslator *m_qt_tr;
     QTranslator *m_gui_tr;
     QTranslator *m_qsci_tr;
--- a/libgui/src/qt-interpreter-events.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/qt-interpreter-events.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -104,8 +104,9 @@
   }
 
   qt_interpreter_events::qt_interpreter_events (base_qobject& oct_qobj)
-    : interpreter_events (), m_octave_qobj (oct_qobj), m_result (),
-      m_mutex (), m_waitcondition (), m_uiwidget_creator ()
+    : interpreter_events (), m_octave_qobj (oct_qobj),
+      m_resource_manager (m_octave_qobj.get_resource_manager ()),
+      m_result (), m_mutex (), m_waitcondition (), m_uiwidget_creator ()
   {
     qRegisterMetaType<QIntList> ("QIntList");
     qRegisterMetaType<QFloatList> ("QFloatList");
@@ -274,7 +275,7 @@
 
   bool qt_interpreter_events::prompt_new_edit_file (const std::string& file)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings || settings->value ("editor/create_new_file",false).toBool ())
       return true;
@@ -388,7 +389,7 @@
   {
     QMutexLocker autolock (&m_mutex);
 
-    m_result = QVariant::fromValue (resource_manager::icon (name));
+    m_result = QVariant::fromValue (m_resource_manager.icon (name));
 
     wake_all ();
   }
@@ -577,7 +578,7 @@
   {
     QMutexLocker autolock (&m_mutex);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QString read_value = settings->value (key).toString ();
 
@@ -616,7 +617,7 @@
         adjusted_value = adjusted_value.toUpper ();
 
         QStringList codecs;
-        resource_manager::get_codecs (&codecs);
+        m_resource_manager.get_codecs (&codecs);
 
         QRegExp re ("^CP(\\d+)$");
 
--- a/libgui/src/qt-interpreter-events.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/qt-interpreter-events.h	Fri Nov 01 18:16:49 2019 -0400
@@ -47,6 +47,7 @@
 namespace octave
 {
   class base_qobject;
+  class resource_manager;
 
   // The functions in this class are not normally called directly, but
   // are invoked from the Octave interpreter thead by methods in the
@@ -257,6 +258,8 @@
 
     base_qobject& m_octave_qobj;
 
+    resource_manager& m_resource_manager;
+
     QVariant m_result;
 
     QMutex m_mutex;
--- a/libgui/src/resource-manager.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/resource-manager.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -39,6 +39,7 @@
 #include "QTerminal.h"
 #include "gui-preferences-ed.h"
 #include "gui-preferences-global.h"
+#include "octave-qobject.h"
 #include "resource-manager.h"
 #include "variable-editor.h"
 #include "workspace-model.h"
@@ -52,7 +53,25 @@
 
 namespace octave
 {
-  resource_manager *resource_manager::instance = nullptr;
+  base_qobject& __get_octave_qobject__ (const std::string& who)
+  {
+    base_qobject *oct_qobj = base_qobject::the_octave_qobject ();
+
+    if (! oct_qobj)
+      {
+        abort ();
+        error ("%s: octave_qobject context missing", who.c_str ());
+      }
+
+    return *oct_qobj;
+  }
+
+  resource_manager& __get_resource_manager__ (const std::string& who)
+  {
+    base_qobject& oct_qobj = __get_octave_qobject__ (who);
+
+    return oct_qobj.get_resource_manager ();
+  }
 
   static QString
   default_qt_settings_file (void)
@@ -150,7 +169,8 @@
 
     QString language = "SYSTEM";  // take system language per default
 
-    gui_settings *settings = resource_manager::get_settings ();
+    resource_manager& rmgr = __get_resource_manager__ ("");
+    gui_settings *settings = rmgr.get_settings ();
 
     if (settings)
       {
@@ -205,37 +225,27 @@
     return variable_editor::color_names ();
   }
 
-  bool resource_manager::instance_ok (void)
-  {
-    bool retval = true;
-
-    if (! instance)
-      instance = new resource_manager ();
-
-    return retval;
-  }
-
-  gui_settings * resource_manager::do_get_settings (void) const
+  gui_settings * resource_manager::get_settings (void) const
   {
     return m_settings;
   }
 
-  gui_settings * resource_manager::do_get_default_settings (void) const
+  gui_settings * resource_manager::get_default_settings (void) const
   {
     return m_default_settings;
   }
 
-  QString resource_manager::do_get_settings_directory (void)
+  QString resource_manager::get_settings_directory (void)
   {
     return m_settings_directory;
   }
 
-  QString resource_manager::do_get_settings_file (void)
+  QString resource_manager::get_settings_file (void)
   {
     return m_settings_file;
   }
 
-  QString resource_manager::do_get_default_font_family (void)
+  QString resource_manager::get_default_font_family (void)
   {
     // Get the default monospaced font
 #if defined (HAVE_QFONT_MONOSPACE)
@@ -253,9 +263,9 @@
     return default_family;
   }
 
-  void resource_manager::do_reload_settings (void)
+  void resource_manager::reload_settings (void)
   {
-    QString default_family = do_get_default_font_family ();
+    QString default_family = get_default_font_family ();
 
     if (! QFile::exists (m_settings_file))
       {
@@ -269,7 +279,7 @@
         QString settings_text = in.readAll ();
         qt_settings.close ();
 
-        default_family = do_get_default_font_family ();
+        default_family = get_default_font_family ();
 
         QString default_font_size = "10";
 
@@ -309,7 +319,7 @@
         user_settings.close ();
       }
 
-    do_set_settings (m_settings_file);
+    set_settings (m_settings_file);
 
     // Write the default monospace font into the settings for later use by
     // console and editor as fallbacks of their font prefernces.
@@ -318,7 +328,7 @@
 
   }
 
-  void resource_manager::do_set_settings (const QString& file)
+  void resource_manager::set_settings (const QString& file)
   {
     delete m_settings;
     m_settings = new gui_settings (file, QSettings::IniFormat);
@@ -335,14 +345,14 @@
 
         QMessageBox::critical (nullptr,
                                QString (QT_TR_NOOP ("Octave Critical Error")),
-                               msg.arg (do_get_settings_file ()).arg (do_get_settings_directory ()));
+                               msg.arg (get_settings_file ()).arg (get_settings_directory ()));
 
         exit (1);
       }
   }
 
-  bool resource_manager::do_update_settings_key (const QString& old_key,
-                                                 const QString& new_key)
+  bool resource_manager::update_settings_key (const QString& old_key,
+                                              const QString& new_key)
   {
     if (m_settings->contains (old_key))
       {
@@ -355,12 +365,12 @@
     return false;
   }
 
-  bool resource_manager::do_is_first_run (void) const
+  bool resource_manager::is_first_run (void) const
   {
     return ! QFile::exists (m_settings_file);
   }
 
-  void resource_manager::do_update_network_settings (void)
+  void resource_manager::update_network_settings (void)
   {
     if (m_settings)
       {
@@ -392,7 +402,7 @@
       }
   }
 
-  QIcon resource_manager::do_icon (const QString& icon_name, bool fallback)
+  QIcon resource_manager::icon (const QString& icon_name, bool fallback)
   {
     // If system icon theme is not desired, take own icon files
     if (! m_settings->value (global_icon_theme.key, global_icon_theme.def).toBool ())
@@ -408,7 +418,7 @@
   }
 
   // get a list of all available encodings
-  void resource_manager::do_get_codecs (QStringList *codecs)
+  void resource_manager::get_codecs (QStringList *codecs)
   {
     // get the codec name for each mib
     QList<int> all_mibs = QTextCodec::availableMibs ();
@@ -428,10 +438,11 @@
   }
 
   // initialize a given combo box with available text encodings
-  void resource_manager::do_combo_encoding (QComboBox *combo, QString current)
+  void resource_manager::combo_encoding (QComboBox *combo,
+                                         const QString& current)
   {
     QStringList all_codecs;
-    do_get_codecs (&all_codecs);
+    get_codecs (&all_codecs);
 
     // get the value from the settings file if no current encoding is given
     QString enc = current;
@@ -483,8 +494,8 @@
   }
 
   QPointer<QTemporaryFile>
-  resource_manager::do_create_tmp_file (const QString& extension,
-                                        const QString& contents)
+  resource_manager::create_tmp_file (const QString& extension,
+                                     const QString& contents)
   {
     QString ext = extension;
     if ((! ext.isEmpty ()) && (! ext.startsWith ('.')))
@@ -510,7 +521,7 @@
     return tmp_file;
   }
 
-  void resource_manager::do_remove_tmp_file (QPointer<QTemporaryFile> tmp_file)
+  void resource_manager::remove_tmp_file (QPointer<QTemporaryFile> tmp_file)
   {
     if (tmp_file)
       {
--- a/libgui/src/resource-manager.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/resource-manager.h	Fri Nov 01 18:16:49 2019 -0400
@@ -33,6 +33,10 @@
 
 namespace octave
 {
+  class resource_manager;
+
+  extern resource_manager& __get_resource_manager__ (const std::string& who);
+
   class resource_manager : public QObject
   {
     Q_OBJECT
@@ -51,135 +55,57 @@
 
     ~resource_manager ();
 
-    static gui_settings * get_settings (void)
-    {
-      return instance_ok () ? instance->do_get_settings () : nullptr;
-    }
+    QString get_gui_translation_dir (void);
+
+    void config_translators (QTranslator *qt_tr, QTranslator *qsci_tr,
+                             QTranslator *gui_tr);
 
-    static QIcon icon (const QString& icon_name, bool fallback = true)
-    {
-      if (instance_ok ())
-        return instance->do_icon (icon_name, fallback);
+    QString storage_class_chars (void) { return "agp"; }
 
-      return QIcon ();
-    }
+    QStringList storage_class_names (void);
 
-    static gui_settings * get_default_settings (void)
-    {
-      return instance_ok () ? instance->do_get_default_settings () : nullptr;
-    }
+    QList<QColor> storage_class_default_colors (void);
 
-    static QString get_settings_file (void)
-    {
-      return instance_ok () ? instance->do_get_settings_file () : QString ();
-    }
+    QString varedit_color_chars (void) {return "fbsha"; }
 
-    static void reload_settings (void)
-    {
-      if (instance_ok ())
-        instance->do_reload_settings ();
-    }
+    QStringList varedit_color_names (void);
+
+    QList<QColor> varedit_default_colors (void);
 
-    static void set_settings (const QString& file)
-    {
-      if (instance_ok ())
-        instance->do_set_settings (file);
-    }
+    gui_settings * get_settings (void) const;
 
-    static bool update_settings_key (const QString& new_key,
-                                     const QString& old_key)
-    {
-      return (instance_ok ()
-              ? instance->do_update_settings_key (new_key, old_key)
-              : false);
-    }
+    gui_settings * get_default_settings (void) const;
+
+    QString get_settings_directory (void);
 
-    static void get_codecs (QStringList *codecs)
-    {
-      if (instance_ok ())
-        instance->do_get_codecs (codecs);
-    }
+    QString get_settings_file (void);
+
+    QString get_default_font_family (void);
 
-    static void combo_encoding (QComboBox *combo, QString current = QString ())
-    {
-      if (instance_ok ())
-        instance->do_combo_encoding (combo, current);
-    }
-
-    static QString get_gui_translation_dir (void);
+    QPointer<QTemporaryFile>
+    create_tmp_file (const QString& extension = QString (),
+                     const QString& contents = QString ());
 
-    static void config_translators (QTranslator*, QTranslator*, QTranslator*);
+    void remove_tmp_file (QPointer<QTemporaryFile> tmp_file);
 
-    static void update_network_settings (void)
-    {
-      if (instance_ok ())
-        instance->do_update_network_settings ();
-    }
+    void reload_settings (void);
 
-    static bool is_first_run (void)
-    {
-      return instance_ok () ? instance->do_is_first_run () : true;
-    }
+    void set_settings (const QString& file);
 
-    static QPointer<QTemporaryFile> create_tmp_file (
-                                          const QString& extension = QString (),
-                                          const QString& contents = QString ())
-    {
-      return instance_ok () ? instance->do_create_tmp_file (extension, contents) : QPointer<QTemporaryFile> ();
-    }
+    bool update_settings_key (const QString& new_key, const QString& old_key);
+
+    bool is_first_run (void) const;
 
-    static void remove_tmp_file (QPointer<QTemporaryFile> tmp_file)
-    {
-      if (instance_ok ())
-        instance->do_remove_tmp_file (tmp_file);
-    }
+    void update_network_settings (void);
+
+    QIcon icon (const QString& icon_name, bool fallback = true);
 
-    static QString storage_class_chars (void) { return "agp"; }
-    static QStringList storage_class_names (void);
-    static QList<QColor> storage_class_default_colors (void);
-
-    static resource_manager *instance;
+    void get_codecs (QStringList *codecs);
 
-    static void cleanup_instance (void) { delete instance; instance = nullptr; }
-
-    static QString varedit_color_chars (void) {return "fbsha"; }
-    static QStringList varedit_color_names (void);
-    static QList<QColor> varedit_default_colors (void);
+    void combo_encoding (QComboBox *combo, const QString& current = QString ());
 
   private:
 
-    static bool instance_ok (void);
-
-    gui_settings * do_get_settings (void) const;
-
-    gui_settings * do_get_default_settings (void) const;
-
-    QString do_get_settings_directory (void);
-
-    QString do_get_settings_file (void);
-
-    QString do_get_default_font_family (void);
-
-    QPointer<QTemporaryFile> do_create_tmp_file (const QString& extension,
-                                                 const QString& contents);
-
-    void do_remove_tmp_file (QPointer<QTemporaryFile> tmp_file);
-
-    void do_reload_settings (void);
-
-    void do_set_settings (const QString& file);
-
-    bool do_update_settings_key (const QString& new_key, const QString& old_key);
-
-    bool do_is_first_run (void) const;
-
-    void do_update_network_settings (void);
-
-    QIcon do_icon (const QString& icon, bool fallback);
-
-    void do_get_codecs (QStringList *codecs);
-    void do_combo_encoding (QComboBox *combo, QString current);
-
     QString m_settings_directory;
 
     QString m_settings_file;
--- a/libgui/src/set-path-dialog.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/set-path-dialog.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -55,8 +55,8 @@
 
 namespace octave
 {
-  set_path_dialog::set_path_dialog (QWidget *parent)
-    : QDialog (parent)
+  set_path_dialog::set_path_dialog (QWidget *parent, resource_manager& rmgr)
+    : QDialog (parent), m_resource_manager (rmgr)
   {
     setWindowTitle (tr ("Set Path"));
 
@@ -163,7 +163,7 @@
 
     setLayout (main_layout);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     restoreGeometry (
             settings->value(pd_geometry.key).toByteArray());
   }
@@ -299,7 +299,7 @@
 
   void set_path_dialog::save_settings ()
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     settings->setValue (pd_geometry.key, saveGeometry ());
   }
 
--- a/libgui/src/set-path-dialog.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/set-path-dialog.h	Fri Nov 01 18:16:49 2019 -0400
@@ -38,6 +38,8 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class set_path_dialog : public QDialog
   {
     Q_OBJECT
@@ -48,7 +50,7 @@
     // in the dialog.  That may only be done after the intepreter_event
     // signal connections are made to the Octave interpreter.
 
-    set_path_dialog (QWidget *parent = nullptr);
+    set_path_dialog (QWidget *parent, resource_manager& rmgr);
 
     virtual ~set_path_dialog (void);
 
@@ -91,6 +93,8 @@
 
     void add_dir_common (bool subdirs);
 
+    resource_manager& m_resource_manager;
+
     QLabel *m_info_label;
     QPushButton *m_reload_button;
     QPushButton *m_save_button;
--- a/libgui/src/settings-dialog.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/settings-dialog.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -88,12 +88,13 @@
 
 #endif
 
-  settings_dialog::settings_dialog (QWidget *p, const QString& desired_tab)
-    : QDialog (p), Ui::settings_dialog ()
+  settings_dialog::settings_dialog (QWidget *p, resource_manager& rmgr,
+                                    const QString& desired_tab)
+    : QDialog (p), Ui::settings_dialog (), m_resource_manager (rmgr)
   {
     setupUi (this);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       {
@@ -107,7 +108,7 @@
       }
 
     // look for available language files and the actual settings
-    QString qm_dir_name = resource_manager::get_gui_translation_dir ();
+    QString qm_dir_name = m_resource_manager.get_gui_translation_dir ();
     QDir qm_dir (qm_dir_name);
     QFileInfoList qm_files = qm_dir.entryInfoList (QStringList ("*.qm"), QDir::Files | QDir::Readable, QDir::Name);
 
@@ -251,7 +252,7 @@
     editor_showLineNumbers->setChecked (settings->value ("editor/showLineNumbers", true).toBool ());
     editor_linenr_size->setValue (settings->value ("editor/line_numbers_size", 0).toInt ());
 
-    resource_manager::combo_encoding (editor_combo_encoding);
+    m_resource_manager.combo_encoding (editor_combo_encoding);
 
     default_var = QColor (240, 240, 240);
     QColor setting_color = settings->value ("editor/highlight_current_line_color", default_var).value<QColor> ();
@@ -527,7 +528,7 @@
   {
     if (tab.isEmpty ())
       {
-        gui_settings *settings = resource_manager::get_settings ();
+        gui_settings *settings = m_resource_manager.get_settings ();
         if (settings)
           tabWidget->setCurrentIndex (settings->value ("settings/last_tab", 0).toInt ());
       }
@@ -556,9 +557,10 @@
   {
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks;
-    if (! resource_manager::get_settings ()->value (
-                                    global_use_native_dialogs.key,
-                                    global_use_native_dialogs.def).toBool ())
+
+    gui_settings *settings = m_resource_manager.get_settings ();
+    if (! settings->value (global_use_native_dialogs.key,
+                           global_use_native_dialogs.def).toBool ())
       opts |= QFileDialog::DontUseNativeDialog;
 
     QString dir = QFileDialog::getExistingDirectory
@@ -815,7 +817,7 @@
 
   void settings_dialog::write_changed_settings (bool closing)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     // the icon set
     QString widget_icon_set = "NONE";
@@ -1042,10 +1044,10 @@
   void settings_dialog::read_workspace_colors (gui_settings *settings)
   {
     // Construct the grid with all color related settings
-    QList<QColor> default_colors =
-      resource_manager::storage_class_default_colors ();
-    QStringList class_names = resource_manager::storage_class_names ();
-    QString class_chars = resource_manager::storage_class_chars ();
+    QList<QColor> default_colors
+      = m_resource_manager.storage_class_default_colors ();
+    QStringList class_names = m_resource_manager.storage_class_names ();
+    QString class_chars = m_resource_manager.storage_class_chars ();
     int nr_of_classes = class_chars.length ();
 
     QGridLayout *style_grid = new QGridLayout ();
@@ -1105,7 +1107,7 @@
     settings->setValue (ws_enable_colors.key, m_ws_enable_colors->isChecked ());
     settings->setValue (ws_hide_tool_tips.key, m_ws_hide_tool_tips->isChecked ());
 
-    QString class_chars = resource_manager::storage_class_chars ();
+    QString class_chars = m_resource_manager.storage_class_chars ();
     color_picker *color;
 
     for (int i = 0; i < class_chars.length (); i++)
@@ -1166,7 +1168,7 @@
   {
     QList<QColor> default_colors = variable_editor::default_colors ();
     QStringList class_names = variable_editor::color_names ();
-    QString class_chars = resource_manager::varedit_color_chars ();
+    QString class_chars = m_resource_manager.varedit_color_chars ();
     int nr_of_classes = class_chars.length ();
 
     QGridLayout *style_grid = new QGridLayout ();
@@ -1200,7 +1202,7 @@
 
   void settings_dialog::write_varedit_colors (gui_settings *settings)
   {
-    QString class_chars = resource_manager::varedit_color_chars ();
+    QString class_chars = m_resource_manager.varedit_color_chars ();
     color_picker *color;
 
     for (int i = 0; i < class_chars.length (); i++)
--- a/libgui/src/settings-dialog.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/settings-dialog.h	Fri Nov 01 18:16:49 2019 -0400
@@ -31,6 +31,7 @@
 #include "color-picker.h"
 #include "gui-preferences-ed.h"
 #include "gui-settings.h"
+#include "resource-manager.h"
 #include "ui-settings-dialog.h"
 
 class QsciLexer;
@@ -43,7 +44,7 @@
   {
     Q_OBJECT public:
 
-    explicit settings_dialog (QWidget *parent,
+    explicit settings_dialog (QWidget *parent, resource_manager& rmgr,
                               const QString& desired_tab = QString ());
 
     ~settings_dialog (void) = default;
@@ -85,6 +86,8 @@
     void read_varedit_colors (gui_settings *settings);
     void write_varedit_colors (gui_settings *settings);
 
+    resource_manager& m_resource_manager;
+
     color_picker *m_widget_title_bg_color;
     color_picker *m_widget_title_bg_color_active;
     color_picker *m_widget_title_fg_color;
--- a/libgui/src/shortcut-manager.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/shortcut-manager.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -120,7 +120,10 @@
     QCoreApplication::setAttribute (Qt::AA_MacDontSwapCtrlAndMeta, true);
 #endif
 
-    m_settings = resource_manager::get_settings ();
+    resource_manager& rmgr
+      = __get_resource_manager__ ("shortcut_manager::shortcut_manager");
+
+    m_settings = rmgr.get_settings ();
   }
 
   void shortcut_manager::handle_double_clicked (QTreeWidgetItem *item, int col)
@@ -688,7 +691,7 @@
 
         // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
         int opts = 0;  // No options by default.
-        if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+        if (! m_settings->value ("use_native_file_dialogs",
                                                         true).toBool ())
           opts = QFileDialog::DontUseNativeDialog;
 
--- a/libgui/src/terminal-dock-widget.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/terminal-dock-widget.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -39,8 +39,9 @@
 
 namespace octave
 {
-  terminal_dock_widget::terminal_dock_widget (QWidget *p)
-    : octave_dock_widget ("TerminalDockWidget", p),
+  terminal_dock_widget::terminal_dock_widget (QWidget *p,
+                                              resource_manager& rmgr)
+    : octave_dock_widget ("TerminalDockWidget", p, rmgr),
       m_terminal (QTerminal::create (p))
   {
     m_terminal->setObjectName ("OctaveTerminal");
@@ -61,7 +62,7 @@
 
     // Chose a reasonable size at startup in order to avoid truncated
     // startup messages
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QFont font = QFont ();
     font.setStyleHint (QFont::TypeWriter);
--- a/libgui/src/terminal-dock-widget.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/terminal-dock-widget.h	Fri Nov 01 18:16:49 2019 -0400
@@ -32,13 +32,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class terminal_dock_widget : public octave_dock_widget
   {
     Q_OBJECT
 
   public:
 
-    terminal_dock_widget (QWidget *parent = nullptr);
+    terminal_dock_widget (QWidget *parent, resource_manager& rmgr);
 
     ~terminal_dock_widget (void);
 
--- a/libgui/src/variable-editor.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/variable-editor.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -88,8 +88,9 @@
 
   // Variable dock widget
 
-  variable_dock_widget::variable_dock_widget (QWidget *p)
-    : label_dock_widget (p)
+  variable_dock_widget::variable_dock_widget (QWidget *p,
+                                              resource_manager& rmgr)
+    : label_dock_widget (p, rmgr)
 // See  Octave bug #53807 and https://bugreports.qt.io/browse/QTBUG-44813
 #if (QT_VERSION >= 0x050302) && (QT_VERSION <= QTBUG_44813_FIX_VERSION)
       , m_waiting_for_mouse_move (false)
@@ -120,7 +121,7 @@
 
     QHBoxLayout *h_layout = m_title_widget->findChild<QHBoxLayout *> ();
     m_fullscreen_action = new QAction
-      (resource_manager::icon ("view-fullscreen", false), "", this);
+      (m_resource_manager.icon ("view-fullscreen", false), "", this);
     m_fullscreen_action->setToolTip (tr (DOCKED_FULLSCREEN_BUTTON_TOOLTIP));
     QToolButton *fullscreen_button = new QToolButton (m_title_widget);
     fullscreen_button->setDefaultAction (m_fullscreen_action);
@@ -155,7 +156,7 @@
         if (m_full_screen)
           {
             setGeometry (m_prev_geom);
-            m_fullscreen_action->setIcon (resource_manager::icon ("view-fullscreen", false));
+            m_fullscreen_action->setIcon (m_resource_manager.icon ("view-fullscreen", false));
             m_full_screen = false;
           }
         m_fullscreen_action->setToolTip (tr (DOCKED_FULLSCREEN_BUTTON_TOOLTIP));
@@ -216,7 +217,7 @@
     if (! m_full_screen)
       {
         m_prev_floating = isFloating ();
-        m_fullscreen_action->setIcon (resource_manager::icon ("view-restore", false));
+        m_fullscreen_action->setIcon (m_resource_manager.icon ("view-restore", false));
         if (m_prev_floating)
           m_fullscreen_action->setToolTip (tr ("Restore geometry"));
         else
@@ -236,7 +237,7 @@
       }
     else
       {
-        m_fullscreen_action->setIcon (resource_manager::icon ("view-fullscreen", false));
+        m_fullscreen_action->setIcon (m_resource_manager.icon ("view-fullscreen", false));
         setGeometry (m_prev_geom);
         if (m_prev_floating)
           m_fullscreen_action->setToolTip (tr (UNDOCKED_FULLSCREEN_BUTTON_TOOLTIP));
@@ -368,8 +369,10 @@
 
   // Variable editor stack
 
-  variable_editor_stack::variable_editor_stack (QWidget *p)
-    : QStackedWidget (p), m_edit_view (new variable_editor_view (this))
+  variable_editor_stack::variable_editor_stack (QWidget *p,
+                                                resource_manager& rmgr)
+    : QStackedWidget (p), m_resource_manager (rmgr),
+      m_edit_view (new variable_editor_view (this, m_resource_manager))
   {
     setFocusPolicy (Qt::StrongFocus);
 
@@ -452,7 +455,7 @@
 
     // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
     int opts = 0;  // No options by default.
-    if (! resource_manager::get_settings ()->value ("use_native_file_dialogs",
+    if (! m_resource_manager.get_settings ()->value ("use_native_file_dialogs",
                                                     true).toBool ())
       opts = QFileDialog::DontUseNativeDialog;
 
@@ -476,8 +479,9 @@
 
   // Custom editable variable table view
 
-  variable_editor_view::variable_editor_view (QWidget *p)
-    : QTableView (p), m_var_model (nullptr)
+  variable_editor_view::variable_editor_view (QWidget *p,
+                                              resource_manager& rmgr)
+    : QTableView (p), m_resource_manager (rmgr), m_var_model (nullptr)
   {
     setWordWrap (false);
     setContextMenuPolicy (Qt::CustomContextMenu);
@@ -583,29 +587,29 @@
   variable_editor_view::add_edit_actions (QMenu *menu,
                                           const QString& qualifier_string)
   {
-    menu->addAction (resource_manager::icon ("edit-cut"),
+    menu->addAction (m_resource_manager.icon ("edit-cut"),
                      tr ("Cut") + qualifier_string,
                      this, SLOT (cutClipboard ()));
 
-    menu->addAction (resource_manager::icon ("edit-copy"),
+    menu->addAction (m_resource_manager.icon ("edit-copy"),
                      tr ("Copy") + qualifier_string,
                      this, SLOT (copyClipboard ()));
 
-    menu->addAction (resource_manager::icon ("edit-paste"),
+    menu->addAction (m_resource_manager.icon ("edit-paste"),
                      tr ("Paste"),
                      this, SLOT (pasteClipboard ()));
 
     menu->addSeparator ();
 
-    menu->addAction (resource_manager::icon ("edit-delete"),
+    menu->addAction (m_resource_manager.icon ("edit-delete"),
                      tr ("Clear") + qualifier_string,
                      this, SLOT (clearContent ()));
 
-    menu->addAction (resource_manager::icon ("edit-delete"),
+    menu->addAction (m_resource_manager.icon ("edit-delete"),
                      tr ("Delete") + qualifier_string,
                      this, SLOT (delete_selected ()));
 
-    menu->addAction (resource_manager::icon ("document-new"),
+    menu->addAction (m_resource_manager.icon ("document-new"),
                      tr ("Variable from Selection"),
                      this, SLOT (createVariable ()));
   }
@@ -1033,9 +1037,9 @@
 
   // Variable editor.
 
-  variable_editor::variable_editor (QWidget *p)
-    : octave_dock_widget ("VariableEditor", p),
-      m_main (new dw_main_window ()),
+  variable_editor::variable_editor (QWidget *p, resource_manager& rmgr)
+    : octave_dock_widget ("VariableEditor", p, rmgr),
+      m_main (new dw_main_window (rmgr)),
       m_tool_bar (new QToolBar (m_main)),
       m_default_width (30),
       m_default_height (100),
@@ -1073,7 +1077,7 @@
 
     // Colors.
 
-    for (int i = 0; i < resource_manager::varedit_color_chars ().length (); i++)
+    for (int i = 0; i < m_resource_manager.varedit_color_chars ().length (); i++)
       m_table_colors.append (QColor (Qt::white));
 
     // Use an MDI area that is shrunk to nothing as the central widget.
@@ -1154,7 +1158,7 @@
   {
     if (m_stylesheet.isEmpty ())
       {
-        gui_settings *settings = resource_manager::get_settings ();
+        gui_settings *settings = m_resource_manager.get_settings ();
         notice_settings (settings);
       }
 
@@ -1181,7 +1185,9 @@
         return;
       }
 
-    variable_dock_widget *page = new variable_dock_widget (this);
+    variable_dock_widget *page
+      = new variable_dock_widget (this, m_resource_manager);
+
     page->setObjectName (name);
     m_main->addDockWidget (Qt::LeftDockWidgetArea, page);
 
@@ -1199,7 +1205,9 @@
              page, SLOT (refloat ()), Qt::QueuedConnection);
 #endif
 
-    variable_editor_stack *stack = new variable_editor_stack (page);
+    variable_editor_stack *stack
+      = new variable_editor_stack (page, m_resource_manager);
+
     stack->setObjectName (name);
     page->setWidget (stack);
     page->setFocusProxy (stack);
@@ -1371,9 +1379,9 @@
     m_alternate_rows = settings->value ("variable_editor/alternate_rows",
                                         false).toBool ();
 
-    QList<QColor> default_colors = resource_manager::varedit_default_colors ();
+    QList<QColor> default_colors = m_resource_manager.varedit_default_colors ();
 
-    QString class_chars = resource_manager::varedit_color_chars ();
+    QString class_chars = m_resource_manager.varedit_color_chars ();
 
     m_use_terminal_font = settings->value ("variable_editor/use_terminal_font",
                                            true).toBool ();
@@ -1622,7 +1630,7 @@
     m_tool_bar->setWindowTitle (tr ("Variable Editor Toolbar"));
 
     QAction *action;
-    action = add_tool_bar_button (resource_manager::icon ("document-save"),
+    action = add_tool_bar_button (m_resource_manager.icon ("document-save"),
                                   tr ("Save"), this, SLOT (save ()));
     addAction (action);
     action->setShortcutContext (Qt::WidgetWithChildrenShortcut);
@@ -1631,15 +1639,15 @@
 
     m_tool_bar->addSeparator ();
 
-    action = add_tool_bar_button (resource_manager::icon ("edit-cut"),
+    action = add_tool_bar_button (m_resource_manager.icon ("edit-cut"),
                                   tr ("Cut"), this, SLOT (cutClipboard ()));
     action->setStatusTip(tr("Cut data to clipboard"));
 
-    action = add_tool_bar_button (resource_manager::icon ("edit-copy"),
+    action = add_tool_bar_button (m_resource_manager.icon ("edit-copy"),
                                   tr ("Copy"), this, SLOT (copyClipboard ()));
     action->setStatusTip(tr("Copy data to clipboard"));
 
-    action = add_tool_bar_button (resource_manager::icon ("edit-paste"),
+    action = add_tool_bar_button (m_resource_manager.icon ("edit-paste"),
                                   tr ("Paste"), this, SLOT (pasteClipboard ()));
     action->setStatusTip(tr("Paste clipboard into variable data"));
 
@@ -1649,7 +1657,7 @@
     // QAction *print_action; /icons/fileprint.png
     // m_tool_bar->addSeparator ();
 
-    action = new QAction (resource_manager::icon ("plot-xy-curve"),
+    action = new QAction (m_resource_manager.icon ("plot-xy-curve"),
                           tr ("Plot"), m_tool_bar);
     action->setToolTip (tr ("Plot Selected Data"));
     QToolButton *plot_tool_button = new HoverToolButton (m_tool_bar);
@@ -1657,7 +1665,7 @@
 
     plot_tool_button->setText (tr ("Plot"));
     plot_tool_button->setToolTip (tr ("Plot selected data"));
-    plot_tool_button->setIcon (resource_manager::icon ("plot-xy-curve"));
+    plot_tool_button->setIcon (m_resource_manager.icon ("plot-xy-curve"));
 
     plot_tool_button->setPopupMode (QToolButton::InstantPopup);
 
@@ -1676,7 +1684,7 @@
 
     m_tool_bar->addSeparator ();
 
-    action = add_tool_bar_button (resource_manager::icon ("go-up"),
+    action = add_tool_bar_button (m_resource_manager.icon ("go-up"),
                                   tr ("Up"), this, SLOT (levelUp ()));
     action->setStatusTip(tr("Go one level up in variable hierarchy"));
 
--- a/libgui/src/variable-editor.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/variable-editor.h	Fri Nov 01 18:16:49 2019 -0400
@@ -42,10 +42,11 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class variable_editor_model;
   class variable_editor_view;
 
-
   // The individual variable subwindow class
 
   class variable_dock_widget : public label_dock_widget
@@ -54,7 +55,7 @@
 
   public:
 
-    variable_dock_widget (QWidget *p = nullptr);
+    variable_dock_widget (QWidget *p, resource_manager& rmgr);
 
   signals:
 
@@ -129,7 +130,7 @@
 
   public:
 
-    variable_editor_stack (QWidget *p = nullptr);
+    variable_editor_stack (QWidget *p, resource_manager& rmgr);
 
     variable_editor_view *edit_view (void) {return m_edit_view;};
 
@@ -153,6 +154,8 @@
 
     QTextEdit *make_disp_view (QWidget *parent);
 
+    resource_manager& m_resource_manager;
+
     variable_editor_view *m_edit_view;
 
     QTextEdit *m_disp_view;
@@ -165,7 +168,7 @@
 
   public:
 
-    variable_editor_view (QWidget *p = nullptr);
+    variable_editor_view (QWidget *p, resource_manager& rmgr);
 
     void setModel (QAbstractItemModel *model);
 
@@ -212,6 +215,8 @@
 
     void add_edit_actions (QMenu *menu, const QString& qualifier_string);
 
+    resource_manager& m_resource_manager;
+
     variable_editor_model *m_var_model;
   };
 
@@ -280,7 +285,7 @@
 
   public:
 
-    variable_editor (QWidget *parent = nullptr);
+    variable_editor (QWidget *parent, resource_manager& rmgr);
 
     ~variable_editor (void) = default;
 
--- a/libgui/src/welcome-wizard.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/welcome-wizard.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -36,9 +36,9 @@
   #include <windows.h>
 #endif
 
+#include "gui-preferences-nr.h"
 #include "resource-manager.h"
 #include "welcome-wizard.h"
-#include "gui-preferences-nr.h"
 
 namespace octave
 {
@@ -51,9 +51,9 @@
     return logo;
   };
 
-  welcome_wizard::welcome_wizard (QWidget *p)
-    : QDialog (p), m_page_ctor_list (), m_page_list_iterator (),
-      m_current_page (initial_page::create (this)),
+  welcome_wizard::welcome_wizard (resource_manager& rmgr, QWidget *p)
+    : QDialog (p), m_resource_manager (rmgr), m_page_ctor_list (),
+      m_page_list_iterator (), m_current_page (initial_page::create (this)),
       m_allow_web_connect_state (false),
       m_max_height (0), m_max_width (0)
   {
@@ -140,9 +140,9 @@
   {
     // Create default settings file.
 
-    resource_manager::reload_settings ();
+    m_resource_manager.reload_settings ();
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings)
       {
@@ -167,13 +167,16 @@
     ft.setPointSize (20);
     m_title->setFont (ft);
 
+    resource_manager& rmgr
+      = __get_resource_manager__ ("shortcut_manager::shortcut_manager");
+
     m_message->setText
       (tr ("<html><body>\n"
            "<p>You seem to be using the Octave graphical interface for the first time on this computer.\n"
            "Click 'Next' to create a configuration file and launch Octave.</p>\n"
            "<p>The configuration file is stored in<br>%1.</p>\n"
            "</body></html>").
-       arg (resource_manager::get_settings_file ()));
+       arg (rmgr.get_settings_file ()));
     m_message->setWordWrap (true);
     m_message->setMinimumWidth (400);
 
--- a/libgui/src/welcome-wizard.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/welcome-wizard.h	Fri Nov 01 18:16:49 2019 -0400
@@ -30,6 +30,8 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class welcome_wizard : public QDialog
   {
     Q_OBJECT
@@ -38,7 +40,7 @@
 
     typedef QWidget *(*page_creator_fptr) (welcome_wizard *wizard);
 
-    welcome_wizard (QWidget *parent = nullptr);
+    welcome_wizard (resource_manager& rmgr, QWidget *parent = nullptr);
 
     ~welcome_wizard (void) = default;
 
@@ -46,6 +48,8 @@
 
   private:
 
+    resource_manager& m_resource_manager;
+
     QList<page_creator_fptr> m_page_ctor_list;
     QList<page_creator_fptr>::iterator m_page_list_iterator;
     QWidget *m_current_page;
--- a/libgui/src/workspace-model.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/workspace-model.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -39,8 +39,8 @@
 
 namespace octave
 {
-  workspace_model::workspace_model (QObject *p)
-    : QAbstractTableModel (p)
+  workspace_model::workspace_model (resource_manager& rmgr, QObject *p)
+    : QAbstractTableModel (p), m_resource_manager (rmgr)
   {
     m_columnNames.append (tr ("Name"));
     m_columnNames.append (tr ("Class"));
@@ -52,7 +52,7 @@
     // classes in the workspace view. The structure is
     // m_storage_class_colors(1,2,...,colors):        background colors
     // m_storage_class_colors(colors+1,...,2*colors): foreground colors
-    int colors = resource_manager::storage_class_chars ().length ();
+    int colors = m_resource_manager.storage_class_chars ().length ();
     for (int i = 0; i < 2*colors; i++)
       m_storage_class_colors.append (QColor (Qt::white));
 
@@ -136,7 +136,7 @@
         if ((role == Qt::BackgroundColorRole || role == Qt::ForegroundRole)
             && m_enable_colors)
           {
-            QString class_chars = resource_manager::storage_class_chars ();
+            QString class_chars = m_resource_manager.storage_class_chars ();
             int actual_class
               = class_chars.indexOf (m_scopes[idx.row ()].toLatin1 ());
             if (actual_class >= 0)
@@ -182,7 +182,7 @@
                 {
                   QString sclass;
 
-                  QString class_chars = resource_manager::storage_class_chars ();
+                  QString class_chars = m_resource_manager.storage_class_chars ();
 
                   int actual_class
                     = class_chars.indexOf (m_scopes[idx.row ()].toLatin1 ());
@@ -190,7 +190,7 @@
                   if (actual_class >= 0)
                     {
                       QStringList class_names
-                        = resource_manager::storage_class_names ();
+                        = m_resource_manager.storage_class_names ();
 
                       sclass = class_names.at (actual_class);
                     }
@@ -236,8 +236,8 @@
   workspace_model::notice_settings (const gui_settings *settings)
   {
     QList<QColor> default_colors =
-      resource_manager::storage_class_default_colors ();
-    QString class_chars = resource_manager::storage_class_chars ();
+      m_resource_manager.storage_class_default_colors ();
+    QString class_chars = m_resource_manager.storage_class_chars ();
 
     m_enable_colors =
         settings->value (ws_enable_colors.key, ws_enable_colors.def).toBool ();
--- a/libgui/src/workspace-model.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/workspace-model.h	Fri Nov 01 18:16:49 2019 -0400
@@ -41,6 +41,8 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class workspace_model
     : public QAbstractTableModel
   {
@@ -48,7 +50,7 @@
 
   public:
 
-    workspace_model (QObject *parent = nullptr);
+    workspace_model (resource_manager& rmgr, QObject *parent = nullptr);
 
     ~workspace_model (void) = default;
 
@@ -95,6 +97,8 @@
     void clear_data (void);
     void update_table (void);
 
+    resource_manager& m_resource_manager;
+
     bool m_top_level;
     symbol_info_list m_syminfo_list;
     QString m_scopes;
--- a/libgui/src/workspace-view.cc	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/workspace-view.cc	Fri Nov 01 18:16:49 2019 -0400
@@ -49,8 +49,8 @@
 
 namespace octave
 {
-  workspace_view::workspace_view (QWidget *p)
-    : octave_dock_widget ("WorkspaceView", p),
+  workspace_view::workspace_view (QWidget *p, resource_manager& rmgr)
+    : octave_dock_widget ("WorkspaceView", p, rmgr),
       m_view (new QTableView (this)),
       m_filter_checkbox (new QCheckBox ()),
       m_filter (new QComboBox (this)),
@@ -96,7 +96,7 @@
     ws_layout->addWidget (m_view);
     ws_layout->setSpacing (0);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (settings)
       {
@@ -177,7 +177,7 @@
     m_view->setModel (&m_filter_model);
 
     // set the sorting after a model was set, it would be ignored otherwise
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
     m_view->sortByColumn (settings->value ("workspaceview/sort_by_column",0).toInt (),
                           static_cast<Qt::SortOrder> (settings->value ("workspaceview/sort_order", Qt::AscendingOrder).toUInt ()));
 
@@ -201,14 +201,14 @@
       {
         tool_tip  = QString (tr ("View the variables in the active workspace.<br>"));
         tool_tip += QString (tr ("Colors for variable attributes:"));
-        int colors = resource_manager::storage_class_chars ().length ();
+        int colors = m_resource_manager.storage_class_chars ().length ();
         for (i = 0; i < colors; i++)
           {
             tool_tip +=
               QString (R"(<div style="background-color:%1;color:%2">%3</div>)")
               .arg (m_model->storage_class_color (i).name ())
               .arg (m_model->storage_class_color (i + colors).name ())
-              .arg (resource_manager::storage_class_names ().at (i));
+              .arg (m_resource_manager.storage_class_names ().at (i));
           }
       }
 
@@ -230,7 +230,7 @@
   void
   workspace_view::save_settings (void)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     if (! settings)
       return;
@@ -295,7 +295,7 @@
     QMenu menu (this);
     QSignalMapper sig_mapper (this);
 
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     for (int i = 0; i < m_columns_shown.size (); i++)
       {
@@ -315,7 +315,7 @@
   void
   workspace_view::toggle_header (int col)
   {
-    gui_settings *settings = resource_manager::get_settings ();
+    gui_settings *settings = m_resource_manager.get_settings ();
 
     QString key = m_columns_shown_keys.at (col);
     bool shown = settings->value (key,true).toBool ();
--- a/libgui/src/workspace-view.h	Sat Nov 02 15:24:14 2019 -0400
+++ b/libgui/src/workspace-view.h	Fri Nov 01 18:16:49 2019 -0400
@@ -39,13 +39,15 @@
 
 namespace octave
 {
+  class resource_manager;
+
   class workspace_view : public octave_dock_widget
   {
     Q_OBJECT
 
   public:
 
-    workspace_view (QWidget *parent = nullptr);
+    workspace_view (QWidget *parent, resource_manager& rmgr);
 
     ~workspace_view (void) = default;