Commit 8e3fef26 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

win32u: Move ArrangeIconicWindows implementation from user32.

parent 44f667fa
......@@ -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 );
}
......
......@@ -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:
......
......@@ -142,6 +142,7 @@ enum
/* NtUserCallHwnd codes, not compatible with Windows */
enum
{
NtUserArrangeIconicWindows,
NtUserGetDpiForWindow,
NtUserGetParent,
NtUserGetWindowContextHelpId,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment