changeset 27822:78435ddc9f88

Implement new function "gui_mainfcn" for Matlab compatibility (bug #44282). * scripts/plot/util/gui_mainfcn.m: New function. * scripts/plot/util/module.mk: Add function to build system. * NEWS: Mention new function.
author Guillaume Flandin
date Wed, 11 Dec 2019 13:00:31 +0000
parents 9a498cde5bc5
children fa0582694fda
files NEWS scripts/plot/util/gui_mainfcn.m scripts/plot/util/module.mk
diffstat 3 files changed, 73 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Fri Dec 13 08:54:06 2019 -0800
+++ b/NEWS	Wed Dec 11 13:00:31 2019 +0000
@@ -130,6 +130,9 @@
   "Superclasslist" for Matlab compatibility.  The original name will
   exist as an alias until Octave version 8.1.
 
+- An undocumented function `gui_mainfcn` has been added, for compatibility
+  with figures created with Matlab's Guide.
+
 ### Alphabetical list of new functions added in Octave 6
 
 * `commandhistory`
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/plot/util/gui_mainfcn.m	Wed Dec 11 13:00:31 2019 +0000
@@ -0,0 +1,69 @@
+## Copyright (C) 2019 Guillaume Flandin
+##
+## This filename 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.
+## 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 filename COPYING.  If not, see
+## <https://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn  {} {[@var{@dots{}}] =} gui_mainfcn  (@var{gui_state}, @dots{})
+## Compatibility function for figures created with Matlab's Guide.
+##
+## This function is undocumented and users should not use it in new code.
+##
+## @seealso{openfig, hgload, struct2hdl}
+## @end deftypefn
+
+function varargout = gui_mainfcn (gui_state, varargin)
+
+  if (nargin == 1 || isempty (gui_state.gui_Callback))
+    ## Open figure
+    copies = ifelse (gui_state.gui_Singleton, "reuse", "new");
+    if (isempty (gui_state.gui_LayoutFcn))
+      filename = file_in_loadpath ([gui_state.gui_Name ".fig"]);
+      H = openfig (filename, copies, "invisible");
+    else
+      H = feval (gui_LayoutFcn, copies);
+    endif
+
+    ## Set figure properties from input
+    for i = 1:2:numel (varargin)
+      try
+        set (H, varargin{i}, varargin{i+1});
+      catch
+        break;
+      end_try_catch
+    endfor
+
+    ## Store graphics handles in guidata
+    handles = guihandles (H);
+    guidata (H, handles);
+
+    ## Execute opening function
+    ## FIXME: According to comments in auto-generated examples, the opening
+    ## function may block (with "uiwait").  But also the opening function should
+    ## execute just before the figure is made visible.  How is this supposed to
+    ## work?
+    feval (gui_state.gui_OpeningFcn, H, [], handles, varargin{:});
+    set (H, "visible", "on");
+    handles = guidata (H);
+
+    ## Execute output function
+    varargout{1} = feval (gui_state.gui_OutputFcn, H, [], handles);
+  else
+    [varargout{1:nargout}] = feval (gui_state.gui_Callback, varargin{2:end});
+  endif
+
+endfunction
--- a/scripts/plot/util/module.mk	Fri Dec 13 08:54:06 2019 -0800
+++ b/scripts/plot/util/module.mk	Wed Dec 11 13:00:31 2019 +0000
@@ -53,6 +53,7 @@
   %reldir%/ginput.m \
   %reldir%/graphics_toolkit.m \
   %reldir%/groot.m \
+  %reldir%/gui_mainfcn.m \
   %reldir%/hdl2struct.m \
   %reldir%/hggroup.m \
   %reldir%/hgload.m \