changeset 27630:262cdd0f7619

don't use singleton pattern for shortcut manager in GUI Move ownership of the shorcut_manager object to the base_qobject class. Eliminate static member functions in shortcut_managar class. Provide a get_shortcut_manager method in the base_qboject class and access reference to shortcut_manager object from m_octave_qobj member variables in classes that need it.
author John W. Eaton <jwe@octave.org>
date Mon, 04 Nov 2019 14:03:00 -0500
parents 8b6e928e0705
children 688e8fb3caa9
files libgui/src/documentation.cc libgui/src/dw-main-window.cc libgui/src/m-editor/file-editor.cc libgui/src/main-window.cc libgui/src/octave-qobject.cc libgui/src/octave-qobject.h libgui/src/settings-dialog.cc libgui/src/shortcut-manager.cc libgui/src/shortcut-manager.h
diffstat 9 files changed, 294 insertions(+), 322 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/documentation.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/documentation.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -580,15 +580,17 @@
     m_tool_bar->setIconSize (QSize (icon_size, icon_size));
 
     // Shortcuts
-    shortcut_manager::set_shortcut (m_action_find, "editor_edit:find_replace");
-    shortcut_manager::shortcut (m_findnext_shortcut, "editor_edit:find_next");
-    shortcut_manager::shortcut (m_findprev_shortcut, "editor_edit:find_previous");
-    shortcut_manager::set_shortcut (m_action_zoom_in, "editor_view:zoom_in");
-    shortcut_manager::set_shortcut (m_action_zoom_out, "editor_view:zoom_out");
-    shortcut_manager::set_shortcut (m_action_zoom_original, "editor_view:zoom_normal");
-    shortcut_manager::set_shortcut (m_action_go_home, "doc_browser:go_home");
-    shortcut_manager::set_shortcut (m_action_go_prev, "doc_browser:go_back");
-    shortcut_manager::set_shortcut (m_action_go_next, "doc_browser:go_next");
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
+    scmgr.set_shortcut (m_action_find, "editor_edit:find_replace");
+    scmgr.shortcut (m_findnext_shortcut, "editor_edit:find_next");
+    scmgr.shortcut (m_findprev_shortcut, "editor_edit:find_previous");
+    scmgr.set_shortcut (m_action_zoom_in, "editor_view:zoom_in");
+    scmgr.set_shortcut (m_action_zoom_out, "editor_view:zoom_out");
+    scmgr.set_shortcut (m_action_zoom_original, "editor_view:zoom_normal");
+    scmgr.set_shortcut (m_action_go_home, "doc_browser:go_home");
+    scmgr.set_shortcut (m_action_go_prev, "doc_browser:go_back");
+    scmgr.set_shortcut (m_action_go_next, "doc_browser:go_next");
   }
 
   void documentation::copyClipboard (void)
--- a/libgui/src/dw-main-window.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/dw-main-window.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -128,12 +128,14 @@
   // Update the settings
   void dw_main_window::notice_settings (const gui_settings *)
   {
-    shortcut_manager::set_shortcut (m_close_action, "editor_file:close");
-    shortcut_manager::set_shortcut (m_close_all_action, "editor_file:close_all");
-    shortcut_manager::set_shortcut (m_close_others_action, "editor_file:close_other");
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
 
-    shortcut_manager::set_shortcut (m_switch_left_action, "editor_tabs:switch_left_tab");
-    shortcut_manager::set_shortcut (m_switch_right_action, "editor_tabs:switch_right_tab");
+    scmgr.set_shortcut (m_close_action, "editor_file:close");
+    scmgr.set_shortcut (m_close_all_action, "editor_file:close_all");
+    scmgr.set_shortcut (m_close_others_action, "editor_file:close_other");
+
+    scmgr.set_shortcut (m_switch_left_action, "editor_tabs:switch_left_tab");
+    scmgr.set_shortcut (m_switch_right_action, "editor_tabs:switch_right_tab");
   }
 
 
--- a/libgui/src/m-editor/file-editor.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/m-editor/file-editor.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -170,7 +170,8 @@
 
   void file_editor::handle_exit_debug_mode (void)
   {
-    shortcut_manager::set_shortcut (m_run_action, "editor_run:run_file");
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+    scmgr.set_shortcut (m_run_action, "editor_run:run_file");
     m_run_action->setToolTip (tr ("Save File and Run"));  // update tool tip
   }
 
@@ -1232,88 +1233,90 @@
     // Shortcuts also available in the main window, as well as the realted
     // ahotcuts, are defined in main_window and added to the editor
 
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
     // File menu
-    shortcut_manager::set_shortcut (m_edit_function_action, "editor_file:edit_function");
-    shortcut_manager::set_shortcut (m_save_action, "editor_file:save");
-    shortcut_manager::set_shortcut (m_save_as_action, "editor_file:save_as");
-    shortcut_manager::set_shortcut (m_close_action, "editor_file:close");
-    shortcut_manager::set_shortcut (m_close_all_action, "editor_file:close_all");
-    shortcut_manager::set_shortcut (m_close_others_action, "editor_file:close_other");
-    shortcut_manager::set_shortcut (m_print_action, "editor_file:print");
+    scmgr.set_shortcut (m_edit_function_action, "editor_file:edit_function");
+    scmgr.set_shortcut (m_save_action, "editor_file:save");
+    scmgr.set_shortcut (m_save_as_action, "editor_file:save_as");
+    scmgr.set_shortcut (m_close_action, "editor_file:close");
+    scmgr.set_shortcut (m_close_all_action, "editor_file:close_all");
+    scmgr.set_shortcut (m_close_others_action, "editor_file:close_other");
+    scmgr.set_shortcut (m_print_action, "editor_file:print");
 
     // Edit menu
-    shortcut_manager::set_shortcut (m_redo_action, "editor_edit:redo");
-    shortcut_manager::set_shortcut (m_cut_action, "editor_edit:cut");
-    shortcut_manager::set_shortcut (m_find_action, "editor_edit:find_replace");
-    shortcut_manager::set_shortcut (m_find_next_action, "editor_edit:find_next");
-    shortcut_manager::set_shortcut (m_find_previous_action, "editor_edit:find_previous");
-
-    shortcut_manager::set_shortcut (m_delete_start_word_action, "editor_edit:delete_start_word");
-    shortcut_manager::set_shortcut (m_delete_end_word_action, "editor_edit:delete_end_word");
-    shortcut_manager::set_shortcut (m_delete_start_line_action, "editor_edit:delete_start_line");
-    shortcut_manager::set_shortcut (m_delete_end_line_action, "editor_edit:delete_end_line");
-    shortcut_manager::set_shortcut (m_delete_line_action, "editor_edit:delete_line");
-    shortcut_manager::set_shortcut (m_copy_line_action, "editor_edit:copy_line");
-    shortcut_manager::set_shortcut (m_cut_line_action, "editor_edit:cut_line");
-    shortcut_manager::set_shortcut (m_duplicate_selection_action, "editor_edit:duplicate_selection");
-    shortcut_manager::set_shortcut (m_transpose_line_action, "editor_edit:transpose_line");
-    shortcut_manager::set_shortcut (m_comment_selection_action, "editor_edit:comment_selection");
-    shortcut_manager::set_shortcut (m_uncomment_selection_action, "editor_edit:uncomment_selection");
-    shortcut_manager::set_shortcut (m_comment_var_selection_action, "editor_edit:comment_var_selection");
-
-    shortcut_manager::set_shortcut (m_upper_case_action, "editor_edit:upper_case");
-    shortcut_manager::set_shortcut (m_lower_case_action, "editor_edit:lower_case");
-    shortcut_manager::set_shortcut (m_indent_selection_action, "editor_edit:indent_selection");
-    shortcut_manager::set_shortcut (m_unindent_selection_action, "editor_edit:unindent_selection");
-    shortcut_manager::set_shortcut (m_smart_indent_line_or_selection_action, "editor_edit:smart_indent_line_or_selection");
-    shortcut_manager::set_shortcut (m_completion_action, "editor_edit:completion_list");
-    shortcut_manager::set_shortcut (m_goto_line_action, "editor_edit:goto_line");
-    shortcut_manager::set_shortcut (m_move_to_matching_brace, "editor_edit:move_to_brace");
-    shortcut_manager::set_shortcut (m_sel_to_matching_brace, "editor_edit:select_to_brace");
-    shortcut_manager::set_shortcut (m_toggle_bookmark_action, "editor_edit:toggle_bookmark");
-    shortcut_manager::set_shortcut (m_next_bookmark_action, "editor_edit:next_bookmark");
-    shortcut_manager::set_shortcut (m_previous_bookmark_action, "editor_edit:previous_bookmark");
-    shortcut_manager::set_shortcut (m_remove_bookmark_action, "editor_edit:remove_bookmark");
-    shortcut_manager::set_shortcut (m_preferences_action, "editor_edit:preferences");
-    shortcut_manager::set_shortcut (m_styles_preferences_action, "editor_edit:styles_preferences");
-
-    shortcut_manager::set_shortcut (m_conv_eol_windows_action, "editor_edit:conv_eol_winows");
-    shortcut_manager::set_shortcut (m_conv_eol_unix_action,    "editor_edit:conv_eol_unix");
-    shortcut_manager::set_shortcut (m_conv_eol_mac_action,     "editor_edit:conv_eol_mac");
+    scmgr.set_shortcut (m_redo_action, "editor_edit:redo");
+    scmgr.set_shortcut (m_cut_action, "editor_edit:cut");
+    scmgr.set_shortcut (m_find_action, "editor_edit:find_replace");
+    scmgr.set_shortcut (m_find_next_action, "editor_edit:find_next");
+    scmgr.set_shortcut (m_find_previous_action, "editor_edit:find_previous");
+
+    scmgr.set_shortcut (m_delete_start_word_action, "editor_edit:delete_start_word");
+    scmgr.set_shortcut (m_delete_end_word_action, "editor_edit:delete_end_word");
+    scmgr.set_shortcut (m_delete_start_line_action, "editor_edit:delete_start_line");
+    scmgr.set_shortcut (m_delete_end_line_action, "editor_edit:delete_end_line");
+    scmgr.set_shortcut (m_delete_line_action, "editor_edit:delete_line");
+    scmgr.set_shortcut (m_copy_line_action, "editor_edit:copy_line");
+    scmgr.set_shortcut (m_cut_line_action, "editor_edit:cut_line");
+    scmgr.set_shortcut (m_duplicate_selection_action, "editor_edit:duplicate_selection");
+    scmgr.set_shortcut (m_transpose_line_action, "editor_edit:transpose_line");
+    scmgr.set_shortcut (m_comment_selection_action, "editor_edit:comment_selection");
+    scmgr.set_shortcut (m_uncomment_selection_action, "editor_edit:uncomment_selection");
+    scmgr.set_shortcut (m_comment_var_selection_action, "editor_edit:comment_var_selection");
+
+    scmgr.set_shortcut (m_upper_case_action, "editor_edit:upper_case");
+    scmgr.set_shortcut (m_lower_case_action, "editor_edit:lower_case");
+    scmgr.set_shortcut (m_indent_selection_action, "editor_edit:indent_selection");
+    scmgr.set_shortcut (m_unindent_selection_action, "editor_edit:unindent_selection");
+    scmgr.set_shortcut (m_smart_indent_line_or_selection_action, "editor_edit:smart_indent_line_or_selection");
+    scmgr.set_shortcut (m_completion_action, "editor_edit:completion_list");
+    scmgr.set_shortcut (m_goto_line_action, "editor_edit:goto_line");
+    scmgr.set_shortcut (m_move_to_matching_brace, "editor_edit:move_to_brace");
+    scmgr.set_shortcut (m_sel_to_matching_brace, "editor_edit:select_to_brace");
+    scmgr.set_shortcut (m_toggle_bookmark_action, "editor_edit:toggle_bookmark");
+    scmgr.set_shortcut (m_next_bookmark_action, "editor_edit:next_bookmark");
+    scmgr.set_shortcut (m_previous_bookmark_action, "editor_edit:previous_bookmark");
+    scmgr.set_shortcut (m_remove_bookmark_action, "editor_edit:remove_bookmark");
+    scmgr.set_shortcut (m_preferences_action, "editor_edit:preferences");
+    scmgr.set_shortcut (m_styles_preferences_action, "editor_edit:styles_preferences");
+
+    scmgr.set_shortcut (m_conv_eol_windows_action, "editor_edit:conv_eol_winows");
+    scmgr.set_shortcut (m_conv_eol_unix_action,    "editor_edit:conv_eol_unix");
+    scmgr.set_shortcut (m_conv_eol_mac_action,     "editor_edit:conv_eol_mac");
 
     // View menu
-    shortcut_manager::set_shortcut (m_show_linenum_action, "editor_view:show_line_numbers");
-    shortcut_manager::set_shortcut (m_show_whitespace_action, "editor_view:show_white_spaces");
-    shortcut_manager::set_shortcut (m_show_eol_action, "editor_view:show_eol_chars");
-    shortcut_manager::set_shortcut (m_show_indguide_action, "editor_view:show_ind_guides");
-    shortcut_manager::set_shortcut (m_show_longline_action, "editor_view:show_long_line");
-    shortcut_manager::set_shortcut (m_show_toolbar_action, "editor_view:show_toolbar");
-    shortcut_manager::set_shortcut (m_show_statusbar_action, "editor_view:show_statusbar");
-    shortcut_manager::set_shortcut (m_show_hscrollbar_action, "editor_view:show_hscrollbar");
-    shortcut_manager::set_shortcut (m_zoom_in_action, "editor_view:zoom_in");
-    shortcut_manager::set_shortcut (m_zoom_out_action, "editor_view:zoom_out");
-    shortcut_manager::set_shortcut (m_zoom_normal_action, "editor_view:zoom_normal");
-    shortcut_manager::set_shortcut (m_sort_tabs_action, "editor_view:sort_tabs");
+    scmgr.set_shortcut (m_show_linenum_action, "editor_view:show_line_numbers");
+    scmgr.set_shortcut (m_show_whitespace_action, "editor_view:show_white_spaces");
+    scmgr.set_shortcut (m_show_eol_action, "editor_view:show_eol_chars");
+    scmgr.set_shortcut (m_show_indguide_action, "editor_view:show_ind_guides");
+    scmgr.set_shortcut (m_show_longline_action, "editor_view:show_long_line");
+    scmgr.set_shortcut (m_show_toolbar_action, "editor_view:show_toolbar");
+    scmgr.set_shortcut (m_show_statusbar_action, "editor_view:show_statusbar");
+    scmgr.set_shortcut (m_show_hscrollbar_action, "editor_view:show_hscrollbar");
+    scmgr.set_shortcut (m_zoom_in_action, "editor_view:zoom_in");
+    scmgr.set_shortcut (m_zoom_out_action, "editor_view:zoom_out");
+    scmgr.set_shortcut (m_zoom_normal_action, "editor_view:zoom_normal");
+    scmgr.set_shortcut (m_sort_tabs_action, "editor_view:sort_tabs");
 
     // Debug menu
-    shortcut_manager::set_shortcut (m_toggle_breakpoint_action, "editor_debug:toggle_breakpoint");
-    shortcut_manager::set_shortcut (m_next_breakpoint_action, "editor_debug:next_breakpoint");
-    shortcut_manager::set_shortcut (m_previous_breakpoint_action, "editor_debug:previous_breakpoint");
-    shortcut_manager::set_shortcut (m_remove_all_breakpoints_action, "editor_debug:remove_breakpoints");
+    scmgr.set_shortcut (m_toggle_breakpoint_action, "editor_debug:toggle_breakpoint");
+    scmgr.set_shortcut (m_next_breakpoint_action, "editor_debug:next_breakpoint");
+    scmgr.set_shortcut (m_previous_breakpoint_action, "editor_debug:previous_breakpoint");
+    scmgr.set_shortcut (m_remove_all_breakpoints_action, "editor_debug:remove_breakpoints");
 
     // Run menu
-    shortcut_manager::set_shortcut (m_run_action, "editor_run:run_file");
-    shortcut_manager::set_shortcut (m_run_selection_action, "editor_run:run_selection");
+    scmgr.set_shortcut (m_run_action, "editor_run:run_file");
+    scmgr.set_shortcut (m_run_selection_action, "editor_run:run_selection");
 
     // Help menu
-    shortcut_manager::set_shortcut (m_context_help_action, "editor_help:help_keyword");
-    shortcut_manager::set_shortcut (m_context_doc_action,  "editor_help:doc_keyword");
+    scmgr.set_shortcut (m_context_help_action, "editor_help:help_keyword");
+    scmgr.set_shortcut (m_context_doc_action,  "editor_help:doc_keyword");
 
     // Tab navigation without menu entries
-    shortcut_manager::set_shortcut (m_switch_left_tab_action, "editor_tabs:switch_left_tab");
-    shortcut_manager::set_shortcut (m_switch_right_tab_action, "editor_tabs:switch_right_tab");
-    shortcut_manager::set_shortcut (m_move_tab_left_action, "editor_tabs:move_tab_left");
-    shortcut_manager::set_shortcut (m_move_tab_right_action, "editor_tabs:move_tab_right");
+    scmgr.set_shortcut (m_switch_left_tab_action, "editor_tabs:switch_left_tab");
+    scmgr.set_shortcut (m_switch_right_tab_action, "editor_tabs:switch_right_tab");
+    scmgr.set_shortcut (m_move_tab_left_action, "editor_tabs:move_tab_left");
+    scmgr.set_shortcut (m_move_tab_right_action, "editor_tabs:move_tab_right");
 
   }
 
--- a/libgui/src/main-window.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/main-window.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -151,7 +151,12 @@
     sys::env::putenv ("TERM", "xterm");
 #endif
 
-    shortcut_manager::init_data ();
+    // FIXME: can we do this job when creating the shortcut manager?
+    // A quick look shows that it may require some coordination with the
+    // resource manager.  Startup is complicated, but maybe we can make
+    // it simpler?
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+    scmgr.init_data ();
 
     construct_central_widget ();
 
@@ -2011,9 +2016,6 @@
     connect (qApp, SIGNAL (aboutToQuit (void)),
              this, SLOT (prepare_to_exit (void)));
 
-    connect (qApp, SIGNAL (aboutToQuit (void)),
-             shortcut_manager::instance, SLOT (cleanup_instance (void)));
-
     connect (qApp, SIGNAL (focusChanged (QWidget*, QWidget*)),
              this, SLOT (focus_changed (QWidget*, QWidget*)));
 
@@ -2724,82 +2726,66 @@
 
   void main_window::configure_shortcuts (void)
   {
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
     // file menu
-    shortcut_manager::set_shortcut (m_open_action, "main_file:open_file");
-    shortcut_manager::set_shortcut (m_new_script_action, "main_file:new_file");
-    shortcut_manager::set_shortcut (m_new_function_action,
-                                    "main_file:new_function");
-    shortcut_manager::set_shortcut (m_new_function_action, "main_file:new_figure");
-    shortcut_manager::set_shortcut (m_load_workspace_action,
-                                    "main_file:load_workspace");
-    shortcut_manager::set_shortcut (m_save_workspace_action,
-                                    "main_file:save_workspace");
-    shortcut_manager::set_shortcut (m_exit_action,"main_file:exit");
+    scmgr.set_shortcut (m_open_action, "main_file:open_file");
+    scmgr.set_shortcut (m_new_script_action, "main_file:new_file");
+    scmgr.set_shortcut (m_new_function_action, "main_file:new_function");
+    scmgr.set_shortcut (m_new_function_action, "main_file:new_figure");
+    scmgr.set_shortcut (m_load_workspace_action, "main_file:load_workspace");
+    scmgr.set_shortcut (m_save_workspace_action, "main_file:save_workspace");
+    scmgr.set_shortcut (m_exit_action, "main_file:exit");
 
     // edit menu
-    shortcut_manager::set_shortcut (m_copy_action, "main_edit:copy");
-    shortcut_manager::set_shortcut (m_paste_action, "main_edit:paste");
-    shortcut_manager::set_shortcut (m_undo_action, "main_edit:undo");
-    shortcut_manager::set_shortcut (m_select_all_action, "main_edit:select_all");
-    shortcut_manager::set_shortcut (m_clear_clipboard_action,
-                                    "main_edit:clear_clipboard");
-    shortcut_manager::set_shortcut (m_find_files_action, "main_edit:find_in_files");
-    shortcut_manager::set_shortcut (m_clear_command_history_action,
-                                    "main_edit:clear_history");
-    shortcut_manager::set_shortcut (m_clear_command_window_action,
-                                    "main_edit:clear_command_window");
-    shortcut_manager::set_shortcut (m_clear_workspace_action,
-                                    "main_edit:clear_workspace");
-    shortcut_manager::set_shortcut (m_set_path_action, "main_edit:set_path");
-    shortcut_manager::set_shortcut (m_preferences_action, "main_edit:preferences");
+    scmgr.set_shortcut (m_copy_action, "main_edit:copy");
+    scmgr.set_shortcut (m_paste_action, "main_edit:paste");
+    scmgr.set_shortcut (m_undo_action, "main_edit:undo");
+    scmgr.set_shortcut (m_select_all_action, "main_edit:select_all");
+    scmgr.set_shortcut (m_clear_clipboard_action, "main_edit:clear_clipboard");
+    scmgr.set_shortcut (m_find_files_action, "main_edit:find_in_files");
+    scmgr.set_shortcut (m_clear_command_history_action, "main_edit:clear_history");
+    scmgr.set_shortcut (m_clear_command_window_action, "main_edit:clear_command_window");
+    scmgr.set_shortcut (m_clear_workspace_action, "main_edit:clear_workspace");
+    scmgr.set_shortcut (m_set_path_action, "main_edit:set_path");
+    scmgr.set_shortcut (m_preferences_action, "main_edit:preferences");
 
     // debug menu
-    shortcut_manager::set_shortcut (m_debug_step_over, "main_debug:step_over");
-    shortcut_manager::set_shortcut (m_debug_step_into, "main_debug:step_into");
-    shortcut_manager::set_shortcut (m_debug_step_out,  "main_debug:step_out");
-    shortcut_manager::set_shortcut (m_debug_continue,  "main_debug:continue");
-    shortcut_manager::set_shortcut (m_debug_quit,  "main_debug:quit");
+    scmgr.set_shortcut (m_debug_step_over, "main_debug:step_over");
+    scmgr.set_shortcut (m_debug_step_into, "main_debug:step_into");
+    scmgr.set_shortcut (m_debug_step_out, "main_debug:step_out");
+    scmgr.set_shortcut (m_debug_continue, "main_debug:continue");
+    scmgr.set_shortcut (m_debug_quit, "main_debug:quit");
 
     // window menu
-    shortcut_manager::set_shortcut (m_show_command_window_action,
-                                    "main_window:show_command");
-    shortcut_manager::set_shortcut (m_show_history_action,
-                                    "main_window:show_history");
-    shortcut_manager::set_shortcut (m_show_workspace_action,
-                                    "main_window:show_workspace");
-    shortcut_manager::set_shortcut (m_show_file_browser_action,
-                                    "main_window:show_file_browser");
-    shortcut_manager::set_shortcut (m_show_editor_action,
-                                    "main_window:show_editor");
-    shortcut_manager::set_shortcut (m_show_documentation_action,
-                                    "main_window:show_doc");
-    shortcut_manager::set_shortcut (m_show_variable_editor_action,
-                                    "main_window:show_variable_editor");
-    shortcut_manager::set_shortcut (m_command_window_action, "main_window:command");
-    shortcut_manager::set_shortcut (m_history_action, "main_window:history");
-    shortcut_manager::set_shortcut (m_workspace_action,  "main_window:workspace");
-    shortcut_manager::set_shortcut (m_file_browser_action,
-                                    "main_window:file_browser");
-    shortcut_manager::set_shortcut (m_editor_action, "main_window:editor");
-    shortcut_manager::set_shortcut (m_documentation_action, "main_window:doc");
-    shortcut_manager::set_shortcut (m_variable_editor_action,
-                                    "main_window:variable_editor");
-    shortcut_manager::set_shortcut (m_reset_windows_action, "main_window:reset");
+    scmgr.set_shortcut (m_show_command_window_action, "main_window:show_command");
+    scmgr.set_shortcut (m_show_history_action, "main_window:show_history");
+    scmgr.set_shortcut (m_show_workspace_action, "main_window:show_workspace");
+    scmgr.set_shortcut (m_show_file_browser_action, "main_window:show_file_browser");
+    scmgr.set_shortcut (m_show_editor_action, "main_window:show_editor");
+    scmgr.set_shortcut (m_show_documentation_action, "main_window:show_doc");
+    scmgr.set_shortcut (m_show_variable_editor_action, "main_window:show_variable_editor");
+    scmgr.set_shortcut (m_command_window_action, "main_window:command");
+    scmgr.set_shortcut (m_history_action, "main_window:history");
+    scmgr.set_shortcut (m_workspace_action, "main_window:workspace");
+    scmgr.set_shortcut (m_file_browser_action, "main_window:file_browser");
+    scmgr.set_shortcut (m_editor_action, "main_window:editor");
+    scmgr.set_shortcut (m_documentation_action, "main_window:doc");
+    scmgr.set_shortcut (m_variable_editor_action, "main_window:variable_editor");
+    scmgr.set_shortcut (m_reset_windows_action, "main_window:reset");
 
     // help menu
-    shortcut_manager::set_shortcut (m_ondisk_doc_action, "main_help:ondisk_doc");
-    shortcut_manager::set_shortcut (m_online_doc_action, "main_help:online_doc");
-    shortcut_manager::set_shortcut (m_report_bug_action, "main_help:report_bug");
-    shortcut_manager::set_shortcut (m_octave_packages_action, "main_help:packages");
-    shortcut_manager::set_shortcut (m_contribute_action, "main_help:contribute");
-    shortcut_manager::set_shortcut (m_developer_action, "main_help:developer");
-    shortcut_manager::set_shortcut (m_about_octave_action, "main_help:about");
+    scmgr.set_shortcut (m_ondisk_doc_action, "main_help:ondisk_doc");
+    scmgr.set_shortcut (m_online_doc_action, "main_help:online_doc");
+    scmgr.set_shortcut (m_report_bug_action, "main_help:report_bug");
+    scmgr.set_shortcut (m_octave_packages_action, "main_help:packages");
+    scmgr.set_shortcut (m_contribute_action, "main_help:contribute");
+    scmgr.set_shortcut (m_developer_action, "main_help:developer");
+    scmgr.set_shortcut (m_about_octave_action, "main_help:about");
 
     // news menu
-    shortcut_manager::set_shortcut (m_release_notes_action,
-                                    "main_news:release_notes");
-    shortcut_manager::set_shortcut (m_current_news_action,
-                                    "main_news:community_news");
+    scmgr.set_shortcut (m_release_notes_action, "main_news:release_notes");
+    scmgr.set_shortcut (m_current_news_action, "main_news:community_news");
   }
 
   QList<octave_dock_widget *> main_window::dock_widget_list (void)
--- a/libgui/src/octave-qobject.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/octave-qobject.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -40,6 +40,7 @@
 #include "qt-application.h"
 #include "qt-interpreter-events.h"
 #include "resource-manager.h"
+#include "shortcut-manager.h"
 
 // Bug #55940 (Disable App Nap on Mac)
 #if defined (Q_OS_MAC)
@@ -157,7 +158,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_resource_manager (), m_shortcut_manager (*this),
       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)),
--- a/libgui/src/octave-qobject.h	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/octave-qobject.h	Mon Nov 04 14:03:00 2019 -0500
@@ -34,6 +34,7 @@
 
 #include "interpreter-qobject.h"
 #include "resource-manager.h"
+#include "shortcut-manager.h"
 
 namespace octave
 {
@@ -100,6 +101,11 @@
       return m_resource_manager;
     }
 
+    shortcut_manager& get_shortcut_manager (void)
+    {
+      return m_shortcut_manager;
+    }
+
     std::shared_ptr<qt_interpreter_events> get_qt_interpreter_events (void)
     {
       return m_qt_interpreter_events;
@@ -145,6 +151,8 @@
 
     resource_manager m_resource_manager;
 
+    shortcut_manager m_shortcut_manager;
+
     QTranslator *m_qt_tr;
     QTranslator *m_gui_tr;
     QTranslator *m_qsci_tr;
--- a/libgui/src/settings-dialog.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/settings-dialog.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -62,7 +62,6 @@
 #include "gui-preferences-all.h"
 #include "octave-qobject.h"
 #include "settings-dialog.h"
-#include "shortcut-manager.h"
 #include "variable-editor.h"
 #include "workspace-model.h"
 
@@ -451,10 +450,12 @@
 
     // shortcuts
 
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
     cb_prevent_readline_conflicts->setChecked (settings->value ("shortcuts/prevent_readline_conflicts", true).toBool ());
 
     // initialize the tree view with all shortcut data
-    shortcut_manager::fill_treewidget (shortcuts_treewidget);
+    scmgr.fill_treewidget (shortcuts_treewidget);
 
     // connect the buttons for import/export of the shortcut sets
     connect (btn_import_shortcut_set, SIGNAL (clicked (void)),
@@ -607,17 +608,23 @@
 
   void settings_dialog::import_shortcut_set (void)
   {
-    shortcut_manager::import_export (shortcut_manager::OSC_IMPORT);
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
+    scmgr.import_export (shortcut_manager::OSC_IMPORT);
   }
 
   void settings_dialog::export_shortcut_set (void)
   {
-    shortcut_manager::import_export (shortcut_manager::OSC_EXPORT);
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
+    scmgr.import_export (shortcut_manager::OSC_EXPORT);
   }
 
   void settings_dialog::default_shortcut_set (void)
   {
-    shortcut_manager::import_export (shortcut_manager::OSC_DEFAULT);
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+
+    scmgr.import_export (shortcut_manager::OSC_DEFAULT);
   }
 
   void settings_dialog::read_lexer_settings (QsciLexer *lexer,
@@ -1034,8 +1041,10 @@
     write_varedit_colors (settings);
 
     // shortcuts
+
     settings->setValue ("shortcuts/prevent_readline_conflicts", cb_prevent_readline_conflicts->isChecked ());
-    shortcut_manager::write_shortcuts (settings, closing);
+    shortcut_manager& scmgr = m_octave_qobj.get_shortcut_manager ();
+    scmgr.write_shortcuts (settings, closing);
 
     // settings dialog's geometry
     settings->setValue ("settings/last_tab", tabWidget->currentIndex ());
--- a/libgui/src/shortcut-manager.cc	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/shortcut-manager.cc	Mon Nov 04 14:03:00 2019 -0500
@@ -109,9 +109,8 @@
   }
 
 
-  shortcut_manager *shortcut_manager::instance = nullptr;
-
-  shortcut_manager::shortcut_manager (void)
+  shortcut_manager::shortcut_manager (base_qobject& oct_qobj)
+    : m_octave_qobj (oct_qobj)
   {
     setObjectName ("Shortcut_Manager");
 
@@ -119,108 +118,9 @@
 #if defined (Q_OS_MAC)
     QCoreApplication::setAttribute (Qt::AA_MacDontSwapCtrlAndMeta, true);
 #endif
-
-    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)
-  {
-    if (col != 2)
-      return;
-
-    int i = m_item_index_hash[item];
-    if (i == 0)
-      return;  // top-level-item clicked
-
-    shortcut_dialog (i-1); // correct to index starting at 0
   }
 
-  void shortcut_manager::shortcut_dialog_finished (int result)
-  {
-    if (result == QDialog::Rejected)
-      return;
-
-    // check for duplicate
-    int double_index = m_shortcut_hash[m_edit_actual->text ()] - 1;
-
-    if (double_index >= 0 && double_index != m_handled_index)
-      {
-        int ret = QMessageBox::warning (this, tr ("Double Shortcut"),
-                                        tr ("The chosen shortcut\n  \"%1\"\n"
-                                            "is already used for the action\n  \"%2\".\n"
-                                            "Do you want to use the shortcut anyhow removing it "
-                                            "from the previous action?")
-                                        .arg (m_edit_actual->text ())
-                                        .arg (m_sc.at (double_index).m_description),
-                                        QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
-
-        if (ret == QMessageBox::Yes)
-          {
-            shortcut_t double_shortcut = m_sc.at (double_index);
-            double_shortcut.m_actual_sc = QKeySequence ();
-            m_sc.replace (double_index, double_shortcut);
-            m_index_item_hash[double_index]->setText (2, QString ());
-          }
-        else
-          return;
-      }
-
-    shortcut_t shortcut = m_sc.at (m_handled_index);
-    if (! shortcut.m_actual_sc.isEmpty ())
-      m_shortcut_hash.remove (shortcut.m_actual_sc.toString ());
-    shortcut.m_actual_sc = m_edit_actual->text ();
-    m_sc.replace (m_handled_index, shortcut);
-
-    m_index_item_hash[m_handled_index]->setText (2, shortcut.m_actual_sc.toString ());
-
-    if (! shortcut.m_actual_sc.isEmpty ())
-      m_shortcut_hash[shortcut.m_actual_sc.toString ()] = m_handled_index + 1;
-  }
-
-  void shortcut_manager::shortcut_dialog_set_default (void)
-  {
-    m_edit_actual->setText (m_label_default->text ());
-  }
-
-  bool shortcut_manager::instance_ok (void)
-  {
-    bool retval = true;
-
-    if (! instance)
-      instance = new shortcut_manager ();
-
-    return retval;
-  }
-
-  void shortcut_manager::init (const QString& description, const QString& key,
-                               const QKeySequence& def_sc)
-  {
-    QKeySequence actual
-      = QKeySequence (m_settings->value ("shortcuts/" + key, def_sc).toString ());
-
-    // append the new shortcut to the list
-    shortcut_t shortcut_info;
-    shortcut_info.m_description = description;
-    shortcut_info.m_settings_key = key;
-    shortcut_info.m_actual_sc = actual;
-    shortcut_info.m_default_sc = def_sc;
-    m_sc << shortcut_info;
-
-    // insert shortcut in order check for duplicates later
-    if (! actual.isEmpty ())
-      m_shortcut_hash[actual.toString ()] = m_sc.count ();
-    m_action_hash[key] = m_sc.count ();
-
-    // check whether ctrl+d is used from main window, i.e. is a global shortcut
-    if (key.startsWith ("main_")
-        && actual == QKeySequence (Qt::ControlModifier+Qt::Key_D))
-      m_settings->setValue ("shortcuts/main_ctrld",true);
-  }
-
-  void shortcut_manager::do_init_data (void)
+  void shortcut_manager::init_data (void)
   {
     Qt::KeyboardModifier ctrl;
     int prefix;
@@ -241,7 +141,10 @@
 
     // actions of the main window
 
-    m_settings->setValue ("shortcuts/main_ctrld",false); // reset use fo ctrl-d
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    gui_settings *settings = rmgr.get_settings ();
+
+    settings->setValue ("shortcuts/main_ctrld",false); // reset use fo ctrl-d
 
     // file
     init (tr ("New File"), "main_file:new_file", QKeySequence::New);
@@ -494,7 +397,7 @@
   }
 
   // write one or all actual shortcut set(s) into a settings file
-  void shortcut_manager::do_write_shortcuts (gui_settings *settings,
+  void shortcut_manager::write_shortcuts (gui_settings *settings,
                                              bool closing)
   {
     bool sc_ctrld = false;
@@ -520,33 +423,39 @@
     settings->sync ();      // sync the settings file
   }
 
-  void shortcut_manager::do_set_shortcut (QAction *action, const QString& key)
+  void shortcut_manager::set_shortcut (QAction *action, const QString& key)
   {
     int index;
 
     index = m_action_hash[key] - 1;
 
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    gui_settings *settings = rmgr.get_settings ();
+
     if (index > -1 && index < m_sc.count ())
       action->setShortcut
-        (QKeySequence (m_settings->value ("shortcuts/" + key, m_sc.at (index).m_default_sc).toString ()));
+        (QKeySequence (settings->value ("shortcuts/" + key, m_sc.at (index).m_default_sc).toString ()));
     else
       qDebug () << "Key: " << key << " not found in m_action_hash";
   }
 
-  void shortcut_manager::do_shortcut (QShortcut *sc, const QString& key)
+  void shortcut_manager::shortcut (QShortcut *sc, const QString& key)
   {
     int index;
 
     index = m_action_hash[key] - 1;
 
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    gui_settings *settings = rmgr.get_settings ();
+
     if (index > -1 && index < m_sc.count ())
-      sc->setKey (QKeySequence (m_settings->value ("shortcuts/" + key,
+      sc->setKey (QKeySequence (settings->value ("shortcuts/" + key,
                                 m_sc.at (index).m_default_sc).toString ()));
     else
       qDebug () << "Key: " << key << " not found in m_action_hash";
   }
 
-  void shortcut_manager::do_fill_treewidget (QTreeWidget *tree_view)
+  void shortcut_manager::fill_treewidget (QTreeWidget *tree_view)
   {
     m_dialog = nullptr;
     m_level_hash.clear ();
@@ -667,14 +576,13 @@
         m_item_index_hash[tree_item] = i + 1; // index+1 to avoid 0
         m_index_item_hash[i] = tree_item;
       }
-
   }
 
   // import or export of shortcut sets,
   // called from settings dialog when related buttons are clicked;
   // returns true on success, false otherwise
   bool
-  shortcut_manager::do_import_export (int action)
+  shortcut_manager::import_export (int action)
   {
     // ask to save the current shortcuts, maybe abort import
     if (action == OSC_DEFAULT || action == OSC_IMPORT)
@@ -691,7 +599,9 @@
 
         // FIXME: Remove, if for all common KDE versions (bug #54607) is resolved.
         int opts = 0;  // No options by default.
-        if (! m_settings->value ("use_native_file_dialogs",
+        resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+        gui_settings *settings = rmgr.get_settings ();
+        if (! settings->value ("use_native_file_dialogs",
                                                         true).toBool ())
           opts = QFileDialog::DontUseNativeDialog;
 
@@ -722,7 +632,7 @@
             if (action == OSC_IMPORT)
               import_shortcuts (&osc_settings);   // import (special action)
             else if (action == OSC_EXPORT)
-              do_write_shortcuts (&osc_settings, false); // export, (save settings)
+              write_shortcuts (&osc_settings, false); // export, (save settings)
           }
       }
     else
@@ -733,6 +643,93 @@
     return true;
   }
 
+  void shortcut_manager::handle_double_clicked (QTreeWidgetItem *item, int col)
+  {
+    if (col != 2)
+      return;
+
+    int i = m_item_index_hash[item];
+    if (i == 0)
+      return;  // top-level-item clicked
+
+    shortcut_dialog (i-1); // correct to index starting at 0
+  }
+
+  void shortcut_manager::shortcut_dialog_finished (int result)
+  {
+    if (result == QDialog::Rejected)
+      return;
+
+    // check for duplicate
+    int double_index = m_shortcut_hash[m_edit_actual->text ()] - 1;
+
+    if (double_index >= 0 && double_index != m_handled_index)
+      {
+        int ret = QMessageBox::warning (this, tr ("Double Shortcut"),
+                                        tr ("The chosen shortcut\n  \"%1\"\n"
+                                            "is already used for the action\n  \"%2\".\n"
+                                            "Do you want to use the shortcut anyhow removing it "
+                                            "from the previous action?")
+                                        .arg (m_edit_actual->text ())
+                                        .arg (m_sc.at (double_index).m_description),
+                                        QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
+
+        if (ret == QMessageBox::Yes)
+          {
+            shortcut_t double_shortcut = m_sc.at (double_index);
+            double_shortcut.m_actual_sc = QKeySequence ();
+            m_sc.replace (double_index, double_shortcut);
+            m_index_item_hash[double_index]->setText (2, QString ());
+          }
+        else
+          return;
+      }
+
+    shortcut_t shortcut = m_sc.at (m_handled_index);
+    if (! shortcut.m_actual_sc.isEmpty ())
+      m_shortcut_hash.remove (shortcut.m_actual_sc.toString ());
+    shortcut.m_actual_sc = m_edit_actual->text ();
+    m_sc.replace (m_handled_index, shortcut);
+
+    m_index_item_hash[m_handled_index]->setText (2, shortcut.m_actual_sc.toString ());
+
+    if (! shortcut.m_actual_sc.isEmpty ())
+      m_shortcut_hash[shortcut.m_actual_sc.toString ()] = m_handled_index + 1;
+  }
+
+  void shortcut_manager::shortcut_dialog_set_default (void)
+  {
+    m_edit_actual->setText (m_label_default->text ());
+  }
+
+  void shortcut_manager::init (const QString& description, const QString& key,
+                               const QKeySequence& def_sc)
+  {
+    resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+    gui_settings *settings = rmgr.get_settings ();
+
+    QKeySequence actual
+      = QKeySequence (settings->value ("shortcuts/" + key, def_sc).toString ());
+
+    // append the new shortcut to the list
+    shortcut_t shortcut_info;
+    shortcut_info.m_description = description;
+    shortcut_info.m_settings_key = key;
+    shortcut_info.m_actual_sc = actual;
+    shortcut_info.m_default_sc = def_sc;
+    m_sc << shortcut_info;
+
+    // insert shortcut in order check for duplicates later
+    if (! actual.isEmpty ())
+      m_shortcut_hash[actual.toString ()] = m_sc.count ();
+    m_action_hash[key] = m_sc.count ();
+
+    // check whether ctrl+d is used from main window, i.e. is a global shortcut
+    if (key.startsWith ("main_")
+        && actual == QKeySequence (Qt::ControlModifier+Qt::Key_D))
+      settings->setValue ("shortcuts/main_ctrld",true);
+  }
+
   void shortcut_manager::shortcut_dialog (int index)
   {
     if (! m_dialog)
@@ -868,7 +865,7 @@
 
     if (ret == QMessageBox::Save)
       {
-        if (do_import_export (OSC_EXPORT))
+        if (import_export (OSC_EXPORT))
           return true;  // go ahead
       }
 
--- a/libgui/src/shortcut-manager.h	Mon Nov 04 13:34:44 2019 -0500
+++ b/libgui/src/shortcut-manager.h	Mon Nov 04 14:03:00 2019 -0500
@@ -58,6 +58,8 @@
 
   };
 
+  class base_qobject;
+
   class shortcut_manager : public QWidget
   {
     Q_OBJECT
@@ -71,7 +73,7 @@
       OSC_DEFAULT = 2
     };
 
-    shortcut_manager (void);
+    shortcut_manager (base_qobject& oct_qobj);
 
     // No copying!
 
@@ -81,47 +83,17 @@
 
     ~shortcut_manager (void) = default;
 
-    static void init_data (void)
-    {
-      if (instance_ok ())
-        instance->do_init_data ();
-    }
+    void init_data (void);
 
-    static void write_shortcuts (gui_settings *settings, bool closing)
-    {
-      if (instance_ok ())
-        instance->do_write_shortcuts (settings, closing);
-    }
+    void write_shortcuts (gui_settings *settings, bool closing);
 
-    static void set_shortcut (QAction *action, const QString& key)
-    {
-      if (instance_ok ())
-        instance->do_set_shortcut (action, key);
-    }
+    void set_shortcut (QAction *action, const QString& key);
 
-    static void shortcut (QShortcut *sc, const QString& key)
-    {
-      if (instance_ok () && sc)
-        instance->do_shortcut (sc, key);
-    }
-
-    static void fill_treewidget (QTreeWidget *tree_view)
-    {
-      if (instance_ok ())
-        instance->do_fill_treewidget (tree_view);
-    }
+    void shortcut (QShortcut *sc, const QString& key);
 
-    static void import_export (int action)
-    {
-      if (instance_ok ())
-        instance->do_import_export (action);
-    }
+    void fill_treewidget (QTreeWidget *tree_view);
 
-    static shortcut_manager *instance;
-
-  public slots:
-
-    static void cleanup_instance (void) { delete instance; instance = nullptr; }
+    bool import_export (int action);
 
   protected slots:
 
@@ -131,15 +103,7 @@
 
   private:
 
-    static bool instance_ok (void);
-
     void init (const QString&, const QString&, const QKeySequence&);
-    void do_init_data ();
-    void do_write_shortcuts (gui_settings *settings, bool closing);
-    void do_set_shortcut (QAction *action, const QString& key);
-    void do_shortcut (QShortcut *sc, const QString& key);
-    void do_fill_treewidget (QTreeWidget *tree_view);
-    bool do_import_export (int action);
     void shortcut_dialog (int);
     void import_shortcuts (gui_settings *settings);
     bool overwrite_all_shortcuts (void);
@@ -188,6 +152,8 @@
       QKeySequence m_default_sc;
     };
 
+    base_qobject& m_octave_qobj;
+
     QList<shortcut_t> m_sc;
     QHash<QString, int> m_shortcut_hash;
     QHash<QString, int> m_action_hash;
@@ -199,8 +165,6 @@
     enter_shortcut *m_edit_actual;
     QLabel *m_label_default;
     int m_handled_index;
-
-    gui_settings *m_settings;
   };
 }