diff --git a/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java b/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java index beb4e0f9dfee..c2fab02e0657 100644 --- a/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java +++ b/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/cleanupaddon/CleanupAddon.java @@ -346,13 +346,16 @@ private void subscribeRenderingChanged( int visCount = modelService.countRenderableChildren(container); // Remove stacks with no visible children from the display (but not the - // model). Since event delivery is synchronous (EventBroker.send via - // EventAdmin.sendEvent and Display.syncExec), the visCount reflects - // the actual state at the time of this event and can be acted upon - // immediately without deferring via asyncExec. - if (visCount == 0 && !isLastEditorStack(container)) { - container.setToBeRendered(false); - transferPrimaryDataStackIfRemoved(container); + // model) + final MElementContainer theContainer = container; + if (visCount == 0) { + Display.getCurrent().asyncExec(() -> { + int visCount1 = modelService.countRenderableChildren(theContainer); + if (!isLastEditorStack(theContainer) && visCount1 == 0) { + theContainer.setToBeRendered(false); + transferPrimaryDataStackIfRemoved(theContainer); + } + }); } else if (container.getParent() != null) { // omit detached windows // if there are rendered elements but none are 'visible' we should // make the container invisible as well diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java index d646a2150eef..3fa7f8b7679e 100644 --- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java +++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java @@ -2445,6 +2445,9 @@ public void ensureCleanUpAddonCleansUp() { assertTrue(partStackForPartBPartC.isToBeRendered(), " PartStack with children should be rendered"); partService.hidePart(partB); + // Drain pending events between hides so that the event queue is clean + // when the second hidePart queues CleanupAddon's asyncExec for visCount==0 + contextRule.spinEventLoop(); partService.hidePart(partC); contextRule.spinEventLoop(); assertFalse(partStackForPartBPartC.isToBeRendered(),