Module: wine Branch: master Commit: 84102e758f19edb5a03b3d1cbda4c508a010ac7b URL: http://source.winehq.org/git/wine.git/?a=commit;h=84102e758f19edb5a03b3d1cbd...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Oct 4 20:41:11 2010 +0200
winex11: Mirror the DC exposure region for RTL devices.
---
dlls/winex11.drv/init.c | 20 +++++++++++--------- dlls/winex11.drv/x11drv.h | 8 ++++++++ 2 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 1462b5e..7df6fe2 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -388,18 +388,20 @@ INT CDECL X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, L if (event.type == NoExpose) break; if (event.type == GraphicsExpose) { - int x = event.xgraphicsexpose.x - physDev->dc_rect.left; - int y = event.xgraphicsexpose.y - physDev->dc_rect.top; + RECT rect;
- TRACE( "got %d,%d %dx%d count %d\n", x, y, - event.xgraphicsexpose.width, - event.xgraphicsexpose.height, + rect.left = event.xgraphicsexpose.x - physDev->dc_rect.left; + rect.top = event.xgraphicsexpose.y - physDev->dc_rect.top; + rect.right = rect.left + event.xgraphicsexpose.width; + rect.bottom = rect.top + event.xgraphicsexpose.height; + if (GetLayout( physDev->hdc ) & LAYOUT_RTL) + mirror_rect( &physDev->dc_rect, &rect ); + + TRACE( "got %s count %d\n", wine_dbgstr_rect(&rect), event.xgraphicsexpose.count );
- if (!tmp) tmp = CreateRectRgn( 0, 0, 0, 0 ); - SetRectRgn( tmp, x, y, - x + event.xgraphicsexpose.width, - y + event.xgraphicsexpose.height ); + if (!tmp) tmp = CreateRectRgnIndirect( &rect ); + else SetRectRgn( tmp, rect.left, rect.top, rect.right, rect.bottom ); if (hrgn) CombineRgn( hrgn, hrgn, tmp, RGN_OR ); else { diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 3590d44..a4b9d76 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -777,6 +777,14 @@ extern void update_user_time( Time time ); extern void update_net_wm_states( Display *display, struct x11drv_win_data *data ); extern void make_window_embedded( Display *display, struct x11drv_win_data *data );
+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; +} + /* X context to associate a hwnd to an X window */ extern XContext winContext;