From e7b98d9f1c7a3c24499b84cc1a90e164560e570b Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 9 Oct 2016 15:41:42 +0200 Subject: [PATCH] Fixed obliterate for sub-menus --- src/dorkbox/systemTray/linux/GtkMenu.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/dorkbox/systemTray/linux/GtkMenu.java b/src/dorkbox/systemTray/linux/GtkMenu.java index ffba45c..24a6a27 100644 --- a/src/dorkbox/systemTray/linux/GtkMenu.java +++ b/src/dorkbox/systemTray/linux/GtkMenu.java @@ -20,6 +20,7 @@ import static dorkbox.systemTray.SystemTray.TIMEOUT; import java.io.File; import java.io.InputStream; import java.net.URL; +import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -329,11 +330,16 @@ class GtkMenu extends Menu { // have to remove all other menu entries synchronized (menuEntries) { - for (int i = 0, menuEntriesSize = menuEntries.size(); i < menuEntriesSize; i++) { - final MenuEntry menuEntry__ = menuEntries.get(i); + // a copy is made because sub-menus remove themselves from parents when .remove() is called. If we don't + // do this, errors will be had because indices don't line up anymore. + ArrayList menuEntriesCopy = new ArrayList(this.menuEntries); + + for (int i = 0, menuEntriesSize = menuEntriesCopy.size(); i < menuEntriesSize; i++) { + final MenuEntry menuEntry__ = menuEntriesCopy.get(i); menuEntry__.remove(); } - menuEntries.clear(); + this.menuEntries.clear(); + menuEntriesCopy.clear(); Gtk.gtk_widget_destroy(_native); }