changeset 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 028205a91a07
children 2a506bc4a7af
files libgui/graphics/__init_qt__.cc libgui/graphics/__init_qt__.h libgui/graphics/module.mk libgui/module.mk libgui/src/graphics-init.cc libgui/src/graphics-init.h libgui/src/interpreter-qobject.cc libgui/src/module.mk
diffstat 8 files changed, 138 insertions(+), 432 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/__init_qt__.cc	Tue Nov 05 13:28:45 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,343 +0,0 @@
-/*
-
-Copyright (C) 2011-2019 Michael Goffioul
-
-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 <QApplication>
-#include <QDir>
-#include <QFileDialog>
-#include <QMetaType>
-#include <QPalette>
-#include <QRegExp>
-#include <QThread>
-
-#include "octave-qobject.h"
-#include "qt-graphics-toolkit.h"
-#include "QtHandlesUtils.h"
-#include "__init_qt__.h"
-
-#include "defun-dld.h"
-#include "graphics.h"
-#include "gtk-manager.h"
-#include "interpreter.h"
-#include "symtab.h"
-
-// PKG_ADD: if (__have_feature__ ("QT") && __have_feature__ ("OPENGL") && have_window_system () && __event_manager_enabled__ ()) register_graphics_toolkit ("qt"); endif
-
-namespace QtHandles
-{
-
-  static bool qtHandlesInitialized = false;
-
-  bool
-  __init__ (octave::interpreter& interp)
-  {
-    if (! qtHandlesInitialized)
-      {
-        if (qApp)
-          {
-            gh_manager& gh_mgr = interp.get_gh_manager ();
-
-            octave::autolock guard (gh_mgr.graphics_lock ());
-
-            interp.mlock ();
-
-            qRegisterMetaType<graphics_object> ("graphics_object");
-
-            gh_mgr.enable_event_processing (true);
-
-            // FIXME: temporary?
-            octave::base_qobject& octave_qobj
-              = *(octave::base_qobject::the_octave_qobject ());
-
-            qt_graphics_toolkit *qt_gtk
-              = new qt_graphics_toolkit (interp, octave_qobj);
-
-            if (QThread::currentThread ()
-                != QApplication::instance ()->thread ())
-              qt_gtk->moveToThread (QApplication::instance ()->thread ());
-
-            graphics_toolkit tk (qt_gtk);
-
-            octave::gtk_manager& gtk_mgr = interp.get_gtk_manager ();
-
-            gtk_mgr.load_toolkit (tk);
-
-            octave::interpreter::add_atexit_function ("__shutdown_qt__");
-
-            qtHandlesInitialized = true;
-
-            return true;
-          }
-        else
-          error ("__init_qt__: QApplication object must exist.");
-      }
-
-    return false;
-  }
-
-  bool
-  __shutdown__ (octave::interpreter& interp)
-  {
-    if (qtHandlesInitialized)
-      {
-        gh_manager& gh_mgr = interp.get_gh_manager ();
-
-        octave::autolock guard (gh_mgr.graphics_lock ());
-
-        gh_mgr.enable_event_processing (false);
-
-        qtHandlesInitialized = false;
-
-        return true;
-      }
-
-    return false;
-  }
-}
-
-DEFMETHOD_DLD (__init_qt__, interp, , , "")
-{
-  QtHandles::__init__ (interp);
-
-  return octave_value ();
-}
-
-DEFMETHOD_DLD (__shutdown_qt__, interp, , , "")
-{
-  QtHandles::__shutdown__ (interp);
-
-  return octave_value ();
-}
-
-void
-install___init_qt___functions (octave::symbol_table& symtab)
-{
-  symtab.install_built_in_function
-    ("__init_qt__", octave_value (new octave_builtin
-                                  (F__init_qt__, "__init_qt__",
-                                   "__init_qt__.cc", "")));
-
-  symtab.install_built_in_function
-    ("__shutdown_qt__", octave_value (new octave_builtin
-                                      (F__shutdown_qt__, "__shutdown_qt__",
-                                       "__init_qt__.cc", "")));
-}
-
-#if 0
-
-static QStringList
-makeFilterSpecs (const Cell& filters)
-{
-  using namespace QtHandles::Utils;
-
-  QStringList filterSpecs;
-  QRegExp parenRe (" ?\\(.*\\)\\s*$");
-
-  for (int i = 0; i < filters.rows (); i++)
-    {
-      QStringList extList =
-        fromStdString (filters(i, 0).string_value ()).split (";");
-      QString desc = fromStdString (filters(i, 1).string_value ()).trimmed ();
-      QString specItem;
-
-      if (desc.contains (parenRe))
-        {
-          // We need to strip any existing parenthesis and recreate it.
-          // In case the format specified in the () section is not correct,
-          // the filters won't work as expected.
-          desc.remove (parenRe);
-        }
-
-      specItem = QString ("%1 (%2)").arg (desc).arg (extList.join (" "));
-
-      filterSpecs.append (specItem);
-    }
-
-  return filterSpecs;
-}
-
-static QString
-appendDirSep (const QString& d)
-{
-  if (! d.endsWith ("/") && ! d.endsWith (QDir::separator ()))
-    return (d + '/');
-  return d;
-}
-
-DEFUN_DLD (__uigetfile_qt__, args, , "")
-{
-  using namespace QtHandles::Utils;
-
-  // Expected arguments:
-  //   args(0) : File filter as a cell array {ext1, name1; ext2, name2; ...}
-  //   args(1) : Dialog title
-  //   args(2) : Default filename
-  //   args(3) : Dialog position [ignored]
-  //   args(4) : Multiselection "on"/"off"
-  //   args(5) : Default directory
-
-  octave_value_list retval (3);
-
-  QString caption = fromStdString (args(1).string_value ());
-  QString defaultDirectory = fromStdString (args(5).string_value ());
-  QString defaultFileName = fromStdString (args(2).string_value ());
-  bool isMultiSelect = (args(4).string_value () == "on");
-
-  if (isMultiSelect)
-    retval(0) = Cell ();
-  else
-    retval(0) = "";
-  retval(1) = "";
-  retval(2) = 0.0;
-
-  if (defaultFileName.isEmpty ())
-    defaultFileName = defaultDirectory;
-  else
-    defaultFileName = defaultDirectory + '/' + defaultFileName;
-
-  QStringList filterSpecs = makeFilterSpecs (args(0).cell_value ());
-
-  if (isMultiSelect)
-    {
-      QString filter;
-      QStringList files =
-        QFileDialog::getOpenFileNames (0, caption, defaultFileName,
-                                       filterSpecs.join (";;"), &filter, 0);
-
-      if (! files.isEmpty ())
-        {
-          Cell cFiles (1, files.length ());
-          QString dirName;
-          int i = 0;
-
-          foreach (const QString& s, files)
-            {
-              QFileInfo fi (s);
-
-              if (dirName.isEmpty ())
-                dirName = appendDirSep (fi.canonicalPath ());
-              cFiles(i++) = toStdString (fi.fileName ());
-            }
-
-          retval(0) = cFiles;
-          retval(1) = toStdString (dirName);
-          if (! filter.isEmpty ())
-            retval(2) = static_cast<double> (filterSpecs.indexOf (filter) + 1);
-        }
-    }
-  else
-    {
-      QString filter;
-      QString fileName =
-        QFileDialog::getOpenFileName (0, caption, defaultFileName,
-                                      filterSpecs.join (";;"), &filter, 0);
-
-      if (! fileName.isNull ())
-        {
-          QFileInfo fi (fileName);
-
-          retval(0) = toStdString (fi.fileName ());
-          retval(1) = toStdString (appendDirSep (fi.canonicalPath ()));
-          if (! filter.isEmpty ())
-            retval(2) = static_cast<double> (filterSpecs.indexOf (filter) + 1);
-        }
-    }
-
-  return retval;
-}
-
-DEFUN_DLD (__uiputfile_qt__, args, , "")
-{
-  using namespace QtHandles::Utils;
-
-  // Expected arguments:
-  //   args(0) : File filter as a cell array {ext1, name1; ext2, name2; ...}
-  //   args(1) : Dialog title
-  //   args(2) : Default filename
-  //   args(3) : Dialog position [ignored]
-  //   args(4) : Tag [ignored]
-  //   args(5) : Default directory
-
-  octave_value_list retval (3);
-
-  QString caption = fromStdString (args(1).string_value ());
-  QString defaultDirectory = fromStdString (args(5).string_value ());
-  QString defaultFileName = fromStdString (args(2).string_value ());
-
-  retval(0) = "";
-  retval(1) = "";
-  retval(2) = 0.0;
-
-  if (defaultFileName.isEmpty ())
-    defaultFileName = defaultDirectory;
-  else
-    defaultFileName = defaultDirectory + '/' + defaultFileName;
-
-  QStringList filterSpecs = makeFilterSpecs (args(0).cell_value ());
-
-  QString filter;
-  QString fileName =
-    QFileDialog::getSaveFileName (0, caption, defaultFileName,
-                                  filterSpecs.join (";;"), &filter, 0);
-
-  if (! fileName.isNull ())
-    {
-      QFileInfo fi (fileName);
-
-      retval(0) = toStdString (fi.fileName ());
-      if (fi.exists ())
-        retval(1) = toStdString (appendDirSep (fi.canonicalPath ()));
-      else
-        retval(1) = toStdString (appendDirSep (fi.absolutePath ()));
-      if (! filter.isEmpty ())
-        retval(2) = static_cast<double> (filterSpecs.indexOf (filter) + 1);
-    }
-
-  return retval;
-}
-
-DEFUN_DLD (__uigetdir_qt__, args, , "")
-{
-  using namespace QtHandles::Utils;
-
-  // Expected arguments:
-  //   args(0) : Start directory
-  //   args(1) : Dialog title
-
-  octave_value retval ("");
-
-  QString caption = fromStdString (args(1).string_value ());
-  QString defaultDirectory = fromStdString (args(0).string_value ());
-
-  QString dirName = QFileDialog::getExistingDirectory (0, caption,
-                    defaultDirectory);
-
-  if (! dirName.isNull ())
-    retval = toStdString (dirName);
-
-  return retval;
-}
-
-#endif
--- a/libgui/graphics/__init_qt__.h	Tue Nov 05 13:28:45 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
-
-Copyright (C) 2011-2019 Michael Goffioul
-
-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 (octave__init_qt___h)
-#define octave__init_qt___h 1
-
-namespace QtHandles
-{
-
-  bool __init__ (void);
-
-}
-
-namespace octave
-{
-  class symbol_table;
-}
-
-extern void install___init_qt___functions (octave::symbol_table&);
-
-#endif
--- a/libgui/graphics/module.mk	Tue Nov 05 13:28:45 2019 -0500
+++ b/libgui/graphics/module.mk	Tue Nov 05 18:23:20 2019 -0500
@@ -1,7 +1,5 @@
 if AMCOND_BUILD_QT_GRAPHICS
 
-LIBOCTGUI_GRAPHICS_LIB = %reldir%/__init_qt__.la
-
 OCTAVE_GUI_GRAPHICS_MOC = \
   %reldir%/moc-ButtonControl.cc \
   %reldir%/moc-ButtonGroup.cc \
@@ -30,17 +28,17 @@
 DIRSTAMP_FILES += \
   %reldir%/$(octave_dirstamp)
 
-__init_qt___MOC = \
+libgraphics_MOC = \
   $(OCTAVE_GUI_GRAPHICS_MOC)
 
-__init_qt___UI = \
+libgraphics_UI = \
   %reldir%/annotation-dialog.ui
 
-__init_qt___UI_H = $(patsubst %reldir%/%.ui, %reldir%/ui-%.h, $(__init_qt___UI))
+libgraphics_UI_H = $(patsubst %reldir%/%.ui, %reldir%/ui-%.h, $(libgraphics_UI))
 
-$(__init_qt___UI_H): | %reldir%/$(octave_dirstamp)
+$(libgraphics_UI_H): | %reldir%/$(octave_dirstamp)
 
-BUILT_SOURCES += $(__init_qt___UI_H)
+BUILT_SOURCES += $(libgraphics_UI_H)
 
 noinst_HEADERS += \
   %reldir%/BaseControl.h \
@@ -76,14 +74,13 @@
   %reldir%/ToggleTool.h \
   %reldir%/ToolBar.h \
   %reldir%/ToolBarButton.h \
-  %reldir%/__init_qt__.h \
   %reldir%/annotation-dialog.h \
   %reldir%/gl-select.h \
   %reldir%/qopengl-functions.h \
   %reldir%/qt-graphics-toolkit.h \
   $(TEMPLATE_SRC)
 
-%canon_reldir%___init_qt___la_SOURCES = \
+%canon_reldir%_libgraphics_la_SOURCES = \
   %reldir%/BaseControl.cc \
   %reldir%/ButtonControl.cc \
   %reldir%/ButtonGroup.cc \
@@ -114,7 +111,6 @@
   %reldir%/ToggleButtonControl.cc \
   %reldir%/ToggleTool.cc \
   %reldir%/ToolBar.cc \
-  %reldir%/__init_qt__.cc \
   %reldir%/annotation-dialog.cc \
   %reldir%/gl-select.cc \
   %reldir%/qt-graphics-toolkit.cc
@@ -122,9 +118,9 @@
 TEMPLATE_SRC = \
   %reldir%/ToolBarButton.cc
 
-nodist_%canon_reldir%___init_qt___la_SOURCES = $(__init_qt___MOC)
+nodist_%canon_reldir%_libgraphics_la_SOURCES = $(libgraphics_MOC)
 
-%canon_reldir%___init_qt___la_CPPFLAGS = \
+%canon_reldir%_libgraphics_la_CPPFLAGS = \
   $(AM_CPPFLAGS) \
   $(FT2_CPPFLAGS) \
   $(FONTCONFIG_CPPFLAGS) \
@@ -144,55 +140,26 @@
   -Ilibinterp/corefcn -I$(srcdir)/libinterp/corefcn \
   -I$(srcdir)/libinterp/octave-value
 
-%canon_reldir%___init_qt___la_LDFLAGS = \
-  -avoid-version -module $(NO_UNDEFINED_LDFLAG) \
+%canon_reldir%_libgraphics_la_LDFLAGS = \
   $(QT_OPENGL_LDFLAGS) \
   $(WARN_LDFLAGS)
 
-DLD_LIBOCTGUI_LIBADD = $(OCT_GUI_LINK_DEPS)
-
-%canon_reldir%___init_qt___la_LIBADD = \
-  $(DLD_LIBOCTGUI_LIBADD) \
+%canon_reldir%_libgraphics_la_LIBADD = \
+  $(OCT_GUI_LINK_DEPS) \
   $(QT_OPENGL_LIBS) \
   $(OPENGL_LIBS)
 
-%canon_reldir%___init_qt___la_DEPENDENCIES = $(OCT_GUI_LINK_DEPS)
-
-octlib_LTLIBRARIES += $(LIBOCTGUI_GRAPHICS_LIB)
-
-GRAPHICS_DEFUN_FILES = %reldir%/__init_qt__.cc
-
-GRAPHICS_OCT_FILES = $(LIBOCTGUI_GRAPHICS_LIB:.la=.oct)
-
-OCTAVE_INTERPRETER_TARGETS += $(GRAPHICS_OCT_FILES)
-
-OCT_FILE_LIBS += $(LIBOCTGUI_GRAPHICS_LIB)
-
-OCT_FILES += $(GRAPHICS_OCT_FILES)
+%canon_reldir%_libgraphics_la_DEPENDENCIES = $(OCT_GUI_LINK_DEPS)
 
-## Use stamp files to avoid problems with checking timestamps
-## of symbolic links
-
-%reldir%/__init_qt__.oct : $(LIBOCTGUI_GRAPHICS_LIB)
-	$(AM_V_GEN)$(INSTALL_PROGRAM) %reldir%/.libs/$(shell $(SED) -n -e "s/dlname='\([^']*\)'/\1/p" < $<) $@
-
-GRAPHICS_PKG_ADD_FILE = %reldir%/PKG_ADD
-
-%reldir%/PKG_ADD: $(GRAPHICS_DEFUN_FILES) $(srcdir)/build-aux/mk-pkg-add.sh | %reldir%/$(octave_dirstamp)
-	$(AM_V_GEN)rm -f $@-t && \
-	$(SHELL) $(srcdir)/build-aux/mk-pkg-add.sh "$(srcdir)" $(GRAPHICS_DEFUN_FILES) > $@-t && \
-	mv $@-t $@
-
-OCT_FILE_PKG_ADD_FILES += \
-  $(GRAPHICS_PKG_ADD_FILE)
+noinst_LTLIBRARIES += %reldir%/libgraphics.la
 
 libgui_EXTRA_DIST += \
-  $(__init_qt___UI)
+  $(libgraphics_UI)
 
 libgui_CLEANFILES += \
   $(GRAPHICS_OCT_FILES) \
   $(GRAPHICS_PKG_ADD_FILE) \
-  $(__init_qt___MOC) \
-  $(__init_qt___UI_H)
+  $(libgraphics_MOC) \
+  $(libgraphics_UI_H)
 
 endif
--- a/libgui/module.mk	Tue Nov 05 13:28:45 2019 -0500
+++ b/libgui/module.mk	Tue Nov 05 18:23:20 2019 -0500
@@ -53,6 +53,7 @@
 
 %canon_reldir%_liboctgui_la_LIBADD = \
   %reldir%/qterminal/libqterminal.la \
+  %reldir%/graphics/libgraphics.la \
   %reldir%/src/libgui-src.la \
   libinterp/liboctinterp.la \
   liboctave/liboctave.la \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgui/src/graphics-init.cc	Tue Nov 05 18:23:20 2019 -0500
@@ -0,0 +1,76 @@
+/*
+
+Copyright (C) 2019 John W. Eaton
+
+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 <QApplication>
+#include <QMetaType>
+#include <QThread>
+
+#include "graphics-init.h"
+#include "octave-qobject.h"
+#include "qt-graphics-toolkit.h"
+#include "QtHandlesUtils.h"
+
+#include "graphics.h"
+#include "gtk-manager.h"
+#include "interpreter.h"
+
+namespace octave
+{
+  void graphics_init (interpreter& interp, base_qobject& oct_qobj)
+  {
+#if defined (HAVE_QT_GRAPHICS)
+
+    gh_manager& gh_mgr = interp.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 (interp, oct_qobj);
+
+    if (QThread::currentThread ()
+        != QApplication::instance ()->thread ())
+      qt_gtk->moveToThread (QApplication::instance ()->thread ());
+
+    graphics_toolkit tk (qt_gtk);
+
+    octave::gtk_manager& gtk_mgr = interp.get_gtk_manager ();
+
+    gtk_mgr.register_toolkit ("qt");
+
+    gtk_mgr.load_toolkit (tk);
+
+#else
+
+    octave_unused_parameter (interp);
+    octave_unused_parameter (oct_qobj);
+
+#endif
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgui/src/graphics-init.h	Tue Nov 05 18:23:20 2019 -0500
@@ -0,0 +1,39 @@
+/*
+
+Copyright (C) 2019 John W. Eaton
+
+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 (octave_graphics_init_h)
+#define octave_graphics_init_h 1
+
+#include <QObject>
+
+#include "qt-interpreter-events.h"
+
+namespace octave
+{
+  class interpreter;
+
+  class base_qobject;
+
+  extern void graphics_init (interpreter& interp, base_qobject& oct_qobj);
+}
+
+#endif
--- a/libgui/src/interpreter-qobject.cc	Tue Nov 05 13:28:45 2019 -0500
+++ b/libgui/src/interpreter-qobject.cc	Tue Nov 05 18:23:20 2019 -0500
@@ -30,6 +30,7 @@
 #include "qt-application.h"
 #include "qt-interpreter-events.h"
 
+#include "graphics-init.h"
 #include "input.h"
 #include "interpreter.h"
 
@@ -77,6 +78,8 @@
 
             emit octave_ready_signal ();
 
+            graphics_init (interp, m_octave_qobj);
+
             // Start executing commands in the command window.
 
             exit_status = interp.execute ();
--- a/libgui/src/module.mk	Tue Nov 05 13:28:45 2019 -0500
+++ b/libgui/src/module.mk	Tue Nov 05 18:23:20 2019 -0500
@@ -203,6 +203,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 \
@@ -241,6 +242,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 \
@@ -284,6 +286,7 @@
   @QT_CPPFLAGS@ \
   -I$(srcdir)/libgui/qterminal/libqterminal \
   -Ilibgui/src -I$(srcdir)/libgui/src \
+  -Ilibgui/graphics -I$(srcdir)/libgui/graphics \
   -I$(srcdir)/%reldir%/m-editor \
   -Iliboctave \
   -I$(srcdir)/liboctave/array \