Rémi Bernon : winex11.drv: Update devmode dmPosition instead of new_rect.
Alexandre Julliard
julliard at winehq.org
Tue Aug 2 14:54:39 CDT 2022
Module: wine
Branch: master
Commit: cd0b4393e5e0c2b7ec2e5824fb3dce44380ac401
URL: https://gitlab.winehq.org/wine/wine/-/commit/cd0b4393e5e0c2b7ec2e5824fb3dce44380ac401
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri Jul 29 11:21:09 2022 +0200
winex11.drv: Update devmode dmPosition instead of new_rect.
---
dlls/winex11.drv/display.c | 55 ++++++++++++++++++++++------------------------
1 file changed, 26 insertions(+), 29 deletions(-)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index 3319697e51f..55962138b50 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -35,7 +35,6 @@ static struct x11drv_settings_handler settings_handler;
struct x11drv_display_setting
{
ULONG_PTR id;
- RECT new_rect;
DEVMODEW desired_mode;
};
@@ -547,8 +546,9 @@ static BOOL overlap_placed_displays(const RECT *rect, const struct x11drv_displa
for (display_idx = 0; display_idx < display_count; ++display_idx)
{
+ set_rect_from_devmode(&intersect, &displays[display_idx].desired_mode);
if ((displays[display_idx].desired_mode.dmFields & DM_POSITION) &&
- intersect_rect(&intersect, &displays[display_idx].new_rect, rect))
+ intersect_rect(&intersect, &intersect, rect))
return TRUE;
}
return FALSE;
@@ -572,7 +572,8 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
/* If there is no placed and attached display, place this display as it is */
for (display_idx = 0; display_idx < display_count; ++display_idx)
{
- if ((displays[display_idx].desired_mode.dmFields & DM_POSITION) && !IsRectEmpty(&displays[display_idx].new_rect))
+ set_rect_from_devmode(&rect, &displays[display_idx].desired_mode);
+ if ((displays[display_idx].desired_mode.dmFields & DM_POSITION) && !IsRectEmpty(&rect))
{
has_placed = TRUE;
break;
@@ -589,37 +590,38 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
for (display_idx = 0; display_idx < display_count; ++display_idx)
{
- if (!(displays[display_idx].desired_mode.dmFields & DM_POSITION) || IsRectEmpty(&displays[display_idx].new_rect))
+ set_rect_from_devmode(&rect, &displays[display_idx].desired_mode);
+ if (!(displays[display_idx].desired_mode.dmFields & DM_POSITION) || IsRectEmpty(&rect))
continue;
/* Get four vertices of the placed display rectangle */
- points[0].x = displays[display_idx].new_rect.left;
- points[0].y = displays[display_idx].new_rect.top;
- points[1].x = displays[display_idx].new_rect.left;
- points[1].y = displays[display_idx].new_rect.bottom;
- points[2].x = displays[display_idx].new_rect.right;
- points[2].y = displays[display_idx].new_rect.top;
- points[3].x = displays[display_idx].new_rect.right;
- points[3].y = displays[display_idx].new_rect.bottom;
+ points[0].x = rect.left;
+ points[0].y = rect.top;
+ points[1].x = rect.left;
+ points[1].y = rect.bottom;
+ points[2].x = rect.right;
+ points[2].y = rect.top;
+ points[3].x = rect.right;
+ points[3].y = rect.bottom;
point_count = 4;
/* Intersected points when moving the display to be placed horizontally */
- if (desired_rect.bottom >= displays[display_idx].new_rect.top &&
- desired_rect.top <= displays[display_idx].new_rect.bottom)
+ if (desired_rect.bottom >= rect.top &&
+ desired_rect.top <= rect.bottom)
{
- points[point_count].x = displays[display_idx].new_rect.left;
+ points[point_count].x = rect.left;
points[point_count++].y = desired_rect.top;
- points[point_count].x = displays[display_idx].new_rect.right;
+ points[point_count].x = rect.right;
points[point_count++].y = desired_rect.top;
}
/* Intersected points when moving the display to be placed vertically */
- if (desired_rect.left <= displays[display_idx].new_rect.right &&
- desired_rect.right >= displays[display_idx].new_rect.left)
+ if (desired_rect.left <= rect.right &&
+ desired_rect.right >= rect.left)
{
points[point_count].x = desired_rect.left;
- points[point_count++].y = displays[display_idx].new_rect.top;
+ points[point_count++].y = rect.top;
points[point_count].x = desired_rect.left;
- points[point_count++].y = displays[display_idx].new_rect.bottom;
+ points[point_count++].y = rect.bottom;
}
/* Try moving each vertex of the display rectangle to each points */
@@ -705,17 +707,12 @@ static void place_all_displays(struct x11drv_display_setting *displays, INT disp
if (placing_idx == -1)
break;
- set_rect_from_devmode(&displays[placing_idx].new_rect, &displays[placing_idx].desired_mode);
- OffsetRect(&displays[placing_idx].new_rect, min_offset.x, min_offset.y);
+ displays[placing_idx].desired_mode.dmPosition.x += min_offset.x;
+ displays[placing_idx].desired_mode.dmPosition.y += min_offset.y;
displays[placing_idx].desired_mode.dmFields |= DM_POSITION;
- }
- for (display_idx = 0; display_idx < display_count; ++display_idx)
- {
- displays[display_idx].desired_mode.dmPosition.x = displays[display_idx].new_rect.left;
- displays[display_idx].desired_mode.dmPosition.y = displays[display_idx].new_rect.top;
- left_most = min(left_most, displays[display_idx].new_rect.left);
- top_most = min(top_most, displays[display_idx].new_rect.top);
+ left_most = min(left_most, displays[placing_idx].desired_mode.dmPosition.x);
+ top_most = min(top_most, displays[placing_idx].desired_mode.dmPosition.y);
}
/* Convert virtual screen coordinates to root coordinates */
More information about the wine-cvs
mailing list