Fix the calculating logic for input region when window orientation is changed.
Change-Id: I74afbe15745ac45706c31c7c39cf931d45747507
void Window::SetInputRegion(const Rect<int>& inputRegion)
{
- Rect<int> convertRegion = RecalculateRect(inputRegion);
-
- 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);
+ DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), SetInputRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height);
+ mWindowBase->SetInputRegion(inputRegion);
}
void Window::SetType(WindowType type)
mWindowBase->EnableFloatingMode(enable);
}
-Rect<int> Window::RecalculateRect(const Rect<int>& rect)
-{
- Rect<int> 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<int>& inputRegion)
{
- Rect<int> 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);
+ DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), IncludeInputRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height);
+ mWindowBase->IncludeInputRegion(inputRegion);
}
void Window::ExcludeInputRegion(const Rect<int>& inputRegion)
{
- Rect<int> 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);
+ DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), ExcludeInputRegion, (%d,%d), (%d x %d)\n", this, mNativeWindowId, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height);
+ mWindowBase->ExcludeInputRegion(inputRegion);
}
void Window::SetNeedsRotationCompletedAcknowledgement(bool needAcknowledgement)
*/
bool IsOrientationAvailable(WindowOrientation orientation) const;
- /**
- * @brief Return the rect value to recalulate with the default system coordinates.
- *
- * Some native window APIs work the geometry value based on the default system coordinates.
- * IncludeInputRegion() and ExcludeInputRegion() are one of them.
- * When the window is rotated, current window's geometry already were set with the rotated angle.
- * If IncludeInputRegion() or ExcludeInputRegion() are called with rotated angle by application,
- * the rect's area should be re-calcuated on the default system coordinates.
- *
- * @param[in] rect the window's current position and size with current window rotation angle.
- * @return the re-calculated rect on the default system coordinates.
- */
- Rect<int> RecalculateRect(const Rect<int>& rect);
-
private: // Dali::Internal::Adaptor::SceneHolder
/**
* @copydoc Dali::Internal::Adaptor::SceneHolder::OnAdaptorSet
return 0;
}
+
+Rect<int> WindowBaseEcoreWl2::RecalculateInputRect(const Rect<int>& rect)
+{
+ Rect<int> newRect;
+
+ if(mWindowRotationAngle == 90)
+ {
+ newRect.x = rect.y;
+ newRect.y = mWindowPositionSize.height - (rect.x + rect.width);
+ newRect.width = rect.height;
+ newRect.height = rect.width;
+ }
+ else if(mWindowRotationAngle == 180)
+ {
+ newRect.x = mWindowPositionSize.width - (rect.x + rect.width);
+ newRect.y = mWindowPositionSize.height - (rect.y + rect.height);
+ newRect.width = rect.width;
+ newRect.height = rect.height;
+ }
+ else if(mWindowRotationAngle == 270)
+ {
+ newRect.x = mWindowPositionSize.width - (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 WindowBaseEcoreWl2::SetInputRegion(const Rect<int>& inputRegion)
{
- DALI_LOG_RELEASE_INFO("%p, Set input rect (%d, %d, %d x %d)\n", mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height);
+ Rect<int> convertRegion = RecalculateInputRect(inputRegion);
+
Eina_Rectangle rect;
- rect.x = inputRegion.x;
- rect.y = inputRegion.y;
- rect.w = inputRegion.width;
- rect.h = inputRegion.height;
+ rect.x = convertRegion.x;
+ rect.y = convertRegion.y;
+ rect.w = convertRegion.width;
+ rect.h = convertRegion.height;
+ DALI_LOG_RELEASE_INFO("%p, Set input rect (%d, %d, %d x %d)\n", mEcoreWindow, rect.x, rect.y, rect.w, rect.h);
ecore_wl2_window_input_rect_set(mEcoreWindow, &rect);
ecore_wl2_window_commit(mEcoreWindow, EINA_TRUE);
}
void WindowBaseEcoreWl2::IncludeInputRegion(const Rect<int>& inputRegion)
{
+ Rect<int> convertRegion = RecalculateInputRect(inputRegion);
Eina_Rectangle rect;
- rect.x = inputRegion.x;
- rect.y = inputRegion.y;
- rect.w = inputRegion.width;
- rect.h = inputRegion.height;
+
+ rect.x = convertRegion.x;
+ rect.y = convertRegion.y;
+ rect.w = convertRegion.width;
+ rect.h = convertRegion.height;
DALI_LOG_RELEASE_INFO("%p, Add input_rect(%d, %d, %d x %d)\n", mEcoreWindow, rect.x, rect.y, rect.w, rect.h);
ecore_wl2_window_input_rect_add(mEcoreWindow, &rect);
void WindowBaseEcoreWl2::ExcludeInputRegion(const Rect<int>& inputRegion)
{
+ Rect<int> convertRegion = RecalculateInputRect(inputRegion);
Eina_Rectangle rect;
- rect.x = inputRegion.x;
- rect.y = inputRegion.y;
- rect.w = inputRegion.width;
- rect.h = inputRegion.height;
+
+ rect.x = convertRegion.x;
+ rect.y = convertRegion.y;
+ rect.w = convertRegion.width;
+ rect.h = convertRegion.height;
DALI_LOG_RELEASE_INFO("%p, Subtract input_rect(%d, %d, %d x %d)\n", mEcoreWindow, rect.x, rect.y, rect.w, rect.h);
ecore_wl2_window_input_rect_subtract(mEcoreWindow, &rect);
*/
PositionSize RecalculatePositionSizeToCurrentOrientation(PositionSize positionSize);
+
+ /**
+ * @brief Return the rect value to recalulate with the default system coordinates.
+ *
+ * Some native window APIs work the geometry value based on the default system coordinates.
+ * IncludeInputRegion() and ExcludeInputRegion() are one of them.
+ * When the window is rotated, current window's geometry already were set with the rotated angle.
+ * If IncludeInputRegion() or ExcludeInputRegion() are called with rotated angle by application,
+ * the rect's area should be re-calcuated on the default system coordinates.
+ *
+ * @param[in] rect the window's current position and size with current window rotation angle.
+ * @return the re-calculated rect on the default system coordinates.
+ */
+ Rect<int> RecalculateInputRect(const Rect<int>& rect);
+
protected:
// Undefined
WindowBaseEcoreWl2(const WindowBaseEcoreWl2&) = delete;