Altered the algorithm for selecting a new focus after a window is destroyed that currently has the focus. Dave Hawkes
Index: windows/winpos.c =================================================================== RCS file: /home/wine/wine/windows/winpos.c,v retrieving revision 1.129 diff -u -r1.129 winpos.c --- windows/winpos.c 2001/12/06 22:33:58 1.129 +++ windows/winpos.c 2001/12/11 12:07:06 @@ -622,7 +622,6 @@ return (GetWindowLongW( hWnd, GWL_STYLE ) & WS_MAXIMIZE) != 0; } - /******************************************************************* * GetActiveWindow (USER32.@) */ @@ -647,8 +646,17 @@ */ static BOOL WINPOS_CanActivate(HWND hwnd) { + if (!hwnd) return FALSE; + return ((GetWindowLongW( hwnd, GWL_STYLE ) & (WS_DISABLED|WS_CHILD)) == 0); +} + +/******************************************************************* + * WINPOS_CanActivate + */ +static BOOL WINPOS_IsVisible(HWND hwnd) +{ if (!hwnd) return FALSE; - return ((GetWindowLongW( hwnd, GWL_STYLE ) & (WS_DISABLED|WS_VISIBLE|WS_CHILD)) == WS_VISIBLE); + return ((GetWindowLongW( hwnd, GWL_STYLE ) & WS_VISIBLE) == WS_VISIBLE); } @@ -1394,6 +1402,7 @@ { HWND hwndActive = 0; HWND hwndTo = 0; + HWND hwndDefaultTo = 0; HWND owner; /* Get current active window from the active queue */ @@ -1417,16 +1426,23 @@ if (!(GetWindowLongW( hwnd, GWL_STYLE ) & WS_POPUP) || !(owner = GetWindow( hwnd, GW_OWNER )) || - !WINPOS_CanActivate((hwndTo = GetAncestor( owner, GA_ROOT ))) ) + !WINPOS_CanActivate((hwndTo = GetAncestor( owner, GA_ROOT ))) || + !WINPOS_IsVisible(hwndTo)) { HWND tmp = GetAncestor( hwnd, GA_ROOT ); hwndTo = hwndPrevActive; - while( !WINPOS_CanActivate(hwndTo) ) + while( !WINPOS_CanActivate(hwndTo) || !WINPOS_IsVisible(hwndTo)) { /* by now owned windows should've been taken care of */ + if(!hwndDefaultTo && WINPOS_CanActivate(hwndTo)) + hwndDefaultTo = hwndTo; tmp = hwndTo = GetWindow( tmp, GW_HWNDNEXT ); - if( !hwndTo ) break; + if( !hwndTo ) + { + hwndTo = hwndDefaultTo; + break; + } } }