- Patch by Piotr Caban : Make it possible to activate a window with parent and no WS_CHILD flag in WS_NCLBUTTONDOWN function.
- Sync port from wine with modifications and addons.

svn path=/trunk/; revision=62610
This commit is contained in:
James Tabor 2014-04-04 14:49:22 +00:00
parent 2fce3630ab
commit 82b5418f45

View file

@ -980,26 +980,44 @@ DefWndDoButton(HWND hWnd, WPARAM wParam)
LRESULT LRESULT
DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
PWND Wnd = ValidateHwnd(hWnd);
switch (wParam) switch (wParam)
{ {
case HTCAPTION: case HTCAPTION:
{ {
HWND hTopWnd = GetAncestor(hWnd, GA_ROOT); HWND hTopWnd = hWnd, parent;
if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) || while(1)
GetActiveWindow() == hTopWnd) {
{ if ((GetWindowLongW( hTopWnd, GWL_STYLE ) & (WS_POPUP|WS_CHILD)) != WS_CHILD)
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam); break;
} parent = GetAncestor( hTopWnd, GA_PARENT );
break; if (!parent || parent == GetDesktopWindow()) break;
hTopWnd = parent;
}
if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) ||
GetActiveWindow() == hTopWnd)
{
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam);
}
break;
} }
case HTSYSMENU: case HTSYSMENU:
{ {
LONG style = GetWindowLongPtrW( hWnd, GWL_STYLE ); LONG style = GetWindowLongPtrW( hWnd, GWL_STYLE );
if (style & WS_SYSMENU) if (style & WS_SYSMENU)
{ {
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, if( Wnd && !(style & WS_MINIMIZE) )
lParam); {
} RECT rect;
HDC hDC = GetWindowDC(hWnd);
UserGetInsideRectNC(Wnd, &rect);
UserDrawSysMenuButton(hWnd, hDC, &rect, TRUE);
ReleaseDC( hWnd, hDC );
}
SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, lParam);
}
break; break;
} }
case HTMENU: case HTMENU:
@ -1070,7 +1088,14 @@ DefWndNCLButtonDblClk(HWND hWnd, WPARAM wParam, LPARAM lParam)
} }
case HTSYSMENU: case HTSYSMENU:
{ {
SendMessageW(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); HMENU hSysMenu = GetSystemMenu(hWnd, FALSE);
UINT state = GetMenuState(hSysMenu, SC_CLOSE, MF_BYCOMMAND);
/* If the close item of the sysmenu is disabled or not present do nothing */
if ((state & (MF_DISABLED | MF_GRAYED)) || (state == 0xFFFFFFFF))
break;
SendMessageW(hWnd, WM_SYSCOMMAND, SC_CLOSE, lParam);
break; break;
} }
default: default: