mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 21:11:54 +00:00
[User32]
- Use zap command when ending dialogs. Check keyboard perfs and cues before sending change GUI states. svn path=/trunk/; revision=56841
This commit is contained in:
parent
2cf18f8b33
commit
cd217d6680
2 changed files with 29 additions and 62 deletions
|
@ -46,7 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32);
|
||||||
#define GET_WORD(ptr) (*(WORD *)(ptr))
|
#define GET_WORD(ptr) (*(WORD *)(ptr))
|
||||||
#define GET_DWORD(ptr) (*(DWORD *)(ptr))
|
#define GET_DWORD(ptr) (*(DWORD *)(ptr))
|
||||||
#define DLG_ISANSI 2
|
#define DLG_ISANSI 2
|
||||||
void WINAPI WinPosActivateOtherWindow(HWND hwnd);
|
|
||||||
|
|
||||||
/* INTERNAL STRUCTS **********************************************************/
|
/* INTERNAL STRUCTS **********************************************************/
|
||||||
|
|
||||||
|
@ -1062,7 +1061,21 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
|
||||||
return hwnd;
|
return hwnd;
|
||||||
}
|
}
|
||||||
if (modal && ownerEnabled) DIALOG_EnableOwner(owner);
|
if (modal && ownerEnabled) DIALOG_EnableOwner(owner);
|
||||||
if( IsWindow(hwnd) ) DestroyWindow( hwnd );
|
IntNotifyWinEvent(EVENT_SYSTEM_DIALOGEND, hwnd, OBJID_WINDOW, CHILDID_SELF, 0);
|
||||||
|
if( IsWindow(hwnd) )
|
||||||
|
{
|
||||||
|
DestroyWindow( hwnd );
|
||||||
|
//// ReactOS
|
||||||
|
if (owner)
|
||||||
|
{ ERR("DIALOG_CreateIndirect 1\n");
|
||||||
|
if ( NtUserGetThreadState(THREADSTATE_FOREGROUNDTHREAD) && // Rule #1.
|
||||||
|
!NtUserQueryWindow(owner, QUERY_WINDOW_FOREGROUND) )
|
||||||
|
{ ERR("DIALOG_CreateIndirect SFW\n");
|
||||||
|
SetForegroundWindow(owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2001,7 +2014,7 @@ DlgDirSelectExW(
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented Modified for ReactOS.
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
|
@ -2012,6 +2025,7 @@ EndDialog(
|
||||||
BOOL wasEnabled = TRUE;
|
BOOL wasEnabled = TRUE;
|
||||||
DIALOGINFO * dlgInfo;
|
DIALOGINFO * dlgInfo;
|
||||||
HWND owner;
|
HWND owner;
|
||||||
|
BOOL wasActive;
|
||||||
|
|
||||||
TRACE("%p %ld\n", hwnd, retval );
|
TRACE("%p %ld\n", hwnd, retval );
|
||||||
|
|
||||||
|
@ -2020,6 +2034,7 @@ EndDialog(
|
||||||
ERR("got invalid window handle (%p); buggy app !?\n", hwnd);
|
ERR("got invalid window handle (%p); buggy app !?\n", hwnd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
wasActive = (hwnd == GetActiveWindow());
|
||||||
dlgInfo->idResult = retval;
|
dlgInfo->idResult = retval;
|
||||||
dlgInfo->flags |= DF_END;
|
dlgInfo->flags |= DF_END;
|
||||||
wasEnabled = (dlgInfo->flags & DF_OWNERENABLED);
|
wasEnabled = (dlgInfo->flags & DF_OWNERENABLED);
|
||||||
|
@ -2030,7 +2045,7 @@ EndDialog(
|
||||||
|
|
||||||
/* Windows sets the focus to the dialog itself in EndDialog */
|
/* Windows sets the focus to the dialog itself in EndDialog */
|
||||||
|
|
||||||
if (IsChild(hwnd, GetFocus()))
|
if (wasActive && IsChild(hwnd, GetFocus()))
|
||||||
SetFocus( hwnd );
|
SetFocus( hwnd );
|
||||||
|
|
||||||
/* Don't have to send a ShowWindow(SW_HIDE), just do
|
/* Don't have to send a ShowWindow(SW_HIDE), just do
|
||||||
|
@ -2039,15 +2054,16 @@ EndDialog(
|
||||||
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE
|
SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE
|
||||||
| SWP_NOZORDER | SWP_NOACTIVATE | SWP_HIDEWINDOW);
|
| SWP_NOZORDER | SWP_NOACTIVATE | SWP_HIDEWINDOW);
|
||||||
|
|
||||||
if (hwnd == GetActiveWindow())
|
if (wasActive && owner)
|
||||||
{
|
{
|
||||||
/* If this dialog was given an owner then set the focus to that owner
|
/* If this dialog was given an owner then set the focus to that owner
|
||||||
even when the owner is disabled (normally when a window closes any
|
even when the owner is disabled (normally when a window closes any
|
||||||
disabled windows cannot receive the focus). */
|
disabled windows cannot receive the focus). */
|
||||||
if (owner)
|
SetActiveWindow(owner);
|
||||||
SetForegroundWindow( owner );
|
}
|
||||||
else
|
else if (hwnd == GetActiveWindow()) // Check it again!
|
||||||
WinPosActivateOtherWindow( hwnd );
|
{
|
||||||
|
NtUserCallNoParam(NOPARAM_ROUTINE_ZAPACTIVEANDFOUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unblock dialog loop */
|
/* unblock dialog loop */
|
||||||
|
@ -2593,13 +2609,15 @@ IsDialogMessageW(
|
||||||
//// ReactOS
|
//// ReactOS
|
||||||
case WM_SYSKEYDOWN:
|
case WM_SYSKEYDOWN:
|
||||||
/* If the ALT key is being pressed display the keyboard cues */
|
/* If the ALT key is being pressed display the keyboard cues */
|
||||||
if (HIWORD(lpMsg->lParam) & KF_ALTDOWN)
|
if ( HIWORD(lpMsg->lParam) & KF_ALTDOWN &&
|
||||||
|
!(gpsi->dwSRVIFlags & SRVINFO_KBDPREF) && !(gpsi->PUSIFlags & PUSIF_KEYBOARDCUES) )
|
||||||
SendMessageW(hDlg, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);
|
SendMessageW(hDlg, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_SYSCOMMAND:
|
case WM_SYSCOMMAND:
|
||||||
/* If the ALT key is being pressed display the keyboard cues */
|
/* If the ALT key is being pressed display the keyboard cues */
|
||||||
if (lpMsg->wParam == SC_KEYMENU)
|
if ( lpMsg->wParam == SC_KEYMENU &&
|
||||||
|
!(gpsi->dwSRVIFlags & SRVINFO_KBDPREF) && !(gpsi->PUSIFlags & PUSIF_KEYBOARDCUES) )
|
||||||
{
|
{
|
||||||
SendMessageW(hDlg, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);
|
SendMessageW(hDlg, WM_CHANGEUISTATE, MAKEWPARAM(UIS_CLEAR, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,57 +25,6 @@ void mirror_rect( const RECT *window_rect, RECT *rect )
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
* can_activate_window
|
|
||||||
*
|
|
||||||
* Check if we can activate the specified window.
|
|
||||||
*/
|
|
||||||
static BOOL can_activate_window( HWND hwnd )
|
|
||||||
{
|
|
||||||
LONG style;
|
|
||||||
|
|
||||||
if (!hwnd) return FALSE;
|
|
||||||
style = GetWindowLongPtrW( hwnd, GWL_STYLE );
|
|
||||||
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
|
|
||||||
WINAPI
|
|
||||||
WinPosActivateOtherWindow(HWND hwnd)
|
|
||||||
{
|
|
||||||
HWND hwndTo, fg;
|
|
||||||
|
|
||||||
if ((GetWindowLongPtrW( hwnd, GWL_STYLE ) & WS_POPUP) && (hwndTo = GetWindow( hwnd, GW_OWNER )))
|
|
||||||
{
|
|
||||||
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:
|
|
||||||
fg = GetForegroundWindow();
|
|
||||||
TRACE("win = %p fg = %p\n", hwndTo, fg);
|
|
||||||
if (!fg || (hwnd == fg))
|
|
||||||
{
|
|
||||||
if (SetForegroundWindow( hwndTo )) return;
|
|
||||||
}
|
|
||||||
if (!SetActiveWindow( hwndTo )) SetActiveWindow(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
|
#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
|
||||||
|
|
||||||
UINT WINAPI
|
UINT WINAPI
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue