view libgui/src/interpreter-qobject.cc @ 27646:2ff12b707f60

integrate Qt graphics toolkit in Qt interpreter object Instead of dynamically loading Qt graphics toolkit, make it an integral part of the Qt interpreter object. This arrangement allows us to pass references to both the Octave interpreter and the base_qobject to the graphics subsystem. Earlier, I made the Qt graphics system loadable so that it was more like the fltk and gnuplot versions. But that doesn't really make sense, as the Qt graphics system requires a Qt application context and specific support from Octave for callbacks and other things. It can't really be separated from Octave itself, or the parts of Octave that are built on Qt, so it might as well be available and initialized any time that we start a copy of Octave that is using Qt (i.e., not the strictly "cli" version that doesn't link to the Qt libraries). * __init_qt__.h, __init_qt__.cc: Delete. * graphics/module.mk: Update. Create convenience library for libgraphics instead of __init_qt__.oct file. * libgui/module.mk (%canon_reldir%_liboctgui_la_LIBADD): Add libgraphics.la to the list. * graphics-init.h, graphics-init.cc: New files. (graphics_init): New function to initialize the graphics system. * libgui/src/module.mk: Update. Add -I options for libgui/graphics directories to CPPFLAGS. * interpreter-qobject.cc (interpreter_qobject::interpreter_qobject): Call graphics_init to initialize graphics system.
author John W. Eaton <jwe@octave.org>
date Tue, 05 Nov 2019 18:23:20 -0500
parents f0e3f3e28a8e
children b3401292e101
line wrap: on
line source

/*

Copyright (C) 2013-2019 John W. Eaton
Copyright (C) 2011-2019 Jacob Dawid

This file is part of Octave.

Octave is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Octave is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<https://www.gnu.org/licenses/>.

*/

#if defined (HAVE_CONFIG_H)
#  include "config.h"
#endif

#include "interpreter-qobject.h"
#include "octave-qobject.h"
#include "qt-application.h"
#include "qt-interpreter-events.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)
  { }

  void interpreter_qobject::execute (void)
  {
    // The Octave application context owns the interpreter.

    qt_application& app_context = m_octave_qobj.app_context ();

    interpreter& interp = app_context.create_interpreter ();

    event_manager& evmgr = interp.get_event_manager ();

    evmgr.connect_link (m_octave_qobj.get_qt_interpreter_events ());
    evmgr.enable ();

    int exit_status = 0;

    try
      {
        // Final initialization.

        interp.initialize ();

        if (app_context.start_gui_p ())
          {
            input_system& input_sys = interp.get_input_system ();

            input_sys.PS1 (">> ");
            input_sys.PS2 ("");
          }

        if (interp.initialized ())
          {
            // The interpreter should be completely ready at this point so let
            // the GUI know.

            m_interpreter = &interp;

            emit octave_ready_signal ();

            graphics_init (interp, m_octave_qobj);

            // Start executing commands in the command window.

            exit_status = interp.execute ();
          }
      }
    catch (const exit_exception& ex)
      {
        exit_status = ex.exit_status ();
      }

    // Disable events from being passed from the GUI to the interpreter.

    m_interpreter = nullptr;

    // Whether or not initialization succeeds we need to clean up the
    // interpreter once we are done with it.

    app_context.delete_interpreter ();

    emit octave_finished_signal (exit_status);
  }

  void interpreter_qobject::interpreter_event (const fcn_callback& fcn)
  {
    if (! m_interpreter)
      return;

    event_manager& evmgr = m_interpreter->get_event_manager ();

    evmgr.post_event (fcn);
  }

  void interpreter_qobject::interpreter_event (const meth_callback& meth)
  {
    if (! m_interpreter)
      return;

    event_manager& evmgr = m_interpreter->get_event_manager ();

    evmgr.post_event (meth);
  }

  qt_interpreter_events * interpreter_qobject::qt_link (void)
  {
    return m_octave_qobj.qt_link ();
  }
}