From: Shinwoo Kim Date: Wed, 17 Nov 2021 03:58:40 +0000 (+0900) Subject: Merge branch 'devel/master' into tizen_6.5 X-Git-Tag: submit/tizen_6.5/20211117.085954^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2eb17a0add04d011b5cac0d6513ee41c7fc89005;hp=29ac9fc0419dcae3366b84e1fdf7ff214e1eebff;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git Merge branch 'devel/master' into tizen_6.5 --- diff --git a/dali/devel-api/adaptor-framework/accessibility-impl.cpp b/dali/devel-api/adaptor-framework/accessibility-impl.cpp index 3a96638..774915f 100644 --- a/dali/devel-api/adaptor-framework/accessibility-impl.cpp +++ b/dali/devel-api/adaptor-framework/accessibility-impl.cpp @@ -593,7 +593,7 @@ void Bridge::SetIsOnRootLevel(Accessible* owner) namespace { -class NonControlAccessible : public virtual Accessible, public virtual Collection, public virtual Component +class AdaptorAccessible : public virtual Accessible, public virtual Collection, public virtual Component { protected: Dali::WeakHandle mSelf; @@ -603,7 +603,7 @@ protected: { auto handle = mSelf.GetHandle(); - // NonControlAccessible is deleted on ObjectDestroyedSignal + // AdaptorAccessible is deleted on ObjectDestroyedSignal // for the respective actor (see `nonControlAccessibles`). DALI_ASSERT_ALWAYS(handle); @@ -611,7 +611,7 @@ protected: } public: - NonControlAccessible(Dali::Actor actor, bool isRoot) + AdaptorAccessible(Dali::Actor actor, bool isRoot) : mSelf(actor), mRoot(isRoot) { @@ -772,11 +772,17 @@ public: { return {}; } -}; -using NonControlAccessiblesType = std::unordered_map >; + Dali::Actor GetInternalActor() override + { + return mSelf.GetHandle(); + } +}; // AdaptorAccessible -NonControlAccessiblesType nonControlAccessibles; +using AdaptorAccessiblesType = std::unordered_map >; + +// Save RefObject from an Actor in Accessible::Get() +AdaptorAccessiblesType gAdaptorAccessibles; std::function convertingFunctor = [](Dali::Actor) -> Accessible* { return nullptr; @@ -790,7 +796,7 @@ void Accessible::SetObjectRegistry(ObjectRegistry registry) objectRegistry = registry; } -void Accessible::RegisterControlAccessibilityGetter(std::function functor) +void Accessible::RegisterExternalAccessibleGetter(std::function functor) { convertingFunctor = functor; } @@ -805,18 +811,19 @@ Accessible* Accessible::Get(Dali::Actor actor, bool isRoot) auto accessible = convertingFunctor(actor); if(!accessible) { - if(nonControlAccessibles.empty() && objectRegistry) + if(gAdaptorAccessibles.empty() && objectRegistry) { objectRegistry.ObjectDestroyedSignal().Connect([](const Dali::RefObject* obj) { - nonControlAccessibles.erase(obj); + gAdaptorAccessibles.erase(obj); }); } - auto pair = nonControlAccessibles.emplace(&actor.GetBaseObject(), nullptr); + auto pair = gAdaptorAccessibles.emplace(&actor.GetBaseObject(), nullptr); if(pair.second) { - pair.first->second.reset(new NonControlAccessible(actor, isRoot)); + pair.first->second.reset(new AdaptorAccessible(actor, isRoot)); } accessible = pair.first->second.get(); } + return accessible; } diff --git a/dali/devel-api/adaptor-framework/accessibility-impl.h b/dali/devel-api/adaptor-framework/accessibility-impl.h index dfe1f6b..5b05489 100644 --- a/dali/devel-api/adaptor-framework/accessibility-impl.h +++ b/dali/devel-api/adaptor-framework/accessibility-impl.h @@ -35,6 +35,7 @@ //INTERNAL INCLUDES #include +#include #include namespace Dali @@ -147,13 +148,31 @@ struct DALI_ADAPTOR_API Bridge /** * @brief Notifies accessibility dbus that window has just been shown. + * + * @param[in] window The window to be shown */ - virtual void WindowShown() = 0; + virtual void WindowShown(Window window) = 0; /** * @brief Notifies accessibility dbus that window has just been hidden. + * + * @param[in] window The window to be hidden + */ + virtual void WindowHidden(Window window) = 0; + + /** + * @brief Notifies accessibility dbus that window has just been focused. + * + * @param[in] window The window to be focused + */ + virtual void WindowFocused(Window window) = 0; + + /** + * @brief Notifies accessibility dbus that window has just been out of focus. + * + * @param[in] window The window to be out of focus */ - virtual void WindowHidden() = 0; + virtual void WindowUnfocused(Window window) = 0; /** * @brief Initializes accessibility bus. @@ -364,6 +383,16 @@ struct DALI_ADAPTOR_API Bridge */ static void EnableAutoInit(); + static Signal& EnabledSignal() + { + return mEnabledSignal; + } + + static Signal& DisabledSignal() + { + return mDisabledSignal; + } + protected: struct Data { @@ -384,6 +413,9 @@ protected: inline static AutoInitState mAutoInitState = AutoInitState::ENABLED; + inline static Signal mEnabledSignal; + inline static Signal mDisabledSignal; + /** * @brief Registers accessible object to be known in bridge object. * @@ -720,6 +752,13 @@ public: virtual std::vector GetRelationSet() = 0; /** + * @brief Gets internal Actor to be saved before. + * + * @return The internal Actor + */ + virtual Dali::Actor GetInternalActor() = 0; + + /** * @brief Gets all implemented interfaces. * * @return The collection of strings with implemented interfaces @@ -736,22 +775,6 @@ public: return mIsOnRootLevel; } - /** - * @brief The method registers functor resposible for converting Actor into Accessible. - * @param functor The returning Accessible handle from Actor object - */ - static void RegisterControlAccessibilityGetter(std::function functor); - - /** - * @brief Acquires Accessible object from Actor object. - * - * @param[in] actor Actor object - * @param[in] isRoot True, if it's top level object (window) - * - * @return The handle to Accessible object - */ - static Accessible* Get(Dali::Actor actor, bool isRoot = false); - protected: Accessible(); Accessible(const Accessible&) = delete; @@ -798,12 +821,29 @@ public: */ static void SetObjectRegistry(ObjectRegistry registry); + /** + * @brief The method registers functor resposible for converting Actor into Accessible. + * @param functor The returning Accessible handle from Actor object + */ + static void RegisterExternalAccessibleGetter(std::function functor); + + /** + * @brief Acquires Accessible object from Actor object. + * + * @param[in] actor Actor object + * @param[in] isRoot True, if it's top level object (window) + * + * @return The handle to Accessible object + */ + static Accessible* Get(Dali::Actor actor, bool isRoot = false); + private: friend class Bridge; std::weak_ptr mBridgeData; bool mIsOnRootLevel = false; -}; + +}; // Accessible class /** * @brief Interface enabling to perform provided actions. @@ -1387,6 +1427,11 @@ public: return {}; } + Dali::Actor GetInternalActor() override + { + return Dali::Actor{}; + } + private: Address mAddress; }; diff --git a/dali/internal/accessibility/bridge/bridge-base.cpp b/dali/internal/accessibility/bridge/bridge-base.cpp index ee1987f..23c6c60 100644 --- a/dali/internal/accessibility/bridge/bridge-base.cpp +++ b/dali/internal/accessibility/bridge/bridge-base.cpp @@ -19,6 +19,7 @@ #include // EXTERNAL INCLUDES +#include #include #include #include @@ -30,12 +31,14 @@ using namespace Dali::Accessibility; static Dali::Timer tickTimer; -BridgeBase::~BridgeBase() +BridgeBase::BridgeBase() { } -BridgeBase::BridgeBase() +BridgeBase::~BridgeBase() { + mApplication.mChildren.clear(); + mApplication.mWindows.clear(); } void BridgeBase::AddFilteredEvent(FilteredEvents kind, Dali::Accessibility::Accessible* obj, float delay, std::function functor) @@ -217,17 +220,76 @@ void BridgeBase::RemovePopup(Accessible* object) } } -void BridgeBase::AddTopLevelWindow(Accessible* root) +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) { - mApplication.mChildren.push_back(root); - SetIsOnRootLevel(root); + if(windowAccessible->GetInternalActor() == nullptr) + { + return; + } + + // Prevent adding the default window twice. + if(!mApplication.mChildren.empty() && + mApplication.mChildren[0]->GetInternalActor() == windowAccessible->GetInternalActor()) + { + return; + } + + // 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* root) +void BridgeBase::RemoveTopLevelWindow(Accessible* windowAccessible) { + for(auto i = 0u; i < mApplication.mWindows.size(); ++i) + { + if(windowAccessible->GetInternalActor() == mApplication.mWindows[i].GetRootLayer()) + { + Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(mApplication.mWindows[i]); + 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] == root) + if(mApplication.mChildren[i] == windowAccessible) { mApplication.mChildren.erase(mApplication.mChildren.begin() + i); break; diff --git a/dali/internal/accessibility/bridge/bridge-base.h b/dali/internal/accessibility/bridge/bridge-base.h index 2c06249..62a0094 100644 --- a/dali/internal/accessibility/bridge/bridge-base.h +++ b/dali/internal/accessibility/bridge/bridge-base.h @@ -21,9 +21,11 @@ // EXTERNAL INCLUDES #include #include +#include #include // INTERNAL INCLUDES +#include #include /** @@ -34,6 +36,7 @@ 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 @@ -87,14 +90,32 @@ public: } /** - * @brief Gets the active window. + * @brief Gets the Accessible object from the window. * - * @return Null if mChildren is empty, otherwise the active window + * @param[in] window The window to find + * @return Null if mChildren is empty, otherwise the Accessible object * @note Currently, the default window would be returned when mChildren is not empty. */ - Dali::Accessibility::Accessible* GetActiveWindow() + Dali::Accessibility::Accessible* GetWindowAccessible(Dali::Window window) { - return mChildren.empty() ? nullptr : mChildren[0]; + if(mChildren.empty()) + { + return nullptr; + } + + Dali::Layer rootLayer = window.GetRootLayer(); + + // Find a child which is related to the window. + for(auto i = 0u; i < mChildren.size(); ++i) + { + if(rootLayer == mChildren[i]->GetInternalActor()) + { + return mChildren[i]; + } + } + + // If can't find its children, return the default window. + return mChildren[0]; } bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override @@ -107,6 +128,11 @@ public: return {}; } + Dali::Actor GetInternalActor() override + { + return Dali::Actor{}; + } + Dali::Accessibility::Address GetAddress() override { return {"", "root"}; @@ -170,6 +196,22 @@ public: void AddFilteredEvent(FilteredEvents kind, Dali::Accessibility::Accessible* obj, float delay, std::function functor); /** + * @brief Callback when the visibility of the window is changed. + * + * @param[in] window The window to be changed + * @param[in] visible The visibility of the window + */ + void OnWindowVisibilityChanged(Dali::Window window, bool visible); + + /** + * @brief Callback when the window focus is changed. + * + * @param[in] window The window whose focus is changed + * @param[in] focusIn Whether the focus is in/out + */ + void OnWindowFocusChanged(Dali::Window window, bool focusIn); + + /** * @copydoc Dali::Accessibility::Bridge::GetBusName() */ const std::string& GetBusName() const override; @@ -177,12 +219,12 @@ public: /** * @copydoc Dali::Accessibility::Bridge::AddTopLevelWindow() */ - void AddTopLevelWindow(Dali::Accessibility::Accessible* window) override; + void AddTopLevelWindow(Dali::Accessibility::Accessible* windowAccessible) override; /** * @copydoc Dali::Accessibility::Bridge::RemoveTopLevelWindow() */ - void RemoveTopLevelWindow(Dali::Accessibility::Accessible* window) override; + void RemoveTopLevelWindow(Dali::Accessibility::Accessible* windowAccessible) override; /** * @copydoc Dali::Accessibility::Bridge::AddPopup() diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index a4144ab..b5c275e 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -208,6 +208,8 @@ public: } mData->mCurrentlyHighlightedActor = {}; mData->mHighlightActor = {}; + + mDisabledSignal.Emit(); } mHighlightedActor = {}; mHighlightClearAction = {}; @@ -215,6 +217,8 @@ public: mRegistryClient = {}; mDirectReadingClient = {}; mDirectReadingCallbacks.clear(); + mApplication.mChildren.clear(); + mApplication.mWindows.clear(); } /** @@ -285,90 +289,149 @@ public: assert(res); mApplication.mParent.SetAddress(std::move(std::get<0>(res))); + if(mIsShown) { - EmitActivate(); + 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. } + + mEnabledSignal.Emit(); + return ForceUpResult::JUST_STARTED; } /** - * @brief Sends a signal to dbus that the default window is activated. + * @brief Sends a signal to dbus that the window is shown. * - * TODO : This is subject to change if/when we implement multi-window support. - * @see BridgeObject::Emit() + * @param[in] window The window to be shown + * @see Accessible::EmitShowing() and BridgeObject::EmitStateChanged() */ - void EmitActivate() + void EmitShown(Dali::Window window) { - auto win = mApplication.GetActiveWindow(); - if(win) + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) { - win->Emit(WindowEvent::ACTIVATE, 0); + windowAccessible->EmitShowing(true); } } /** - * @brief Sends a signal to dbus that the default window is deactivated. + * @brief Sends a signal to dbus that the window is hidden. * - * TODO : This is subject to change if/when we implement multi-window support. + * @param[in] window The window to be hidden + * @see Accessible::EmitShowing() and BridgeObject::EmitStateChanged() + */ + void EmitHidden(Dali::Window window) + { + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) + { + windowAccessible->EmitShowing(false); + } + } + + /** + * @brief Sends a signal to dbus that the window is activated. + * + * @param[in] window The window to be activated * @see BridgeObject::Emit() */ - void EmitDeactivate() + void EmitActivate(Dali::Window window) { - auto win = mApplication.GetActiveWindow(); - if(win) + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) { - win->Emit(WindowEvent::DEACTIVATE, 0); + windowAccessible->Emit(WindowEvent::ACTIVATE, 0); } } /** - * @copydoc Dali::Accessibility::Bridge::WindowHidden() + * @brief Sends a signal to dbus that the window is deactivated. + * + * @param[in] window The window to be deactivated + * @see BridgeObject::Emit() */ - void WindowHidden() override + void EmitDeactivate(Dali::Window window) { - if(mIsShown && IsUp()) + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) { - EmitDeactivate(); + windowAccessible->Emit(WindowEvent::DEACTIVATE, 0); } - mIsShown = false; } /** * @copydoc Dali::Accessibility::Bridge::WindowShown() */ - void WindowShown() override + void WindowShown(Dali::Window window) override { if(!mIsShown && IsUp()) { - EmitActivate(); + EmitShown(window); } mIsShown = true; } - void ReadAndListenProperty() + /** + * @copydoc Dali::Accessibility::Bridge::WindowHidden() + */ + void WindowHidden(Dali::Window window) override { - // read property - auto enabled = mAccessibilityStatusClient.property("ScreenReaderEnabled").get(); - if(enabled) + if(mIsShown && IsUp()) { - mIsScreenReaderEnabled = std::get<0>(enabled); + EmitHidden(window); } + mIsShown = false; + } - enabled = mAccessibilityStatusClient.property("IsEnabled").get(); - if(enabled) + /** + * @copydoc Dali::Accessibility::Bridge::WindowFocused() + */ + void WindowFocused(Dali::Window window) override + { + if(mIsShown && IsUp()) { - mIsEnabled = std::get<0>(enabled); + EmitActivate(window); } + } - if(mIsScreenReaderEnabled || mIsEnabled) + /** + * @copydoc Dali::Accessibility::Bridge::WindowUnfocused() + */ + void WindowUnfocused(Dali::Window window) override + { + if(mIsShown && IsUp()) { - ForceUp(); + EmitDeactivate(window); } + } - // listen property change - mAccessibilityStatusClient.addPropertyChangedEvent("ScreenReaderEnabled", [this](bool res) { - mIsScreenReaderEnabled = res; + void ReadIsEnabledProperty() + { + mAccessibilityStatusClient.property("IsEnabled").asyncGet([this](DBus::ValueOrError msg) { + if(!msg) + { + DALI_LOG_ERROR("Get IsEnabled property error: %s\n", msg.getError().message.c_str()); + if(msg.getError().errorType == DBus::ErrorType::INVALID_REPLY) + { + ReadIsEnabledProperty(); + } + return; + } + mIsEnabled = std::get<0>(msg); + if(mIsEnabled) + { + ForceUp(); + } + }); + } + + void ListenIsEnabledProperty() + { + mAccessibilityStatusClient.addPropertyChangedEvent("IsEnabled", [this](bool res) { + mIsEnabled = res; if(mIsScreenReaderEnabled || mIsEnabled) { ForceUp(); @@ -378,9 +441,32 @@ public: ForceDown(); } }); + } - mAccessibilityStatusClient.addPropertyChangedEvent("IsEnabled", [this](bool res) { - mIsEnabled = res; + void ReadScreenReaderEnabledProperty() + { + mAccessibilityStatusClient.property("ScreenReaderEnabled").asyncGet([this](DBus::ValueOrError msg) { + if(!msg) + { + DALI_LOG_ERROR("Get ScreenReaderEnabled property error: %s\n", msg.getError().message.c_str()); + if(msg.getError().errorType == DBus::ErrorType::INVALID_REPLY) + { + ReadScreenReaderEnabledProperty(); + } + return; + } + mIsScreenReaderEnabled = std::get<0>(msg); + if(mIsScreenReaderEnabled) + { + ForceUp(); + } + }); + } + + void ListenScreenReaderEnabledProperty() + { + mAccessibilityStatusClient.addPropertyChangedEvent("ScreenReaderEnabled", [this](bool res) { + mIsScreenReaderEnabled = res; if(mIsScreenReaderEnabled || mIsEnabled) { ForceUp(); @@ -392,6 +478,15 @@ public: }); } + void ReadAndListenProperties() + { + ReadIsEnabledProperty(); + ListenIsEnabledProperty(); + + ReadScreenReaderEnabledProperty(); + ListenScreenReaderEnabledProperty(); + } + bool InitializeAccessibilityStatusClient() { mAccessibilityStatusClient = DBus::DBusClient{A11yDbusName, A11yDbusPath, A11yDbusStatusInterface, DBus::ConnectionType::SESSION}; @@ -409,7 +504,7 @@ public: { if ( InitializeAccessibilityStatusClient() ) { - ReadAndListenProperty(); + ReadAndListenProperties(); mIdleCallback = NULL; return false; } @@ -424,7 +519,7 @@ public: { if ( InitializeAccessibilityStatusClient() ) { - ReadAndListenProperty(); + ReadAndListenProperties(); return; } @@ -538,17 +633,19 @@ void Bridge::EnableAutoInit() return; } - auto rootLayer = Dali::Stage::GetCurrent().GetRootLayer(); + auto rootLayer = Dali::Stage::GetCurrent().GetRootLayer(); // A root layer of the default window. auto window = Dali::DevelWindow::Get(rootLayer); auto applicationName = Dali::Internal::Adaptor::Adaptor::GetApplicationPackageName(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto* bridge = Bridge::GetCurrentBridge(); - bridge->AddTopLevelWindow(Dali::Accessibility::Accessible::Get(rootLayer, true)); + bridge->AddTopLevelWindow(accessible); bridge->SetApplicationName(applicationName); bridge->Initialize(); if(window && window.IsVisible()) { - bridge->WindowShown(); + bridge->WindowShown(window); } } diff --git a/dali/internal/accessibility/bridge/dbus.h b/dali/internal/accessibility/bridge/dbus.h index c983902..d43c009 100644 --- a/dali/internal/accessibility/bridge/dbus.h +++ b/dali/internal/accessibility/bridge/dbus.h @@ -471,13 +471,24 @@ void debugPrint(const char* file, size_t line, const char* format, ...); */ void setDebugPrinter(std::function); +/** + * @brief Enumeration indicatng DBus error type + */ +enum class ErrorType +{ + DEFAULT, ///< default + INVALID_REPLY ///< reply message has error +}; + struct Error { std::string message; + ErrorType errorType{ErrorType::DEFAULT}; Error() = default; - Error(std::string msg) - : message(std::move(msg)) + Error(std::string msg, ErrorType errorType = ErrorType::DEFAULT) + : message(std::move(msg)), + errorType(errorType) { assert(!message.empty()); } @@ -1842,7 +1853,7 @@ void asyncCall(CallId callId, const ConnectionState& connectionState, bool prope if(DBUS_W->eldbus_message_error_get_impl(reply, errname, errmsg)) { DBUS_DEBUG("call %d: %s: %s", callId.id, errname.c_str(), errmsg.c_str()); - callback(Error{errname + ": " + errmsg}); + callback(Error{errname + ": " + errmsg, ErrorType::INVALID_REPLY}); } else { diff --git a/dali/internal/accessibility/bridge/dummy-atspi.h b/dali/internal/accessibility/bridge/dummy-atspi.h index bcdc26a..06995b9 100644 --- a/dali/internal/accessibility/bridge/dummy-atspi.h +++ b/dali/internal/accessibility/bridge/dummy-atspi.h @@ -65,11 +65,19 @@ struct DummyBridge : Dali::Accessibility::Bridge return nullptr; } - void WindowShown() override + void WindowShown(Window window) override { } - void WindowHidden() override + void WindowHidden(Window window) override + { + } + + void WindowFocused(Window window) override + { + } + + void WindowUnfocused(Window window) override { } diff --git a/dali/internal/adaptor/common/adaptor-impl.cpp b/dali/internal/adaptor/common/adaptor-impl.cpp index e787668..feac31b 100644 --- a/dali/internal/adaptor/common/adaptor-impl.cpp +++ b/dali/internal/adaptor/common/adaptor-impl.cpp @@ -330,7 +330,6 @@ void Adaptor::AccessibilityObserver::OnAccessibleKeyEvent(const Dali::KeyEvent& Adaptor::~Adaptor() { - Accessibility::Bridge::GetCurrentBridge()->WindowHidden(); Accessibility::Bridge::GetCurrentBridge()->Terminate(); // Ensure stop status @@ -956,8 +955,6 @@ void Adaptor::RequestProcessEventsOnIdle(bool forceProcess) void Adaptor::OnWindowShown() { - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(); - if(PAUSED_WHILE_HIDDEN == mState) { // Adaptor can now be resumed @@ -988,8 +985,6 @@ void Adaptor::OnWindowShown() void Adaptor::OnWindowHidden() { - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(); - if(RUNNING == mState || READY == mState) { bool allWindowsHidden = true; diff --git a/dali/internal/adaptor/common/application-impl.cpp b/dali/internal/adaptor/common/application-impl.cpp index 1311e2a..4e08ba1 100644 --- a/dali/internal/adaptor/common/application-impl.cpp +++ b/dali/internal/adaptor/common/application-impl.cpp @@ -238,7 +238,6 @@ void Application::Quit() void Application::QuitFromMainLoop() { - Accessibility::Bridge::GetCurrentBridge()->WindowHidden(); Accessibility::Bridge::GetCurrentBridge()->Terminate(); mAdaptor->Stop(); diff --git a/dali/internal/imaging/common/loader-webp.cpp b/dali/internal/imaging/common/loader-webp.cpp index e388712..da82a89 100644 --- a/dali/internal/imaging/common/loader-webp.cpp +++ b/dali/internal/imaging/common/loader-webp.cpp @@ -130,6 +130,7 @@ bool LoadWebpHeader(const Dali::ImageLoader::Input& input, unsigned int& width, WebPAnimDecoderGetInfo(webPAnimDecoder, &webPAnimInfo); width = webPAnimInfo.canvas_width; height = webPAnimInfo.canvas_height; + ReleaseResource(webPData, webPAnimDecoder); return true; } } @@ -225,6 +226,7 @@ bool LoadBitmapFromWebp(const Dali::ImageLoader::Input& input, Dali::Devel::Pixe bitmap = Dali::Devel::PixelBuffer::New(webPAnimInfo.canvas_width, webPAnimInfo.canvas_height, Dali::Pixel::RGBA8888); const int32_t bufferSize = webPAnimInfo.canvas_width * webPAnimInfo.canvas_height * sizeof(uint32_t); memcpy(bitmap.GetBuffer(), frameBuffer, bufferSize); + ReleaseResource(webPData, webPAnimDecoder); return true; } } diff --git a/dali/internal/imaging/common/webp-loading.cpp b/dali/internal/imaging/common/webp-loading.cpp index dc758fa..707821b 100644 --- a/dali/internal/imaging/common/webp-loading.cpp +++ b/dali/internal/imaging/common/webp-loading.cpp @@ -116,7 +116,7 @@ public: { Internal::Platform::FileReader fileReader(mUrl); fp = fileReader.GetFile(); - if(fp == NULL) + if(fp == nullptr) { return false; } @@ -165,28 +165,37 @@ public: return false; } - // Moveable but not copyable - - Impl(const Impl&) = delete; - Impl& operator=(const Impl&) = delete; - Impl(Impl&&) = default; - Impl& operator=(Impl&&) = default; - - ~Impl() + void ReleaseResource() { #ifdef DALI_ANIMATED_WEBP_ENABLED - if(&mWebPData != NULL) + if(&mWebPData != nullptr) { mWebPData.bytes = nullptr; WebPDataInit(&mWebPData); } - if(mWebPAnimDecoder) + if(mWebPAnimDecoder != nullptr) { WebPAnimDecoderDelete(mWebPAnimDecoder); + mWebPAnimDecoder = nullptr; } #endif - free((void*)mBuffer); - mBuffer = nullptr; + if(mBuffer != nullptr) + { + free((void*)mBuffer); + mBuffer = nullptr; + } + } + + // Moveable but not copyable + + Impl(const Impl&) = delete; + Impl& operator=(const Impl&) = delete; + Impl(Impl&&) = default; + Impl& operator=(Impl&&) = default; + + ~Impl() + { + ReleaseResource(); } std::string mUrl; @@ -279,8 +288,9 @@ Dali::Devel::PixelBuffer WebPLoading::LoadFrame(uint32_t frameIndex) const int32_t imageBufferSize = width * height * sizeof(uint8_t) * channelNumber; memcpy(pixelBuffer.GetBuffer(), frameBuffer, imageBufferSize); free((void*)frameBuffer); - return pixelBuffer; } + mImpl->ReleaseResource(); + return pixelBuffer; } #endif diff --git a/dali/internal/imaging/tizen/native-image-source-impl-tizen.h b/dali/internal/imaging/tizen/native-image-source-impl-tizen.h index 10dd6c9..35299ba 100644 --- a/dali/internal/imaging/tizen/native-image-source-impl-tizen.h +++ b/dali/internal/imaging/tizen/native-image-source-impl-tizen.h @@ -22,6 +22,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include diff --git a/dali/internal/imaging/ubuntu-x11/native-image-source-impl-x.h b/dali/internal/imaging/ubuntu-x11/native-image-source-impl-x.h index a522fa1..6f49953 100644 --- a/dali/internal/imaging/ubuntu-x11/native-image-source-impl-x.h +++ b/dali/internal/imaging/ubuntu-x11/native-image-source-impl-x.h @@ -20,12 +20,10 @@ // EXTERNAL INCLUDES #include +#include // INTERNAL INCLUDES -#include - #include - #include namespace Dali diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 2396704..cd060f0 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -98,13 +98,13 @@ Window::Window() Window::~Window() { + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer); + bridge->RemoveTopLevelWindow(accessible); + if(mAdaptor) { - auto bridge = Accessibility::Bridge::GetCurrentBridge(); - auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer); - bridge->RemoveTopLevelWindow(accessible); - mAdaptor->RemoveWindow(this); } @@ -171,6 +171,7 @@ void Window::OnAdaptorSet(Dali::Adaptor& adaptor) mEventHandler = EventHandlerPtr(new EventHandler(mWindowSurface->GetWindowBase(), *mAdaptor)); 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); @@ -753,11 +754,11 @@ void Window::OnFocusChanged(bool focusIn) { if(focusIn) { - bridge->WindowShown(); + bridge->WindowFocused(handle); } else { - bridge->WindowHidden(); + bridge->WindowUnfocused(handle); } } } diff --git a/dali/public-api/dali-adaptor-version.cpp b/dali/public-api/dali-adaptor-version.cpp index b4b44b2..d0a3add 100644 --- a/dali/public-api/dali-adaptor-version.cpp +++ b/dali/public-api/dali-adaptor-version.cpp @@ -27,7 +27,7 @@ namespace Dali { const unsigned int ADAPTOR_MAJOR_VERSION = 2; const unsigned int ADAPTOR_MINOR_VERSION = 0; -const unsigned int ADAPTOR_MICRO_VERSION = 51; +const unsigned int ADAPTOR_MICRO_VERSION = 52; const char* const ADAPTOR_BUILD_DATE = __DATE__ " " __TIME__; #ifdef DEBUG_ENABLED diff --git a/packaging/dali-adaptor.spec b/packaging/dali-adaptor.spec index 51d32c8..a27af87 100644 --- a/packaging/dali-adaptor.spec +++ b/packaging/dali-adaptor.spec @@ -17,7 +17,7 @@ Name: dali2-adaptor Summary: The DALi Tizen Adaptor -Version: 2.0.51 +Version: 2.0.52 Release: 1 Group: System/Libraries License: Apache-2.0 and BSD-3-Clause and MIT