diff --git a/libgui/qterminal/libqterminal/unix/TerminalView.cpp b/libgui/qterminal/libqterminal/unix/TerminalView.cpp --- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp +++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp @@ -323,6 +323,8 @@ connect (this, SIGNAL (set_global_shortcuts_signal (bool)), parent->parent (), SLOT (set_global_shortcuts (bool))); + connect (this, SIGNAL (interrupt_signal (void)), + parent->parent (), SLOT (terminal_interrupt (void))); } TerminalView::~TerminalView() @@ -2274,9 +2276,7 @@ QString text = _screenWindow->selectedText(_preserveLineBreaks); if (text.isEmpty ()) - { - ::raise (SIGINT); - } + emit interrupt_signal (); else QApplication::clipboard()->setText(text); } diff --git a/libgui/qterminal/libqterminal/unix/TerminalView.h b/libgui/qterminal/libqterminal/unix/TerminalView.h --- a/libgui/qterminal/libqterminal/unix/TerminalView.h +++ b/libgui/qterminal/libqterminal/unix/TerminalView.h @@ -447,6 +447,8 @@ signals: + void interrupt_signal (void); + /** * Emitted when the user presses a key whilst the terminal widget has focus. */ diff --git a/libgui/src/main-window.cc b/libgui/src/main-window.cc --- a/libgui/src/main-window.cc +++ b/libgui/src/main-window.cc @@ -79,7 +79,6 @@ workspace_window (new workspace_view (this)), find_files_dlg (0), release_notes_window (0), - _octave_main_thread (0), _octave_qt_link (0), _clipboard (QApplication::clipboard ()), _cmd_queue (new QStringList ()), // no command pending @@ -114,7 +113,6 @@ delete release_notes_window; release_notes_window = 0; } - delete _octave_main_thread; delete _octave_qt_link; delete _cmd_queue; } @@ -990,9 +988,7 @@ void main_window::construct_octave_qt_link (void) { - _octave_main_thread = new octave_main_thread (); - - _octave_qt_link = new octave_qt_link (_octave_main_thread); + _octave_qt_link = new octave_qt_link (); connect (_octave_qt_link, SIGNAL (exit_signal (int)), this, SLOT (exit (int))); @@ -1824,6 +1820,12 @@ } void +main_window::terminal_interrupt (void) +{ + _octave_qt_link->interrupt_interpreter (); +} + +void main_window::handle_show_doc (const QString& file) { doc_browser_window->setVisible (true); diff --git a/libgui/src/main-window.h b/libgui/src/main-window.h --- a/libgui/src/main-window.h +++ b/libgui/src/main-window.h @@ -188,6 +188,8 @@ // setting global shortcuts void set_global_shortcuts (bool enable); + void terminal_interrupt (void); + // handling the clipboard void clipboard_has_changed (QClipboard::Mode); void clear_clipboard (); @@ -326,8 +328,6 @@ // release notes window QWidget * release_notes_window; - octave_main_thread *_octave_main_thread; - octave_qt_link *_octave_qt_link; QClipboard *_clipboard; diff --git a/libgui/src/module.mk b/libgui/src/module.mk --- a/libgui/src/module.mk +++ b/libgui/src/module.mk @@ -90,6 +90,7 @@ src/moc-files-dock-widget.cc \ src/moc-history-dock-widget.cc \ src/moc-main-window.cc \ + src/moc-octave-main-thread.cc \ src/moc-octave-qt-link.cc \ src/moc-settings-dialog.cc \ src/moc-news-dock-widget.cc \ diff --git a/libgui/src/octave-main-thread.cc b/libgui/src/octave-main-thread.cc --- a/libgui/src/octave-main-thread.cc +++ b/libgui/src/octave-main-thread.cc @@ -27,6 +27,9 @@ #include +#include +#include + #include "builtin-defun-decls.h" #include "octave.h" #include "ov-builtin.h" @@ -36,8 +39,10 @@ #include "octave-link.h" void -octave_main_thread::run (void) +octave_main_thread::execute_interpreter (void) { + interpreter_thread = pthread_self (); + octave_initialize_interpreter (octave_cmdline_argc, octave_cmdline_argv, octave_embedded); @@ -45,7 +50,7 @@ } void -octave_main_thread::execute_interpreter (void) +octave_main_thread::interrupt_interpreter (void) { - start (); + pthread_kill (interpreter_thread, SIGINT); } diff --git a/libgui/src/octave-main-thread.h b/libgui/src/octave-main-thread.h --- a/libgui/src/octave-main-thread.h +++ b/libgui/src/octave-main-thread.h @@ -24,26 +24,35 @@ #ifndef OCTAVEMAINTHREAD_H #define OCTAVEMAINTHREAD_H -#include +#include + +#include /** * \class octave_main * \brief This class represents a thread just running octave_main. * \author Jacob Dawid */ -class octave_main_thread : public QThread +class octave_main_thread : public QObject { + Q_OBJECT + public: + // Create a new thread for running the octave interpreter. - octave_main_thread (void) : QThread () { } + octave_main_thread (void) : QObject (), interpreter_thread () { } + + void interrupt_interpreter (void); + +public slots: // Start the thread and initialize and execute the octave // interpreter. void execute_interpreter (void); -protected: - // Avoid exec. Run the octave interpreter in the new thread. - void run (void); +private: + + pthread_t interpreter_thread; }; #endif // OCTAVEMAINTHREAD_H diff --git a/libgui/src/octave-qt-link.cc b/libgui/src/octave-qt-link.cc --- a/libgui/src/octave-qt-link.cc +++ b/libgui/src/octave-qt-link.cc @@ -43,16 +43,33 @@ #include "resource-manager.h" -octave_qt_link::octave_qt_link (octave_main_thread *mt) - : octave_link (), main_thread (mt) -{ } +octave_qt_link::octave_qt_link (void) + : octave_link (), main_thread (new QThread ()), + octave_interpreter (new octave_main_thread ()) +{ + connect (this, SIGNAL (execute_interpreter_signal (void)), + octave_interpreter, SLOT (execute_interpreter (void))); + + connect (this, SIGNAL (interrupt_interpreter_signal (void)), + octave_interpreter, SLOT (interrupt_interpreter (void))); + + octave_interpreter->moveToThread (main_thread); + + main_thread->start (); +} octave_qt_link::~octave_qt_link (void) { } void octave_qt_link::execute_interpreter (void) { - main_thread->execute_interpreter (); + emit execute_interpreter_signal (); +} + +void +octave_qt_link::interrupt_interpreter (void) +{ + octave_interpreter->interrupt_interpreter (); } bool diff --git a/libgui/src/octave-qt-link.h b/libgui/src/octave-qt-link.h --- a/libgui/src/octave-qt-link.h +++ b/libgui/src/octave-qt-link.h @@ -31,6 +31,7 @@ #include #include #include +#include #include "octave-link.h" #include "octave-main-thread.h" @@ -52,12 +53,14 @@ public: - octave_qt_link (octave_main_thread *mt); + octave_qt_link (void); ~octave_qt_link (void); void execute_interpreter (void); + void interrupt_interpreter (void); + bool do_exit (int status); bool do_edit_file (const std::string& file); @@ -128,6 +131,7 @@ void do_show_preferences (void); void do_show_doc (const std::string& file); + private: // No copying! @@ -140,10 +144,17 @@ void do_delete_debugger_pointer (const std::string& file, int line); // Thread running octave_main. - octave_main_thread *main_thread; + QThread *main_thread; + + // Octave interpreter (misnamed class) + octave_main_thread *octave_interpreter; signals: + void execute_interpreter_signal (void); + + void interrupt_interpreter_signal (void); + void exit_signal (int status); void edit_file_signal (const QString& file);