From 4142d89e56dd24cce6daad87562527b52f332301 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Thu, 31 Mar 2022 20:02:02 +0900 Subject: [PATCH] [Tizen][AT-SPI] do not keep window in ApplicationAccessible There is not a reason to keep window in ApplicationAccessible to emit window related signals. Moreover, keeping window increases the reference count. In multi window case, Window.Reset() for the second window cannot make ~Window() is called because of the reference count is not 0. Change-Id: I13f636b12c62a29dc976602446b5dc13f2b521cb --- dali/internal/accessibility/bridge/bridge-base.cpp | 46 ---------------------- dali/internal/accessibility/bridge/bridge-base.h | 1 - dali/internal/accessibility/bridge/bridge-impl.cpp | 8 ---- dali/internal/window-system/common/window-impl.cpp | 34 ++++++++++++---- dali/internal/window-system/common/window-impl.h | 1 + 5 files changed, 27 insertions(+), 63 deletions(-) diff --git a/dali/internal/accessibility/bridge/bridge-base.cpp b/dali/internal/accessibility/bridge/bridge-base.cpp index 92c2000..99f5f93 100644 --- a/dali/internal/accessibility/bridge/bridge-base.cpp +++ b/dali/internal/accessibility/bridge/bridge-base.cpp @@ -38,7 +38,6 @@ BridgeBase::BridgeBase() BridgeBase::~BridgeBase() { mApplication.mChildren.clear(); - mApplication.mWindows.clear(); } void BridgeBase::AddFilteredEvent(FilteredEvents kind, Dali::Accessibility::Accessible* obj, float delay, std::function functor) @@ -220,32 +219,6 @@ void BridgeBase::RemovePopup(Accessible* object) } } -void BridgeBase::OnWindowVisibilityChanged(Dali::Window window, bool visible) -{ - if(visible) - { - // TODO : Should we check 'out of screen' here? -> Then, we need an actor of this change. - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(window); // Called when Window is shown. - } - else - { - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(window); // Called when Window is hidden and iconified. - } - -} - -void BridgeBase::OnWindowFocusChanged(Dali::Window window, bool focusIn) -{ - if(focusIn) - { - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowFocused(window); // Called when Window is focused. - } - else - { - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowUnfocused(window); // Called when Window is out of focus. - } -} - void BridgeBase::AddTopLevelWindow(Accessible* windowAccessible) { if(windowAccessible->GetInternalActor() == nullptr) @@ -263,29 +236,10 @@ void BridgeBase::AddTopLevelWindow(Accessible* windowAccessible) // Adds Window to a list of Windows. mApplication.mChildren.push_back(windowAccessible); SetIsOnRootLevel(windowAccessible); - - Dali::Window window = Dali::DevelWindow::Get(windowAccessible->GetInternalActor()); - if(window) - { - mApplication.mWindows.push_back(window); - Dali::DevelWindow::VisibilityChangedSignal(window).Connect(this, &BridgeBase::OnWindowVisibilityChanged); - window.FocusChangeSignal().Connect(this, &BridgeBase::OnWindowFocusChanged); - } } void BridgeBase::RemoveTopLevelWindow(Accessible* windowAccessible) { - for(auto i = 0u; i < mApplication.mWindows.size(); ++i) - { - if(windowAccessible->GetInternalActor() == mApplication.mWindows[i].GetRootLayer()) - { - Dali::DevelWindow::VisibilityChangedSignal(mApplication.mWindows[i]).Disconnect(this, &BridgeBase::OnWindowVisibilityChanged); - mApplication.mWindows[i].FocusChangeSignal().Disconnect(this, &BridgeBase::OnWindowFocusChanged); - mApplication.mWindows.erase(mApplication.mWindows.begin() + i); - break; - } - } - for(auto i = 0u; i < mApplication.mChildren.size(); ++i) { if(mApplication.mChildren[i] == windowAccessible) diff --git a/dali/internal/accessibility/bridge/bridge-base.h b/dali/internal/accessibility/bridge/bridge-base.h index 74f4384..213ca77 100644 --- a/dali/internal/accessibility/bridge/bridge-base.h +++ b/dali/internal/accessibility/bridge/bridge-base.h @@ -36,7 +36,6 @@ class AppAccessible : public virtual Dali::Accessibility::Accessible, public vir public: Dali::Accessibility::EmptyAccessibleWithAddress mParent; std::vector mChildren; - std::vector mWindows; std::string mName; std::string GetName() override diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 8f72698..27525b4 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -228,7 +228,6 @@ public: mDirectReadingClient = {}; mDirectReadingCallbacks.clear(); mApplication.mChildren.clear(); - mApplication.mWindows.clear(); } void StopTimer() @@ -321,13 +320,6 @@ public: mEnabledSignal.Emit(); - if(mIsShown) - { - auto rootLayer = Dali::Stage::GetCurrent().GetRootLayer(); - auto window = Dali::DevelWindow::Get(rootLayer); - EmitActivate(window); // Currently, sends a signal that the default window is activated here. - } - return ForceUpResult::JUST_STARTED; } diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index f6c4c62..889ae26 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -80,6 +80,7 @@ Window::Window() mIconified(false), mOpaqueState(false), mWindowRotationAcknowledgement(false), + mFocused(false), mParentWindow(NULL), mPreferredAngle(static_cast(WindowOrientation::NO_ORIENTATION_PREFERENCE)), mRotationAngle(0), @@ -99,10 +100,13 @@ Window::Window() Window::~Window() { - auto bridge = Accessibility::Bridge::GetCurrentBridge(); - auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); - bridge->RemoveTopLevelWindow(accessible); + if(mScene) + { + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + bridge->RemoveTopLevelWindow(accessible); + } if(mAdaptor) { @@ -174,10 +178,13 @@ void Window::OnAdaptorSet(Dali::Adaptor& adaptor) mEventHandler->AddObserver(*this); // Add Window to bridge for ATSPI - auto bridge = Accessibility::Bridge::GetCurrentBridge(); - auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); - bridge->AddTopLevelWindow(accessible); + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + if (bridge->IsUp()) + { + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + bridge->AddTopLevelWindow(accessible); + } bridge->EnabledSignal().Connect(this, &Window::OnAccessibilityEnabled); bridge->DisabledSignal().Connect(this, &Window::OnAccessibilityDisabled); @@ -442,6 +449,7 @@ void Window::Show() { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowShown(); @@ -462,6 +470,7 @@ void Window::Hide() { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, false); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowHidden(); @@ -722,6 +731,7 @@ void Window::OnIconifyChanged(bool iconified) { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, false); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowHidden(); @@ -737,6 +747,7 @@ void Window::OnIconifyChanged(bool iconified) { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowShown(); @@ -766,6 +777,7 @@ void Window::OnFocusChanged(bool focusIn) bridge->WindowUnfocused(handle); } } + mFocused = focusIn; } void Window::OnOutputTransformed() @@ -874,6 +886,12 @@ void Window::OnAccessibilityEnabled() auto rootLayer = mScene.GetRootLayer(); auto accessible = Accessibility::Accessible::Get(rootLayer, true); bridge->AddTopLevelWindow(accessible); + + if(mFocused) + { + Dali::Window handle(this); + bridge->WindowFocused(handle); + } } void Window::OnAccessibilityDisabled() diff --git a/dali/internal/window-system/common/window-impl.h b/dali/internal/window-system/common/window-impl.h index 3ea83ab..ebf996c 100644 --- a/dali/internal/window-system/common/window-impl.h +++ b/dali/internal/window-system/common/window-impl.h @@ -672,6 +672,7 @@ private: bool mIconified : 1; bool mOpaqueState : 1; bool mWindowRotationAcknowledgement : 1; + bool mFocused : 1; Dali::Window mParentWindow; OrientationPtr mOrientation; -- 2.7.4