[PATCH 6/6] winex11.drv: Support clipping full screen windows on non-primary monitors.
Zhiyi Zhang
zzhang at codeweavers.com
Tue Aug 25 02:21:03 CDT 2020
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/winex11.drv/mouse.c | 15 ++++++++++-----
dlls/winex11.drv/window.c | 2 +-
dlls/winex11.drv/x11drv.h | 7 -------
3 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index d78449c2cc7..eb5e6a6c0d4 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -548,7 +548,8 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset )
{
struct x11drv_win_data *data;
struct x11drv_thread_data *thread_data;
- RECT rect;
+ MONITORINFO monitor_info;
+ HMONITOR monitor;
DWORD style;
BOOL fullscreen;
@@ -559,21 +560,25 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset )
/* maximized windows don't count as full screen */
if ((style & WS_MAXIMIZE) && (style & WS_CAPTION) == WS_CAPTION) return FALSE;
if (!(data = get_win_data( hwnd ))) return FALSE;
- fullscreen = is_window_rect_fullscreen( &data->whole_rect );
+ fullscreen = is_window_rect_full_screen( &data->whole_rect );
release_win_data( data );
if (!fullscreen) return FALSE;
if (!(thread_data = x11drv_thread_data())) return FALSE;
if (GetTickCount() - thread_data->clip_reset < 1000) return FALSE;
if (!reset && clipping_cursor && thread_data->clip_hwnd) return FALSE; /* already clipping */
- rect = get_primary_monitor_rect();
+
+ monitor = MonitorFromWindow( hwnd, MONITOR_DEFAULTTONEAREST );
+ if (!monitor) return FALSE;
+ monitor_info.cbSize = sizeof(monitor_info);
+ if (!GetMonitorInfoW( monitor, &monitor_info )) return FALSE;
if (!grab_fullscreen)
{
RECT virtual_rect = get_virtual_screen_rect();
- if (!EqualRect( &rect, &virtual_rect )) return FALSE;
+ if (!EqualRect( &monitor_info.rcMonitor, &virtual_rect )) return FALSE;
if (is_virtual_desktop()) return FALSE;
}
TRACE( "win %p clipping fullscreen\n", hwnd );
- return grab_clipping_window( &rect );
+ return grab_clipping_window( &monitor_info.rcMonitor );
}
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 6378c9c7650..455957264bc 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2460,7 +2460,7 @@ void CDECL X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, UINT swp_flags
{
release_win_data( data );
unmap_window( hwnd );
- if (is_window_rect_fullscreen( &old_window_rect )) reset_clipping_window();
+ if (is_window_rect_full_screen( &old_window_rect )) reset_clipping_window();
if (!(data = get_win_data( hwnd ))) return;
}
}
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index ce00e6c54dd..a92c738a685 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -822,11 +822,4 @@ static inline BOOL is_window_rect_mapped( const RECT *rect )
max( rect->bottom, rect->top + 1 ) > virtual_rect.top);
}
-static inline BOOL is_window_rect_fullscreen( const RECT *rect )
-{
- RECT primary_rect = get_primary_monitor_rect();
- return (rect->left <= primary_rect.left && rect->right >= primary_rect.right &&
- rect->top <= primary_rect.top && rect->bottom >= primary_rect.bottom);
-}
-
#endif /* __WINE_X11DRV_H */
--
2.25.1
More information about the wine-devel
mailing list