# HG changeset patch # User Konstantinos Poulios # Date 1299785235 -3600 # Node ID 0dda50ae4997442e3452651e88864d149e770ab1 # Parent 6a1fe83fe1296d19767c54fdd9114a7a3e29a6f0 add a persistent mode for listeners diff -r 6a1fe83fe129 -r 0dda50ae4997 src/ChangeLog --- a/src/ChangeLog Sat Feb 26 18:15:48 2011 -0500 +++ b/src/ChangeLog Thu Mar 10 20:27:15 2011 +0100 @@ -1,3 +1,11 @@ +2011-03-10 Konstantinos Poulios + + * graphics.h.in: Add PERSISTENT mode to listener_mode. + (base_property::delete_listener): Take into account persistent + mode of a listener. + * graphics.cc (addlistener, dellistener): Accept a new optional + argument for persistent listeners. + 2011-03-07 Konstantinos Poulios Bug #32482. diff -r 6a1fe83fe129 -r 0dda50ae4997 src/graphics.cc --- a/src/graphics.cc Sat Feb 26 18:15:48 2011 -0500 +++ b/src/graphics.cc Thu Mar 10 20:27:15 2011 +0100 @@ -7768,7 +7768,7 @@ octave_value retval; - if (args.length () == 3) + if (args.length () >= 3 && args.length () <= 4) { double h = args(0).double_value (); @@ -7785,6 +7785,13 @@ graphics_object go = gh_manager::get_object (gh); go.add_property_listener (pname, args(2), POSTSET); + + if (args.length () == 4) + { + caseless_str persistent = args(3).string_value (); + if (persistent.compare ("persistent")) + go.add_property_listener (pname, args(2), PERSISTENT); + } } else error ("addlistener: invalid graphics object (= %g)", @@ -7852,7 +7859,16 @@ if (args.length () == 2) go.delete_property_listener (pname, octave_value (), POSTSET); else - go.delete_property_listener (pname, args(2), POSTSET); + { + caseless_str persistent = args(2).string_value (); + if (persistent.compare ("persistent")) + { + go.delete_property_listener (pname, octave_value (), PERSISTENT); + go.delete_property_listener (pname, octave_value (), POSTSET); + } + else + go.delete_property_listener (pname, args(2), POSTSET); + } } else error ("dellistener: invalid graphics object (= %g)", diff -r 6a1fe83fe129 -r 0dda50ae4997 src/graphics.h.in --- a/src/graphics.h.in Sat Feb 26 18:15:48 2011 -0500 +++ b/src/graphics.h.in Thu Mar 10 20:27:15 2011 +0100 @@ -318,7 +318,7 @@ class property; -enum listener_mode { POSTSET }; +enum listener_mode { POSTSET, PERSISTENT }; class base_property { @@ -423,7 +423,27 @@ } } else - l.resize (0); + { + if (mode == PERSISTENT) + l.resize (0); + else + { + octave_value_list lnew (0); + octave_value_list& lp = listeners[PERSISTENT]; + for (int i = l.length () - 1; i >= 0 ; i--) + { + for (int j = 0; j < lp.length (); j++) + { + if (l(i).internal_rep () == lp(j).internal_rep ()) + { + lnew.resize (lnew.length () + 1, l(i)); + break; + } + } + } + l = lnew; + } + } }