From: Shinwoo Kim Date: Thu, 31 Mar 2022 11:02:02 +0000 (+0900) Subject: [AT-SPI] do not keep window in ApplicationAccessible X-Git-Tag: dali_2.1.17~2^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=74834c6a17f4fa7e01610a33107e8591d1586836 [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 --- diff --git a/dali/internal/accessibility/bridge/bridge-base.cpp b/dali/internal/accessibility/bridge/bridge-base.cpp index 983bbe3..9b920d8 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) @@ -186,31 +185,6 @@ Accessible* BridgeBase::FindByPath(const std::string& name) const } } -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) @@ -230,29 +204,10 @@ void BridgeBase::AddTopLevelWindow(Accessible* windowAccessible) SetIsOnRootLevel(windowAccessible); RegisterDefaultLabel(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; - } - } - UnregisterDefaultLabel(windowAccessible); for(auto i = 0u; i < mApplication.mChildren.size(); ++i) diff --git a/dali/internal/accessibility/bridge/bridge-base.h b/dali/internal/accessibility/bridge/bridge-base.h index 5e1ffca..bf2a22c 100644 --- a/dali/internal/accessibility/bridge/bridge-base.h +++ b/dali/internal/accessibility/bridge/bridge-base.h @@ -40,7 +40,6 @@ class ApplicationAccessible : public virtual Dali::Accessibility::Accessible, pu public: Dali::Accessibility::ProxyAccessible mParent; std::vector mChildren; - std::vector mWindows; std::string mName; std::string GetName() const override diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 817b445..0cf7d17 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -235,7 +235,6 @@ public: mDirectReadingClient = {}; mDirectReadingCallbacks.clear(); mApplication.mChildren.clear(); - mApplication.mWindows.clear(); ClearTimer(); } @@ -360,13 +359,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 fff3338..3e54d2c 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -81,6 +81,7 @@ Window::Window() mIconified(false), mOpaqueState(false), mWindowRotationAcknowledgement(false), + mFocused(false), mParentWindow(NULL), mPreferredAngle(static_cast(WindowOrientation::NO_ORIENTATION_PREFERENCE)), mRotationAngle(0), @@ -100,10 +101,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) { @@ -175,10 +179,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); @@ -467,6 +474,7 @@ void Window::Show() { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowShown(); @@ -487,6 +495,7 @@ void Window::Hide() { Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, false); + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowHidden(); @@ -747,6 +756,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(); @@ -762,6 +772,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(); @@ -791,6 +802,7 @@ void Window::OnFocusChanged(bool focusIn) bridge->WindowUnfocused(handle); } } + mFocused = focusIn; } void Window::OnOutputTransformed() @@ -922,6 +934,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 dff9c28..ff922c2 100644 --- a/dali/internal/window-system/common/window-impl.h +++ b/dali/internal/window-system/common/window-impl.h @@ -687,6 +687,7 @@ private: bool mIconified : 1; bool mOpaqueState : 1; bool mWindowRotationAcknowledgement : 1; + bool mFocused : 1; Dali::Window mParentWindow; OrientationPtr mOrientation;