# HG changeset patch # User John W. Eaton # Date 1561747364 14400 # Node ID a044202208af2c10e9cf900276edc81b4d3b8cb3 # Parent de0762d72d529b4010ab5139a8b6eb974636115e more refactoring of GUI classes that manage the interpreter * interpreter-qobject.h, interpreter-qobject.cc (interpreter_qobject::m_app_context): Delete. (interpreter_qobject::m_octave_qobject, interpreter_qobject::m_qt_link): New data members. (interpreter_qobject::interpreter_qobject): Accept reference to base_qobject as argument instead of qt_application object. Make octave_qt_link connections here. (interpreter_qobject::confirm_shutdown, interpreter_qobject::qt_link): New functions. * main-window.h, main-window.cc (main_window::m_octave_qapp, main_window::m_octave_qt_link): Delete data members. (main_window::m_octave_qobj): New data membeer. (main_window::main_window): Don't pass pointer to octave_qt_link as separate argument. In other member functions, get QApplication and octave_qt_link objects from m_octave_qobj as needed. * octave-qobject.h, octave-qobject.cc (base_qobject::m_octave_qt_link): Delete. (base_qobject::base_qobject): Don't make connections to octave_qt_lnk signals here. (base_qobject::confirm_shutdown_octave_internal): Delete. (base_qobject::confirm_shutdown_octave): Call interpreter_qobject::confirm_shutdown instead of confirm_shutdown_octave_internal. (gui_qobject::confirm_shutdown_octave): Likewise. diff -r de0762d72d52 -r a044202208af libgui/src/interpreter-qobject.cc --- a/libgui/src/interpreter-qobject.cc Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/interpreter-qobject.cc Fri Jun 28 14:42:44 2019 -0400 @@ -26,6 +26,8 @@ #endif #include "interpreter-qobject.h" +#include "octave-qobject.h" +#include "octave-qt-link.h" #include "qt-application.h" #include "input.h" @@ -33,15 +35,28 @@ namespace octave { - interpreter_qobject::interpreter_qobject (qt_application& app_context) - : QObject (), m_app_context (app_context) - { } + interpreter_qobject::interpreter_qobject (base_qobject *oct_qobj) + : QObject (), m_octave_qobject (oct_qobj), + m_qt_link (new octave_qt_link ()) + { + octave_link::connect_link (m_qt_link); + + connect (m_qt_link, SIGNAL (confirm_shutdown_signal (void)), + m_octave_qobject, SLOT (confirm_shutdown_octave (void))); + + connect (m_qt_link, + SIGNAL (copy_image_to_clipboard_signal (const QString&, bool)), + m_octave_qobject, + SLOT (copy_image_to_clipboard (const QString&, bool))); + } void interpreter_qobject::execute (void) { - // The application context owns the interpreter. + // The Octave application context owns the interpreter. - interpreter& interp = m_app_context.create_interpreter (); + qt_application& app_context = m_octave_qobject->app_context (); + + interpreter& interp = app_context.create_interpreter (); int exit_status = 0; @@ -51,7 +66,7 @@ interp.initialize (); - if (m_app_context.start_gui_p ()) + if (app_context.start_gui_p ()) { input_system& input_sys = interp.get_input_system (); @@ -79,8 +94,21 @@ // Whether or not initialization succeeds we need to clean up the // interpreter once we are done with it. - m_app_context.delete_interpreter (); + app_context.delete_interpreter (); emit octave_finished_signal (exit_status); } + + void interpreter_qobject::confirm_shutdown (bool closenow) + { + // Wait for link thread to go to sleep state. + m_qt_link->lock (); + + m_qt_link->shutdown_confirmation (closenow); + + m_qt_link->unlock (); + + // Awake the worker thread so that it continues shutting down (or not). + m_qt_link->wake_all (); + } } diff -r de0762d72d52 -r a044202208af libgui/src/interpreter-qobject.h --- a/libgui/src/interpreter-qobject.h Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/interpreter-qobject.h Fri Jun 28 14:42:44 2019 -0400 @@ -28,7 +28,8 @@ namespace octave { - class qt_application; + class base_qobject; + class octave_qt_link; class interpreter_qobject : public QObject { @@ -36,10 +37,14 @@ public: - interpreter_qobject (qt_application& app_context); + interpreter_qobject (base_qobject *oct_qobj); ~interpreter_qobject (void) = default; + octave_qt_link * qt_link (void) { return m_qt_link; } + + void confirm_shutdown (bool closenow); + signals: void octave_ready_signal (void); @@ -53,7 +58,9 @@ private: - qt_application& m_app_context; + base_qobject *m_octave_qobject; + + octave_qt_link *m_qt_link; }; } diff -r de0762d72d52 -r a044202208af libgui/src/main-window.cc --- a/libgui/src/main-window.cc Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/main-window.cc Fri Jun 28 14:42:44 2019 -0400 @@ -96,11 +96,8 @@ #endif } - main_window::main_window (base_qobject& qobj, - octave_qt_link *lnk) - : QMainWindow (), - m_octave_qapp (qobj.octave_qapp ()), m_octave_qt_link (lnk), - m_workspace_model (nullptr), + main_window::main_window (base_qobject& qobj) + : QMainWindow (), m_octave_qobj (qobj), 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), @@ -166,7 +163,9 @@ QGuiApplication::setDesktopFileName ("org.octave.Octave.desktop"); #endif - m_default_style = m_octave_qapp->style ()->objectName (); + QApplication *qapp = m_octave_qobj.qapplication (); + + m_default_style = qapp->style ()->objectName (); QSettings *settings = resource_manager::get_settings (); @@ -432,8 +431,12 @@ void main_window::file_remove_proxy (const QString& o, const QString& n) { + interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj (); + + octave_qt_link *qt_link = interp_qobj->qt_link (); + // Wait for worker to suspend - m_octave_qt_link->lock (); + qt_link->lock (); // Close the file if opened #if defined (HAVE_QSCINTILLA) @@ -444,8 +447,8 @@ #endif // We are done: Unlock and wake the worker thread - m_octave_qt_link->unlock (); - m_octave_qt_link->wake_all (); + qt_link->unlock (); + qt_link->wake_all (); } void main_window::open_online_documentation_page (void) @@ -675,7 +678,11 @@ QStyle *new_style = QStyleFactory::create (preferred_style); if (new_style) - m_octave_qapp->setStyle (new_style); + { + QApplication *qapp = m_octave_qobj.qapplication (); + + qapp->setStyle (new_style); + } // the widget's icons (when floating) QString icon_set @@ -1653,13 +1660,17 @@ connect (m_workspace_model, SIGNAL (model_changed (void)), m_workspace_window, SLOT (handle_model_changed (void))); - connect (m_octave_qt_link, + interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj (); + + octave_qt_link *qt_link = interp_qobj->qt_link (); + + connect (qt_link, SIGNAL (edit_variable_signal (const QString&, const octave_value&)), this, SLOT (edit_variable (const QString&, const octave_value&))); - connect (m_octave_qt_link, SIGNAL (refresh_variable_editor_signal (void)), + connect (qt_link, SIGNAL (refresh_variable_editor_signal (void)), this, SLOT (refresh_variable_editor (void))); connect (m_workspace_model, @@ -1814,12 +1825,12 @@ m_editor_window, SLOT (handle_file_renamed (bool))); // Signals for removing/renaming files/dirs in the temrinal window - connect (m_octave_qt_link, SIGNAL (file_renamed_signal (bool)), + connect (qt_link, SIGNAL (file_renamed_signal (bool)), m_editor_window, SLOT (handle_file_renamed (bool))); #endif // Signals for removing/renaming files/dirs in the temrinal window - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (file_remove_signal (const QString&, const QString&)), this, SLOT (file_remove_proxy (const QString&, const QString&))); @@ -1831,88 +1842,92 @@ void main_window::construct_octave_qt_link (void) { - connect (m_octave_qt_link, + interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj (); + + octave_qt_link *qt_link = interp_qobj->qt_link (); + + connect (qt_link, SIGNAL (set_workspace_signal (bool, bool, const symbol_info_list&)), m_workspace_model, SLOT (set_workspace (bool, bool, const symbol_info_list&))); - connect (m_octave_qt_link, SIGNAL (clear_workspace_signal (void)), + connect (qt_link, SIGNAL (clear_workspace_signal (void)), m_workspace_model, SLOT (clear_workspace (void))); - connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)), + connect (qt_link, SIGNAL (change_directory_signal (QString)), this, SLOT (change_directory (QString))); - connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)), + connect (qt_link, SIGNAL (change_directory_signal (QString)), m_file_browser_window, SLOT (update_octave_directory (QString))); - connect (m_octave_qt_link, SIGNAL (change_directory_signal (QString)), + connect (qt_link, SIGNAL (change_directory_signal (QString)), m_editor_window, SLOT (update_octave_directory (QString))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (execute_command_in_terminal_signal (QString)), this, SLOT (execute_command_in_terminal (QString))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (set_history_signal (const QStringList&)), m_history_window, SLOT (set_history (const QStringList&))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (append_history_signal (const QString&)), m_history_window, SLOT (append_history (const QString&))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (clear_history_signal (void)), m_history_window, SLOT (clear_history (void))); - connect (m_octave_qt_link, SIGNAL (enter_debugger_signal (void)), + connect (qt_link, SIGNAL (enter_debugger_signal (void)), this, SLOT (handle_enter_debugger (void))); - connect (m_octave_qt_link, SIGNAL (exit_debugger_signal (void)), + connect (qt_link, SIGNAL (exit_debugger_signal (void)), this, SLOT (handle_exit_debugger (void))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (show_preferences_signal (void)), this, SLOT (process_settings_dialog_request (void))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (gui_preference_signal (const QString&, const QString&, QString*)), this, SLOT (gui_preference (const QString&, const QString&, QString*))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (edit_file_signal (const QString&)), m_active_editor, SLOT (handle_edit_file_request (const QString&))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (insert_debugger_pointer_signal (const QString&, int)), this, SLOT (handle_insert_debugger_pointer_request (const QString&, int))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (delete_debugger_pointer_signal (const QString&, int)), this, SLOT (handle_delete_debugger_pointer_request (const QString&, int))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (update_breakpoint_marker_signal (bool, const QString&, int, const QString&)), this, SLOT (handle_update_breakpoint_marker_request (bool, const QString&, int, const QString&))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (show_doc_signal (const QString &)), this, SLOT (handle_show_doc (const QString &))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (register_doc_signal (const QString &)), this, SLOT (handle_register_doc (const QString &))); - connect (m_octave_qt_link, + connect (qt_link, SIGNAL (unregister_doc_signal (const QString &)), this, SLOT (handle_unregister_doc (const QString &))); } @@ -2428,8 +2443,12 @@ QSettings *settings = resource_manager::get_settings (); *read_value = settings->value (key).toString (); + interpreter_qobject *interp_qobj = m_octave_qobj.interpreter_qobj (); + + octave_qt_link *qt_link = interp_qobj->qt_link (); + // Wait for worker to suspend - m_octave_qt_link->lock (); + qt_link->lock (); // Some preferences need extra handling QString adjusted_value = gui_preference_adjust (key, value); @@ -2442,8 +2461,8 @@ } // We are done: Unlock and wake the worker thread - m_octave_qt_link->unlock (); - m_octave_qt_link->wake_all (); + qt_link->unlock (); + qt_link->wake_all (); } void main_window::rename_variable_callback (const main_window::name_pair& names) diff -r de0762d72d52 -r a044202208af libgui/src/main-window.h --- a/libgui/src/main-window.h Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/main-window.h Fri Jun 28 14:42:44 2019 -0400 @@ -77,7 +77,7 @@ typedef std::pair name_pair; typedef std::pair int_pair; - main_window (base_qobject& qapp, octave_qt_link *lnk); + main_window (base_qobject& qapp); ~main_window (void); @@ -306,9 +306,7 @@ QList dock_widget_list (void); - QApplication *m_octave_qapp; - - octave_qt_link *m_octave_qt_link; + base_qobject& m_octave_qobj; workspace_model *m_workspace_model; diff -r de0762d72d52 -r a044202208af libgui/src/octave-qobject.cc --- a/libgui/src/octave-qobject.cc Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/octave-qobject.cc Fri Jun 28 14:42:44 2019 -0400 @@ -87,11 +87,10 @@ : QObject (), m_app_context (app_context), m_argc (m_app_context.sys_argc ()), m_argv (m_app_context.sys_argv ()), - m_octave_qapp (new octave_qapplication (m_argc, m_argv)), + m_qapplication (new octave_qapplication (m_argc, m_argv)), m_qt_tr (new QTranslator ()), m_gui_tr (new QTranslator ()), m_qsci_tr (new QTranslator ()), m_translators_installed (false), - m_octave_qt_link (new octave_qt_link ()), - m_interpreter_qobject (new interpreter_qobject (m_app_context)), + m_interpreter_qobj (new interpreter_qobject (this)), m_main_thread (new QThread ()) { std::string show_gui_msgs = @@ -127,23 +126,14 @@ qRegisterMetaType ("octave_value_list"); // Force left-to-right alignment (see bug #46204) - m_octave_qapp->setLayoutDirection (Qt::LeftToRight); - - octave_link::connect_link (m_octave_qt_link); - - connect (m_octave_qt_link, SIGNAL (confirm_shutdown_signal (void)), - this, SLOT (confirm_shutdown_octave (void))); - - connect (m_octave_qt_link, - SIGNAL (copy_image_to_clipboard_signal (const QString&, bool)), - this, SLOT (copy_image_to_clipboard (const QString&, bool))); + m_qapplication->setLayoutDirection (Qt::LeftToRight); connect_uiwidget_links (); - connect (m_interpreter_qobject, SIGNAL (octave_finished_signal (int)), + connect (m_interpreter_qobj, SIGNAL (octave_finished_signal (int)), this, SLOT (handle_octave_finished (int))); - connect (m_interpreter_qobject, SIGNAL (octave_finished_signal (int)), + connect (m_interpreter_qobj, SIGNAL (octave_finished_signal (int)), m_main_thread, SLOT (quit (void))); connect (m_main_thread, SIGNAL (finished (void)), @@ -152,8 +142,8 @@ base_qobject::~base_qobject (void) { - delete m_interpreter_qobject; - delete m_octave_qapp; + delete m_interpreter_qobj; + delete m_qapplication; string_vector::delete_c_str_vec (m_argv); } @@ -165,9 +155,9 @@ resource_manager::config_translators (m_qt_tr, m_qsci_tr, m_gui_tr); - m_octave_qapp->installTranslator (m_qt_tr); - m_octave_qapp->installTranslator (m_gui_tr); - m_octave_qapp->installTranslator (m_qsci_tr); + m_qapplication->installTranslator (m_qt_tr); + m_qapplication->installTranslator (m_gui_tr); + m_qapplication->installTranslator (m_qsci_tr); m_translators_installed = true; } @@ -176,16 +166,16 @@ { // Defer initializing and executing the interpreter until after the main // window and QApplication are running to prevent race conditions - QTimer::singleShot (0, m_interpreter_qobject, SLOT (execute (void))); + QTimer::singleShot (0, m_interpreter_qobj, SLOT (execute (void))); - m_interpreter_qobject->moveToThread (m_main_thread); + m_interpreter_qobj->moveToThread (m_main_thread); m_main_thread->start (); } int base_qobject::exec (void) { - return m_octave_qapp->exec (); + return m_qapplication->exec (); } void base_qobject::handle_octave_finished (int exit_status) @@ -195,7 +185,7 @@ void base_qobject::confirm_shutdown_octave (void) { - confirm_shutdown_octave_internal (true); + m_interpreter_qobj->confirm_shutdown (true); } void base_qobject::copy_image_to_clipboard (const QString& file, @@ -332,19 +322,6 @@ const QString&))); } - void base_qobject::confirm_shutdown_octave_internal (bool closenow) - { - // Wait for link thread to go to sleep state. - m_octave_qt_link->lock (); - - m_octave_qt_link->shutdown_confirmation (closenow); - - m_octave_qt_link->unlock (); - - // Awake the worker thread so that it continues shutting down (or not). - m_octave_qt_link->wake_all (); - } - cli_qobject::cli_qobject (qt_application& app_context) : base_qobject (app_context) { @@ -354,16 +331,15 @@ // After settings. config_translators (); - m_octave_qapp->setQuitOnLastWindowClosed (false); + m_qapplication->setQuitOnLastWindowClosed (false); start_main_thread (); } gui_qobject::gui_qobject (qt_application& app_context) - : base_qobject (app_context), - m_main_window (new main_window (*this, m_octave_qt_link)) + : base_qobject (app_context), m_main_window (new main_window (*this)) { - connect (m_interpreter_qobject, SIGNAL (octave_ready_signal (void)), + connect (m_interpreter_qobj, SIGNAL (octave_ready_signal (void)), m_main_window, SLOT (handle_octave_ready (void))); m_app_context.gui_running (true); @@ -383,6 +359,6 @@ if (m_main_window) closenow = m_main_window->confirm_shutdown_octave (); - confirm_shutdown_octave_internal (closenow); + m_interpreter_qobj->confirm_shutdown (closenow); } } diff -r de0762d72d52 -r a044202208af libgui/src/octave-qobject.h --- a/libgui/src/octave-qobject.h Thu Jun 27 13:27:22 2019 -0400 +++ b/libgui/src/octave-qobject.h Fri Jun 28 14:42:44 2019 -0400 @@ -40,7 +40,6 @@ { class interpreter_qobject; class main_window; - class octave_qt_link; class qt_application; //! This class is a simple wrapper around QApplication so that we can @@ -84,7 +83,18 @@ int exec (void); - QApplication *octave_qapp (void) { return m_octave_qapp; }; + // The Octave application context. + qt_application& app_context (void) { return m_app_context; } + + // The Qt QApplication. + QApplication * qapplication (void) { return m_qapplication; }; + + interpreter_qobject * interpreter_qobj (void) + { + return m_interpreter_qobj; + } + + QThread *main_thread (void) { return m_main_thread; } public slots: @@ -127,7 +137,7 @@ int m_argc; char **m_argv; - QApplication *m_octave_qapp; + QApplication *m_qapplication; QTranslator *m_qt_tr; QTranslator *m_gui_tr; @@ -135,15 +145,11 @@ bool m_translators_installed; - octave_qt_link *m_octave_qt_link; - - interpreter_qobject *m_interpreter_qobject; + interpreter_qobject *m_interpreter_qobj; QThread *m_main_thread; void connect_uiwidget_links (void); - - void confirm_shutdown_octave_internal (bool closenow); }; //! This object provides a command-line interface to Octave that may