From 06db2cc40c59daa1f29b8a2a375285030439d823 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Fri, 15 Apr 2022 12:09:38 +0900 Subject: [PATCH] [AT-SPI] Emit WindowEvent::DESTROY AT client needs to know that a window is destroyed. Change-Id: Id64d31b3a69a7465e8eb382ab6ed2db9b1788007 --- dali/internal/accessibility/bridge/bridge-impl.cpp | 5 +++++ dali/internal/accessibility/bridge/bridge-object.h | 2 +- dali/internal/window-system/common/window-impl.cpp | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 0cf7d17..6d96eea 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -272,6 +272,11 @@ public: { if(mData) { + // The ~Window() after this point cannot emit DESTROY, because Bridge is not available. So emit DESTROY here. + for(auto windowAccessible : mApplication.mChildren) + { + BridgeObject::Emit(windowAccessible, WindowEvent::DESTROY); + } mData->mCurrentlyHighlightedActor = {}; mData->mHighlightActor = {}; } diff --git a/dali/internal/accessibility/bridge/bridge-object.h b/dali/internal/accessibility/bridge/bridge-object.h index 7d402b1..9784469 100644 --- a/dali/internal/accessibility/bridge/bridge-object.h +++ b/dali/internal/accessibility/bridge/bridge-object.h @@ -68,7 +68,7 @@ protected: /** * @copydoc Dali::Accessibility::Bridge::Emit() */ - void Emit(Dali::Accessibility::Accessible* obj, Dali::Accessibility::WindowEvent event, unsigned int detail) override; + void Emit(Dali::Accessibility::Accessible* obj, Dali::Accessibility::WindowEvent event, unsigned int detail = 0) override; /** * @copydoc Dali::Accessibility::Bridge::Emit() diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 545b382..e0a6cc5 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -107,6 +107,8 @@ Window::~Window() auto rootLayer = mScene.GetRootLayer(); auto accessible = Accessibility::Accessible::Get(rootLayer, true); bridge->RemoveTopLevelWindow(accessible); + // Related to multi-window case. This is called for default window and non-default window, but it is effective for non-default window. + bridge->Emit(accessible, Accessibility::WindowEvent::DESTROY); } if(mAdaptor) -- 2.7.4