From 4a2f022e97257f1e6ce3207c0bb0383b2ee56885 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 4 Apr 2024 09:53:07 +0800 Subject: [PATCH] Avoid destroying windows after they are unmapped * java/org/gnu/emacs/EmacsActivity.java (destroy): Detach from current window before calling finish. * java/org/gnu/emacs/EmacsWindow.java (reparentTo): Don't clear attachment state here... * java/org/gnu/emacs/EmacsWindowManager.java (detachWindow): ...but do so here instead. (cherry picked from commit 42c0603c7aab191c9cc15a7eca1253060ff5b71a) --- java/org/gnu/emacs/EmacsActivity.java | 12 ++++++++++++ java/org/gnu/emacs/EmacsWindow.java | 4 ---- java/org/gnu/emacs/EmacsWindowManager.java | 12 ++++++++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/java/org/gnu/emacs/EmacsActivity.java b/java/org/gnu/emacs/EmacsActivity.java index a939641a752..28bb6e4c065 100644 --- a/java/org/gnu/emacs/EmacsActivity.java +++ b/java/org/gnu/emacs/EmacsActivity.java @@ -207,6 +207,18 @@ public class EmacsActivity extends Activity public final void destroy () { + if (window != null) + { + /* Clear the window's pointer to this activity and remove the + window's view. */ + window.setConsumer (null); + + /* The window can't be iconified any longer. */ + window.noticeDeiconified (); + layout.removeView (window.view); + window = null; + } + finish (); } diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 05d55ce4e54..b0957bcab44 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -1322,10 +1322,6 @@ public final class EmacsWindow extends EmacsHandleObject manager = EmacsWindowManager.MANAGER; manager.detachWindow (EmacsWindow.this); - /* Reset window management state. */ - previouslyAttached = false; - attachmentToken = 0; - /* Also unparent this view. */ /* If the window manager is set, use that instead. */ diff --git a/java/org/gnu/emacs/EmacsWindowManager.java b/java/org/gnu/emacs/EmacsWindowManager.java index 21df77587b0..a239fdc8ac2 100644 --- a/java/org/gnu/emacs/EmacsWindowManager.java +++ b/java/org/gnu/emacs/EmacsWindowManager.java @@ -238,15 +238,19 @@ public final class EmacsWindowManager { WindowConsumer consumer; - if (window.getAttachedConsumer () != null) - { - consumer = window.getAttachedConsumer (); + /* Reset window management state. */ + window.previouslyAttached = false; + window.attachmentToken = 0; + + /* Remove WINDOW from the list of active windows. */ + windows.remove (window); + if ((consumer = window.getAttachedConsumer ()) != null) + { consumers.remove (consumer); consumer.destroy (); } - windows.remove (window); pruneWindows (); } -- 2.39.5