Keep fullscreen window aspect ratio, with opaque window padding on X11. Use bilinear filtering for XRender blits.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/window.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index b99c96f644b..404c308bf4e 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -475,12 +475,13 @@ static int get_window_attributes( struct x11drv_win_data *data, XSetWindowAttrib attr->bit_gravity = NorthWestGravity; attr->backing_store = NotUseful; attr->border_pixel = 0; + attr->background_pixel = 0; attr->event_mask = (ExposureMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | EnterWindowMask | KeyPressMask | KeyReleaseMask | FocusChangeMask | KeymapStateMask | StructureNotifyMask | PropertyChangeMask);
- return (CWOverrideRedirect | CWSaveUnder | CWColormap | CWBorderPixel | + return (CWOverrideRedirect | CWSaveUnder | CWColormap | CWBorderPixel | CWBackPixel | CWEventMask | CWBitGravity | CWBackingStore); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 4eeb999c891..01342cd4c9f 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2512,11 +2512,19 @@ RECT map_rect_virt_to_raw( RECT rect, UINT dpi_from ) struct window_rects map_window_rects_virt_to_raw( struct window_rects rects, UINT dpi_from ) { struct monitor *monitor; + RECT rect, monitor_rect; + BOOL is_fullscreen;
if (!lock_display_devices()) return rects; if ((monitor = get_monitor_from_rect( rects.window, MONITOR_DEFAULTTONEAREST, dpi_from, MDT_DEFAULT ))) { - rects.visible = map_monitor_rect( monitor, rects.visible, dpi_from, MDT_DEFAULT, 0, MDT_RAW_DPI ); + /* if the visible rect is fullscreen, make it cover the full raw monitor, regardless of aspect ratio */ + monitor_rect = monitor_get_rect( monitor, dpi_from, MDT_DEFAULT ); + + is_fullscreen = intersect_rect( &rect, &monitor_rect, &rects.visible ) && EqualRect( &rect, &monitor_rect ); + if (is_fullscreen) rects.visible = monitor_get_rect( monitor, 0, MDT_RAW_DPI ); + else rects.visible = map_monitor_rect( monitor, rects.visible, dpi_from, MDT_DEFAULT, 0, MDT_RAW_DPI ); + rects.window = map_monitor_rect( monitor, rects.window, dpi_from, MDT_DEFAULT, 0, MDT_RAW_DPI ); rects.client = map_monitor_rect( monitor, rects.client, dpi_from, MDT_DEFAULT, 0, MDT_RAW_DPI ); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xrender.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index a59653871fd..bac3e6fac4b 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -177,6 +177,7 @@ MAKE_FUNCPTR(XRenderComposite) MAKE_FUNCPTR(XRenderCompositeText16) MAKE_FUNCPTR(XRenderCreateGlyphSet) MAKE_FUNCPTR(XRenderCreatePicture) +MAKE_FUNCPTR(XRenderSetPictureFilter) MAKE_FUNCPTR(XRenderFillRectangle) MAKE_FUNCPTR(XRenderFindFormat) MAKE_FUNCPTR(XRenderFindVisualFormat) @@ -332,6 +333,7 @@ const struct gdi_dc_funcs *X11DRV_XRender_Init(void) LOAD_FUNCPTR(XRenderCompositeText16); LOAD_FUNCPTR(XRenderCreateGlyphSet); LOAD_FUNCPTR(XRenderCreatePicture); + LOAD_FUNCPTR(XRenderSetPictureFilter); LOAD_FUNCPTR(XRenderFillRectangle); LOAD_FUNCPTR(XRenderFindFormat); LOAD_FUNCPTR(XRenderFindVisualFormat); @@ -1493,6 +1495,7 @@ static void xrender_blit( int op, Picture src_pict, Picture mask_pict, Picture d y_offset = y_src; set_xrender_transformation(src_pict, 1, 1, 0, 0); } + pXRenderSetPictureFilter( gdi_display, src_pict, FilterBilinear, 0, 0 ); pXRenderComposite( gdi_display, op, src_pict, mask_pict, dst_pict, x_offset, y_offset, 0, 0, x_dst, y_dst, width_dst, height_dst ); }