Author: jimtabor Date: Wed Apr 9 01:26:19 2014 New Revision: 62692
URL: http://svn.reactos.org/svn/reactos?rev=62692&view=rev Log: [NtUser|User32] - Start moving system control functions into Win32k. See CORE-7447. - Sync port from wine to update code before move and test.
Modified: trunk/reactos/win32ss/user/ntuser/defwnd.c trunk/reactos/win32ss/user/ntuser/message.c trunk/reactos/win32ss/user/ntuser/window.h trunk/reactos/win32ss/user/user32/windows/defwnd.c
Modified: trunk/reactos/win32ss/user/ntuser/defwnd.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/defwnd.... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/defwnd.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/defwnd.c [iso-8859-1] Wed Apr 9 01:26:19 2014 @@ -135,6 +135,72 @@
LRESULT FASTCALL +DefWndHandleWindowPosChanging(PWND pWnd, WINDOWPOS* Pos) +{ + POINT maxTrack, minTrack; + LONG style = pWnd->style; + + if (Pos->flags & SWP_NOSIZE) return 0; + if ((style & WS_THICKFRAME) || ((style & (WS_POPUP | WS_CHILD)) == 0)) + { + co_WinPosGetMinMaxInfo(pWnd, NULL, NULL, &minTrack, &maxTrack); + Pos->cx = min(Pos->cx, maxTrack.x); + Pos->cy = min(Pos->cy, maxTrack.y); + if (!(style & WS_MINIMIZE)) + { + if (Pos->cx < minTrack.x) Pos->cx = minTrack.x; + if (Pos->cy < minTrack.y) Pos->cy = minTrack.y; + } + } + else + { + Pos->cx = max(Pos->cx, 0); + Pos->cy = max(Pos->cy, 0); + } + return 0; +} + +LRESULT FASTCALL +DefWndHandleWindowPosChanged(PWND pWnd, WINDOWPOS* Pos) +{ + RECT Rect; + LONG style = pWnd->style; + + IntGetClientRect(pWnd, &Rect); + IntMapWindowPoints(pWnd, (style & WS_CHILD ? IntGetParent(pWnd) : NULL), (LPPOINT) &Rect, 2); + + if (! (Pos->flags & SWP_NOCLIENTMOVE)) + { + co_IntSendMessage(UserHMGetHandle(pWnd), WM_MOVE, 0, MAKELONG(Rect.left, Rect.top)); + } + + if (! (Pos->flags & SWP_NOCLIENTSIZE)) + { + WPARAM wp = SIZE_RESTORED; + + if (style & WS_MAXIMIZE) wp = SIZE_MAXIMIZED; + else if (style & WS_MINIMIZE) wp = SIZE_MINIMIZED; + + co_IntSendMessage(UserHMGetHandle(pWnd), WM_SIZE, wp, MAKELONG(Rect.right - Rect.left, Rect.bottom - Rect.top)); + } + return 0; +} + +VOID FASTCALL +UserDrawWindowFrame(HDC hdc, + RECTL *rect, + ULONG width, + ULONG height) +{ + HBRUSH hbrush = NtGdiSelectBrush( hdc, gpsi->hbrGray ); + NtGdiPatBlt( hdc, rect->left, rect->top, rect->right - rect->left - width, height, PATINVERT ); + NtGdiPatBlt( hdc, rect->left, rect->top + height, width, rect->bottom - rect->top - height, PATINVERT ); + NtGdiPatBlt( hdc, rect->left + width, rect->bottom - 1, rect->right - rect->left - width, -height, PATINVERT ); + NtGdiPatBlt( hdc, rect->right - 1, rect->top, -width, rect->bottom - rect->top - height, PATINVERT ); + NtGdiSelectBrush( hdc, hbrush ); +} + +LRESULT FASTCALL DefWndHandleSysCommand(PWND pWnd, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; @@ -264,6 +330,7 @@ }
case WM_SETREDRAW: + ERR("WM_SETREDRAW\n"); if (wParam) { if (!(Wnd->style & WS_VISIBLE)) @@ -282,6 +349,16 @@ } return 0;
+ case WM_WINDOWPOSCHANGING: + { + return (DefWndHandleWindowPosChanging(Wnd, (WINDOWPOS*)lParam)); + } + + case WM_WINDOWPOSCHANGED: + { + return (DefWndHandleWindowPosChanged(Wnd, (WINDOWPOS*)lParam)); + } + /* ReactOS only. */ case WM_CBT: {
Modified: trunk/reactos/win32ss/user/ntuser/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/message... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/message.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/message.c [iso-8859-1] Wed Apr 9 01:26:19 2014 @@ -134,7 +134,7 @@ { WM_SETTINGCHANGE, MMS_SIZE_LPARAMSZ, MMS_FLAG_READ }, { WM_COPYDATA, MMS_SIZE_SPECIAL, MMS_FLAG_READ }, { WM_COPYGLOBALDATA, MMS_SIZE_WPARAM, MMS_FLAG_READ }, - { WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READ }, + { WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READWRITE }, { WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE }, };
Modified: trunk/reactos/win32ss/user/ntuser/window.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/window.... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/window.h [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/window.h [iso-8859-1] Wed Apr 9 01:26:19 2014 @@ -39,6 +39,7 @@ BOOL FASTCALL IntIsWindow(HWND hWnd); HWND* FASTCALL IntWinListChildren(PWND Window); VOID FASTCALL IntGetClientRect (PWND WindowObject, RECTL *Rect); +INT FASTCALL IntMapWindowPoints(PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints); BOOL FASTCALL IntIsChildWindow (PWND Parent, PWND Child); VOID FASTCALL IntUnlinkWindow(PWND Wnd); VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev);
Modified: trunk/reactos/win32ss/user/user32/windows/defwnd.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/user32/windows... ============================================================================== --- trunk/reactos/win32ss/user/user32/windows/defwnd.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/user32/windows/defwnd.c [iso-8859-1] Wed Apr 9 01:26:19 2014 @@ -153,7 +153,7 @@ } }
- +#if 0 // Moved to Win32k VOID DefWndSetRedraw(HWND hWnd, WPARAM wParam) { @@ -177,7 +177,7 @@ } return; } - +#endif
LRESULT DefWndHandleSetCursor(HWND hWnd, WPARAM wParam, LPARAM lParam, ULONG Style) @@ -277,8 +277,11 @@ rect.right -= GetSystemMetrics(SM_CXSIZE) + 1; if (Style & WS_MAXIMIZEBOX) rect.right -= GetSystemMetrics(SM_CXSIZE) + 1; - pt.x = rectWindow.left + (rect.right - rect.left) / 2; - pt.y = rectWindow.top + rect.top + GetSystemMetrics(SM_CYSIZE)/2; + //pt.x = rectWindow.left + (rect.right - rect.left) / 2; + //pt.y = rectWindow.top + rect.top + GetSystemMetrics(SM_CYSIZE)/2; + pt.x = (rect.right + rect.left) / 2; + pt.y = rect.top + GetSystemMetrics(SM_CYSIZE)/2; + ERR("SC_MOVE\n"); hittest = HTCAPTION; *capturePoint = pt; } @@ -293,9 +296,12 @@ switch(msg.message) { case WM_MOUSEMOVE: + //// Clamp the mouse position to the window rectangle when starting a window resize. + //pt.x = min( max( msg.pt.x, rectWindow.left ), rectWindow.right - 1 ); + //pt.y = min( max( msg.pt.y, rectWindow.top ), rectWindow.bottom - 1 ); + //// Breaks a win test. hittest = DefWndNCHitTest(hWnd, msg.pt); - if ((hittest < HTLEFT) || (hittest > HTBOTTOMRIGHT)) - hittest = 0; + if ((hittest < HTLEFT) || (hittest > HTBOTTOMRIGHT)) hittest = 0; break;
case WM_LBUTTONUP: @@ -354,19 +360,8 @@ UserDrawWindowFrame(HDC hdc, const RECT *rect, ULONG width, ULONG height) { - static HBRUSH hDraggingRectBrush = NULL; - HBRUSH hbrush; - - if(!hDraggingRectBrush) - { - static HBITMAP hDraggingPattern = NULL; - const DWORD Pattern[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA}; - - hDraggingPattern = CreateBitmap(8, 8, 1, 1, Pattern); - hDraggingRectBrush = CreatePatternBrush(hDraggingPattern); - } - - hbrush = SelectObject( hdc, hDraggingRectBrush ); + HBRUSH hbrush = SelectObject( hdc, gpsi->hbrGray ); + PatBlt( hdc, rect->left, rect->top, rect->right - rect->left - width, height, PATINVERT ); PatBlt( hdc, rect->left, rect->top + height, width, @@ -410,6 +405,8 @@ BOOL DragFullWindows = FALSE; HWND hWndParent = NULL; PWND Wnd; + WPARAM syscommand = wParam & 0xfff0; + HMONITOR mon = 0;
Wnd = ValidateHwnd(hwnd); if (!Wnd) @@ -419,36 +416,32 @@ ExStyle = Wnd->ExStyle; iconic = (Style & WS_MINIMIZE) != 0;
+ // + // Show window contents while dragging the window, get flag from registry data. + // SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS, 0, &DragFullWindows, 0);
pt.x = GET_X_LPARAM(dwPoint); pt.y = GET_Y_LPARAM(dwPoint); capturePoint = pt;
- if ((Style & WS_MAXIMIZE) || !IsWindowVisible(hwnd)) - { - return; - } - - thickframe = UserHasThickFrameStyle(Style, ExStyle) && !(Style & WS_MINIMIZE); - if ((wParam & 0xfff0) == SC_MOVE) - { - if (!hittest) - { - hittest = DefWndStartSizeMove(hwnd, Wnd, wParam, &capturePoint); - } - if (!hittest) - { - return; - } - } + TRACE("hwnd %p command %04lx, hittest %d, pos %d,%d\n", + hwnd, syscommand, hittest, pt.x, pt.y); + + if ((Style & WS_MAXIMIZE) || !IsWindowVisible(hwnd)) return; + + thickframe = UserHasThickFrameStyle(Style, ExStyle) && !iconic; + + if (syscommand == SC_MOVE) + { + ERR("SC_MOVE\n"); + if (!hittest) hittest = DefWndStartSizeMove(hwnd, Wnd, wParam, &capturePoint); + if (!hittest) return; + } else /* SC_SIZE */ - { - if (!thickframe) - { - return; - } - if (hittest && ((wParam & 0xfff0) != SC_MOUSEMENU)) + { + if (!thickframe) return; + if (hittest && (syscommand != SC_MOUSEMENU)) { hittest += (HTLEFT - WMSZ_LEFT); } @@ -462,23 +455,24 @@ return; } } - } + }
/* Get min/max info */
WinPosGetMinMaxInfo(hwnd, NULL, NULL, &minTrack, &maxTrack); sizingRect = Wnd->rcWindow; + ERR("x %d y %d X %d Y %d\n",pt.x,pt.y,sizingRect.left,sizingRect.top); if (Style & WS_CHILD) - { + { hWndParent = GetParent(hwnd); MapWindowPoints( 0, hWndParent, (LPPOINT)&sizingRect, 2 ); unmodRect = sizingRect; GetClientRect(hWndParent, &mouseRect ); clipRect = mouseRect; MapWindowPoints(hWndParent, HWND_DESKTOP, (LPPOINT)&clipRect, 2); - } + } else - { + { if(!(ExStyle & WS_EX_TOPMOST)) { SystemParametersInfoW(SPI_GETWORKAREA, 0, &clipRect, 0); @@ -489,70 +483,72 @@ SetRect(&mouseRect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)); clipRect = mouseRect; } + mon = MonitorFromPoint( pt, MONITOR_DEFAULTTONEAREST ); unmodRect = sizingRect; - } + } ClipCursor(&clipRect);
origRect = sizingRect; if (ON_LEFT_BORDER(hittest)) - { + { mouseRect.left = max( mouseRect.left, sizingRect.right-maxTrack.x ); mouseRect.right = min( mouseRect.right, sizingRect.right-minTrack.x ); - } + } else if (ON_RIGHT_BORDER(hittest)) - { + { mouseRect.left = max( mouseRect.left, sizingRect.left+minTrack.x ); mouseRect.right = min( mouseRect.right, sizingRect.left+maxTrack.x ); - } + } if (ON_TOP_BORDER(hittest)) - { + { mouseRect.top = max( mouseRect.top, sizingRect.bottom-maxTrack.y ); mouseRect.bottom = min( mouseRect.bottom,sizingRect.bottom-minTrack.y); - } + } else if (ON_BOTTOM_BORDER(hittest)) - { + { mouseRect.top = max( mouseRect.top, sizingRect.top+minTrack.y ); mouseRect.bottom = min( mouseRect.bottom, sizingRect.top+maxTrack.y ); - } + } if (Style & WS_CHILD) - { + { MapWindowPoints( hWndParent, 0, (LPPOINT)&mouseRect, 2 ); - } - + } + + IntNotifyWinEvent( EVENT_SYSTEM_MOVESIZESTART, hwnd, OBJID_WINDOW, CHILDID_SELF, 0); SendMessageA( hwnd, WM_ENTERSIZEMOVE, 0, 0 ); NtUserxSetGUIThreadHandle(MSQ_STATE_MOVESIZE, hwnd); if (GetCapture() != hwnd) SetCapture( hwnd );
if (Style & WS_CHILD) - { + { /* Retrieve a default cache DC (without using the window style) */ hdc = GetDCEx(hWndParent, 0, DCX_CACHE); DesktopRgn = NULL; - } + } else - { + { hdc = GetDC( 0 ); DesktopRgn = CreateRectRgnIndirect(&clipRect); - } + }
SelectObject(hdc, DesktopRgn);
if( iconic ) /* create a cursor for dragging */ - { + { HICON hIcon = (HICON)GetClassLongPtrW(hwnd, GCL_HICON); if(!hIcon) hIcon = (HICON)SendMessageW( hwnd, WM_QUERYDRAGICON, 0, 0L); if( hIcon ) hDragCursor = CursorIconToCursor( hIcon, TRUE ); if( !hDragCursor ) iconic = FALSE; - } + }
/* invert frame if WIN31_LOOK to indicate mouse click on caption */ if( !iconic && !DragFullWindows) - { + { UserDrawMovingFrame( hdc, &sizingRect, thickframe); - } + }
for(;;) - { + { int dx = 0, dy = 0;
if (!GetMessageW(&msg, 0, 0, 0)) break; @@ -564,12 +560,12 @@ ((msg.wParam == VK_RETURN) || (msg.wParam == VK_ESCAPE)))) break;
if (msg.message == WM_PAINT) - { + { if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); UpdateWindow( msg.hwnd ); if(!iconic && !DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe ); continue; - } + }
if ((msg.message != WM_KEYDOWN) && (msg.message != WM_MOUSEMOVE)) { @@ -581,39 +577,56 @@ pt = msg.pt;
if (msg.message == WM_KEYDOWN) switch(msg.wParam) - { + { case VK_UP: pt.y -= 8; break; case VK_DOWN: pt.y += 8; break; case VK_LEFT: pt.x -= 8; break; case VK_RIGHT: pt.x += 8; break; - } + }
pt.x = max( pt.x, mouseRect.left ); - pt.x = min( pt.x, mouseRect.right ); + pt.x = min( pt.x, mouseRect.right - 1 ); pt.y = max( pt.y, mouseRect.top ); - pt.y = min( pt.y, mouseRect.bottom ); + pt.y = min( pt.y, mouseRect.bottom - 1 ); + + if (!hWndParent) + { + HMONITOR newmon; + MONITORINFO info; + + if ((newmon = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL ))) + mon = newmon; + + info.cbSize = sizeof(info); + if (mon && GetMonitorInfoW( mon, &info )) + { + pt.x = max( pt.x, info.rcWork.left ); + pt.x = min( pt.x, info.rcWork.right - 1 ); + pt.y = max( pt.y, info.rcWork.top ); + pt.y = min( pt.y, info.rcWork.bottom - 1 ); + } + }
dx = pt.x - capturePoint.x; dy = pt.y - capturePoint.y;
if (dx || dy) - { + { if( !moved ) - { + { moved = TRUE;
if( iconic ) /* ok, no system popup tracking */ - { + { hOldCursor = SetCursor(hDragCursor); ShowCursor( TRUE ); - } - } + } + }
if (msg.message == WM_KEYDOWN) SetCursorPos( pt.x, pt.y ); else - { + { RECT newRect = unmodRect; - WPARAM wpSizingHit = 0;
if (hittest == HTCAPTION) OffsetRect( &newRect, dx, dy ); if (ON_LEFT_BORDER(hittest)) newRect.left += dx; @@ -624,18 +637,26 @@ capturePoint = pt;
/* determine the hit location */ - if (hittest >= HTLEFT && hittest <= HTBOTTOMRIGHT) - wpSizingHit = WMSZ_LEFT + (hittest - HTLEFT); unmodRect = newRect; - SendMessageA( hwnd, WM_SIZING, wpSizingHit, (LPARAM)&newRect ); + if (syscommand == SC_SIZE) + { + WPARAM wpSizingHit = 0; + + if (hittest >= HTLEFT && hittest <= HTBOTTOMRIGHT) + wpSizingHit = WMSZ_LEFT + (hittest - HTLEFT); + SendMessageW( hwnd, WM_SIZING, wpSizingHit, (LPARAM)&newRect ); + } + else + SendMessageW( hwnd, WM_MOVING, 0, (LPARAM)&newRect );
if (!iconic) { if(!DragFullWindows) UserDrawMovingFrame( hdc, &newRect, thickframe ); - else { - /* To avoid any deadlocks, all the locks on the windows + else + { /* To avoid any deadlocks, all the locks on the windows structures must be suspended before the SetWindowPos */ + //ERR("SWP 1\n"); SetWindowPos( hwnd, 0, newRect.left, newRect.top, newRect.right - newRect.left, newRect.bottom - newRect.top, @@ -643,21 +664,21 @@ } } sizingRect = newRect; - } - } - } + } + } + }
ReleaseCapture(); ClipCursor(NULL); if( iconic ) - { + { if( moved ) /* restore cursors, show icon title later on */ - { + { ShowCursor( FALSE ); SetCursor( hOldCursor ); - } + } DestroyCursor( hDragCursor ); - } + } else if(!DragFullWindows) UserDrawMovingFrame( hdc, &sizingRect, thickframe );
@@ -671,6 +692,8 @@ DeleteObject(DesktopRgn); } } + //// This causes the mdi child window to jump up when it is moved. + //if (hWndParent) MapWindowPoints( 0, hWndParent, (POINT *)&sizingRect, 2 );
if (ISITHOOKED(WH_CBT)) { @@ -685,40 +708,45 @@
/* window moved or resized */ if (moved) - { + { /* if the moving/resizing isn't canceled call SetWindowPos * with the new position or the new size of the window */ if (!((msg.message == WM_KEYDOWN) && (msg.wParam == VK_ESCAPE)) ) - { + { /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */ - if(!DragFullWindows) + if(!DragFullWindows )//|| iconic) breaks 2 win tests. + { + //ERR("SWP 2\n"); SetWindowPos( hwnd, 0, sizingRect.left, sizingRect.top, sizingRect.right - sizingRect.left, sizingRect.bottom - sizingRect.top, ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 ); - } - else { /* restore previous size/position */ + } + } + else + { /* restore previous size/position */ if(DragFullWindows) + { + //ERR("SWP 3\n"); SetWindowPos( hwnd, 0, origRect.left, origRect.top, origRect.right - origRect.left, origRect.bottom - origRect.top, ( hittest == HTCAPTION ) ? SWP_NOSIZE : 0 ); + } } - } + }
if( IsWindow(hwnd) ) - if( Style & WS_MINIMIZE ) - { + if( iconic ) + { /* Single click brings up the system menu when iconized */ - if( !moved ) - { + { if( Style & WS_SYSMENU ) - SendMessageA( hwnd, WM_SYSCOMMAND, - SC_MOUSEMENU + HTSYSMENU, MAKELONG(pt.x,pt.y)); - } - } + SendMessageA( hwnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, MAKELONG(pt.x,pt.y)); + } + } }
@@ -858,7 +886,7 @@
return(0); } - +#if 0 // Move to Win32k LRESULT DefWndHandleWindowPosChanging(HWND hWnd, WINDOWPOS* Pos) { @@ -916,6 +944,7 @@
return 0; } +#endif
/*********************************************************************** * DefWndControlColor @@ -1165,7 +1194,7 @@ { return (DefWndNCLButtonDblClk(hWnd, wParam, lParam)); } - +/* Moved to Win32k case WM_WINDOWPOSCHANGING: { return (DefWndHandleWindowPosChanging(hWnd, (WINDOWPOS*)lParam)); @@ -1175,7 +1204,7 @@ { return (DefWndHandleWindowPosChanged(hWnd, (WINDOWPOS*)lParam)); } - +*/ case WM_NCRBUTTONDOWN: return NC_HandleNCRButtonDown( hWnd, wParam, lParam );
@@ -1314,7 +1343,7 @@ } return (0); } -/* +/* Moved to Win32k case WM_SYNCPAINT: { HRGN hRgn; @@ -1845,7 +1874,7 @@ break; }
-/* Move to win32k !*/ +/* Move to Win32k !*/ case WM_SHOWWINDOW: if (!lParam) break; // Call when it is necessary. case WM_SYNCPAINT: @@ -1853,6 +1882,8 @@ case WM_CLIENTSHUTDOWN: case WM_GETHOTKEY: case WM_SETHOTKEY: + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: { LRESULT lResult; NtUserMessageCall( hWnd, Msg, wParam, lParam, (ULONG_PTR)&lResult, FNID_DEFWINDOWPROC, !bUnicode);