mirror of
https://github.com/reactos/reactos.git
synced 2024-10-03 16:05:37 +00:00
[User32]
- When sending set cursor with an error hit, it should locate a pop up window if any are visible. See CORE-6651. - Need to fix NtUser co_IntProcessMouseMessage and co_WinPosWindowFromPoint properly. While testing, added hack to help make this work. - REAL fix for CORE-6129. svn path=/trunk/; revision=66056
This commit is contained in:
parent
2439d0030f
commit
53c063af78
|
@ -153,80 +153,137 @@ UserGetInsideRectNC(PWND Wnd, RECT *rect)
|
|||
}
|
||||
}
|
||||
|
||||
HWND FASTCALL
|
||||
IntFindChildWindowToOwner(HWND hRoot, HWND hOwner)
|
||||
{
|
||||
HWND Ret;
|
||||
PWND Child, OwnerWnd, Root, Owner;
|
||||
|
||||
Root = ValidateHwnd(hRoot);
|
||||
Owner = ValidateHwnd(hOwner);
|
||||
|
||||
for( Child = Root->spwndChild ? DesktopPtrToUser(Root->spwndChild) : NULL;
|
||||
Child;
|
||||
Child = Child->spwndNext ? DesktopPtrToUser(Child->spwndNext) : NULL )
|
||||
{
|
||||
OwnerWnd = Child->spwndOwner ? DesktopPtrToUser(Child->spwndOwner) : NULL;
|
||||
if(!OwnerWnd)
|
||||
continue;
|
||||
|
||||
if (!(Child->style & WS_POPUP) || !(Child->style & WS_VISIBLE))
|
||||
continue;
|
||||
|
||||
if(OwnerWnd == Owner)
|
||||
{
|
||||
Ret = Child->head.h;
|
||||
return Ret;
|
||||
}
|
||||
}
|
||||
ERR("IDCWTO Nothing found\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LRESULT
|
||||
DefWndHandleSetCursor(HWND hWnd, WPARAM wParam, LPARAM lParam, ULONG Style)
|
||||
{
|
||||
/* Not for child windows. */
|
||||
if (hWnd != (HWND)wParam)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
/* Not for child windows. */
|
||||
if (hWnd != (HWND)wParam)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch((INT_PTR) LOWORD(lParam))
|
||||
{
|
||||
case HTERROR:
|
||||
switch((short)LOWORD(lParam))
|
||||
{
|
||||
case HTERROR:
|
||||
{
|
||||
WORD Msg = HIWORD(lParam);
|
||||
if (Msg == WM_LBUTTONDOWN || Msg == WM_MBUTTONDOWN ||
|
||||
Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN)
|
||||
{
|
||||
MessageBeep(0);
|
||||
}
|
||||
break;
|
||||
//// This is the real fix for CORE-6129!
|
||||
HWND hwndPopUP;
|
||||
WORD Msg = HIWORD(lParam);
|
||||
|
||||
if (Msg == WM_LBUTTONDOWN)
|
||||
{
|
||||
// Find a pop up window to bring active.
|
||||
hwndPopUP = IntFindChildWindowToOwner(GetDesktopWindow(), hWnd);
|
||||
if (hwndPopUP)
|
||||
{
|
||||
// Not a child pop up from desktop.
|
||||
if ( hwndPopUP != GetWindow(GetDesktopWindow(), GW_CHILD) )
|
||||
{
|
||||
// Get original active window.
|
||||
HWND hwndOrigActive = GetActiveWindow();
|
||||
|
||||
SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||
|
||||
//SetActiveWindow(hwndPopUP);
|
||||
SetForegroundWindow(hwndPopUP); // HACK
|
||||
|
||||
// If the change was made, break out.
|
||||
if (hwndOrigActive != GetActiveWindow())
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
////
|
||||
if (Msg == WM_LBUTTONDOWN || Msg == WM_MBUTTONDOWN ||
|
||||
Msg == WM_RBUTTONDOWN || Msg == WM_XBUTTONDOWN)
|
||||
{
|
||||
ERR("Beep!\n");
|
||||
MessageBeep(0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case HTCLIENT:
|
||||
case HTCLIENT:
|
||||
{
|
||||
HICON hCursor = (HICON)GetClassLongPtrW(hWnd, GCL_HCURSOR);
|
||||
if (hCursor)
|
||||
{
|
||||
SetCursor(hCursor);
|
||||
return(TRUE);
|
||||
}
|
||||
return(FALSE);
|
||||
HICON hCursor = (HICON)GetClassLongPtrW(hWnd, GCL_HCURSOR);
|
||||
if (hCursor)
|
||||
{
|
||||
SetCursor(hCursor);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
case HTLEFT:
|
||||
case HTRIGHT:
|
||||
case HTLEFT:
|
||||
case HTRIGHT:
|
||||
{
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZEWE)));
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZEWE)));
|
||||
}
|
||||
|
||||
case HTTOP:
|
||||
case HTBOTTOM:
|
||||
case HTTOP:
|
||||
case HTBOTTOM:
|
||||
{
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENS)));
|
||||
}
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENS)));
|
||||
}
|
||||
|
||||
case HTTOPLEFT:
|
||||
case HTBOTTOMRIGHT:
|
||||
{
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENWSE)));
|
||||
}
|
||||
|
||||
case HTBOTTOMLEFT:
|
||||
case HTTOPRIGHT:
|
||||
{
|
||||
if (GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENESW)));
|
||||
}
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_ARROW)));
|
||||
case HTTOPLEFT:
|
||||
case HTBOTTOMRIGHT:
|
||||
{
|
||||
if (Style & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENWSE)));
|
||||
}
|
||||
case HTBOTTOMLEFT:
|
||||
case HTTOPRIGHT:
|
||||
{
|
||||
if (GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_MAXIMIZE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_SIZENESW)));
|
||||
}
|
||||
}
|
||||
return((LRESULT)SetCursor(LoadCursorW(0, IDC_ARROW)));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
Loading…
Reference in a new issue