Rémi Bernon : winex11.drv: Use DM_POSITION field bit to mark placed displays.

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


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

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

winex11.drv: Use DM_POSITION field bit to mark placed displays.

---

 dlls/winex11.drv/display.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index db1628b2c85..3319697e51f 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;
-    BOOL placed;
     RECT new_rect;
     DEVMODEW desired_mode;
 };
@@ -548,7 +547,7 @@ static BOOL overlap_placed_displays(const RECT *rect, const struct x11drv_displa
 
     for (display_idx = 0; display_idx < display_count; ++display_idx)
     {
-        if (displays[display_idx].placed &&
+        if ((displays[display_idx].desired_mode.dmFields & DM_POSITION) &&
             intersect_rect(&intersect, &displays[display_idx].new_rect, rect))
             return TRUE;
     }
@@ -573,7 +572,7 @@ 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].placed && !IsRectEmpty(&displays[display_idx].new_rect))
+        if ((displays[display_idx].desired_mode.dmFields & DM_POSITION) && !IsRectEmpty(&displays[display_idx].new_rect))
         {
             has_placed = TRUE;
             break;
@@ -590,7 +589,7 @@ 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].placed || IsRectEmpty(&displays[display_idx].new_rect))
+        if (!(displays[display_idx].desired_mode.dmFields & DM_POSITION) || IsRectEmpty(&displays[display_idx].new_rect))
             continue;
 
         /* Get four vertices of the placed display rectangle */
@@ -681,6 +680,9 @@ static void place_all_displays(struct x11drv_display_setting *displays, INT disp
     INT placing_idx, display_idx;
     POINT min_offset, offset;
 
+    for (display_idx = 0; display_idx < display_count; ++display_idx)
+        displays[display_idx].desired_mode.dmFields &= ~DM_POSITION;
+
     /* Place all displays with no extra space between them and no overlapping */
     while (1)
     {
@@ -688,7 +690,7 @@ static void place_all_displays(struct x11drv_display_setting *displays, INT disp
         placing_idx = -1;
         for (display_idx = 0; display_idx < display_count; ++display_idx)
         {
-            if (displays[display_idx].placed)
+            if (displays[display_idx].desired_mode.dmFields & DM_POSITION)
                 continue;
 
             offset = get_placement_offset(displays, display_count, display_idx);
@@ -705,7 +707,7 @@ static void place_all_displays(struct x11drv_display_setting *displays, INT disp
 
         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;
+        displays[placing_idx].desired_mode.dmFields |= DM_POSITION;
     }
 
     for (display_idx = 0; display_idx < display_count; ++display_idx)




More information about the wine-cvs mailing list