Jacek Caban : win32u: Move ArrangeIconicWindows implementation from user32.

Alexandre Julliard julliard at winehq.org
Fri Mar 18 16:39:54 CDT 2022


Module: wine
Branch: master
Commit: 8e3fef2627d0bfd6c7912fab77a794941518983c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8e3fef2627d0bfd6c7912fab77a794941518983c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Mar 18 14:29:17 2022 +0100

win32u: Move ArrangeIconicWindows implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/winpos.c | 123 +--------------------------------------------------
 dlls/win32u/window.c |  44 ++++++++++++++++++
 include/ntuser.h     |   1 +
 3 files changed, 46 insertions(+), 122 deletions(-)

diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index 6f0dfec23ac..fa074e9f7c8 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -31,19 +31,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(win);
 
-#define SWP_AGG_NOGEOMETRYCHANGE \
-    (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)
-#define SWP_AGG_NOPOSCHANGE \
-    (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
-#define SWP_AGG_STATUSFLAGS \
-    (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
-#define SWP_AGG_NOCLIENTCHANGE \
-        (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
-
-#define HAS_DLGFRAME(style,exStyle) \
-    (((exStyle) & WS_EX_DLGMODALFRAME) || \
-     (((style) & WS_DLGFRAME) && !((style) & WS_BORDER)))
-
 #define HAS_THICKFRAME(style) \
     (((style) & WS_THICKFRAME) && \
      !(((style) & (WS_DLGFRAME|WS_BORDER)) == WS_DLGFRAME))
@@ -551,78 +538,6 @@ MINMAXINFO WINPOS_GetMinMaxInfo( HWND hwnd )
     return info;
 }
 
-
-static POINT get_first_minimized_child_pos( const RECT *parent, const MINIMIZEDMETRICS *mm,
-                                            int width, int height )
-{
-    POINT ret;
-
-    if (mm->iArrange & ARW_STARTRIGHT)
-        ret.x = parent->right - mm->iHorzGap - width;
-    else
-        ret.x = parent->left + mm->iHorzGap;
-    if (mm->iArrange & ARW_STARTTOP)
-        ret.y = parent->top + mm->iVertGap;
-    else
-        ret.y = parent->bottom - mm->iVertGap - height;
-
-    return ret;
-}
-
-static void get_next_minimized_child_pos( const RECT *parent, const MINIMIZEDMETRICS *mm,
-                                          int width, int height, POINT *pos )
-{
-    BOOL next;
-
-    if (mm->iArrange & ARW_UP) /* == ARW_DOWN */
-    {
-        if (mm->iArrange & ARW_STARTTOP)
-        {
-            pos->y += height + mm->iVertGap;
-            if ((next = pos->y + height > parent->bottom))
-                pos->y = parent->top + mm->iVertGap;
-        }
-        else
-        {
-            pos->y -= height + mm->iVertGap;
-            if ((next = pos->y < parent->top))
-                pos->y = parent->bottom - mm->iVertGap - height;
-        }
-
-        if (next)
-        {
-            if (mm->iArrange & ARW_STARTRIGHT)
-                pos->x -= width + mm->iHorzGap;
-            else
-                pos->x += width + mm->iHorzGap;
-        }
-    }
-    else
-    {
-        if (mm->iArrange & ARW_STARTRIGHT)
-        {
-            pos->x -= width + mm->iHorzGap;
-            if ((next = pos->x < parent->left))
-                pos->x = parent->right - mm->iHorzGap - width;
-        }
-        else
-        {
-            pos->x += width + mm->iHorzGap;
-            if ((next = pos->x + width > parent->right))
-                pos->x = parent->left + mm->iHorzGap;
-        }
-
-        if (next)
-        {
-            if (mm->iArrange & ARW_STARTTOP)
-                pos->y += height + mm->iVertGap;
-            else
-                pos->y -= height + mm->iVertGap;
-        }
-    }
-}
-
-
 /***********************************************************************
  *		GetInternalWindowPos (USER32.@)
  */
@@ -992,43 +907,7 @@ BOOL WINAPI EndDeferWindowPos( HDWP hdwp )
  */
 UINT WINAPI ArrangeIconicWindows( HWND parent )
 {
-    int width, height, count = 0;
-    RECT rectParent;
-    HWND hwndChild;
-    POINT pt;
-    MINIMIZEDMETRICS metrics;
-
-    metrics.cbSize = sizeof(metrics);
-    SystemParametersInfoW( SPI_GETMINIMIZEDMETRICS, sizeof(metrics), &metrics, 0 );
-    width = GetSystemMetrics( SM_CXMINIMIZED );
-    height = GetSystemMetrics( SM_CYMINIMIZED );
-
-    if (parent == GetDesktopWindow())
-    {
-        MONITORINFO mon_info;
-        HMONITOR monitor = MonitorFromWindow( 0, MONITOR_DEFAULTTOPRIMARY );
-
-        mon_info.cbSize = sizeof( mon_info );
-        GetMonitorInfoW( monitor, &mon_info );
-        rectParent = mon_info.rcWork;
-    }
-    else GetClientRect( parent, &rectParent );
-
-    pt = get_first_minimized_child_pos( &rectParent, &metrics, width, height );
-
-    hwndChild = GetWindow( parent, GW_CHILD );
-    while (hwndChild)
-    {
-        if( IsIconic( hwndChild ) )
-        {
-            NtUserSetWindowPos( hwndChild, 0, pt.x, pt.y, 0, 0,
-                                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
-            get_next_minimized_child_pos( &rectParent, &metrics, width, height, &pt );
-            count++;
-        }
-        hwndChild = GetWindow( hwndChild, GW_HWNDNEXT );
-    }
-    return count;
+    return NtUserCallHwnd( parent, NtUserArrangeIconicWindows );
 }
 
 
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 521523dc2b5..8c7a5950a78 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -3830,6 +3830,48 @@ static UINT window_min_maximize( HWND hwnd, UINT cmd, RECT *rect )
     return swp_flags;
 }
 
+/* see ArrangeIconicWindows */
+static UINT arrange_iconic_windows( HWND parent )
+{
+    int width, height, count = 0;
+    MINIMIZEDMETRICS metrics;
+    RECT parent_rect;
+    HWND child;
+    POINT pt;
+
+    metrics.cbSize = sizeof(metrics);
+    NtUserSystemParametersInfo( SPI_GETMINIMIZEDMETRICS, sizeof(metrics), &metrics, 0 );
+    width  = get_system_metrics( SM_CXMINIMIZED );
+    height = get_system_metrics( SM_CYMINIMIZED );
+
+    if (parent == get_desktop_window())
+    {
+        MONITORINFO mon_info;
+        HMONITOR monitor = monitor_from_window( 0, MONITOR_DEFAULTTOPRIMARY, get_thread_dpi() );
+
+        mon_info.cbSize = sizeof( mon_info );
+        get_monitor_info( monitor, &mon_info );
+        parent_rect = mon_info.rcWork;
+    }
+    else get_client_rect( parent, &parent_rect );
+
+    pt = get_first_minimized_child_pos( &parent_rect, &metrics, width, height );
+
+    child = get_window_relative( parent, GW_CHILD );
+    while (child)
+    {
+        if (is_iconic( child ))
+        {
+            NtUserSetWindowPos( child, 0, pt.x, pt.y, 0, 0,
+                                SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE );
+            get_next_minimized_child_pos( &parent_rect, &metrics, width, height, &pt );
+            count++;
+        }
+        child = get_window_relative( child, GW_HWNDNEXT );
+    }
+    return count;
+}
+
 /*******************************************************************
  *           update_window_state
  *
@@ -4905,6 +4947,8 @@ ULONG_PTR WINAPI NtUserCallHwnd( HWND hwnd, DWORD code )
 {
     switch (code)
     {
+    case NtUserArrangeIconicWindows:
+        return arrange_iconic_windows( hwnd );
     case NtUserGetDpiForWindow:
         return get_dpi_for_window( hwnd );
     case NtUserGetParent:
diff --git a/include/ntuser.h b/include/ntuser.h
index 03b48747665..b327dbc87f0 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -142,6 +142,7 @@ enum
 /* NtUserCallHwnd codes, not compatible with Windows */
 enum
 {
+    NtUserArrangeIconicWindows,
     NtUserGetDpiForWindow,
     NtUserGetParent,
     NtUserGetWindowContextHelpId,




More information about the wine-cvs mailing list