Alexandre Julliard : user32: Add support for RTL window layouts in WIN_GetRectangles.
Alexandre Julliard
julliard at winehq.org
Wed Sep 22 14:47:55 CDT 2010
Module: wine
Branch: master
Commit: 3f026cafa5d2fa76d31e379ca1cd3e7809907594
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3f026cafa5d2fa76d31e379ca1cd3e7809907594
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 22 20:28:11 2010 +0200
user32: Add support for RTL window layouts in WIN_GetRectangles.
---
dlls/user32/win.c | 28 ++++++++++++++++++++++++++++
server/window.c | 26 ++++++++++++++++++++++++++
2 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index d691676..17925e9 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -44,6 +44,14 @@ static DWORD process_layout;
/**********************************************************************/
+static inline void mirror_rect( const RECT *window_rect, RECT *rect )
+{
+ int width = window_rect->right - window_rect->left;
+ int tmp = rect->left;
+ rect->left = width - rect->right;
+ rect->right = width - tmp;
+}
+
/* helper for Get/SetWindowLong */
static inline LONG_PTR get_win_data( const void *ptr, UINT size )
{
@@ -689,12 +697,32 @@ BOOL WIN_GetRectangles( HWND hwnd, enum coords_relative relative, RECT *rectWind
case COORDS_CLIENT:
OffsetRect( &window_rect, -win->rectClient.left, -win->rectClient.top );
OffsetRect( &client_rect, -win->rectClient.left, -win->rectClient.top );
+ if (win->dwExStyle & WS_EX_LAYOUTRTL)
+ mirror_rect( &win->rectClient, &window_rect );
break;
case COORDS_WINDOW:
OffsetRect( &window_rect, -win->rectWindow.left, -win->rectWindow.top );
OffsetRect( &client_rect, -win->rectWindow.left, -win->rectWindow.top );
+ if (win->dwExStyle & WS_EX_LAYOUTRTL)
+ mirror_rect( &win->rectWindow, &client_rect );
break;
case COORDS_PARENT:
+ if (win->parent)
+ {
+ WND *parent = WIN_GetPtr( win->parent );
+ if (parent == WND_DESKTOP) break;
+ if (!parent || parent == WND_OTHER_PROCESS)
+ {
+ WIN_ReleasePtr( win );
+ goto other_process;
+ }
+ if (parent->dwExStyle & WS_EX_LAYOUTRTL)
+ {
+ mirror_rect( &parent->rectClient, &window_rect );
+ mirror_rect( &parent->rectClient, &client_rect );
+ }
+ WIN_ReleasePtr( parent );
+ }
break;
case COORDS_SCREEN:
while (win->parent)
diff --git a/server/window.c b/server/window.c
index 8129912..ebcb5bf 100644
--- a/server/window.c
+++ b/server/window.c
@@ -905,6 +905,16 @@ static inline void offset_rect( rectangle_t *rect, int offset_x, int offset_y )
}
+/* mirror a rectangle respective to the window client area */
+static inline void mirror_rect( const rectangle_t *window_rect, rectangle_t *rect )
+{
+ int width = window_rect->right - window_rect->left;
+ int tmp = rect->left;
+ rect->left = width - rect->right;
+ rect->right = width - tmp;
+}
+
+
/* set the region to the client rect clipped by the window rect, in parent-relative coordinates */
static void set_region_client_rect( struct region *region, struct window *win )
{
@@ -2134,13 +2144,29 @@ DECL_HANDLER(get_window_rectangles)
offset_rect( &reply->window, -win->client_rect.left, -win->client_rect.top );
offset_rect( &reply->visible, -win->client_rect.left, -win->client_rect.top );
offset_rect( &reply->client, -win->client_rect.left, -win->client_rect.top );
+ if (win->ex_style & WS_EX_LAYOUTRTL)
+ {
+ mirror_rect( &win->client_rect, &reply->window );
+ mirror_rect( &win->client_rect, &reply->visible );
+ }
break;
case COORDS_WINDOW:
offset_rect( &reply->window, -win->window_rect.left, -win->window_rect.top );
offset_rect( &reply->visible, -win->window_rect.left, -win->window_rect.top );
offset_rect( &reply->client, -win->window_rect.left, -win->window_rect.top );
+ if (win->ex_style & WS_EX_LAYOUTRTL)
+ {
+ mirror_rect( &win->window_rect, &reply->visible );
+ mirror_rect( &win->window_rect, &reply->client );
+ }
break;
case COORDS_PARENT:
+ if (win->parent && win->parent->ex_style & WS_EX_LAYOUTRTL)
+ {
+ mirror_rect( &win->parent->client_rect, &reply->window );
+ mirror_rect( &win->parent->client_rect, &reply->visible );
+ mirror_rect( &win->parent->client_rect, &reply->client );
+ }
break;
case COORDS_SCREEN:
client_to_screen_rect( win->parent, &reply->window );
More information about the wine-cvs
mailing list