Megre 16749, 16750, 16751, 16763, 16764 from trunk:
Fix reverting of focus to owner windows.
Modified:
branches/ros-branch-0_2_7/reactos/subsys/win32k/ntuser/winpos.c
_____
Modified:
branches/ros-branch-0_2_7/reactos/subsys/win32k/ntuser/winpos.c
--- branches/ros-branch-0_2_7/reactos/subsys/win32k/ntuser/winpos.c
2005-08-03 17:16:24 UTC (rev 17018)
+++ branches/ros-branch-0_2_7/reactos/subsys/win32k/ntuser/winpos.c
2005-08-03 17:17:57 UTC (rev 17019)
@@ -107,62 +107,75 @@
WinPosActivateOtherWindow(PWINDOW_OBJECT Window)
{
PWINDOW_OBJECT Wnd, Old;
- int TryTopmost;
+ HWND Fg;
if (!Window || IntIsDesktopWindow(Window))
{
IntSetFocusMessageQueue(NULL);
return;
}
- Wnd = Window;
- for(;;)
+
+ /* If this is popup window, try to activate the owner first. */
+ if ((Window->Style & WS_POPUP) && (Wnd = IntGetOwner(Window)))
{
- HWND *List, *phWnd;
-
- Old = Wnd;
- Wnd = IntGetParentObject(Wnd);
- if(Old != Window)
+ for(;;)
{
+ Old = Wnd;
+ Wnd = IntGetParentObject(Wnd);
+ if(IntIsDesktopWindow(Wnd))
+ {
+ IntReleaseWindowObject(Wnd);
+ Wnd = Old;
+ break;
+ }
IntReleaseWindowObject(Old);
}
- if(!Wnd)
+
+ if ((Wnd->Style & (WS_DISABLED | WS_VISIBLE)) == WS_VISIBLE &&
+ (Wnd->Style & (WS_POPUP | WS_CHILD)) != WS_CHILD)
+ goto done;
+
+ IntReleaseWindowObject(Wnd);
+ }
+
+ /* Pick a next top-level window. */
+ /* FIXME: Search for non-tooltip windows first. */
+ Wnd = Window;
+ while (Wnd != NULL)
+ {
+ Old = Wnd;
+ IntLockRelatives(Old);
+ if (Old->NextSibling == NULL)
{
- IntSetFocusMessageQueue(NULL);
- return;
+ Wnd = NULL;
+ IntUnLockRelatives(Old);
+ if (Old != Window)
+ IntReleaseWindowObject(Old);
+ break;
}
+ Wnd = IntGetWindowObject(Old->NextSibling->Self);
+ IntUnLockRelatives(Old);
+ if (Old != Window)
+ IntReleaseWindowObject(Old);
+ if ((Wnd->Style & (WS_DISABLED | WS_VISIBLE)) == WS_VISIBLE &&
+ (Wnd->Style & (WS_POPUP | WS_CHILD)) != WS_CHILD)
+ break;
+ }
- if((List = IntWinListChildren(Wnd)))
+done:
+ Fg = NtUserGetForegroundWindow();
+ if (Wnd && (!Fg || Window->Self == Fg))
+ {
+ if (IntSetForegroundWindow(Wnd))
{
- for(TryTopmost = 0; TryTopmost <= 1; TryTopmost++)
- {
- for(phWnd = List; *phWnd; phWnd++)
- {
- PWINDOW_OBJECT Child;
-
- if((*phWnd) == Window->Self)
- {
- continue;
- }
-
- if((Child = IntGetWindowObject(*phWnd)))
- {
- if(((! TryTopmost && (0 == (Child->ExStyle &
WS_EX_TOPMOST)))
- || (TryTopmost && (0 != (Child->ExStyle &
WS_EX_TOPMOST))))
- && IntSetForegroundWindow(Child))
- {
- ExFreePool(List);
- IntReleaseWindowObject(Wnd);
- IntReleaseWindowObject(Child);
- return;
- }
- IntReleaseWindowObject(Child);
- }
- }
- }
- ExFreePool(List);
+ IntReleaseWindowObject(Wnd);
+ return;
}
}
- IntReleaseWindowObject(Wnd);
+ if (!IntSetActiveWindow(Wnd))
+ IntSetActiveWindow(0);
+ if (Wnd)
+ IntReleaseWindowObject(Wnd);
}
VOID STATIC FASTCALL
Show replies by date