2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2003-07-27 11:54:42 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS user32.dll
|
|
|
|
* FILE: lib/user32/windows/window.c
|
|
|
|
* PURPOSE: Window management
|
|
|
|
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* 06-06-2001 CSH Created
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2005-06-19 18:06:53 +00:00
|
|
|
#include <user32.h>
|
2003-07-27 11:54:42 +00:00
|
|
|
|
2006-06-26 13:16:43 +00:00
|
|
|
#include <wine/debug.h>
|
2007-07-26 15:13:36 +00:00
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(user32);
|
2006-06-26 13:16:43 +00:00
|
|
|
|
2003-07-27 11:54:42 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2006-08-01 21:14:45 +00:00
|
|
|
/*******************************************************************
|
|
|
|
* can_activate_window
|
|
|
|
*
|
|
|
|
* Check if we can activate the specified window.
|
|
|
|
*/
|
|
|
|
static BOOL can_activate_window( HWND hwnd )
|
|
|
|
{
|
|
|
|
LONG style;
|
|
|
|
|
|
|
|
if (!hwnd) return FALSE;
|
2009-05-09 12:27:40 +00:00
|
|
|
style = GetWindowLongPtrW( hwnd, GWL_STYLE );
|
2006-08-01 21:14:45 +00:00
|
|
|
if (!(style & WS_VISIBLE)) return FALSE;
|
|
|
|
if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
|
|
|
|
return !(style & WS_DISABLED);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* WINPOS_ActivateOtherWindow
|
|
|
|
*
|
|
|
|
* Activates window other than pWnd.
|
|
|
|
*/
|
|
|
|
void
|
2008-11-30 11:42:05 +00:00
|
|
|
WINAPI
|
2006-08-01 21:14:45 +00:00
|
|
|
WinPosActivateOtherWindow(HWND hwnd)
|
|
|
|
{
|
|
|
|
HWND hwndTo, fg;
|
|
|
|
|
2009-05-09 12:27:40 +00:00
|
|
|
if ((GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_POPUP) && (hwndTo = GetWindow( hwnd, GW_OWNER )))
|
2006-08-01 21:14:45 +00:00
|
|
|
{
|
|
|
|
hwndTo = GetAncestor( hwndTo, GA_ROOT );
|
|
|
|
if (can_activate_window( hwndTo )) goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
hwndTo = hwnd;
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
if (!(hwndTo = GetWindow( hwndTo, GW_HWNDNEXT ))) break;
|
|
|
|
if (can_activate_window( hwndTo )) break;
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
2009-01-11 12:37:54 +00:00
|
|
|
fg = GetForegroundWindow();
|
2006-08-01 21:14:45 +00:00
|
|
|
TRACE("win = %p fg = %p\n", hwndTo, fg);
|
|
|
|
if (!fg || (hwnd == fg))
|
|
|
|
{
|
|
|
|
if (SetForegroundWindow( hwndTo )) return;
|
|
|
|
}
|
2009-01-11 12:37:54 +00:00
|
|
|
if (!SetActiveWindow( hwndTo )) SetActiveWindow(0);
|
2006-08-01 21:14:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-11-30 11:42:05 +00:00
|
|
|
UINT WINAPI
|
2003-07-27 11:54:42 +00:00
|
|
|
WinPosGetMinMaxInfo(HWND hWnd, POINT* MaxSize, POINT* MaxPos,
|
|
|
|
POINT* MinTrack, POINT* MaxTrack)
|
|
|
|
{
|
|
|
|
MINMAXINFO MinMax;
|
2005-05-09 01:42:07 +00:00
|
|
|
|
2003-12-26 13:06:34 +00:00
|
|
|
if(NtUserGetMinMaxInfo(hWnd, &MinMax, TRUE))
|
|
|
|
{
|
|
|
|
MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
|
|
|
|
MinMax.ptMinTrackSize.x);
|
|
|
|
MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
|
|
|
|
MinMax.ptMinTrackSize.y);
|
|
|
|
|
|
|
|
if (MaxSize) *MaxSize = MinMax.ptMaxSize;
|
|
|
|
if (MaxPos) *MaxPos = MinMax.ptMaxPosition;
|
|
|
|
if (MinTrack) *MinTrack = MinMax.ptMinTrackSize;
|
|
|
|
if (MaxTrack) *MaxTrack = MinMax.ptMaxTrackSize;
|
|
|
|
}
|
2003-07-27 11:54:42 +00:00
|
|
|
return 0; //FIXME: what does it return?
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
HWND WINAPI
|
2003-07-27 11:54:42 +00:00
|
|
|
GetActiveWindow(VOID)
|
|
|
|
{
|
Patch by Stefan Ginsberg (stefan__100__ AT hotmail DOT com):
- remove NtUserEnumClipboardFormats, use ->ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMAT insetad
- remove NtUserRegisterClipboardFormat, use NtUserRegisterWIndowsMessage instead
- remove NtUserKillSystemTimer, use HWNDPARAM_ROUTINE_KILLSYSTEMTIMER instead
- remove NtUserInsertMenuItem, use NtUserThunkedMenuItemInfo instead
- remove NtUserGetCapture, use THREADSTATE_CAPTUREWINDOW instead
- remove NtUserGetActiveWindow, use THREADSTATE_ACTIVEWINDOW instead
- remove NtUserGetQueueStatus, use ONEPARAM_ROUTIME_GETQUEUESTATUS instead
- remove NtUserGetLastActivePopup, wasn't implemented
- remove NtUserRealizePalette from ntuser.h, it's not implemented
- remove duplicate NtUserGetLastInputInfo from ntuser.h
- remove PrivateCsrssRergisterPrimitive from user32, it was unused and unimplemented
- remove NtUserDereferenceWndprocHandle, it was unused
- move WNDPROC_INFO structure from ntuser.h to win32k/include/class.h, as it's not used in usermode anymore
tested with AbiWord and FF on VMWare
svn path=/trunk/; revision=32825
2008-04-03 02:13:34 +00:00
|
|
|
return (HWND)NtUserGetThreadState(THREADSTATE_ACTIVEWINDOW);
|
2003-07-27 11:54:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-07-18 03:13:11 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2008-11-30 11:42:05 +00:00
|
|
|
UINT WINAPI
|
2005-07-18 03:13:11 +00:00
|
|
|
ArrangeIconicWindows(HWND hWnd)
|
|
|
|
{
|
|
|
|
return NtUserCallHwndLock( hWnd, HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS);
|
|
|
|
}
|