Rémi Bernon : winex11.drv: Use a local desired_rect variable when placing displays.

Alexandre Julliard julliard at winehq.org
Tue Aug 2 14:54:39 CDT 2022


Module: wine
Branch: master
Commit: 65b71e858eaeb108dc3934ab424f10b0b1cefbba
URL:    https://gitlab.winehq.org/wine/wine/-/commit/65b71e858eaeb108dc3934ab424f10b0b1cefbba

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Jul 29 11:07:35 2022 +0200

winex11.drv: Use a local desired_rect variable when placing displays.

---

 dlls/winex11.drv/display.c | 45 +++++++++++++++++++++++----------------------
 1 file changed, 23 insertions(+), 22 deletions(-)

diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index 174411c7915..db1628b2c85 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -37,7 +37,6 @@ struct x11drv_display_setting
     ULONG_PTR id;
     BOOL placed;
     RECT new_rect;
-    RECT desired_rect;
     DEVMODEW desired_mode;
 };
 
@@ -519,11 +518,6 @@ static LONG get_display_settings(struct x11drv_display_setting **new_displays,
             displays[display_idx].desired_mode = current_mode;
         }
 
-        SetRect(&displays[display_idx].desired_rect,
-                displays[display_idx].desired_mode.dmPosition.x,
-                displays[display_idx].desired_mode.dmPosition.y,
-                displays[display_idx].desired_mode.dmPosition.x + displays[display_idx].desired_mode.dmPelsWidth,
-                displays[display_idx].desired_mode.dmPosition.y + displays[display_idx].desired_mode.dmPelsHeight);
         lstrcpyW(displays[display_idx].desired_mode.dmDeviceName, display_device.DeviceName);
     }
 
@@ -541,6 +535,11 @@ static INT offset_length(POINT offset)
     return offset.x * offset.x + offset.y * offset.y;
 }
 
+static void set_rect_from_devmode(RECT *rect, const DEVMODEW *mode)
+{
+    SetRect(rect, mode->dmPosition.x, mode->dmPosition.y, mode->dmPosition.x + mode->dmPelsWidth, mode->dmPosition.y + mode->dmPelsHeight);
+}
+
 /* Check if a rect overlaps with placed display rects */
 static BOOL overlap_placed_displays(const RECT *rect, const struct x11drv_display_setting *displays, INT display_count)
 {
@@ -562,11 +561,13 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
     POINT points[8], left_top, offset, min_offset = {0, 0};
     INT display_idx, point_idx, point_count, vertex_idx;
     BOOL has_placed = FALSE, first = TRUE;
+    RECT desired_rect, rect;
     INT width, height;
-    RECT rect;
+
+    set_rect_from_devmode(&desired_rect, &displays[placing_idx].desired_mode);
 
     /* If the display to be placed is detached, no offset is needed to place it */
-    if (IsRectEmpty(&displays[placing_idx].desired_rect))
+    if (IsRectEmpty(&desired_rect))
         return min_offset;
 
     /* If there is no placed and attached display, place this display as it is */
@@ -584,8 +585,8 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
 
     /* Try to place this display with each of its four vertices at every vertex of the placed
      * displays and see which combination has the minimum offset length */
-    width = displays[placing_idx].desired_rect.right - displays[placing_idx].desired_rect.left;
-    height = displays[placing_idx].desired_rect.bottom - displays[placing_idx].desired_rect.top;
+    width = desired_rect.right - desired_rect.left;
+    height = desired_rect.bottom - desired_rect.top;
 
     for (display_idx = 0; display_idx < display_count; ++display_idx)
     {
@@ -604,21 +605,21 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
         point_count = 4;
 
         /* Intersected points when moving the display to be placed horizontally */
-        if (displays[placing_idx].desired_rect.bottom >= displays[display_idx].new_rect.top &&
-            displays[placing_idx].desired_rect.top <= displays[display_idx].new_rect.bottom)
+        if (desired_rect.bottom >= displays[display_idx].new_rect.top &&
+            desired_rect.top <= displays[display_idx].new_rect.bottom)
         {
             points[point_count].x = displays[display_idx].new_rect.left;
-            points[point_count++].y = displays[placing_idx].desired_rect.top;
+            points[point_count++].y = desired_rect.top;
             points[point_count].x = displays[display_idx].new_rect.right;
-            points[point_count++].y = displays[placing_idx].desired_rect.top;
+            points[point_count++].y = desired_rect.top;
         }
         /* Intersected points when moving the display to be placed vertically */
-        if (displays[placing_idx].desired_rect.left <= displays[display_idx].new_rect.right &&
-            displays[placing_idx].desired_rect.right >= displays[display_idx].new_rect.left)
+        if (desired_rect.left <= displays[display_idx].new_rect.right &&
+            desired_rect.right >= displays[display_idx].new_rect.left)
         {
-            points[point_count].x = displays[placing_idx].desired_rect.left;
+            points[point_count].x = desired_rect.left;
             points[point_count++].y = displays[display_idx].new_rect.top;
-            points[point_count].x = displays[placing_idx].desired_rect.left;
+            points[point_count].x = desired_rect.left;
             points[point_count++].y = displays[display_idx].new_rect.bottom;
         }
 
@@ -651,9 +652,9 @@ static POINT get_placement_offset(const struct x11drv_display_setting *displays,
                     break;
                 }
 
-                offset.x = left_top.x - displays[placing_idx].desired_rect.left;
-                offset.y = left_top.y - displays[placing_idx].desired_rect.top;
-                rect = displays[placing_idx].desired_rect;
+                offset.x = left_top.x - desired_rect.left;
+                offset.y = left_top.y - desired_rect.top;
+                rect = desired_rect;
                 OffsetRect(&rect, offset.x, offset.y);
                 if (!overlap_placed_displays(&rect, displays, display_count))
                 {
@@ -702,7 +703,7 @@ static void place_all_displays(struct x11drv_display_setting *displays, INT disp
         if (placing_idx == -1)
             break;
 
-        displays[placing_idx].new_rect = displays[placing_idx].desired_rect;
+        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].placed = TRUE;
     }




More information about the wine-cvs mailing list