X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fwindow-system%2Fcommon%2Fwindow-impl.cpp;h=f6c4c62d916cc7f135447b29edba7d28d5451e5c;hb=9112005f3adf24ccb219fe6bca4401e42a5ccf4f;hp=44f8b66bf110451513cabc6c83d3e9bb4518e226;hpb=cb3eac000069a449cc32987911322d91ffdf9b57;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 44f8b66..f6c4c62 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -79,6 +79,7 @@ Window::Window() mIsFocusAcceptable(true), mIconified(false), mOpaqueState(false), + mWindowRotationAcknowledgement(false), mParentWindow(NULL), mPreferredAngle(static_cast(WindowOrientation::NO_ORIENTATION_PREFERENCE)), mRotationAngle(0), @@ -91,19 +92,20 @@ Window::Window() mResizeSignal(), mVisibilityChangedSignal(), mTransitionEffectEventSignal(), - mKeyboardRepeatSettingsChangedSignal() + mKeyboardRepeatSettingsChangedSignal(), + mAuxiliaryMessageSignal() { } Window::~Window() { + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + 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); } @@ -141,6 +143,7 @@ void Window::Initialize(Any surface, const PositionSize& positionSize, const std mWindowBase->KeyboardRepeatSettingsChangedSignal().Connect(this, &Window::OnKeyboardRepeatSettingsChanged); mWindowBase->WindowRedrawRequestSignal().Connect(this, &Window::OnWindowRedrawRequest); mWindowBase->UpdatePositionSizeSignal().Connect(this, &Window::OnUpdatePositionSize); + mWindowBase->AuxiliaryMessageSignal().Connect(this, &Window::OnAuxiliaryMessage); mWindowSurface->OutputTransformedSignal().Connect(this, &Window::OnOutputTransformed); @@ -170,11 +173,15 @@ 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); bridge->AddTopLevelWindow(accessible); + bridge->EnabledSignal().Connect(this, &Window::OnAccessibilityEnabled); + bridge->DisabledSignal().Connect(this, &Window::OnAccessibilityDisabled); + // If you call the 'Show' before creating the adaptor, the application cannot know the app resource id. // The show must be called after the adaptor is initialized. Show(); @@ -433,11 +440,11 @@ void Window::Show() if(!mIconified) { - WindowVisibilityObserver* observer(mAdaptor); - observer->OnWindowShown(); - Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); + + WindowVisibilityObserver* observer(mAdaptor); + observer->OnWindowShown(); } mSurface->SetFullSwapNextFrame(); @@ -453,11 +460,11 @@ void Window::Hide() if(!mIconified) { - WindowVisibilityObserver* observer(mAdaptor); - observer->OnWindowHidden(); - Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, false); + + WindowVisibilityObserver* observer(mAdaptor); + observer->OnWindowHidden(); } DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), Hide(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible); @@ -506,9 +513,11 @@ unsigned int Window::GetAuxiliaryHintId(const std::string& hint) const void Window::SetInputRegion(const Rect& inputRegion) { - mWindowBase->SetInputRegion(inputRegion); + Rect convertRegion = RecalculateRect(inputRegion); - DALI_LOG_INFO(gWindowLogFilter, Debug::Verbose, "Window::SetInputRegion: x = %d, y = %d, w = %d, h = %d\n", inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height); + DALI_LOG_INFO(gWindowLogFilter, Debug::Verbose, "Window (%p), WinId (%d), SetInputRegion, RecalculateRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, convertRegion.x, convertRegion.y, convertRegion.width, convertRegion.height); + + mWindowBase->SetInputRegion(convertRegion); } void Window::SetType(WindowType type) @@ -711,11 +720,11 @@ void Window::OnIconifyChanged(bool iconified) if(mVisible) { - WindowVisibilityObserver* observer(mAdaptor); - observer->OnWindowHidden(); - Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, false); + + WindowVisibilityObserver* observer(mAdaptor); + observer->OnWindowHidden(); } DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), Iconified: visible = %d\n", this, mNativeWindowId, mVisible); @@ -726,11 +735,11 @@ void Window::OnIconifyChanged(bool iconified) if(mVisible) { - WindowVisibilityObserver* observer(mAdaptor); - observer->OnWindowShown(); - Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); + + WindowVisibilityObserver* observer(mAdaptor); + observer->OnWindowShown(); } DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), Deiconified: visible = %d\n", this, mNativeWindowId, mVisible); @@ -750,11 +759,11 @@ void Window::OnFocusChanged(bool focusIn) { if(focusIn) { - bridge->ApplicationShown(); + bridge->WindowFocused(handle); } else { - bridge->ApplicationHidden(); + bridge->WindowUnfocused(handle); } } } @@ -854,6 +863,27 @@ void Window::OnResume() mSurface->SetFullSwapNextFrame(); } +void Window::OnAuxiliaryMessage(const std::string& key, const std::string& value, const Property::Array& options) +{ + mAuxiliaryMessageSignal.Emit(key, value, options); +} + +void Window::OnAccessibilityEnabled() +{ + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + bridge->AddTopLevelWindow(accessible); +} + +void Window::OnAccessibilityDisabled() +{ + auto bridge = Accessibility::Bridge::GetCurrentBridge(); + auto rootLayer = mScene.GetRootLayer(); + auto accessible = Accessibility::Accessible::Get(rootLayer, true); + bridge->RemoveTopLevelWindow(accessible); +} + void Window::RecalculateTouchPosition(Integration::Point& point) { Vector2 position = point.GetScreenPosition(); @@ -917,13 +947,28 @@ void Window::SetParent(Dali::Window& parent) { Dali::DevelWindow::Unparent(parent); } - mWindowBase->SetParent(GetImplementation(mParentWindow).mWindowBase); + mWindowBase->SetParent(GetImplementation(mParentWindow).mWindowBase, false); + } +} + +void Window::SetParent(Dali::Window& parent, bool belowParent) +{ + if(DALI_UNLIKELY(parent)) + { + mParentWindow = parent; + Dali::Window self = Dali::Window(this); + // check circular parent window setting + if(Dali::DevelWindow::GetParent(parent) == self) + { + Dali::DevelWindow::Unparent(parent); + } + mWindowBase->SetParent(GetImplementation(mParentWindow).mWindowBase, belowParent); } } void Window::Unparent() { - mWindowBase->SetParent(nullptr); + mWindowBase->SetParent(nullptr, false); mParentWindow.Reset(); } @@ -995,6 +1040,81 @@ void Window::EnableFloatingMode(bool enable) mWindowBase->EnableFloatingMode(enable); } +Rect Window::RecalculateRect(const Rect& rect) +{ + Rect newRect; + int screenWidth, screenHeight; + + WindowSystem::GetScreenSize(screenWidth, screenHeight); + + if(mRotationAngle == 90) + { + newRect.x = rect.y; + newRect.y = screenHeight - (rect.x + rect.width); + newRect.width = rect.height; + newRect.height = rect.width; + } + else if(mRotationAngle == 180) + { + newRect.x = screenWidth - (rect.x + rect.width); + newRect.y = screenHeight - (rect.y + rect.height); + newRect.width = rect.width; + newRect.height = rect.height; + } + else if(mRotationAngle == 270) + { + newRect.x = screenWidth - (rect.y + rect.height); + newRect.y = rect.x; + newRect.width = rect.height; + newRect.height = rect.width; + } + else + { + newRect.x = rect.x; + newRect.y = rect.y; + newRect.width = rect.width; + newRect.height = rect.height; + } + return newRect; +} + +void Window::IncludeInputRegion(const Rect& inputRegion) +{ + Rect convertRegion = RecalculateRect(inputRegion); + + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), IncludeInputRegion, RecalculateRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, convertRegion.x, convertRegion.y, convertRegion.width, convertRegion.height); + mWindowBase->IncludeInputRegion(convertRegion); +} + +void Window::ExcludeInputRegion(const Rect& inputRegion) +{ + Rect convertRegion = RecalculateRect(inputRegion); + + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), ExcludeInputRegion, RecalculateRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, convertRegion.x, convertRegion.y, convertRegion.width, convertRegion.height); + mWindowBase->ExcludeInputRegion(convertRegion); +} + +void Window::SetNeedsRotationCompletedAcknowledgement(bool needAcknowledgement) +{ + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), needAcknowledgement(%d) Set needs Rotation Completed Acknowledgement\n", this, mNativeWindowId, needAcknowledgement); + mWindowSurface->SetNeedsRotationCompletedAcknowledgement(needAcknowledgement); + mWindowRotationAcknowledgement = needAcknowledgement; +} + +void Window::SendRotationCompletedAcknowledgement() +{ + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), SendRotationCompletedAcknowledgement(): orientation: %d, mWindowRotationAcknowledgement: %d\n", this, mNativeWindowId, mRotationAngle, mWindowRotationAcknowledgement); + if(mWindowRotationAcknowledgement) + { + SetRotationCompletedAcknowledgement(); + } +} + +bool Window::IsWindowRotating() const +{ + return mWindowSurface->IsWindowRotating(); +} + } // namespace Adaptor } // namespace Internal