changeset 27697:5e8891dceec7

backout changesets cdb681adc85a and b3401292e101 (bug #56952) Oops. These are probably not the proper changes to fix the crash-on-exit problem reported in bug #56952.
author John W. Eaton <jwe@octave.org>
date Fri, 15 Nov 2019 18:06:28 -0500
parents cf231bc5876f
children f65b1666e650
files libgui/src/interpreter-qobject.cc libgui/src/interpreter-qobject.h libgui/src/module.mk
diffstat 3 files changed, 12 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/interpreter-qobject.cc	Fri Nov 15 20:38:21 2019 +0100
+++ b/libgui/src/interpreter-qobject.cc	Fri Nov 15 18:06:28 2019 -0500
@@ -25,29 +25,19 @@
 #  include "config.h"
 #endif
 
-#include <QApplication>
-#include <QMetaType>
-#include <QThread>
-
-#include "QtHandlesUtils.h"
 #include "interpreter-qobject.h"
 #include "octave-qobject.h"
 #include "qt-application.h"
-#include "qt-graphics-toolkit.h"
 #include "qt-interpreter-events.h"
 
-#include "unwind-prot.h"
-
-#include "graphics.h"
-#include "gtk-manager.h"
+#include "graphics-init.h"
 #include "input.h"
 #include "interpreter.h"
 
 namespace octave
 {
   interpreter_qobject::interpreter_qobject (base_qobject& oct_qobj)
-    : QObject (), m_octave_qobj (oct_qobj), m_interpreter (nullptr),
-      m_graphics_toolkit (nullptr)
+    : QObject (), m_octave_qobj (oct_qobj), m_interpreter (nullptr)
   { }
 
   void interpreter_qobject::execute (void)
@@ -56,9 +46,6 @@
 
     qt_application& app_context = m_octave_qobj.app_context ();
 
-    // The application context will own the interpreter.  It is
-    // responsible for cleaning it up when the application exits.
-
     interpreter& interp = app_context.create_interpreter ();
 
     event_manager& evmgr = interp.get_event_manager ();
@@ -84,22 +71,14 @@
 
         if (interp.initialized ())
           {
-            // The interpreter should be completely ready at this point
-            // so let the GUI know.
+            // The interpreter should be completely ready at this point so let
+            // the GUI know.
 
             m_interpreter = &interp;
 
             emit octave_ready_signal ();
 
-            graphics_init ();
-
-            // We created the Qt graphics toolkit and interperter here.
-            // Disable and delete it when the interpreter is done
-            // executing commands for us.  Use an unwind_action to
-            // ensure that it is disabled and deleted even if we exit
-            // this code block becuase an exception is thrown.
-
-            unwind_action ([this] (void) { graphics_fini (); });
+            graphics_init (interp, m_octave_qobj);
 
             // Start executing commands in the command window.
 
@@ -115,65 +94,12 @@
 
     m_interpreter = nullptr;
 
-    emit octave_finished_signal (exit_status);
-  }
-
-  interpreter_qobject::~interpreter_qobject (void)
-  {
-    delete m_graphics_toolkit;
-  }
-
-  void interpreter_qobject::graphics_init (void)
-  {
-#if defined (HAVE_QT_GRAPHICS)
-
-    if (! m_interpreter)
-      return;
-
-    gh_manager& gh_mgr = m_interpreter->get_gh_manager ();
-
-    autolock guard (gh_mgr.graphics_lock ());
-
-    qRegisterMetaType<graphics_object> ("graphics_object");
-
-    gh_mgr.enable_event_processing (true);
-
-    QtHandles::qt_graphics_toolkit *qt_gtk
-      = new QtHandles::qt_graphics_toolkit (*m_interpreter, m_octave_qobj);
-
-    if (QThread::currentThread ()
-        != QApplication::instance ()->thread ())
-      qt_gtk->moveToThread (QApplication::instance ()->thread ());
+    // Whether or not initialization succeeds we need to clean up the
+    // interpreter once we are done with it.
 
-    m_graphics_toolkit = new graphics_toolkit (qt_gtk);
-
-    octave::gtk_manager& gtk_mgr = m_interpreter->get_gtk_manager ();
-
-    gtk_mgr.register_toolkit ("qt");
-
-    gtk_mgr.load_toolkit (*m_graphics_toolkit);
-
-#endif
-  }
-
-  void interpreter_qobject::graphics_fini (void)
-  {
-#if defined (HAVE_QT_GRAPHICS)
+    app_context.delete_interpreter ();
 
-    if (! m_interpreter)
-      return;
-
-    octave::gtk_manager& gtk_mgr = m_interpreter->get_gtk_manager ();
-
-    gtk_mgr.unregister_toolkit ("qt");
-
-    gtk_mgr.unload_toolkit ("qt");
-
-    delete m_graphics_toolkit;
-
-    m_graphics_toolkit = nullptr;
-
-#endif
+    emit octave_finished_signal (exit_status);
   }
 
   void interpreter_qobject::interpreter_event (const fcn_callback& fcn)
--- a/libgui/src/interpreter-qobject.h	Fri Nov 15 20:38:21 2019 +0100
+++ b/libgui/src/interpreter-qobject.h	Fri Nov 15 18:06:28 2019 -0500
@@ -28,8 +28,6 @@
 
 #include "qt-interpreter-events.h"
 
-class graphics_toolkit;
-
 namespace octave
 {
   class interpreter;
@@ -44,11 +42,7 @@
 
     interpreter_qobject (base_qobject& oct_qobj);
 
-    ~interpreter_qobject (void);
-
-    void graphics_init (void);
-
-    void graphics_fini (void);
+    ~interpreter_qobject (void) = default;
 
     qt_interpreter_events * qt_link (void);
 
@@ -91,8 +85,6 @@
     base_qobject& m_octave_qobj;
 
     interpreter *m_interpreter;
-
-    graphics_toolkit *m_graphics_toolkit;
   };
 }
 
--- a/libgui/src/module.mk	Fri Nov 15 20:38:21 2019 +0100
+++ b/libgui/src/module.mk	Fri Nov 15 18:06:28 2019 -0500
@@ -204,6 +204,7 @@
   %reldir%/gui-settings.h \
   %reldir%/external-editor-interface.h \
   %reldir%/files-dock-widget.h \
+  %reldir%/graphics-init.h \
   %reldir%/history-dock-widget.h \
   %reldir%/interpreter-qobject.h \
   %reldir%/m-editor/file-editor-interface.h \
@@ -242,6 +243,7 @@
   %reldir%/dw-main-window.cc \
   %reldir%/external-editor-interface.cc \
   %reldir%/files-dock-widget.cc \
+  %reldir%/graphics-init.cc \
   %reldir%/gui-settings.cc \
   %reldir%/history-dock-widget.cc \
   %reldir%/interpreter-qobject.cc \