From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/init.c | 62 +++++++++++++++++++++++++++++++++++++ dlls/winex11.drv/opengl.c | 64 --------------------------------------- dlls/winex11.drv/x11drv.h | 5 +++ 3 files changed, 67 insertions(+), 64 deletions(-)
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index ea19be92b74..e7a6132fd87 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -194,6 +194,68 @@ static HFONT X11DRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) return dev->funcs->pSelectFont( dev, hfont, aa_flags ); }
+BOOL needs_offscreen_rendering( HWND hwnd, BOOL known_child ) +{ + if (NtUserGetDpiForWindow( hwnd ) != get_win_monitor_dpi( hwnd )) return TRUE; /* needs DPI scaling */ + if (NtUserGetAncestor( hwnd, GA_PARENT ) != NtUserGetDesktopWindow()) return TRUE; /* child window, needs compositing */ + if (NtUserGetWindowRelative( hwnd, GW_CHILD )) return TRUE; /* window has children, needs compositing */ + if (known_child) return TRUE; /* window is/have children, needs compositing */ + return FALSE; +} + +void set_dc_drawable( HDC hdc, Drawable drawable, const RECT *rect, int mode ) +{ + struct x11drv_escape_set_drawable escape = + { + .code = X11DRV_SET_DRAWABLE, + .drawable = drawable, + .dc_rect = *rect, + .mode = mode, + }; + NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); +} + +Drawable get_dc_drawable( HDC hdc, RECT *rect ) +{ + struct x11drv_escape_get_drawable escape = {.code = X11DRV_GET_DRAWABLE}; + NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, sizeof(escape), (LPSTR)&escape ); + *rect = escape.dc_rect; + return escape.drawable; +} + +HRGN get_dc_monitor_region( HWND hwnd, HDC hdc ) +{ + RGNDATA *data; + UINT i, size; + HRGN region; + POINT pt; + + if (!(region = NtGdiCreateRectRgn( 0, 0, 0, 0 ))) return 0; + if (NtGdiGetRandomRgn( hdc, region, SYSRGN ) <= 0) goto failed; + if (!(size = NtGdiGetRegionData( region, 0, NULL ))) goto failed; + if (!(data = malloc( size ))) goto failed; + NtGdiGetRegionData( region, size, data ); + NtGdiDeleteObjectApp( region ); + + NtGdiGetDCPoint( hdc, NtGdiGetDCOrg, &pt ); + NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, &pt ); + for (i = 0; i < data->rdh.nCount; i++) + { + RECT *rect = (RECT *)data->Buffer + i; + NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->left ); + NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->right ); + OffsetRect( rect, -pt.x, -pt.y ); + } + + region = NtGdiExtCreateRegion( NULL, size, data ); + free( data ); + return region; + +failed: + NtGdiDeleteObjectApp( region ); + return 0; +} + /********************************************************************** * ExtEscape (X11DRV.@) */ diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index eee57f6b804..53bad9efb23 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1090,29 +1090,6 @@ static GLXContext create_glxcontext(Display *display, struct wgl_context *contex return ctx; }
-static void set_dc_drawable( HDC hdc, Drawable drawable, const RECT *rect, int mode ) -{ - struct x11drv_escape_set_drawable escape = - { - .code = X11DRV_SET_DRAWABLE, - .drawable = drawable, - .dc_rect = *rect, - .mode = mode, - }; - NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); -} - -static BOOL needs_offscreen_rendering( HWND hwnd, BOOL known_child ) -{ - if (NtUserGetDpiForWindow( hwnd ) != get_win_monitor_dpi( hwnd )) return TRUE; - - if (!known_child && !NtUserGetWindowRelative( hwnd, GW_CHILD ) && - NtUserGetAncestor( hwnd, GA_PARENT ) == NtUserGetDesktopWindow()) - return FALSE; /* childless top-level window */ - - return TRUE; -} - /*********************************************************************** * create_gl_drawable */ @@ -1865,47 +1842,6 @@ static BOOL glxdrv_wglShareLists(struct wgl_context *org, struct wgl_context *de return TRUE; }
-static Drawable get_dc_drawable( HDC hdc, RECT *rect ) -{ - struct x11drv_escape_get_drawable escape = {.code = X11DRV_GET_DRAWABLE}; - NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, sizeof(escape), (LPSTR)&escape ); - *rect = escape.dc_rect; - return escape.drawable; -} - -static HRGN get_dc_monitor_region( HWND hwnd, HDC hdc ) -{ - RGNDATA *data; - UINT i, size; - HRGN region; - POINT pt; - - if (!(region = NtGdiCreateRectRgn( 0, 0, 0, 0 ))) return 0; - if (NtGdiGetRandomRgn( hdc, region, SYSRGN ) <= 0) goto failed; - if (!(size = NtGdiGetRegionData( region, 0, NULL ))) goto failed; - if (!(data = malloc( size ))) goto failed; - NtGdiGetRegionData( region, size, data ); - NtGdiDeleteObjectApp( region ); - - NtGdiGetDCPoint( hdc, NtGdiGetDCOrg, &pt ); - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, &pt ); - for (i = 0; i < data->rdh.nCount; i++) - { - RECT *rect = (RECT *)data->Buffer + i; - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->left ); - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->right ); - OffsetRect( rect, -pt.x, -pt.y ); - } - - region = NtGdiExtCreateRegion( NULL, size, data ); - free( data ); - return region; - -failed: - NtGdiDeleteObjectApp( region ); - return 0; -} - static void present_gl_drawable( HWND hwnd, HDC hdc, struct gl_drawable *gl, BOOL flush ) { HWND toplevel = NtUserGetAncestor( hwnd, GA_ROOT ); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index bffcd196d04..10257898a76 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -353,6 +353,11 @@ struct x11drv_escape_get_drawable RECT dc_rect; /* DC rectangle relative to drawable */ };
+extern BOOL needs_offscreen_rendering( HWND hwnd, BOOL known_child ); +extern void set_dc_drawable( HDC hdc, Drawable drawable, const RECT *rect, int mode ); +extern Drawable get_dc_drawable( HDC hdc, RECT *rect ); +extern HRGN get_dc_monitor_region( HWND hwnd, HDC hdc ); + /************************************************************************** * X11 USER driver */