Sync to trunk head (r42241)
[reactos.git] / reactos / dll / win32 / user32 / windows / winpos.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: lib/user32/windows/window.c
6 * PURPOSE: Window management
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * UPDATE HISTORY:
9 * 06-06-2001 CSH Created
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <user32.h>
15
16 #include <wine/debug.h>
17 WINE_DEFAULT_DEBUG_CHANNEL(user32);
18
19 /* FUNCTIONS *****************************************************************/
20
21 /*******************************************************************
22 * can_activate_window
23 *
24 * Check if we can activate the specified window.
25 */
26 static BOOL can_activate_window( HWND hwnd )
27 {
28 LONG style;
29
30 if (!hwnd) return FALSE;
31 style = GetWindowLongPtrW( hwnd, GWL_STYLE );
32 if (!(style & WS_VISIBLE)) return FALSE;
33 if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
34 return !(style & WS_DISABLED);
35 }
36
37
38 /*******************************************************************
39 * WINPOS_ActivateOtherWindow
40 *
41 * Activates window other than pWnd.
42 */
43 void
44 WINAPI
45 WinPosActivateOtherWindow(HWND hwnd)
46 {
47 HWND hwndTo, fg;
48
49 if ((GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_POPUP) && (hwndTo = GetWindow( hwnd, GW_OWNER )))
50 {
51 hwndTo = GetAncestor( hwndTo, GA_ROOT );
52 if (can_activate_window( hwndTo )) goto done;
53 }
54
55 hwndTo = hwnd;
56 for (;;)
57 {
58 if (!(hwndTo = GetWindow( hwndTo, GW_HWNDNEXT ))) break;
59 if (can_activate_window( hwndTo )) break;
60 }
61
62 done:
63 fg = GetForegroundWindow();
64 TRACE("win = %p fg = %p\n", hwndTo, fg);
65 if (!fg || (hwnd == fg))
66 {
67 if (SetForegroundWindow( hwndTo )) return;
68 }
69 if (!SetActiveWindow( hwndTo )) SetActiveWindow(0);
70 }
71
72
73
74 UINT WINAPI
75 WinPosGetMinMaxInfo(HWND hWnd, POINT* MaxSize, POINT* MaxPos,
76 POINT* MinTrack, POINT* MaxTrack)
77 {
78 MINMAXINFO MinMax;
79
80 if(NtUserGetMinMaxInfo(hWnd, &MinMax, TRUE))
81 {
82 MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
83 MinMax.ptMinTrackSize.x);
84 MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
85 MinMax.ptMinTrackSize.y);
86
87 if (MaxSize) *MaxSize = MinMax.ptMaxSize;
88 if (MaxPos) *MaxPos = MinMax.ptMaxPosition;
89 if (MinTrack) *MinTrack = MinMax.ptMinTrackSize;
90 if (MaxTrack) *MaxTrack = MinMax.ptMaxTrackSize;
91 }
92 return 0; //FIXME: what does it return?
93 }
94
95
96 /*
97 * @implemented
98 */
99 HWND WINAPI
100 GetActiveWindow(VOID)
101 {
102 return (HWND)NtUserGetThreadState(THREADSTATE_ACTIVEWINDOW);
103 }
104
105
106 /*
107 * @unimplemented
108 */
109 UINT WINAPI
110 ArrangeIconicWindows(HWND hWnd)
111 {
112 return NtUserCallHwndLock( hWnd, HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS);
113 }