changeset 27804:73b765ae3131

Better fix for error in stem callback function (bug #57391). * __stem__.m: Undo cset f78dc0d6ad2d. Set "deletefcn" property on baseline line object to point to rm_xlim_listener() which deletes the listener on the "xlim" property of the axes object in to which the stem plot is made.
author Rik <rik@octave.org>
date Wed, 11 Dec 2019 16:37:28 -0800
parents e8823425a60b
children dccc551aa83b
files scripts/plot/draw/private/__stem__.m
diffstat 1 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/draw/private/__stem__.m	Wed Dec 11 09:11:53 2019 +0100
+++ b/scripts/plot/draw/private/__stem__.m	Wed Dec 11 16:37:28 2019 -0800
@@ -155,7 +155,10 @@
 
     ## baseline listeners
     if (! isempty (h_baseline))
-      addlistener (hax, "xlim", @update_xlim);
+      fcn_handle = @update_xlim;
+      addlistener (hax, "xlim", fcn_handle);
+      set (h_baseline, "deletefcn", {@rm_xlim_listener, hax, fcn_handle});
+
       for hg = h'
         addlistener (hg, "showbaseline", @show_baseline);
         addlistener (hg, "visible", {@show_baseline, h});
@@ -362,8 +365,7 @@
 
   for i = 1 : length (kids)
     obj = get (kids(i));
-    if (strcmp (obj.type, "hggroup") && isfield (obj, "baseline")
-        && ! strcmp (obj.beingdeleted, "on"))
+    if (strcmp (obj.type, "hggroup") && isfield (obj, "baseline"))
       if (any (get (obj.baseline, "xdata") != xlim))
         set (obj.baseline, "xdata", xlim);
       endif
@@ -372,6 +374,12 @@
 
 endfunction
 
+## Good practice to remove listeners when object is deleted.
+## In this case, required to avoid error in update_xlim callback (bug #57391).
+function rm_xlim_listener (~, ~, hax, fcn_handle)
+  dellistener (hax, "xlim", fcn_handle);
+endfunction
+
 function update_baseline (h, ~, src)
 
   visible = get (h, "visible");