Module: wine Branch: master Commit: 395928dfb17a1e73a1d11acbdd27deecd48655d6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=395928dfb17a1e73a1d11acbdd...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jan 23 16:30:18 2008 +0100
winex11: Apply the existing window region (if any) when creating the whole window.
Move X11DRV_SetWindowRgn to window.c.
---
dlls/winex11.drv/window.c | 71 +++++++++++++++++++++++++++++++++++++++++++++ dlls/winex11.drv/winpos.c | 56 ----------------------------------- 2 files changed, 71 insertions(+), 56 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 015a57b..fd05cc9 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -32,6 +32,9 @@ #include <X11/Xlib.h> #include <X11/Xresource.h> #include <X11/Xutil.h> +#ifdef HAVE_LIBXSHAPE +#include <X11/extensions/shape.h> +#endif /* HAVE_LIBXSHAPE */
#include "windef.h" #include "winbase.h" @@ -222,6 +225,41 @@ void X11DRV_sync_window_style( Display *display, struct x11drv_win_data *data )
/*********************************************************************** + * sync_window_region + * + * Update the X11 window region. + */ +static void sync_window_region( Display *display, struct x11drv_win_data *data, HRGN hrgn ) +{ +#ifdef HAVE_LIBXSHAPE + if (!data->whole_window) return; + + if (!hrgn) + { + wine_tsx11_lock(); + XShapeCombineMask( display, data->whole_window, ShapeBounding, 0, 0, None, ShapeSet ); + wine_tsx11_unlock(); + } + else + { + RGNDATA *pRegionData = X11DRV_GetRegionData( hrgn, 0 ); + if (pRegionData) + { + wine_tsx11_lock(); + XShapeCombineRectangles( display, data->whole_window, ShapeBounding, + data->window_rect.left - data->whole_rect.left, + data->window_rect.top - data->whole_rect.top, + (XRectangle *)pRegionData->Buffer, + pRegionData->rdh.nCount, ShapeSet, YXBanded ); + wine_tsx11_unlock(); + HeapFree(GetProcessHeap(), 0, pRegionData); + } + } +#endif /* HAVE_LIBXSHAPE */ +} + + +/*********************************************************************** * X11DRV_set_win_format */ BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id ) @@ -1013,6 +1051,7 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat int cx, cy, mask; XSetWindowAttributes attr; XIM xim; + HRGN hrgn;
if (!(cx = data->window_rect.right - data->window_rect.left)) cx = 1; if (!(cy = data->window_rect.bottom - data->window_rect.top)) cy = 1; @@ -1051,6 +1090,13 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat X11DRV_set_wm_hints( display, data );
SetPropA( data->hwnd, whole_window_prop, (HANDLE)data->whole_window ); + + /* set the window region */ + if ((hrgn = CreateRectRgn( 0, 0, 0, 0 ))) + { + if (GetWindowRgn( data->hwnd, hrgn ) != ERROR) sync_window_region( display, data, hrgn ); + DeleteObject( hrgn ); + } return data->whole_window; }
@@ -1619,3 +1665,28 @@ void X11DRV_SetWindowIcon( HWND hwnd, UINT type, HICON icon ) wine_tsx11_unlock(); } } + + +/*********************************************************************** + * SetWindowRgn (X11DRV.@) + * + * Assign specified region to window (for non-rectangular windows) + */ +int X11DRV_SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) +{ + struct x11drv_win_data *data; + + if ((data = X11DRV_get_win_data( hwnd ))) + { + sync_window_region( thread_display(), data, hrgn ); + invalidate_dce( hwnd, &data->window_rect ); + } + else if (GetWindowThreadProcessId( hwnd, NULL ) != GetCurrentThreadId()) + { + FIXME( "not supported on other thread window %p\n", hwnd ); + SetLastError( ERROR_INVALID_WINDOW_HANDLE ); + return FALSE; + } + + return TRUE; +} diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c index 36cab19..08baa65 100644 --- a/dlls/winex11.drv/winpos.c +++ b/dlls/winex11.drv/winpos.c @@ -23,9 +23,6 @@
#include <X11/Xlib.h> #include <X11/Xutil.h> -#ifdef HAVE_LIBXSHAPE -#include <X11/extensions/shape.h> -#endif /* HAVE_LIBXSHAPE */ #include <stdarg.h>
#include "windef.h" @@ -1029,59 +1026,6 @@ void X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev )
/*********************************************************************** - * SetWindowRgn (X11DRV.@) - * - * Assign specified region to window (for non-rectangular windows) - */ -int X11DRV_SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) -{ - struct x11drv_win_data *data; - - if (!(data = X11DRV_get_win_data( hwnd ))) - { - if (IsWindow( hwnd )) - FIXME( "not supported on other thread window %p\n", hwnd ); - SetLastError( ERROR_INVALID_WINDOW_HANDLE ); - return FALSE; - } - -#ifdef HAVE_LIBXSHAPE - if (data->whole_window) - { - Display *display = thread_display(); - - if (!hrgn) - { - wine_tsx11_lock(); - XShapeCombineMask( display, data->whole_window, - ShapeBounding, 0, 0, None, ShapeSet ); - wine_tsx11_unlock(); - } - else - { - RGNDATA *pRegionData = X11DRV_GetRegionData( hrgn, 0 ); - if (pRegionData) - { - wine_tsx11_lock(); - XShapeCombineRectangles( display, data->whole_window, ShapeBounding, - data->window_rect.left - data->whole_rect.left, - data->window_rect.top - data->whole_rect.top, - (XRectangle *)pRegionData->Buffer, - pRegionData->rdh.nCount, - ShapeSet, YXBanded ); - wine_tsx11_unlock(); - HeapFree(GetProcessHeap(), 0, pRegionData); - } - } - } -#endif /* HAVE_LIBXSHAPE */ - - invalidate_dce( hwnd, &data->window_rect ); - return TRUE; -} - - -/*********************************************************************** * draw_moving_frame * * Draw the frame used when moving or resizing window.