2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS user32.dll
4 * FILE: dll/win32/user32/windows/winpos.c
5 * PURPOSE: Window management
6 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * 06-06-2001 CSH Created
11 /* INCLUDES ******************************************************************/
15 #include <wine/debug.h>
16 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
18 void mirror_rect( const RECT
*window_rect
, RECT
*rect
)
20 int width
= window_rect
->right
- window_rect
->left
;
22 rect
->left
= width
- rect
->right
;
23 rect
->right
= width
- tmp
;
26 /* FUNCTIONS *****************************************************************/
28 #define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
31 WinPosGetMinMaxInfo(HWND hwnd
, POINT
* maxSize
, POINT
* maxPos
,
32 POINT
* minTrack
, POINT
* maxTrack
)
37 LONG style
= GetWindowLongW( hwnd
, GWL_STYLE
);
39 LONG exstyle
= GetWindowLongW( hwnd
, GWL_EXSTYLE
);
43 /* Compute default values */
45 GetWindowRect(hwnd
, &rc
);
46 MinMax
.ptReserved
.x
= rc
.left
;
47 MinMax
.ptReserved
.y
= rc
.top
;
49 if ((style
& WS_CAPTION
) == WS_CAPTION
)
50 adjustedStyle
= style
& ~WS_BORDER
; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
52 adjustedStyle
= style
;
54 GetClientRect(GetAncestor(hwnd
,GA_PARENT
), &rc
);
55 AdjustWindowRectEx(&rc
, adjustedStyle
, ((style
& WS_POPUP
) && GetMenu(hwnd
)), exstyle
);
60 MinMax
.ptMaxSize
.x
= rc
.right
- rc
.left
;
61 MinMax
.ptMaxSize
.y
= rc
.bottom
- rc
.top
;
62 if (style
& (WS_DLGFRAME
| WS_BORDER
))
64 MinMax
.ptMinTrackSize
.x
= GetSystemMetrics(SM_CXMINTRACK
);
65 MinMax
.ptMinTrackSize
.y
= GetSystemMetrics(SM_CYMINTRACK
);
69 MinMax
.ptMinTrackSize
.x
= 2 * xinc
;
70 MinMax
.ptMinTrackSize
.y
= 2 * yinc
;
72 MinMax
.ptMaxTrackSize
.x
= GetSystemMetrics(SM_CXMAXTRACK
);
73 MinMax
.ptMaxTrackSize
.y
= GetSystemMetrics(SM_CYMAXTRACK
);
74 MinMax
.ptMaxPosition
.x
= -xinc
;
75 MinMax
.ptMaxPosition
.y
= -yinc
;
77 if ((win
= ValidateHwnd( hwnd
)) )//&& win != WND_DESKTOP && win != WND_OTHER_PROCESS)
79 if (!EMPTYPOINT(win
->InternalPos
.MaxPos
)) MinMax
.ptMaxPosition
= win
->InternalPos
.MaxPos
;
82 SendMessageW( hwnd
, WM_GETMINMAXINFO
, 0, (LPARAM
)&MinMax
);
84 /* if the app didn't change the values, adapt them for the current monitor */
86 if ((monitor
= MonitorFromWindow( hwnd
, MONITOR_DEFAULTTOPRIMARY
)))
91 mon_info
.cbSize
= sizeof(mon_info
);
92 GetMonitorInfoW( monitor
, &mon_info
);
94 rc_work
= mon_info
.rcMonitor
;
96 if (style
& WS_MAXIMIZEBOX
)
98 if ((style
& WS_CAPTION
) == WS_CAPTION
|| !(style
& (WS_CHILD
| WS_POPUP
)))
99 rc_work
= mon_info
.rcWork
;
102 if (MinMax
.ptMaxSize
.x
== GetSystemMetrics(SM_CXSCREEN
) + 2 * xinc
&&
103 MinMax
.ptMaxSize
.y
== GetSystemMetrics(SM_CYSCREEN
) + 2 * yinc
)
105 MinMax
.ptMaxSize
.x
= (rc_work
.right
- rc_work
.left
) + 2 * xinc
;
106 MinMax
.ptMaxSize
.y
= (rc_work
.bottom
- rc_work
.top
) + 2 * yinc
;
108 if (MinMax
.ptMaxPosition
.x
== -xinc
&& MinMax
.ptMaxPosition
.y
== -yinc
)
110 MinMax
.ptMaxPosition
.x
= rc_work
.left
- xinc
;
111 MinMax
.ptMaxPosition
.y
= rc_work
.top
- yinc
;
115 /* Some sanity checks */
117 TRACE("%d %d / %d %d / %d %d / %d %d\n",
118 MinMax
.ptMaxSize
.x
, MinMax
.ptMaxSize
.y
,
119 MinMax
.ptMaxPosition
.x
, MinMax
.ptMaxPosition
.y
,
120 MinMax
.ptMaxTrackSize
.x
, MinMax
.ptMaxTrackSize
.y
,
121 MinMax
.ptMinTrackSize
.x
, MinMax
.ptMinTrackSize
.y
);
122 MinMax
.ptMaxTrackSize
.x
= max( MinMax
.ptMaxTrackSize
.x
,
123 MinMax
.ptMinTrackSize
.x
);
124 MinMax
.ptMaxTrackSize
.y
= max( MinMax
.ptMaxTrackSize
.y
,
125 MinMax
.ptMinTrackSize
.y
);
127 if (maxSize
) *maxSize
= MinMax
.ptMaxSize
;
128 if (maxPos
) *maxPos
= MinMax
.ptMaxPosition
;
129 if (minTrack
) *minTrack
= MinMax
.ptMinTrackSize
;
130 if (maxTrack
) *maxTrack
= MinMax
.ptMaxTrackSize
;
132 return 0; //FIXME: what does it return?
140 GetActiveWindow(VOID
)
142 return (HWND
)NtUserGetThreadState(THREADSTATE_ACTIVEWINDOW
);
150 ArrangeIconicWindows(HWND hWnd
)
152 return NtUserxArrangeIconicWindows( hWnd
);
159 WindowFromPoint(POINT Point
)
161 //TODO: Determine what the actual parameters to
162 // NtUserWindowFromPoint are.
163 return NtUserWindowFromPoint(Point
.x
, Point
.y
);
170 MapWindowPoints(HWND hWndFrom
, HWND hWndTo
, LPPOINT lpPoints
, UINT cPoints
)
172 PWND FromWnd
= NULL
, ToWnd
= NULL
;
173 BOOL mirror_from
, mirror_to
;
180 FromWnd
= ValidateHwnd(hWndFrom
);
186 ToWnd
= ValidateHwnd(hWndTo
);
191 /* Note: Desktop Top and Left is always 0! */
192 Delta
.x
= Delta
.y
= 0;
193 mirror_from
= mirror_to
= FALSE
;
195 if (FromWnd
&& hWndFrom
!= GetDesktopWindow()) // FromWnd->fnid != FNID_DESKTOP)
197 if (FromWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
201 Delta
.x
= -FromWnd
->rcClient
.right
;
204 Delta
.x
= FromWnd
->rcClient
.left
;
205 Delta
.y
= FromWnd
->rcClient
.top
;
208 if (ToWnd
&& hWndTo
!= GetDesktopWindow()) // ToWnd->fnid != FNID_DESKTOP)
210 if (ToWnd
->ExStyle
& WS_EX_LAYOUTRTL
)
214 Delta
.x
+= Change
* ToWnd
->rcClient
.right
;
217 Delta
.x
-= Change
* ToWnd
->rcClient
.left
;
218 Delta
.y
-= ToWnd
->rcClient
.top
;
221 for (i
= 0; i
!= cPoints
; i
++)
223 lpPoints
[i
].x
+= Delta
.x
;
224 lpPoints
[i
].x
*= Change
;
225 lpPoints
[i
].y
+= Delta
.y
;
228 if ((mirror_from
|| mirror_to
) && cPoints
== 2) /* special case for rectangle */
230 int tmp
= min(lpPoints
[0].x
, lpPoints
[1].x
);
231 lpPoints
[1].x
= max(lpPoints
[0].x
, lpPoints
[1].x
);
235 return MAKELONG(LOWORD(Delta
.x
), LOWORD(Delta
.y
));
242 ScreenToClient(HWND hWnd
, LPPOINT lpPoint
)
245 /* Note: Desktop Top and Left is always 0! */
246 Wnd
= ValidateHwnd(hWnd
);
250 if (hWnd
!= GetDesktopWindow()) // Wnd->fnid != FNID_DESKTOP )
252 if (Wnd
->ExStyle
& WS_EX_LAYOUTRTL
)
253 lpPoint
->x
= Wnd
->rcClient
.right
- lpPoint
->x
;
255 lpPoint
->x
-= Wnd
->rcClient
.left
;
256 lpPoint
->y
-= Wnd
->rcClient
.top
;
265 ClientToScreen(HWND hWnd
, LPPOINT lpPoint
)
268 /* Note: Desktop Top and Left is always 0! */
269 Wnd
= ValidateHwnd(hWnd
);
273 if ( hWnd
!= GetDesktopWindow()) // Wnd->fnid != FNID_DESKTOP )
275 if (Wnd
->ExStyle
& WS_EX_LAYOUTRTL
)
276 lpPoint
->x
= Wnd
->rcClient
.right
- lpPoint
->x
;
278 lpPoint
->x
+= Wnd
->rcClient
.left
;
279 lpPoint
->y
+= Wnd
->rcClient
.top
;