# HG changeset patch # User John W. Eaton # Date 1624127647 14400 # Node ID b4d2fa28d1d42390467e4640cce40d00fe47034c # Parent 63c515ff762f114e4aa3ff9506c70a84894ab238 allow terminal window to be opened from command line * command-widget.h, command-widget.cc (command_widget::update_prompt): New slot. (command_widget::insert_interpreter_output): Now public. (command_widget::command_widget): Don't connect to signals from parent object here. * octave-qobject.h, octave-qobject.cc (base_qobject::m_terminal_widget): New data member. (base_qobject::terminal_widget): New function. Make (command_widget, QTerminal)/base_qobject signal/slot connections here instead of in main_window constructor. (base_qobject::show_terminal_window): New slot. (base_qobject::base_qobject): Connect qt_interpreter_events::show_terminal_window_signal to base_qobject::show_terminal_window slot. (base_qobject::~base_qobject): Close and delete terminal widget. * main-window.h, main-window.cc (main_window::main_window): Acquire m_command_window from base_qobject instead of constructing here. * terminal-dock-widget.cc (terminal_dock_widget::terminal_dock_widget): Make dock widget/terminal widget signal/slot connections here instead of in main window constructor. Call make_window if parent object is nullptr. * event-manager.h, event-manager.cc (F__event_manager_show_terminal_window__): New function. (interpreter_events::show_terminal_window): New virtual function. (event_manager::show_terminal_window): New function. * qt-interpreter-events.h, qt-interpreter-events.cc (qt_interpreter_events::show_terminal_window): New signal (qt_interpreter_events::show_terminal_window): New function. diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/command-widget.cc --- a/libgui/src/command-widget.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/command-widget.cc Sat Jun 19 14:34:07 2021 -0400 @@ -94,12 +94,11 @@ connect (stop_button, &QPushButton::clicked, this, &command_widget::interpreter_stop); + } - connect (p, SIGNAL (update_prompt_signal (const QString&)), - m_prompt, SLOT (setText (const QSTring&))); - - connect (p, SIGNAL (interpreter_output_signal (const QString&)), - this, SLOT (insert_interpreter_output (const QString&))); + void command_widget::update_prompt (const QString& prompt) + { + m_prompt->setText (prompt); } void command_widget::insert_interpreter_output (const QString& msg) diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/command-widget.h --- a/libgui/src/command-widget.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/command-widget.h Sat Jun 19 14:34:07 2021 -0400 @@ -61,14 +61,16 @@ public slots: + void update_prompt (const QString& prompt); + + void insert_interpreter_output (const QString& msg); + void notice_settings (const gui_settings *settings); protected slots: void accept_input_line (void); - void insert_interpreter_output (const QString& msg); - private: bool m_incomplete_parse; diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/main-window.cc --- a/libgui/src/main-window.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/main-window.cc Sat Jun 19 14:34:07 2021 -0400 @@ -54,6 +54,9 @@ #include #include +// QTerminal includes +#include "QTerminal.h" + #if defined (HAVE_QSCINTILLA) # include "file-editor.h" #endif @@ -164,47 +167,17 @@ m_status_bar->addPermanentWidget (text); m_status_bar->addPermanentWidget (m_profiler_status_indicator); - m_command_window = new terminal_dock_widget (this, m_octave_qobj); + m_command_window = m_octave_qobj.terminal_widget (this); make_dock_widget_connections (m_command_window); connect (this, &main_window::settings_changed, m_command_window, &terminal_dock_widget::notice_settings); - if (m_octave_qobj.experimental_terminal_widget ()) - { - command_widget *cmd_widget = m_command_window->get_command_widget (); - - connect (m_command_window, &terminal_dock_widget::settings_changed, - cmd_widget, &command_widget::notice_settings); - - connect (cmd_widget, &command_widget::interpreter_pause, - &m_octave_qobj, &base_qobject::interpreter_pause); - - connect (cmd_widget, &command_widget::interpreter_resume, - &m_octave_qobj, &base_qobject::interpreter_resume); - - connect (cmd_widget, &command_widget::interpreter_stop, - &m_octave_qobj, &base_qobject::interpreter_stop); - - m_octave_qobj.connect_interpreter_events (cmd_widget); - } - else + if (! m_octave_qobj.experimental_terminal_widget ()) { QTerminal *cmd_widget = m_command_window->get_qterminal (); - connect (m_command_window, &terminal_dock_widget::settings_changed, - cmd_widget, &QTerminal::notice_settings); - - // Connect the interrupt signal (emitted by Ctrl-C) - connect (cmd_widget, &QTerminal::interrupt_signal, - &m_octave_qobj, &base_qobject::interpreter_interrupt); - - // Connect the visibility signal to the terminal for - // dis-/enabling timers. - connect (m_command_window, &terminal_dock_widget::visibilityChanged, - cmd_widget, &QTerminal::handle_visibility_changed); - // The following connections were previously made in // QTerminal::construct, QWinTerminalImpl::QWinTerminalImpl, and // QUnixTerminalImpl::QUnixTerminalImpl. Similar actions should diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/main-window.h --- a/libgui/src/main-window.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/main-window.h Sat Jun 19 14:34:07 2021 -0400 @@ -43,9 +43,6 @@ #include "external-editor-interface.h" #include "file-editor-interface.h" -// QTerminal includes -#include "QTerminal.h" - // Own includes #include "dialog.h" #include "documentation-dock-widget.h" @@ -312,7 +309,6 @@ //! Dock widgets. //!@{ QPointer m_command_window; - QPointer m_history_window; QPointer m_file_browser_window; QPointer m_doc_browser_window; diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/octave-qobject.cc --- a/libgui/src/octave-qobject.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/octave-qobject.cc Sat Jun 19 14:34:07 2021 -0400 @@ -37,6 +37,10 @@ #include #include +// QTerminal includes +#include "QTerminal.h" + +#include "command-widget.h" #include "documentation-dock-widget.h" #include "files-dock-widget.h" #include "history-dock-widget.h" @@ -47,6 +51,7 @@ #include "qt-interpreter-events.h" #include "resource-manager.h" #include "shortcut-manager.h" +#include "terminal-dock-widget.h" #include "variable-editor.h" #include "workspace-model.h" #include "workspace-view.h" @@ -240,8 +245,13 @@ this, QOverload::of (&base_qobject::interpreter_event)); if (m_app_context.experimental_terminal_widget ()) - connect (qt_link (), &qt_interpreter_events::start_gui_signal, - this, &base_qobject::start_gui); + { + connect (qt_link (), &qt_interpreter_events::start_gui_signal, + this, &base_qobject::start_gui); + + connect (qt_link (), &qt_interpreter_events::show_terminal_window_signal, + this, &base_qobject::show_terminal_window); + } connect (qt_link (), &qt_interpreter_events::copy_image_to_clipboard_signal, this, &base_qobject::copy_image_to_clipboard); @@ -322,6 +332,9 @@ if (! m_main_window) { + if (m_terminal_widget) + m_terminal_widget->close (); + if (m_documentation_widget) m_documentation_widget->close (); @@ -345,6 +358,7 @@ delete m_main_window; } + delete m_terminal_widget; delete m_documentation_widget; delete m_file_browser_widget; delete m_history_widget; @@ -420,6 +434,47 @@ return m_app_context.gui_running (); } + QPointer + base_qobject::terminal_widget (main_window *mw) + { + if (m_terminal_widget && mw) + { + m_terminal_widget->set_main_window (mw); + m_terminal_widget->set_adopted (true); + } + else if (! m_terminal_widget) + { + m_terminal_widget + = QPointer (new terminal_dock_widget (mw, *this)); + if (experimental_terminal_widget ()) + { + command_widget *cmd_widget + = m_terminal_widget->get_command_widget (); + + connect (cmd_widget, &command_widget::interpreter_pause, + this, &base_qobject::interpreter_pause); + + connect (cmd_widget, &command_widget::interpreter_resume, + this, &base_qobject::interpreter_resume); + + connect (cmd_widget, &command_widget::interpreter_stop, + this, &base_qobject::interpreter_stop); + + connect_interpreter_events (cmd_widget); + } + else + { + QTerminal *cmd_widget = m_terminal_widget->get_qterminal (); + + // Connect the interrupt signal (emitted by Ctrl-C) + connect (cmd_widget, &QTerminal::interrupt_signal, + this, &base_qobject::interpreter_interrupt); + } + } + + return m_terminal_widget; + } + QPointer base_qobject::documentation_widget (main_window *mw) { @@ -690,6 +745,19 @@ } } + void base_qobject::show_terminal_window (void) + { + terminal_dock_widget *widget + = (m_terminal_widget + ? m_terminal_widget : terminal_widget ()); + + if (! widget->isVisible ()) + { + widget->show (); + widget->raise (); + } + } + void base_qobject::show_documentation_window (const QString& file) { documentation_dock_widget *widget diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/octave-qobject.h --- a/libgui/src/octave-qobject.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/octave-qobject.h Sat Jun 19 14:34:07 2021 -0400 @@ -83,6 +83,7 @@ class file_editor_interface; class files_dock_widget; class history_dock_widget; + class terminal_dock_widget; class variable_editor; class workspace_model; class workspace_view; @@ -153,6 +154,9 @@ return m_workspace_model; } + QPointer + terminal_widget (main_window *mw = nullptr); + QPointer documentation_widget (main_window *mw = nullptr); @@ -199,6 +203,8 @@ void start_gui (bool gui_app); void close_gui (void); + void show_terminal_window (void); + void show_documentation_window (const QString& file); void show_file_browser_window (void); @@ -268,6 +274,8 @@ // adopted by the desktop (main window) if it is also started from // the command line. + QPointer m_terminal_widget; + QPointer m_documentation_widget; QPointer m_file_browser_widget; diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/qt-interpreter-events.cc --- a/libgui/src/qt-interpreter-events.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/qt-interpreter-events.cc Sat Jun 19 14:34:07 2021 -0400 @@ -259,6 +259,11 @@ emit apply_new_settings (); } + void qt_interpreter_events::show_terminal_window (void) + { + emit show_terminal_window_signal (); + } + bool qt_interpreter_events::show_documentation (const std::string& file) { emit show_documentation_signal (QString::fromStdString (file)); diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/qt-interpreter-events.h --- a/libgui/src/qt-interpreter-events.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/qt-interpreter-events.h Sat Jun 19 14:34:07 2021 -0400 @@ -117,6 +117,8 @@ void apply_preferences (void); + void show_terminal_window (void); + bool show_documentation (const std::string& file); void show_file_browser (void); @@ -263,6 +265,8 @@ void gui_preference_signal (const QString& key, const QString& value); + void show_terminal_window_signal (void); + void show_documentation_signal (const QString& file); void register_documentation_signal (const QString& file); diff -r 63c515ff762f -r b4d2fa28d1d4 libgui/src/terminal-dock-widget.cc --- a/libgui/src/terminal-dock-widget.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libgui/src/terminal-dock-widget.cc Sat Jun 19 14:34:07 2021 -0400 @@ -51,9 +51,34 @@ // FIXME: we could do this in a better way, but improving it doesn't // matter much if we will eventually be removing the old terminal. if (m_experimental_terminal_widget) - m_terminal = new command_widget (oct_qobj, this); + { + command_widget *widget = new command_widget (oct_qobj, this); + + connect (this, &terminal_dock_widget::settings_changed, + widget, &command_widget::notice_settings); + + connect (this, &terminal_dock_widget::update_prompt_signal, + widget, &command_widget::update_prompt); + + connect (this, &terminal_dock_widget::interpreter_output_signal, + widget, &command_widget::insert_interpreter_output); + + m_terminal = widget; + } else - m_terminal = QTerminal::create (oct_qobj, this); + { + QTerminal *widget = QTerminal::create (oct_qobj, this); + + connect (this, &terminal_dock_widget::settings_changed, + widget, &QTerminal::notice_settings); + + // Connect the visibility signal to the terminal for + // dis-/enabling timers. + connect (this, &terminal_dock_widget::visibilityChanged, + widget, &QTerminal::handle_visibility_changed); + + m_terminal = widget; + } m_terminal->setObjectName ("OctaveTerminal"); m_terminal->setFocusPolicy (Qt::StrongFocus); @@ -91,6 +116,9 @@ win_y = max_y; setGeometry (0, 0, win_x, win_y); + + if (! p) + make_window (); } bool terminal_dock_widget::has_focus (void) const diff -r 63c515ff762f -r b4d2fa28d1d4 libinterp/corefcn/event-manager.cc --- a/libinterp/corefcn/event-manager.cc Sat Jun 19 10:33:37 2021 -0400 +++ b/libinterp/corefcn/event-manager.cc Sat Jun 19 14:34:07 2021 -0400 @@ -619,6 +619,21 @@ %!error openvar (1:10) */ +DEFMETHOD (__event_manager_show_terminal_window__, interp, , , + doc: /* -*- texinfo -*- +@deftypefn {} {} __event_manager_show_terminal_window__ () +Undocumented internal function. +@end deftypefn */) +{ + std::string file; + + octave::event_manager& evmgr = interp.get_event_manager (); + + evmgr.show_terminal_window (); + + return ovl (); +} + DEFMETHOD (__event_manager_show_documentation__, interp, args, , doc: /* -*- texinfo -*- @deftypefn {} {} __event_manager_show_documentation__ (@var{filename}) diff -r 63c515ff762f -r b4d2fa28d1d4 libinterp/corefcn/event-manager.h --- a/libinterp/corefcn/event-manager.h Sat Jun 19 10:33:37 2021 -0400 +++ b/libinterp/corefcn/event-manager.h Sat Jun 19 14:34:07 2021 -0400 @@ -148,6 +148,8 @@ virtual void apply_preferences (void) { } + virtual void show_terminal_window (void) { } + virtual bool show_documentation (const std::string& /*file*/) { return false; @@ -454,6 +456,12 @@ return false; } + void show_terminal_window (void) + { + if (enabled ()) + instance->show_terminal_window (); + } + bool show_documentation (const std::string& file) { return enabled () ? instance->show_documentation (file) : false;