# HG changeset patch # User Jacob Dawid # Date 1338840198 -7200 # Node ID ec76264adca9fc4970239dc351d3530582dc006e # Parent cecc7da96e2a9391aba104cf2cedc4a368cb4c4d Removed last bits of Qt from octave_link. * main-window: Made subclass from octave_event_observer. * octave-event-listener: Added new listener method to interface. * octave-link: Removed last bits of Qt. * octave-qt-event-listener: Implemented new listener method. diff --git a/gui/src/main-window.cc b/gui/src/main-window.cc --- a/gui/src/main-window.cc +++ b/gui/src/main-window.cc @@ -30,7 +30,8 @@ #include "file-editor.h" #include "settings-dialog.h" -main_window::main_window (QWidget * parent):QMainWindow (parent) +main_window::main_window (QWidget * parent) + : QMainWindow (parent), octave_event_observer () { // We have to set up all our windows, before we finally launch octave. construct (); @@ -50,6 +51,18 @@ } void +main_window::event_accepted (octave_event *e) +{ + delete e; +} + +void +main_window::event_reject (octave_event *e) +{ + delete e; +} + +void main_window::new_file () { _file_editor->request_new_file (); @@ -177,14 +190,17 @@ if (!selectedDirectory.isEmpty ()) { octave_link::instance () - ->request_working_directory_change (selectedDirectory.toStdString ()); + ->post_event (new octave_change_directory_event (*this, + selectedDirectory.toStdString ())); } } void main_window::change_current_working_directory (QString directory) { - octave_link::instance ()->request_working_directory_change (directory.toStdString ()); + octave_link::instance () + ->post_event (new octave_change_directory_event (*this, + directory.toStdString ())); } void @@ -223,7 +239,7 @@ main_window::closeEvent (QCloseEvent * closeEvent) { closeEvent->ignore (); - octave_link::instance ()->request_octave_exit (); + octave_link::instance ()->post_event (new octave_exit_event (*this)); } void diff --git a/gui/src/main-window.h b/gui/src/main-window.h --- a/gui/src/main-window.h +++ b/gui/src/main-window.h @@ -45,18 +45,23 @@ #include "files-dockwidget.h" #include "terminal-dockwidget.h" #include "octave-qt-event-listener.h" +#include "octave-event-observer.h" /** * \class MainWindow * * Represents the main window. */ -class main_window:public QMainWindow +class main_window + : public QMainWindow, public octave_event_observer { Q_OBJECT public: main_window (QWidget * parent = 0); ~main_window (); + void event_accepted (octave_event *e); + void event_reject (octave_event *e); + QTerminal *get_terminal_view () { return _terminal; } history_dock_widget *get_history_dock_widget () { return _history_dock_widget; } files_dock_widget *get_files_dock_widget () { return _files_dock_widget; } diff --git a/gui/src/octave-adapter/octave-event-listener.h b/gui/src/octave-adapter/octave-event-listener.h --- a/gui/src/octave-adapter/octave-event-listener.h +++ b/gui/src/octave-adapter/octave-event-listener.h @@ -27,6 +27,7 @@ virtual ~octave_event_listener () { } virtual void current_directory_has_changed (std::string directory) = 0; + virtual void about_to_exit () = 0; }; #endif // OCTAVEEVENTLISTENER_H diff --git a/gui/src/octave-adapter/octave-link.cc b/gui/src/octave-adapter/octave-link.cc --- a/gui/src/octave-adapter/octave-link.cc +++ b/gui/src/octave-adapter/octave-link.cc @@ -17,8 +17,6 @@ #include "octave-link.h" #include "load-path.h" -#include -#include int octave_readline_hook () { @@ -29,15 +27,15 @@ void octave_exit_hook (int status) { - Q_UNUSED (status); - qApp->quit (); + (void) status; + octave_link::instance ()->about_to_exit (); } octave_link octave_link::_singleton; octave_link::octave_link () { - _event_queue_semaphore = new QSemaphore (1); + _event_queue_mutex = new octave_mutex (); _last_working_directory = ""; } @@ -77,7 +75,7 @@ void octave_link::process_events () { - _event_queue_semaphore->acquire (); + _event_queue_mutex->lock (); while (_event_queue.size () > 0) { octave_event * e = _event_queue.front (); @@ -87,7 +85,7 @@ else e->reject (); } - _event_queue_semaphore->release (); + _event_queue_mutex->unlock (); } void @@ -95,9 +93,9 @@ { if (e) { - _event_queue_semaphore->acquire (); + _event_queue_mutex->lock (); _event_queue.push (e); - _event_queue_semaphore->release (); + _event_queue_mutex->unlock (); } } @@ -110,9 +108,8 @@ { delete e; } void -octave_link::request_working_directory_change (std::string directory) -{ post_event (new octave_change_directory_event (*this, directory)); } - -void -octave_link::request_octave_exit () -{ post_event (new octave_exit_event (*this)); } +octave_link::about_to_exit () +{ + if (_octave_event_listener) + _octave_event_listener->about_to_exit (); +} diff --git a/gui/src/octave-adapter/octave-link.h b/gui/src/octave-adapter/octave-link.h --- a/gui/src/octave-adapter/octave-link.h +++ b/gui/src/octave-adapter/octave-link.h @@ -53,6 +53,7 @@ #include "octave/unwind-prot.h" #include "octave/utils.h" #include "octave/variables.h" +#include "oct-mutex.h" // Standard includes #include @@ -61,9 +62,6 @@ #include #include -// Qt includes -#include - #include "workspace-model.h" #include "octave-main-thread.h" #include "octave-event.h" @@ -83,8 +81,7 @@ { public: /** Provides a way to access the unique octave_link object. */ - static octave_link * - instance () { return &_singleton; } + static octave_link * instance () { return &_singleton; } /** Starts octave. */ void launch_octave (); @@ -96,9 +93,7 @@ void event_accepted (octave_event *e); void event_reject (octave_event *e); - void request_working_directory_change (std::string directory); - void request_octave_exit (); - + void about_to_exit (); private: /** Singleton. */ octave_link (); @@ -110,7 +105,7 @@ octave_main_thread *_octave_main_thread; /** Semaphore to lock access to the event queue. */ - QSemaphore *_event_queue_semaphore; + octave_mutex *_event_queue_mutex; /** Buffer for queueing events until they will be processed. */ std::queue _event_queue; diff --git a/gui/src/octave-qt-event-listener.cc b/gui/src/octave-qt-event-listener.cc --- a/gui/src/octave-qt-event-listener.cc +++ b/gui/src/octave-qt-event-listener.cc @@ -16,6 +16,7 @@ */ #include "octave-qt-event-listener.h" +#include octave_qt_event_listener::octave_qt_event_listener (QObject *parent) : QObject (parent), octave_event_listener () @@ -25,3 +26,9 @@ void octave_qt_event_listener::current_directory_has_changed (std::string directory) { emit current_directory_changed (QString::fromStdString (directory)); } + +void +octave_qt_event_listener::about_to_exit () +{ + qApp->quit (); +} diff --git a/gui/src/octave-qt-event-listener.h b/gui/src/octave-qt-event-listener.h --- a/gui/src/octave-qt-event-listener.h +++ b/gui/src/octave-qt-event-listener.h @@ -30,6 +30,7 @@ octave_qt_event_listener (QObject *parent = 0); void current_directory_has_changed (std::string directory); + void about_to_exit (); signals: void current_directory_changed (QString directory);