diff libinterp/corefcn/event-manager.h @ 27302:5f170ea12fa1

use Qt signals to pass interpreter callbacks to octave-qobject * interpreter-qobject.h, interpreter-qobject.cc (interpreter_qobject::m_interpreter): New data member. (interpreter_qobject::execute): Cache pointer to interpreter after it is created. Set it to nullptr before exiting to disable interpreter events. (interpreter_qobject::interpreter_event): New functions. * octave-qobject.h, octave-qobject.cc (octave_qapplication::interpreter_event): New signals. (base_qobject::interpreter_event): New slots. Forward action to m_interpreter object interpreter_event functions. (base_qobject::base_qobject): Connect interpreter_event signals for octave_qapplication to the base_qobject::interpreter_event slots. (octave_qapplication::notify): Emit interpreter_event signal instead of using event_manager::post_exception. * qt-interpreter-events.cc: Declare and register octave::fcn_callback and octave::meth_callback as Qt meta types. * event-manager.h, event-manager.cc (event_manager::m_interpreter): New data member. Update constructor, change all uses. (octave::fcn_callback, octave::meth_callback): New typedefs. (event_manager::post_event): Limit allowable callback function signatures. For meth_callback functions, arrange for a reference to the interpreter object to be passed as the first argument. (event_manager::post_exception): Delete. (event_manager::rethrow_exception_callback): Delete. * GLCanvas.cc (GLCanvas::do_print): Use event_manager::post_event instead of event_manager::post_exception. * file-editor-tab.h (file_eitor_tab::interpreter_event): New signals. * file-editor.cc (file_editor::add_file_editor_tab): Forward interpreter_event signal from newly constructed file_editor_tab object to the interpreter_event signal of the file_editor object. * main-window.h, main-window.cc (main_window::construct): Connect the interpreter_event signal from the main_window object to the parent octave_qobject object. (main_window::interpreter_event): New signals. * octave-dock-widget.h, octave-dock-widget.cc (octave_dock_widget::octave_dock_widget) Forward the interpreter_event signal from the octave_dock_widget object to the interpreter_event signal for parent main_window object. (octave_dock_widget::interpreter_event): New signals. * variable-editor-model.h, variable-editor-model.cc (variable_editor_model::init_from_oct, variable_editor_model::retrieve_variable): Accept reference to interpreter object as an argument. Change all uses. (variable_editor_model::interpreter_event): New signals. * variable-editor.cc (variable_editor::edit_variable): Forward interpreter_event signal from newly constructed variable_editor_model to interpreter_event signal fro variable_editor object. * files-dock-widget.cc, file-editor-tab.cc, main-window.cc, variable-editor-model.cc: In all functions that need to perform interpreter actions, emit an interpreter_event signal instead of accessing the interprter event_manager and calling post_interpreter_event directly.
author John W. Eaton <jwe@octave.org>
date Mon, 29 Jul 2019 10:43:04 -0400
parents 6c438195f4e0
children 0040b7668518
line wrap: on
line diff
--- a/libinterp/corefcn/event-manager.h	Sun Jul 28 17:24:42 2019 -0400
+++ b/libinterp/corefcn/event-manager.h	Mon Jul 29 10:43:04 2019 -0400
@@ -27,6 +27,7 @@
 
 #include "octave-config.h"
 
+#include <functional>
 #include <list>
 #include <memory>
 #include <string>
@@ -41,6 +42,9 @@
 
 namespace octave
 {
+  typedef std::function<void (void)> fcn_callback;
+  typedef std::function<void (octave::interpreter&)> meth_callback;
+
   class symbol_info_list;
 
   // The methods in this class provide a way to pass signals to the GUI
@@ -219,7 +223,7 @@
   {
   public:
 
-    event_manager (void);
+    event_manager (interpreter& interp);
 
     // No copying!
 
@@ -262,24 +266,16 @@
     // The queued functions are executed when the interpreter is
     // otherwise idle.
 
-    template <typename F, typename... Args>
-    void post_event (F&& fcn, Args&&... args)
+    void post_event (const fcn_callback& fcn)
     {
       if (enabled ())
-        gui_event_queue.add (fcn, std::forward<Args> (args)...);
+        gui_event_queue.add (fcn);
     }
 
-    template <typename T, typename... Params, typename... Args>
-    void post_event (T *obj, void (T::*method) (Params...), Args&&... args)
+    void post_event (const meth_callback& meth)
     {
       if (enabled ())
-        gui_event_queue.add_method (obj, method, std::forward<Args> (args)...);
-    }
-
-    void post_exception (const std::exception_ptr& p)
-    {
-      if (enabled ())
-        post_event (this, &event_manager::rethrow_exception_callback, p);
+        gui_event_queue.add (std::bind (meth, std::ref (m_interpreter)));
     }
 
     // The following functions correspond to the virtual fuunctions in
@@ -549,6 +545,8 @@
 
   private:
 
+    interpreter& m_interpreter;
+
     // Using a shared_ptr to manage the link_events object ensures that it
     // will be valid until it is no longer needed.
 
@@ -564,11 +562,6 @@
 
     bool debugging;
     bool link_enabled;
-
-    void rethrow_exception_callback (const std::exception_ptr& p)
-    {
-      std::rethrow_exception (p);
-    }
   };
 }