ReactOS  0.4.15-dev-5496-g599ba9c
winpos.c File Reference
#include <win32k.h>
Include dependency graph for winpos.c:

Go to the source code of this file.

Macros

#define MINMAX_NOSWP   (0x00010000)
 
#define SWP_EX_NOCOPY   0x0001
 
#define SWP_EX_PAINTSELF   0x0002
 
#define SWP_AGG_NOGEOMETRYCHANGE   (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)
 
#define SWP_AGG_NOPOSCHANGE   (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
 
#define SWP_AGG_STATUSFLAGS   (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
 
#define SWP_AGG_NOCLIENTCHANGE   (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
 
#define EMPTYPOINT(pt)   ((pt).x == -1 && (pt).y == -1)
 
#define PLACE_MIN   0x0001
 
#define PLACE_MAX   0x0002
 
#define PLACE_RECT   0x0004
 

Functions

 DBG_DEFAULT_CHANNEL (UserWinpos)
 
BOOL FASTCALL IntGetClientOrigin (PWND Window OPTIONAL, LPPOINT Point)
 
VOID FASTCALL IntGetClientRect (PWND Wnd, RECTL *Rect)
 
BOOL FASTCALL IntGetWindowRect (PWND Wnd, RECTL *Rect)
 
INT FASTCALL IntMapWindowPoints (PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints)
 
BOOL FASTCALL IntClientToScreen (PWND Wnd, LPPOINT lpPoint)
 
BOOL FASTCALL IntScreenToClient (PWND Wnd, LPPOINT lpPoint)
 
BOOL FASTCALL IsChildVisible (PWND pWnd)
 
PWND FASTCALL IntGetLastTopMostWindow (VOID)
 
VOID SelectWindowRgn (PWND Window, HRGN hRgnClip)
 
BOOL FASTCALL ActivateOtherWindowMin (PWND Wnd)
 
static BOOL FASTCALL can_activate_window (PWND Wnd OPTIONAL)
 
VOID FASTCALL co_WinPosActivateOtherWindow (PWND Wnd)
 
VOID FASTCALL WinPosInitInternalPos (PWND Wnd, RECTL *RestoreRect)
 
BOOL FASTCALL IntGetWindowPlacement (PWND Wnd, WINDOWPLACEMENT *lpwndpl)
 
static void make_rect_onscreen (RECT *rect)
 
static void make_point_onscreen (POINT *pt)
 
BOOL FASTCALL IntSetWindowPlacement (PWND Wnd, WINDOWPLACEMENT *wpl, UINT Flags)
 
UINT FASTCALL co_WinPosArrangeIconicWindows (PWND parent)
 
static VOID FASTCALL WinPosFindIconPos (PWND Window, POINT *Pos)
 
BOOL UserHasWindowEdge (DWORD Style, DWORD ExStyle)
 
VOID FASTCALL IntGetWindowBorderMeasures (PWND Wnd, UINT *cx, UINT *cy)
 
VOID UserGetWindowBorders (DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
 
DWORD IntGetWindowBorders (DWORD Style, DWORD ExStyle)
 
UINT FASTCALL co_WinPosGetMinMaxInfo (PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
 
static BOOL IntValidateParent (PWND Child, PREGION ValidateRgn)
 
static VOID FASTCALL FixClientRect (PRECTL ClientRect, PRECTL WindowRect)
 
static VOID FASTCALL get_valid_rects (RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
 
static LONG FASTCALL co_WinPosDoNCCALCSize (PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
 
static BOOL FASTCALL co_WinPosDoWinPosChanging (PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
 
static HWND FASTCALL WinPosDoOwnedPopups (PWND Window, HWND hWndInsertAfter)
 
static VOID FASTCALL WinPosInternalMoveWindow (PWND Window, INT MoveX, INT MoveY)
 
static BOOL FASTCALL WinPosFixupFlags (WINDOWPOS *WinPos, PWND Wnd)
 
VOID ForceNCPaintErase (PWND Wnd, HRGN hRgn, PREGION pRgn)
 
BOOLEAN FASTCALL co_WinPosSetWindowPos (PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
 
LRESULT FASTCALL co_WinPosGetNonClientSize (PWND Window, RECT *WindowRect, RECT *ClientRect)
 
void FASTCALL co_WinPosSendSizeMove (PWND Wnd)
 
UINT FASTCALL co_WinPosMinMaximize (PWND Wnd, UINT ShowFlag, RECT *NewPos)
 
BOOLEAN FASTCALL co_WinPosShowWindow (PWND Wnd, INT Cmd)
 
static PWND co_WinPosSearchChildren (IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
 
PWND APIENTRY co_WinPosWindowFromPoint (IN PWND ScopeWin, IN POINT *WinPoint, IN OUT USHORT *HitTest, IN BOOL Ignore)
 
PWND FASTCALL IntRealChildWindowFromPoint (PWND Parent, LONG x, LONG y)
 
PWND APIENTRY IntChildWindowFromPointEx (PWND Parent, LONG x, LONG y, UINT uiFlags)
 
HDWP FASTCALL IntDeferWindowPos (HDWP hdwp, HWND hwnd, HWND hwndAfter, INT x, INT y, INT cx, INT cy, UINT flags)
 
BOOL FASTCALL IntEndDeferWindowPosEx (HDWP hdwp, BOOL sAsync)
 
HWND APIENTRY NtUserChildWindowFromPointEx (HWND hwndParent, LONG x, LONG y, UINT uiFlags)
 
BOOL APIENTRY NtUserEndDeferWindowPosEx (HDWP WinPosInfo, BOOL bAsync)
 
HDWP APIENTRY NtUserDeferWindowPos (HDWP WinPosInfo, HWND Wnd, HWND WndInsertAfter, int x, int y, int cx, int cy, UINT Flags)
 
DWORD APIENTRY NtUserGetInternalWindowPos (HWND hWnd, LPRECT rectWnd, LPPOINT ptIcon)
 
BOOL APIENTRY NtUserGetWindowPlacement (HWND hWnd, WINDOWPLACEMENT *lpwndpl)
 
DWORD APIENTRY NtUserMinMaximize (HWND hWnd, UINT cmd, BOOL Hide)
 
BOOL APIENTRY NtUserMoveWindow (HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
 
HWND APIENTRY NtUserRealChildWindowFromPoint (HWND Parent, LONG x, LONG y)
 
BOOL APIENTRY NtUserSetWindowPos (HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
 
INT APIENTRY NtUserSetWindowRgn (HWND hWnd, HRGN hRgn, BOOL bRedraw)
 
DWORD APIENTRY NtUserSetInternalWindowPos (HWND hwnd, UINT showCmd, LPRECT lprect, LPPOINT lppt)
 
BOOL APIENTRY NtUserSetWindowPlacement (HWND hWnd, WINDOWPLACEMENT *lpwndpl)
 
BOOL APIENTRY NtUserShowWindowAsync (HWND hWnd, LONG nCmdShow)
 
BOOL APIENTRY NtUserShowWindow (HWND hWnd, LONG nCmdShow)
 
HWND APIENTRY NtUserWindowFromPoint (LONG X, LONG Y)
 

Macro Definition Documentation

◆ EMPTYPOINT

#define EMPTYPOINT (   pt)    ((pt).x == -1 && (pt).y == -1)

Definition at line 28 of file winpos.c.

◆ MINMAX_NOSWP

#define MINMAX_NOSWP   (0x00010000)

Definition at line 14 of file winpos.c.

◆ PLACE_MAX

#define PLACE_MAX   0x0002

Definition at line 30 of file winpos.c.

◆ PLACE_MIN

#define PLACE_MIN   0x0001

Definition at line 29 of file winpos.c.

◆ PLACE_RECT

#define PLACE_RECT   0x0004

Definition at line 31 of file winpos.c.

◆ SWP_AGG_NOCLIENTCHANGE

#define SWP_AGG_NOCLIENTCHANGE   (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)

Definition at line 25 of file winpos.c.

◆ SWP_AGG_NOGEOMETRYCHANGE

#define SWP_AGG_NOGEOMETRYCHANGE   (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)

Definition at line 19 of file winpos.c.

◆ SWP_AGG_NOPOSCHANGE

Definition at line 21 of file winpos.c.

◆ SWP_AGG_STATUSFLAGS

Definition at line 23 of file winpos.c.

◆ SWP_EX_NOCOPY

#define SWP_EX_NOCOPY   0x0001

Definition at line 16 of file winpos.c.

◆ SWP_EX_PAINTSELF

#define SWP_EX_PAINTSELF   0x0002

Definition at line 17 of file winpos.c.

Function Documentation

◆ ActivateOtherWindowMin()

BOOL FASTCALL ActivateOtherWindowMin ( PWND  Wnd)

Definition at line 284 of file winpos.c.

285 {
286  BOOL ActivePrev, FindTopWnd;
287  PWND pWndTopMost, pWndChild, pWndSetActive, pWndTemp, pWndDesk;
289  PTHREADINFO pti = gptiCurrent;
290 
291  //ERR("AOWM 1 %p\n",Wnd->head.h);
292  ActivePrev = (pti->MessageQueue->spwndActivePrev != NULL);
293  FindTopWnd = TRUE;
294 
295  if ((pWndTopMost = IntGetLastTopMostWindow()))
296  pWndChild = pWndTopMost->spwndNext;
297  else
298  pWndChild = Wnd->spwndParent->spwndChild;
299 
300  for (;;)
301  {
302  if ( ActivePrev )
303  pWndSetActive = pti->MessageQueue->spwndActivePrev;
304  else
305  pWndSetActive = pWndChild;
306 
307  pWndTemp = NULL;
308 
309  while(pWndSetActive)
310  {
311  if ( VerifyWnd(pWndSetActive) &&
312  !(pWndSetActive->ExStyle & WS_EX_NOACTIVATE) &&
313  (pWndSetActive->style & (WS_VISIBLE|WS_DISABLED)) == WS_VISIBLE &&
314  (!(pWndSetActive->style & WS_ICONIC) /* FIXME MinMax pos? */ ) )
315  {
316  if (!(pWndSetActive->ExStyle & WS_EX_TOOLWINDOW) )
317  {
318  UserRefObjectCo(pWndSetActive, &Ref);
319  //ERR("ActivateOtherWindowMin Set FG 1\n");
320  co_IntSetForegroundWindow(pWndSetActive);
321  UserDerefObjectCo(pWndSetActive);
322  //ERR("AOWM 2 Exit Good %p\n",pWndSetActive->head.h);
323  return TRUE;
324  }
325  if (!pWndTemp ) pWndTemp = pWndSetActive;
326  }
327  if ( ActivePrev )
328  {
329  ActivePrev = FALSE;
330  pWndSetActive = pWndChild;
331  }
332  else
333  pWndSetActive = pWndSetActive->spwndNext;
334  }
335 
336  if ( !FindTopWnd ) break;
337  FindTopWnd = FALSE;
338 
339  if ( pWndChild )
340  {
341  pWndChild = pWndChild->spwndParent->spwndChild;
342  continue;
343  }
344 
345  if (!(pWndDesk = IntGetThreadDesktopWindow(pti)))
346  {
347  pWndChild = NULL;
348  continue;
349  }
350  pWndChild = pWndDesk->spwndChild;
351  }
352 
353  if ((pWndSetActive = pWndTemp))
354  {
355  UserRefObjectCo(pWndSetActive, &Ref);
356  //ERR("ActivateOtherWindowMin Set FG 2\n");
357  co_IntSetForegroundWindow(pWndSetActive);
358  UserDerefObjectCo(pWndSetActive);
359  //ERR("AOWM 3 Exit Good %p\n",pWndSetActive->head.h);
360  return TRUE;
361  }
362  //ERR("AOWM 4 Bad\n");
363  return FALSE;
364 }
#define WS_DISABLED
Definition: pedump.c:621
DWORD ExStyle
Definition: ntuser.h:699
#define TRUE
Definition: types.h:120
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:40
Definition: object.h:3
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
struct _WND * spwndNext
Definition: ntuser.h:706
PWND FASTCALL IntGetLastTopMostWindow(VOID)
Definition: winpos.c:237
#define WS_ICONIC
Definition: pedump.c:641
#define for
Definition: utility.h:88
Definition: ntuser.h:688
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
#define NULL
Definition: types.h:112
struct _WND * spwndParent
Definition: ntuser.h:708
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:86
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1550
struct _WND * spwndChild
Definition: ntuser.h:709
#define WS_VISIBLE
Definition: pedump.c:620
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO pti)
Definition: desktop.c:1359
DWORD style
Definition: ntuser.h:701

Referenced by co_WinPosShowWindow(), and UserSetActiveWindow().

◆ can_activate_window()

static BOOL FASTCALL can_activate_window ( PWND Wnd  OPTIONAL)
static

Definition at line 372 of file winpos.c.

373 {
374  LONG style;
375 
376  if (!Wnd) return FALSE;
377 
378  style = Wnd->style;
379  if (!(style & WS_VISIBLE)) return FALSE;
380  if (style & WS_MINIMIZE) return FALSE;
381  if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
382  if (Wnd->ExStyle & WS_EX_NOACTIVATE) return FALSE;
383  return TRUE;
384  /* FIXME: This window could be disable because the child that closed
385  was a popup. */
386  //return !(style & WS_DISABLED);
387 }
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
#define WS_POPUP
Definition: pedump.c:616
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620

Referenced by co_WinPosActivateOtherWindow().

◆ co_WinPosActivateOtherWindow()

VOID FASTCALL co_WinPosActivateOtherWindow ( PWND  Wnd)

Definition at line 396 of file winpos.c.

397 {
398  PWND WndTo = NULL;
400 
401  ASSERT_REFS_CO(Wnd);
402 
403  if (IntIsDesktopWindow(Wnd))
404  {
405  //ERR("WinPosActivateOtherWindow Set Focus Msg Q No window!\n");
407  return;
408  }
409 
410  /* If this is popup window, try to activate the owner first. */
411  if ((Wnd->style & WS_POPUP) && (WndTo = Wnd->spwndOwner))
412  {
413  TRACE("WPAOW Popup with Owner\n");
414  WndTo = UserGetAncestor( WndTo, GA_ROOT );
415  if (can_activate_window(WndTo)) goto done;
416  }
417 
418  /* Pick a next top-level window. */
419  /* FIXME: Search for non-tooltip windows first. */
420  WndTo = Wnd;
421  for (;;)
422  {
423  if (!(WndTo = WndTo->spwndNext)) break;
424  if (can_activate_window( WndTo )) goto done;
425  }
426 
427  /*
428  Fixes wine win.c:test_SetParent last ShowWindow test after popup dies.
429  Check for previous active window to bring to top.
430  */
431  if (Wnd)
432  {
433  WndTo = Wnd->head.pti->MessageQueue->spwndActivePrev;
434  if (can_activate_window( WndTo )) goto done;
435  }
436 
437  // Find any window to bring to top. Works Okay for wine since it does not see X11 windows.
438  WndTo = UserGetDesktopWindow();
439  WndTo = WndTo->spwndChild;
440  if ( WndTo == NULL )
441  {
442  //ERR("WinPosActivateOtherWindow No window!\n");
443  return;
444  }
445  for (;;)
446  {
447  if (WndTo == Wnd)
448  {
449  WndTo = NULL;
450  break;
451  }
452  if (can_activate_window( WndTo )) goto done;
453  if (!(WndTo = WndTo->spwndNext)) break;
454  }
455 
456 done:
457  if (WndTo) UserRefObjectCo(WndTo, &Ref);
458 
460  {
461  /* ReactOS can pass WndTo = NULL to co_IntSetForegroundWindow and returns FALSE. */
462  //ERR("WinPosActivateOtherWindow Set FG 0x%p hWnd %p\n",WndTo, WndTo ? WndTo->head.h : 0);
463  if (co_IntSetForegroundWindow(WndTo))
464  {
465  if (WndTo) UserDerefObjectCo(WndTo);
466  return;
467  }
468  }
469  //ERR("WinPosActivateOtherWindow Set Active 0x%p\n",WndTo);
470  if (!UserSetActiveWindow(WndTo)) /* Ok for WndTo to be NULL here */
471  {
472  //ERR("WPAOW SA 1\n");
474  }
475  if (WndTo) UserDerefObjectCo(WndTo);
476 }
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
#define GA_ROOT
Definition: winuser.h:2779
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
BOOL FASTCALL UserSetActiveWindow(_In_opt_ PWND Wnd)
Definition: focus.c:1260
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:40
struct _WND * spwndOwner
Definition: ntuser.h:710
THRDESKHEAD head
Definition: ntuser.h:690
Definition: object.h:3
struct _WND * spwndNext
Definition: ntuser.h:706
#define TRACE(s)
Definition: solgame.cpp:4
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1386
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
Definition: window.c:3331
Definition: ntuser.h:688
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1319
#define IntIsDesktopWindow(WndObj)
Definition: window.h:24
#define WS_POPUP
Definition: pedump.c:616
#define NULL
Definition: types.h:112
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1550
static BOOL FASTCALL can_activate_window(PWND Wnd OPTIONAL)
Definition: winpos.c:372
struct _WND * spwndChild
Definition: ntuser.h:709
DWORD style
Definition: ntuser.h:701

Referenced by co_WinPosShowWindow(), IntSendDestroyMsg(), and UserSetActiveWindow().

◆ co_WinPosArrangeIconicWindows()

UINT FASTCALL co_WinPosArrangeIconicWindows ( PWND  parent)

Definition at line 730 of file winpos.c.

731 {
732  RECTL rectParent;
733  PWND Child;
734  INT x, y, xspacing, yspacing, sx, sy;
735 
737 
738  IntGetClientRect( parent, &rectParent );
739  // FIXME: Support Minimize Metrics gspv.mm.iArrange.
740  // Default: ARW_BOTTOMLEFT
741  x = rectParent.left;
742  y = rectParent.bottom;
743 
746 
747  Child = parent->spwndChild;
748  while(Child)
749  {
750  if((Child->style & WS_MINIMIZE) != 0 )
751  {
753  UserRefObjectCo(Child, &Ref);
754 
756  sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
757 
758  Child->InternalPos.IconPos.x = sx;
759  Child->InternalPos.IconPos.y = sy;
760  Child->InternalPos.flags |= WPF_MININIT;
761 
763 
765 
766  if (x <= rectParent.right - xspacing)
767  x += xspacing;
768  else
769  {
770  x = rectParent.left;
771  y -= yspacing;
772  }
773  }
774  Child = Child->spwndNext;
775  }
776  return yspacing;
777 }
#define SM_CXMINIMIZED
Definition: winuser.h:1014
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1748
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
long bottom
Definition: polytest.cpp:53
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1237
int32_t INT
Definition: typedefs.h:58
#define SWP_NOCOPYBITS
Definition: winuser.h:1233
long right
Definition: polytest.cpp:53
#define WS_MINIMIZE
Definition: pedump.c:622
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:533
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:40
Definition: object.h:3
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1243
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
r parent
Definition: btrfs.c:3010
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define SM_CYBORDER
Definition: winuser.h:959
#define WPF_MININIT
Definition: ntuser.h:681
#define SM_CYMINIMIZED
Definition: winuser.h:1015
#define SM_CXBORDER
Definition: winuser.h:958
Definition: ntuser.h:688
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91

Referenced by NtUserCallHwndLock().

◆ co_WinPosDoNCCALCSize()

static LONG FASTCALL co_WinPosDoNCCALCSize ( PWND  Window,
PWINDOWPOS  WinPos,
RECTL WindowRect,
RECTL ClientRect,
RECTL validRects 
)
static

Definition at line 1179 of file winpos.c.

1180 {
1181  PWND Parent;
1182  UINT wvrFlags = 0;
1183 
1185 
1186  /* Send WM_NCCALCSIZE message to get new client area */
1187  if ((WinPos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE)
1188  {
1190  WINDOWPOS winposCopy;
1191 
1192  params.rgrc[0] = *WindowRect; // new coordinates of a window that has been moved or resized
1193  params.rgrc[1] = Window->rcWindow; // window before it was moved or resized
1194  params.rgrc[2] = Window->rcClient; // client area before the window was moved or resized
1195 
1196  Parent = Window->spwndParent;
1197  if (0 != (Window->style & WS_CHILD) && Parent)
1198  {
1199  RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->rcClient.left, - Parent->rcClient.top);
1200  RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->rcClient.left, - Parent->rcClient.top);
1201  RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->rcClient.left, - Parent->rcClient.top);
1202  }
1203 
1204  params.lppos = &winposCopy;
1205  winposCopy = *WinPos;
1206 
1207  wvrFlags = co_IntSendMessage(Window->head.h, WM_NCCALCSIZE, TRUE, (LPARAM) &params);
1208 
1209  /* If the application send back garbage, ignore it */
1210  if (params.rgrc[0].left <= params.rgrc[0].right &&
1211  params.rgrc[0].top <= params.rgrc[0].bottom)
1212  {
1213  *ClientRect = params.rgrc[0]; // First rectangle contains the coordinates of the new client rectangle resulting from the move or resize
1214  if ((Window->style & WS_CHILD) && Parent)
1215  {
1216  RECTL_vOffsetRect(ClientRect, Parent->rcClient.left, Parent->rcClient.top);
1217  }
1218  FixClientRect(ClientRect, WindowRect);
1219  }
1220 
1221  if (ClientRect->left != Window->rcClient.left ||
1222  ClientRect->top != Window->rcClient.top)
1223  {
1224  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1225  }
1226 
1227  if (ClientRect->right - ClientRect->left != Window->rcClient.right - Window->rcClient.left)
1228  {
1229  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1230  }
1231  else
1232  wvrFlags &= ~WVR_HREDRAW;
1233 
1234  if (ClientRect->bottom - ClientRect->top != Window->rcClient.bottom - Window->rcClient.top)
1235  {
1236  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1237  }
1238  else
1239  wvrFlags &= ~WVR_VREDRAW;
1240 
1241  validRects[0] = params.rgrc[1]; // second rectangle contains the valid destination rectangle
1242  validRects[1] = params.rgrc[2]; // third rectangle contains the valid source rectangle
1243  }
1244  else
1245  {
1246  if (!(WinPos->flags & SWP_NOMOVE) &&
1247  (ClientRect->left != Window->rcClient.left ||
1248  ClientRect->top != Window->rcClient.top))
1249  {
1250  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1251  }
1252  }
1253 
1255  {
1256  RECTL_vSetEmptyRect( &validRects[0] );
1257  RECTL_vSetEmptyRect( &validRects[1] );
1258  }
1259  else get_valid_rects( &Window->rcClient, ClientRect, wvrFlags, validRects );
1260 
1261  return wvrFlags;
1262 }
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
#define WM_NCCALCSIZE
Definition: winuser.h:1675
long bottom
Definition: polytest.cpp:53
#define WS_CHILD
Definition: pedump.c:617
#define SWP_HIDEWINDOW
Definition: winuser.h:1231
#define SWP_NOCOPYBITS
Definition: winuser.h:1233
long right
Definition: polytest.cpp:53
Definition: window.c:28
GLenum const GLfloat * params
Definition: glext.h:5645
long top
Definition: polytest.cpp:53
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3584
long left
Definition: polytest.cpp:53
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SWP_FRAMECHANGED
Definition: winuser.h:1230
#define SWP_NOSIZE
Definition: winuser.h:1235
Definition: ntuser.h:688
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
static VOID FASTCALL FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
Definition: winpos.c:1080
#define WVR_HREDRAW
Definition: winuser.h:2509
unsigned int UINT
Definition: ndis.h:50
#define WVR_VREDRAW
Definition: winuser.h:2510
#define SWP_SHOWWINDOW
Definition: winuser.h:1238
#define SWP_NOREDRAW
Definition: winuser.h:1236
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1234
static VOID FASTCALL get_valid_rects(RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
Definition: winpos.c:1123
#define SWP_NOCLIENTSIZE
Definition: msg.h:29

Referenced by co_WinPosSetWindowPos().

◆ co_WinPosDoWinPosChanging()

static BOOL FASTCALL co_WinPosDoWinPosChanging ( PWND  Window,
PWINDOWPOS  WinPos,
PRECTL  WindowRect,
PRECTL  ClientRect 
)
static

Definition at line 1266 of file winpos.c.

1270 {
1272 
1273  /* Send WM_WINDOWPOSCHANGING message */
1274 
1275  if (!(WinPos->flags & SWP_NOSENDCHANGING)
1276  && !((WinPos->flags & SWP_AGG_NOCLIENTCHANGE) && (WinPos->flags & SWP_SHOWWINDOW)))
1277  {
1278  TRACE("Sending WM_WINDOWPOSCHANGING to hwnd %p flags %04x.\n", Window->head.h,WinPos->flags);
1279  co_IntSendMessage(Window->head.h, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos);
1280  }
1281 
1282  /* Calculate new position and size */
1283 
1284  *WindowRect = Window->rcWindow;
1285  *ClientRect = (Window->style & WS_MINIMIZE) ? Window->rcWindow : Window->rcClient;
1286 
1287  if (!(WinPos->flags & SWP_NOSIZE))
1288  {
1289  if (Window->style & WS_MINIMIZE)
1290  {
1291  WindowRect->right = WindowRect->left + UserGetSystemMetrics(SM_CXMINIMIZED);
1292  WindowRect->bottom = WindowRect->top + UserGetSystemMetrics(SM_CYMINIMIZED);
1293  }
1294  else
1295  {
1296  WindowRect->right = WindowRect->left + WinPos->cx;
1297  WindowRect->bottom = WindowRect->top + WinPos->cy;
1298  }
1299  }
1300 
1301  if (!(WinPos->flags & SWP_NOMOVE))
1302  {
1303  INT X, Y;
1304  PWND Parent;
1305  X = WinPos->x;
1306  Y = WinPos->y;
1307 
1308  Parent = Window->spwndParent;
1309 
1310  // Parent child position issue is in here. SetParent_W7 test CORE-6651.
1311  if (//((Window->style & WS_CHILD) != 0) && <- Fixes wine msg test_SetParent: "rects do not match", the last test.
1312  Parent &&
1313  Parent != Window->head.rpdesk->pDeskInfo->spwnd)
1314  {
1315  TRACE("Not SWP_NOMOVE 1 Parent client offset X %d Y %d\n",X,Y);
1316  X += Parent->rcClient.left;
1317  Y += Parent->rcClient.top;
1318  TRACE("Not SWP_NOMOVE 2 Parent client offset X %d Y %d\n",X,Y);
1319  }
1320 
1321  WindowRect->left = X;
1322  WindowRect->top = Y;
1323  WindowRect->right += X - Window->rcWindow.left;
1324  WindowRect->bottom += Y - Window->rcWindow.top;
1325 
1326  RECTL_vOffsetRect(ClientRect, X - Window->rcWindow.left,
1327  Y - Window->rcWindow.top);
1328  }
1330 
1331  TRACE( "hwnd %p, after %p, swp %d,%d %dx%d flags %08x\n",
1332  WinPos->hwnd, WinPos->hwndInsertAfter, WinPos->x, WinPos->y,
1333  WinPos->cx, WinPos->cy, WinPos->flags );
1334  TRACE("WindowRect: %d %d %d %d\n", WindowRect->left,WindowRect->top,WindowRect->right,WindowRect->bottom);
1335  TRACE("ClientRect: %d %d %d %d\n", ClientRect->left,ClientRect->top,ClientRect->right,ClientRect->bottom);
1336 
1337  return TRUE;
1338 }
#define Y(I)
#define TRUE
Definition: types.h:120
#define SM_CXMINIMIZED
Definition: winuser.h:1014
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
long bottom
Definition: polytest.cpp:53
HWND hwndInsertAfter
Definition: winuser.h:3579
if(dx==0 &&dy==0)
Definition: linetemp.h:174
int32_t INT
Definition: typedefs.h:58
#define SWP_NOSENDCHANGING
Definition: winuser.h:1241
long right
Definition: polytest.cpp:53
Definition: window.c:28
#define WS_MINIMIZE
Definition: pedump.c:622
long top
Definition: polytest.cpp:53
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3584
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define TRACE(s)
Definition: solgame.cpp:4
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1651
#define SM_CYMINIMIZED
Definition: winuser.h:1015
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SWP_NOSIZE
Definition: winuser.h:1235
Definition: ntuser.h:688
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:25
#define SWP_SHOWWINDOW
Definition: winuser.h:1238
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1234
HWND hwnd
Definition: winuser.h:3578
#define SWP_NOCLIENTSIZE
Definition: msg.h:29
#define X(b, s)

Referenced by co_WinPosSetWindowPos().

◆ co_WinPosGetMinMaxInfo()

UINT FASTCALL co_WinPosGetMinMaxInfo ( PWND  Window,
POINT MaxSize,
POINT MaxPos,
POINT MinTrack,
POINT MaxTrack 
)

Definition at line 933 of file winpos.c.

935 {
936  MINMAXINFO MinMax;
937  PMONITOR monitor;
938  INT xinc, yinc;
939  LONG style = Window->style;
940  LONG adjustedStyle;
941  LONG exstyle = Window->ExStyle;
942  RECT rc;
943  DWORD adjust;
944 
946 
947  /* Compute default values */
948 
949  rc = Window->rcWindow;
950  MinMax.ptReserved.x = rc.left;
951  MinMax.ptReserved.y = rc.top;
952 
953  if ((style & WS_CAPTION) == WS_CAPTION)
954  adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
955  else
956  adjustedStyle = style;
957 
958  if (Window->spwndParent)
959  IntGetClientRect(Window->spwndParent, &rc);
960 
961  adjust = IntGetWindowBorders(adjustedStyle, exstyle);
962 
963  // Handle special case while maximized. CORE-15893
964  if ((adjustedStyle & WS_THICKFRAME) && !(adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
965  adjust += 1;
966 
967  xinc = yinc = adjust;
968 
969  if ((adjustedStyle & WS_THICKFRAME) && (adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
970  {
973  }
974 
975  RECTL_vInflateRect( &rc,
978 
979  xinc = -rc.left;
980  yinc = -rc.top;
981 
982  MinMax.ptMaxSize.x = rc.right - rc.left;
983  MinMax.ptMaxSize.y = rc.bottom - rc.top;
984  if (style & (WS_DLGFRAME | WS_BORDER))
985  {
988  }
989  else
990  {
991  MinMax.ptMinTrackSize.x = 2 * xinc;
992  MinMax.ptMinTrackSize.y = 2 * yinc;
993  }
996  MinMax.ptMaxPosition.x = -xinc;
997  MinMax.ptMaxPosition.y = -yinc;
998 
999  if (!EMPTYPOINT(Window->InternalPos.MaxPos)) MinMax.ptMaxPosition = Window->InternalPos.MaxPos;
1000 
1001  co_IntSendMessage(Window->head.h, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax);
1002 
1003  /* if the app didn't change the values, adapt them for the current monitor */
1004  if ((monitor = UserGetPrimaryMonitor()))
1005  {
1006  RECT rc_work;
1007 
1008  rc_work = monitor->rcMonitor;
1009 
1010  if (style & WS_MAXIMIZEBOX)
1011  {
1012  if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP)))
1013  rc_work = monitor->rcWork;
1014  }
1015 
1016  if (MinMax.ptMaxSize.x == UserGetSystemMetrics(SM_CXSCREEN) + 2 * xinc &&
1017  MinMax.ptMaxSize.y == UserGetSystemMetrics(SM_CYSCREEN) + 2 * yinc)
1018  {
1019  MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
1020  MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
1021  }
1022  if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
1023  {
1024  MinMax.ptMaxPosition.x = rc_work.left - xinc;
1025  MinMax.ptMaxPosition.y = rc_work.top - yinc;
1026  }
1027  if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
1028  MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
1029  {
1030  Window->state |= WNDS_MAXIMIZESTOMONITOR;
1031  }
1032  else
1033  Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
1034  }
1035 
1036 
1037  MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
1038  MinMax.ptMinTrackSize.x);
1039  MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
1040  MinMax.ptMinTrackSize.y);
1041 
1042  if (MaxSize)
1043  *MaxSize = MinMax.ptMaxSize;
1044  if (MaxPos)
1045  *MaxPos = MinMax.ptMaxPosition;
1046  if (MinTrack)
1047  *MinTrack = MinMax.ptMinTrackSize;
1048  if (MaxTrack)
1049  *MaxTrack = MinMax.ptMaxTrackSize;
1050 
1051  return 0; // FIXME: What does it return? Wine returns MINMAXINFO.
1052 }
POINT ptMinTrackSize
Definition: winuser.h:3620
#define WS_THICKFRAME
Definition: pedump.c:630
#define max(a, b)
Definition: svc.c:63
long y
Definition: polytest.cpp:48
POINT ptReserved
Definition: winuser.h:3617
POINT ptMaxSize
Definition: winuser.h:3618
#define SM_CYMINTRACK
Definition: winuser.h:992
long x
Definition: polytest.cpp:48
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
DWORD IntGetWindowBorders(DWORD Style, DWORD ExStyle)
Definition: winpos.c:914
LONG top
Definition: windef.h:307
#define WS_DLGFRAME
Definition: pedump.c:626
#define WS_CHILD
Definition: pedump.c:617
#define SM_CYMAXTRACK
Definition: winuser.h:1017
LONG left
Definition: windef.h:306
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
LONG right
Definition: windef.h:308
int32_t INT
Definition: typedefs.h:58
RECT rcWork
Definition: monitor.h:19
#define EMPTYPOINT(pt)
Definition: winpos.c:28
#define SM_CXSCREEN
Definition: winuser.h:953
Definition: window.c:28
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define SM_CYDLGFRAME
Definition: winuser.h:962
LONG_PTR LPARAM
Definition: windef.h:208
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define WS_CAPTION
Definition: pedump.c:624
#define SM_CYSCREEN
Definition: winuser.h:954
#define SM_CXDLGFRAME
Definition: winuser.h:960
#define SM_CXMINTRACK
Definition: winuser.h:991
unsigned long DWORD
Definition: ntddk_ex.h:95
POINT ptMaxPosition
Definition: winuser.h:3619
#define SM_CYBORDER
Definition: winuser.h:959
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SM_CXBORDER
Definition: winuser.h:958
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:630
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102
#define SM_CXMAXTRACK
Definition: winuser.h:1016
RECT rcMonitor
Definition: monitor.h:18
LONG bottom
Definition: windef.h:309
POINT ptMaxTrackSize
Definition: winuser.h:3621
Arabic default style
Definition: afstyles.h:93
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91
#define WM_GETMINMAXINFO
Definition: winuser.h:1630

Referenced by co_UserCreateWindowEx(), co_WinPosMinMaximize(), DefWndDoSizeMove(), and DefWndHandleWindowPosChanging().

◆ co_WinPosGetNonClientSize()

LRESULT FASTCALL co_WinPosGetNonClientSize ( PWND  Window,
RECT WindowRect,
RECT ClientRect 
)

Definition at line 2318 of file winpos.c.

2319 {
2320  LRESULT Result;
2321 
2323 
2324  *ClientRect = *WindowRect;
2325  Result = co_IntSendMessageNoWait(Window->head.h, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect);
2326 
2327  FixClientRect(ClientRect, WindowRect);
2328 
2329  return Result;
2330 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
#define WM_NCCALCSIZE
Definition: winuser.h:1675
Definition: window.c:28
#define FALSE
Definition: types.h:117
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
LONG_PTR LPARAM
Definition: windef.h:208
static VOID FASTCALL FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
Definition: winpos.c:1080
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
LONG_PTR LRESULT
Definition: windef.h:209

Referenced by co_IntCreateScrollBars(), and co_UserCreateWindowEx().

◆ co_WinPosMinMaximize()

UINT FASTCALL co_WinPosMinMaximize ( PWND  Wnd,
UINT  ShowFlag,
RECT NewPos 
)

Definition at line 2367 of file winpos.c.

2368 {
2369  POINT Size;
2370  WINDOWPLACEMENT wpl;
2371  LONG old_style;
2372  UINT SwpFlags = 0;
2373 
2374  ASSERT_REFS_CO(Wnd);
2375 
2376  wpl.length = sizeof(wpl);
2377  IntGetWindowPlacement( Wnd, &wpl );
2378 
2379  if (co_HOOK_CallHooks( WH_CBT, HCBT_MINMAX, (WPARAM)Wnd->head.h, ShowFlag))
2380  {
2381  ERR("WinPosMinMaximize WH_CBT Call Hook return!\n");
2382  return SWP_NOSIZE | SWP_NOMOVE;
2383  }
2384  if (Wnd->style & WS_MINIMIZE)
2385  {
2386  switch (ShowFlag)
2387  {
2388  case SW_MINIMIZE:
2389  case SW_SHOWMINNOACTIVE:
2390  case SW_SHOWMINIMIZED:
2391  case SW_FORCEMINIMIZE:
2392  return SWP_NOSIZE | SWP_NOMOVE;
2393  }
2394  if (!co_IntSendMessageNoWait(Wnd->head.h, WM_QUERYOPEN, 0, 0))
2395  {
2396  return(SWP_NOSIZE | SWP_NOMOVE);
2397  }
2398  SwpFlags |= SWP_NOCOPYBITS;
2399  }
2400  switch (ShowFlag)
2401  {
2402  case SW_MINIMIZE:
2403  case SW_SHOWMINNOACTIVE:
2404  case SW_SHOWMINIMIZED:
2405  case SW_FORCEMINIMIZE:
2406  {
2407  //ERR("MinMaximize Minimize\n");
2408  if (Wnd->style & WS_MAXIMIZE)
2409  {
2410  Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
2411  }
2412  else
2413  {
2414  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2415  }
2416 
2417  old_style = IntSetStyle( Wnd, WS_MINIMIZE, WS_MAXIMIZE );
2418 
2420 
2421  if (!(Wnd->InternalPos.flags & WPF_SETMINPOSITION))
2422  Wnd->InternalPos.flags &= ~WPF_MININIT;
2423 
2424  WinPosFindIconPos(Wnd, &wpl.ptMinPosition);
2425 
2426  if (!(old_style & WS_MINIMIZE))
2427  {
2428  SwpFlags |= SWP_STATECHANGED;
2429  IntShowOwnedPopups(Wnd, FALSE);
2430  }
2431 
2432  RECTL_vSetRect(NewPos, wpl.ptMinPosition.x, wpl.ptMinPosition.y,
2435  SwpFlags |= SWP_NOCOPYBITS;
2436  break;
2437  }
2438 
2439  case SW_MAXIMIZE:
2440  {
2441  //ERR("MinMaximize Maximize\n");
2442  if ((Wnd->style & WS_MAXIMIZE) && (Wnd->style & WS_VISIBLE))
2443  {
2444  SwpFlags = SWP_NOSIZE | SWP_NOMOVE;
2445  break;
2446  }
2448 
2449  /*ERR("Maximize: %d,%d %dx%d\n",
2450  wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, Size.x, Size.y);
2451  */
2452  old_style = IntSetStyle( Wnd, WS_MAXIMIZE, WS_MINIMIZE );
2453  /*if (old_style & WS_MINIMIZE)
2454  {
2455  IntShowOwnedPopups(Wnd, TRUE);
2456  }*/
2457 
2458  if (!(old_style & WS_MAXIMIZE)) SwpFlags |= SWP_STATECHANGED;
2459  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2460  //wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2461  Size.x, Size.y);
2462  break;
2463  }
2464 
2465  case SW_SHOWNOACTIVATE:
2466  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2467  /* fall through */
2468  case SW_SHOWNORMAL:
2469  case SW_RESTORE:
2470  case SW_SHOWDEFAULT: /* FIXME: should have its own handler */
2471  {
2472  //ERR("MinMaximize Restore\n");
2473  old_style = IntSetStyle( Wnd, 0, WS_MINIMIZE | WS_MAXIMIZE );
2474  if (old_style & WS_MINIMIZE)
2475  {
2476  IntShowOwnedPopups(Wnd, TRUE);
2477 
2478  if (Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED)
2479  {
2481  IntSetStyle( Wnd, WS_MAXIMIZE, 0 );
2482  SwpFlags |= SWP_STATECHANGED;
2483  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2484  wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2485  break;
2486  }
2487  else
2488  {
2489  *NewPos = wpl.rcNormalPosition;
2490  NewPos->right -= NewPos->left;
2491  NewPos->bottom -= NewPos->top;
2492  break;
2493  }
2494  }
2495  else
2496  {
2497  if (!(old_style & WS_MAXIMIZE))
2498  {
2499  break;
2500  }
2501  SwpFlags |= SWP_STATECHANGED;
2502  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2503  *NewPos = wpl.rcNormalPosition;
2504  NewPos->right -= NewPos->left;
2505  NewPos->bottom -= NewPos->top;
2506  break;
2507  }
2508  }
2509  }
2510  return SwpFlags;
2511 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1207
static VOID FASTCALL WinPosFindIconPos(PWND Window, POINT *Pos)
Definition: winpos.c:780
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define SW_SHOWNOACTIVATE
Definition: winuser.h:768
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
#define SM_CXMINIMIZED
Definition: winuser.h:1014
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:771
BOOL FASTCALL IntGetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:558
LONG top
Definition: windef.h:307
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4656
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
UINT_PTR WPARAM
Definition: windef.h:207
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2522
LONG left
Definition: windef.h:306
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
LONG right
Definition: windef.h:308
#define SWP_NOCOPYBITS
Definition: winuser.h:1233
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
THRDESKHEAD head
Definition: ntuser.h:690
#define WH_CBT
Definition: winuser.h:35
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:933
#define SWP_STATECHANGED
Definition: msg.c:42
#define WPF_SETMINPOSITION
Definition: winuser.h:2523
#define SW_MINIMIZE
Definition: winuser.h:770
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
#define RDW_VALIDATE
Definition: winuser.h:1208
#define WPF_MININIT
Definition: ntuser.h:681
#define SM_CYMINIMIZED
Definition: winuser.h:1015
#define RDW_NOERASE
Definition: winuser.h:1205
#define HCBT_MINMAX
Definition: winuser.h:56
#define SWP_NOSIZE
Definition: winuser.h:1235
#define ERR(fmt,...)
Definition: debug.h:110
POINT ptMinPosition
Definition: winuser.h:3283
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
#define SW_SHOWNORMAL
Definition: winuser.h:764
POINT ptMaxPosition
Definition: winuser.h:3284
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:888
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
RECT rcNormalPosition
Definition: winuser.h:3285
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:147
LONG bottom
Definition: windef.h:309
#define SWP_NOMOVE
Definition: winuser.h:1234
struct _WND::@4898 InternalPos
#define WM_QUERYOPEN
Definition: winuser.h:1614
#define WS_VISIBLE
Definition: pedump.c:620
#define SW_FORCEMINIMIZE
Definition: winuser.h:775
#define SW_MAXIMIZE
Definition: winuser.h:766
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:701

Referenced by co_UserCreateWindowEx(), and co_WinPosShowWindow().

◆ co_WinPosSearchChildren()

static PWND co_WinPosSearchChildren ( IN PWND  ScopeWin,
IN POINT Point,
IN OUT USHORT HitTest,
IN BOOL  Ignore 
)
static

Definition at line 2800 of file winpos.c.

2806 {
2807  HWND *List, *phWnd;
2808  PWND pwndChild = NULL;
2809 
2810  /* not visible */
2811  if (!(ScopeWin->style & WS_VISIBLE))
2812  {
2813  return NULL;
2814  }
2815 
2816  /* not in window or in window region */
2817  if (!IntPtInWindow(ScopeWin, Point->x, Point->y))
2818  {
2819  return NULL;
2820  }
2821 
2822  /* transparent */
2823  if ((ScopeWin->ExStyle & (WS_EX_LAYERED|WS_EX_TRANSPARENT)) == (WS_EX_LAYERED|WS_EX_TRANSPARENT))
2824  {
2825  return NULL;
2826  }
2827 
2828  if (!Ignore && (ScopeWin->style & WS_DISABLED))
2829  { /* disabled child */
2830  if ((ScopeWin->style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return NULL;
2831  /* process the hit error */
2832  *HitTest = HTERROR;
2833  return ScopeWin;
2834  }
2835 
2836  /* not minimized and check if point is inside the window */
2837  if (!(ScopeWin->style & WS_MINIMIZE) &&
2838  RECTL_bPointInRect(&ScopeWin->rcClient, Point->x, Point->y) )
2839  {
2840  UserReferenceObject(ScopeWin);
2841 
2842  List = IntWinListChildren(ScopeWin);
2843  if (List)
2844  {
2845  for (phWnd = List; *phWnd; ++phWnd)
2846  {
2847  if (!(pwndChild = ValidateHwndNoErr(*phWnd)))
2848  {
2849  continue;
2850  }
2851 
2852  pwndChild = co_WinPosSearchChildren(pwndChild, Point, HitTest, Ignore);
2853 
2854  if (pwndChild != NULL)
2855  {
2856  /* We found a window. Don't send any more WM_NCHITTEST messages */
2858  UserDereferenceObject(ScopeWin);
2859  return pwndChild;
2860  }
2861  }
2863  }
2864  UserDereferenceObject(ScopeWin);
2865  }
2866 
2867  if (ScopeWin->head.pti == PsGetCurrentThreadWin32Thread())
2868  {
2869  *HitTest = (USHORT)co_IntSendMessage(ScopeWin->head.h, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y));
2870 
2871  if ((*HitTest) == (USHORT)HTTRANSPARENT)
2872  {
2873  return NULL;
2874  }
2875  }
2876  else
2877  {
2878  if (*HitTest == HTNOWHERE && pwndChild == NULL) *HitTest = HTCLIENT;
2879  }
2880 
2881  return ScopeWin;
2882 }
#define WS_DISABLED
Definition: pedump.c:621
#define HTTRANSPARENT
Definition: winuser.h:2463
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
#define WM_NCHITTEST
Definition: winuser.h:1676
#define WS_CHILD
Definition: pedump.c:617
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
#define HTNOWHERE
Definition: winuser.h:2464
#define WS_MINIMIZE
Definition: pedump.c:622
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2800
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HTERROR
Definition: winuser.h:2462
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
#define WS_EX_LAYERED
Definition: winuser.h:389
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:278
Definition: ntuser.h:688
unsigned short USHORT
Definition: pedump.c:61
#define WS_POPUP
Definition: pedump.c:616
#define NULL
Definition: types.h:112
#define HTCLIENT
Definition: winuser.h:2465
#define USERTAG_WINDOWLIST
Definition: tags.h:298
#define WS_VISIBLE
Definition: pedump.c:620
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:731

Referenced by co_WinPosWindowFromPoint().

◆ co_WinPosSendSizeMove()

void FASTCALL co_WinPosSendSizeMove ( PWND  Wnd)

Definition at line 2333 of file winpos.c.

2334 {
2335  RECTL Rect;
2336  LPARAM lParam;
2338 
2339  IntGetClientRect(Wnd, &Rect);
2340  lParam = MAKELONG(Rect.right-Rect.left, Rect.bottom-Rect.top);
2341 
2342  Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS;
2343 
2344  if (Wnd->style & WS_MAXIMIZE)
2345  {
2347  }
2348  else if (Wnd->style & WS_MINIMIZE)
2349  {
2351  lParam = 0;
2352  }
2353 
2355 
2356  if (UserIsDesktopWindow(Wnd->spwndParent))
2357  lParam = MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top);
2358  else
2359  lParam = MAKELONG(Wnd->rcClient.left-Wnd->spwndParent->rcClient.left, Wnd->rcClient.top-Wnd->spwndParent->rcClient.top);
2360 
2362 
2364 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define SIZE_MAXIMIZED
Definition: winuser.h:2497
#define SIZE_RESTORED
Definition: winuser.h:2495
LONG top
Definition: windef.h:307
#define WM_MOVE
Definition: winuser.h:1600
UINT_PTR WPARAM
Definition: windef.h:207
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:604
RECT rcClient
Definition: ntuser.h:712
LONG left
Definition: windef.h:306
WPARAM wParam
Definition: combotst.c:138
#define WS_MINIMIZE
Definition: pedump.c:622
#define MAKELONG(a, b)
Definition: typedefs.h:249
LONG_PTR LPARAM
Definition: windef.h:208
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define WM_SIZE
Definition: winuser.h:1601
#define SIZE_MINIMIZED
Definition: winuser.h:2496
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
DWORD state
Definition: ntuser.h:696
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
struct _WND * spwndParent
Definition: ntuser.h:708
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91
LPARAM lParam
Definition: combotst.c:139
struct Rect Rect
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:701

Referenced by co_UserCreateWindowEx(), and co_WinPosShowWindow().

◆ co_WinPosSetWindowPos()

BOOLEAN FASTCALL co_WinPosSetWindowPos ( PWND  Window,
HWND  WndInsertAfter,
INT  x,
INT  y,
INT  cx,
INT  cy,
UINT  flags 
)

Definition at line 1748 of file winpos.c.

1757 {
1758  WINDOWPOS WinPos;
1759  RECTL NewWindowRect;
1760  RECTL NewClientRect;
1761  RECTL valid_rects[2];
1762  PREGION VisBefore = NULL;
1763  PREGION VisBeforeJustClient = NULL;
1764  PREGION VisAfter = NULL;
1765  PREGION CopyRgn = NULL;
1766  ULONG WvrFlags = 0;
1767  RECTL OldWindowRect, OldClientRect;
1768  int RgnType;
1769  HDC Dc;
1770  RECTL CopyRect;
1771  PWND Ancestor;
1772  BOOL bPointerInWindow, PosChanged = FALSE;
1774 
1776 
1777  TRACE("pwnd %p, after %p, %d,%d (%dx%d), flags 0x%x\n",
1778  Window, WndInsertAfter, x, y, cx, cy, flags);
1779 #if DBG
1780  dump_winpos_flags(flags);
1781 #endif
1782 
1783  /* FIXME: Get current active window from active queue. Why? since r2915. */
1784 
1785  bPointerInWindow = IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y);
1786 
1787  WinPos.hwnd = Window->head.h;
1788  WinPos.hwndInsertAfter = WndInsertAfter;
1789  WinPos.x = x;
1790  WinPos.y = y;
1791  WinPos.cx = cx;
1792  WinPos.cy = cy;
1793  WinPos.flags = flags;
1794 
1795  if ( flags & SWP_ASYNCWINDOWPOS )
1796  {
1797  LRESULT lRes;
1799  if ( ppos )
1800  {
1801  WinPos.flags &= ~SWP_ASYNCWINDOWPOS; // Clear flag.
1802  *ppos = WinPos;
1803  /* Yes it's a pointer inside Win32k! */
1804  lRes = co_IntSendMessageNoWait( WinPos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
1805  /* We handle this the same way as Event Hooks and Hooks. */
1806  if ( !lRes )
1807  {
1809  return FALSE;
1810  }
1811  return TRUE;
1812  }
1813  return FALSE;
1814  }
1815 
1816  co_WinPosDoWinPosChanging(Window, &WinPos, &NewWindowRect, &NewClientRect);
1817 
1818  /* Does the window still exist? */
1819  if (!IntIsWindow(WinPos.hwnd))
1820  {
1821  TRACE("WinPosSetWindowPos: Invalid handle 0x%p!\n",WinPos.hwnd);
1823  return FALSE;
1824  }
1825 
1826  /* Fix up the flags. */
1827  if (!WinPosFixupFlags(&WinPos, Window))
1828  {
1829  // See Note.
1830  return TRUE;
1831  }
1832 
1833  Ancestor = UserGetAncestor(Window, GA_PARENT);
1834  if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER &&
1835  Ancestor && Ancestor->head.h == IntGetDesktopWindow() )
1836  {
1838  }
1839 
1840  if (!(WinPos.flags & SWP_NOREDRAW))
1841  {
1842  /* Compute the visible region before the window position is changed */
1843  if (!(WinPos.flags & SWP_SHOWWINDOW) &&
1844  (WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
1847  {
1849  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1850 
1851  if ( VisBefore != NULL &&
1852  REGION_Complexity(VisBefore) == NULLREGION )
1853  {
1854  REGION_Delete(VisBefore);
1855  VisBefore = NULL;
1856  }
1857  else if(VisBefore)
1858  {
1859  REGION_bOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top);
1860  }
1861 
1862  /* Calculate the non client area for resizes, as this is used in the copy region */
1863  if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
1864  {
1865  VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
1866  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1867 
1868  if ( VisBeforeJustClient != NULL &&
1869  REGION_Complexity(VisBeforeJustClient) == NULLREGION )
1870  {
1871  REGION_Delete(VisBeforeJustClient);
1872  VisBeforeJustClient = NULL;
1873  }
1874  else if(VisBeforeJustClient)
1875  {
1876  REGION_bOffsetRgn(VisBeforeJustClient, -Window->rcWindow.left, -Window->rcWindow.top);
1877  }
1878  }
1879  }
1880  }
1881 
1883  if (Window->hrgnNewFrame)
1884  {
1885  SelectWindowRgn( Window, Window->hrgnNewFrame ); // Should be PSMWP->acvr->hrgnClip
1886  Window->hrgnNewFrame = NULL;
1887  }
1888 
1889  WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect, valid_rects);
1890 
1891 // ERR("co_WinPosDoNCCALCSize returned 0x%x\n valid dest: %d %d %d %d\n valid src : %d %d %d %d\n", WvrFlags,
1892 // valid_rects[0].left,valid_rects[0].top,valid_rects[0].right,valid_rects[0].bottom,
1893 // valid_rects[1].left,valid_rects[1].top,valid_rects[1].right,valid_rects[1].bottom);
1894 
1895  /* Validate link windows. (also take into account shell window in hwndShellWindow) */
1896  if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow())
1897  {
1899  }
1900 
1901  OldWindowRect = Window->rcWindow;
1902  OldClientRect = Window->rcClient;
1903 
1904  if (NewClientRect.left != OldClientRect.left ||
1905  NewClientRect.top != OldClientRect.top)
1906  {
1907  // Move child window if their parent is moved. Keep Child window relative to Parent...
1909  NewClientRect.left - OldClientRect.left,
1910  NewClientRect.top - OldClientRect.top);
1911  PosChanged = TRUE;
1912  }
1913 
1914  Window->rcWindow = NewWindowRect;
1915  Window->rcClient = NewClientRect;
1916 
1917  /* erase parent when hiding or resizing child */
1918  if (WinPos.flags & SWP_HIDEWINDOW)
1919  {
1920  /* Clear the update region */
1922  NULL,
1923  0,
1925 
1926  if (UserIsDesktopWindow(Window->spwndParent))
1928 
1929  Window->style &= ~WS_VISIBLE; //IntSetStyle( Window, 0, WS_VISIBLE );
1930  Window->head.pti->cVisWindows--;
1932  }
1933  else if (WinPos.flags & SWP_SHOWWINDOW)
1934  {
1935  if (Window->style & WS_CHILD)
1936  {
1937  if ((Window->style & WS_POPUP) && (Window->ExStyle & WS_EX_APPWINDOW))
1938  {
1940  if (!(WinPos.flags & SWP_NOACTIVATE))
1942  }
1943  }
1944  else if ((Window->ExStyle & WS_EX_APPWINDOW) ||
1945  (!(Window->ExStyle & WS_EX_TOOLWINDOW) && !Window->spwndOwner &&
1946  (!Window->spwndParent || UserIsDesktopWindow(Window->spwndParent))))
1947  {
1949  if (!(WinPos.flags & SWP_NOACTIVATE))
1951  }
1952 
1953  Window->style |= WS_VISIBLE; //IntSetStyle( Window, WS_VISIBLE, 0 );
1954  Window->head.pti->cVisWindows++;
1956  }
1957  else
1958  {
1960  }
1961 
1962  if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
1963  {
1964  NtGdiOffsetRgn(Window->hrgnUpdate,
1965  NewWindowRect.left - OldWindowRect.left,
1966  NewWindowRect.top - OldWindowRect.top);
1967  }
1968 
1969  DceResetActiveDCEs(Window); // For WS_VISIBLE changes.
1970 
1971  // Change or update, set send non-client paint flag.
1972  if ( Window->style & WS_VISIBLE &&
1973  (WinPos.flags & SWP_STATECHANGED || (!(Window->state2 & WNDS2_WIN31COMPAT) && WinPos.flags & SWP_NOREDRAW ) ) )
1974  {
1975  TRACE("Set WNDS_SENDNCPAINT %p\n",Window);
1976  Window->state |= WNDS_SENDNCPAINT;
1977  }
1978 
1979  if (!(WinPos.flags & SWP_NOREDRAW))
1980  {
1981  /* Determine the new visible region */
1983  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1984 
1985  if ( VisAfter != NULL &&
1986  REGION_Complexity(VisAfter) == NULLREGION )
1987  {
1988  REGION_Delete(VisAfter);
1989  VisAfter = NULL;
1990  }
1991  else if(VisAfter)
1992  {
1993  REGION_bOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top);
1994  }
1995 
1996  /*
1997  * Determine which pixels can be copied from the old window position
1998  * to the new. Those pixels must be visible in both the old and new
1999  * position. Also, check the class style to see if the windows of this
2000  * class need to be completely repainted on (horizontal/vertical) size
2001  * change.
2002  */
2003  if ( ( VisBefore != NULL &&
2004  VisAfter != NULL &&
2005  !(WinPos.flags & SWP_NOCOPYBITS) &&
2006  ((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
2007  !(Window->ExStyle & WS_EX_TRANSPARENT) ) )
2008  {
2009 
2010  /*
2011  * If this is (also) a window resize, the whole nonclient area
2012  * needs to be repainted. So we limit the copy to the client area,
2013  * 'cause there is no use in copying it (would possibly cause
2014  * "flashing" too). However, if the copy region is already empty,
2015  * we don't have to crop (can't take anything away from an empty
2016  * region...)
2017  */
2018 
2019  CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2020  if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
2021  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
2022  else if (VisBeforeJustClient != NULL)
2023  {
2024  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
2025  }
2026 
2027  if (VisBeforeJustClient != NULL)
2028  {
2029  REGION_Delete(VisBeforeJustClient);
2030  }
2031 
2032  /* Now use in copying bits which are in the update region. */
2033  if (Window->hrgnUpdate != NULL)
2034  {
2035  PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
2036  if (RgnUpdate)
2037  {
2038  REGION_bOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
2039  IntGdiCombineRgn(CopyRgn, CopyRgn, RgnUpdate, RGN_DIFF);
2040  REGION_bOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
2041  REGION_UnlockRgn(RgnUpdate);
2042  }
2043  }
2044 
2045  /*
2046  * Now, get the bounding box of the copy region. If it's empty
2047  * there's nothing to copy. Also, it's no use copying bits onto
2048  * themselves.
2049  */
2051  {
2052  /* Nothing to copy, clean up */
2054  CopyRgn = NULL;
2055  }
2056  else if ( OldWindowRect.left != NewWindowRect.left ||
2057  OldWindowRect.top != NewWindowRect.top ||
2058  (WinPos.flags & SWP_FRAMECHANGED) )
2059  {
2060  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2061  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2062 
2063  /*
2064  * Small trick here: there is no function to bitblt a region. So
2065  * we set the region as the clipping region, take the bounding box
2066  * of the region and bitblt that. Since nothing outside the clipping
2067  * region is copied, this has the effect of bitblt'ing the region.
2068  *
2069  * Since NtUserGetDCEx takes ownership of the clip region, we need
2070  * to create a copy of CopyRgn and pass that. We need CopyRgn later
2071  */
2072  IntGdiCombineRgn(DcRgnObj, CopyRgn, NULL, RGN_COPY);
2073  REGION_bOffsetRgn(DcRgnObj, NewWindowRect.left, NewWindowRect.top);
2074  REGION_UnlockRgn(DcRgnObj);
2075  Dc = UserGetDCEx( Window,
2076  DcRgn,
2077  DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW will set first, go read WinDC.c.
2078  NtGdiBitBlt( Dc,
2079  CopyRect.left, CopyRect.top,
2080  CopyRect.right - CopyRect.left,
2081  CopyRect.bottom - CopyRect.top,
2082  Dc,
2083  CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
2084  CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
2085  SRCCOPY,
2086  0,
2087  0);
2088 
2089  UserReleaseDC(Window, Dc, FALSE);
2091  GreDeleteObject(DcRgn);
2092  }
2093  }
2094  else
2095  {
2096  CopyRgn = NULL;
2097  }
2098 
2099  /* We need to redraw what wasn't visible before or force a redraw */
2100  if (VisAfter != NULL)
2101  {
2102  PREGION DirtyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2103  if (DirtyRgn)
2104  {
2105  if (CopyRgn != NULL)
2106  {
2107  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, CopyRgn, RGN_DIFF);
2108  }
2109  else
2110  {
2111  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, 0, RGN_COPY);
2112  }
2113 
2114  if (RgnType != ERROR && RgnType != NULLREGION) // Regions moved.
2115  {
2116  /* old code
2117  NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2118  IntInvalidateWindows( Window,
2119  DirtyRgn,
2120  RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
2121  }
2122  GreDeleteObject(DirtyRgn);
2123  */
2124 
2125  PWND Parent = Window->spwndParent;
2126 
2127  REGION_bOffsetRgn( DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2128 
2129  if ( (Window->style & WS_CHILD) && (Parent) && !(Parent->style & WS_CLIPCHILDREN))
2130  {
2133  }
2135  }
2136  else if ( RgnType != ERROR && RgnType == NULLREGION ) // Must be the same. See CORE-7166 & CORE-15934, NC HACK fix.
2137  {
2138  if ( !PosChanged &&
2139  !(WinPos.flags & SWP_DEFERERASE) &&
2140  (WinPos.flags & SWP_FRAMECHANGED) )
2141  {
2142  PWND pwnd = Window;
2143  PWND Parent = Window->spwndParent;
2144 
2145  if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing.
2146  {
2147  TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent);
2148  pwnd = Parent ? Parent : pwnd;
2149  }
2150 
2151  if ( !(pwnd->style & WS_CHILD) )
2152  {
2153  /*
2154  * Check if we have these specific windows style bits set/reset.
2155  * FIXME: There may be other combinations of styles that need this handling as well.
2156  * This fixes the ReactOS Calculator buttons disappearing in CORE-16827.
2157  */
2158  if ((Window->style & WS_CLIPSIBLINGS) && !(Window->style & (WS_POPUP | WS_CLIPCHILDREN | WS_SIZEBOX)))
2159  {
2160  IntSendNCPaint(pwnd, HRGN_WINDOW); // Paint the whole frame.
2161  }
2162  else // Use region handling
2163  {
2164  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2165  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2166  TRACE("SWP_FRAMECHANGED win %p hRgn %p\n",pwnd, DcRgn);
2167  IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY);
2168  REGION_UnlockRgn(DcRgnObj);
2169  ForceNCPaintErase(pwnd, DcRgn, DcRgnObj);
2170  GreDeleteObject(DcRgn);
2171  }
2172  }
2173  }
2174  }
2175  REGION_Delete(DirtyRgn);
2176  }
2177  }
2178 
2179  if (CopyRgn != NULL)
2180  {
2182  }
2183 
2184  /* Expose what was covered before but not covered anymore */
2185  if ( VisBefore != NULL )
2186  {
2187  PREGION ExposedRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2188  if (ExposedRgn)
2189  {
2190  RgnType = IntGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
2191  REGION_bOffsetRgn(ExposedRgn,
2192  OldWindowRect.left - NewWindowRect.left,
2193  OldWindowRect.top - NewWindowRect.top);
2194 
2195  if ( VisAfter != NULL )
2196  RgnType = IntGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
2197 
2198  if (RgnType != ERROR && RgnType != NULLREGION)
2199  {
2200  co_VIS_WindowLayoutChanged(Window, ExposedRgn);
2201  }
2202  REGION_Delete(ExposedRgn);
2203  }
2204  REGION_Delete(VisBefore);
2205  }
2206 
2207  if (VisAfter != NULL)
2208  {
2209  REGION_Delete(VisAfter);
2210  }
2211  }
2212 
2213  if (!(WinPos.flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)))
2214  {
2215  if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2216  {
2218  }
2219  else
2220  {
2221  //ERR("SetWindowPos Set FG Window!\n");
2222  if ( pti->MessageQueue->spwndActive != Window ||
2223  pti->MessageQueue != gpqForeground )
2224  {
2225  //ERR("WPSWP : set active window\n");
2226  if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
2227  {
2228  co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
2229  }
2230  }
2231  }
2232  }
2233 
2234  if ( !PosChanged &&
2235  (WinPos.flags & SWP_FRAMECHANGED) &&
2236  !(WinPos.flags & SWP_DEFERERASE) && // Prevent sending WM_SYNCPAINT message.
2237  VisAfter )
2238  {
2239  PWND Parent = Window->spwndParent;
2240  if ( !(Window->style & WS_CHILD) && (Parent) && (Parent->style & WS_CLIPCHILDREN))
2241  {
2242  TRACE("SWP_FRAMECHANGED Parent %p WS_CLIPCHILDREN %p\n",Parent,Window);
2243  UserSyncAndPaintWindows( Parent, RDW_CLIPCHILDREN); // NC should redraw here, see NC HACK fix.
2244  }
2245  }
2246 
2247  // Fix wine msg test_SetFocus, prevents sending WM_WINDOWPOSCHANGED.
2248  if ( VisBefore == NULL &&
2249  VisBeforeJustClient == NULL &&
2250  !(Window->ExStyle & WS_EX_TOPMOST) &&
2252  {
2253  TRACE("No drawing, set no Z order and no redraw!\n");
2254  WinPos.flags |= SWP_NOZORDER|SWP_NOREDRAW;
2255  }
2256 
2257  if(!(flags & SWP_DEFERERASE))
2258  {
2259  /* erase parent when hiding or resizing child */
2260  if ((flags & SWP_HIDEWINDOW) ||
2261  (!(flags & SWP_SHOWWINDOW) &&
2263  {
2264  PWND Parent = Window->spwndParent;
2267  }
2268 
2269  /* Give newly shown windows a chance to redraw */
2270  if(((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2272  {
2274  }
2275  }
2276 
2277  /* And last, send the WM_WINDOWPOSCHANGED message */
2278 
2279  TRACE("\tstatus hwnd %p flags = %04x\n",Window?Window->head.h:NULL,WinPos.flags & SWP_AGG_STATUSFLAGS);
2280 
2281  if (((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2283  {
2284  /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
2285  and always contains final window position.
2286  */
2287  WinPos.x = NewWindowRect.left;
2288  WinPos.y = NewWindowRect.top;
2289  WinPos.cx = NewWindowRect.right - NewWindowRect.left;
2290  WinPos.cy = NewWindowRect.bottom - NewWindowRect.top;
2291  TRACE("WM_WINDOWPOSCHANGED hwnd %p Flags %04x\n",WinPos.hwnd,WinPos.flags);
2292  co_IntSendMessageNoWait(WinPos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM) &WinPos);
2293  }
2294 
2295  if ( WinPos.flags & SWP_FRAMECHANGED || WinPos.flags & SWP_STATECHANGED ||
2296  !(WinPos.flags & SWP_NOCLIENTSIZE) || !(WinPos.flags & SWP_NOCLIENTMOVE) )
2297  {
2298  PWND pWnd = ValidateHwndNoErr(WinPos.hwnd);
2299  if (pWnd)
2300  IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2301  }
2302 
2303  if(bPointerInWindow != IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y))
2304  {
2305  /* Generate mouse move message */
2306  MSG msg;
2307  msg.message = WM_MOUSEMOVE;
2308  msg.wParam = UserGetMouseButtonsState();
2309  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2310  msg.pt = gpsi->ptCursor;
2312  }
2313 
2314  return TRUE;
2315 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1207
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define RDW_NOCHILDREN
Definition: winuser.h:1212
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
#define DCX_CLIPSIBLINGS
Definition: winuser.h:2106
VOID FASTCALL UserSyncAndPaintWindows(PWND pWnd, ULONG Flags)
Definition: painting.c:620
VOID FASTCALL co_VIS_WindowLayoutChanged(PWND Wnd, PREGION NewlyExposed)
Definition: vis.c:145
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define TRUE
Definition: types.h:120
#define ERROR(name)
Definition: error_private.h:53
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WNDS_SENDNCPAINT
Definition: ntuser.h:611
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
#define MAKELPARAM(l, h)
Definition: winuser.h:3998
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
VOID FASTCALL IntSendNCPaint(PWND pWnd, HRGN hRgn)
Definition: painting.c:348
static HDC
Definition: imagelist.c:92
PSERVERINFO gpsi
Definition: imm.c:18
#define SWP_AGG_STATUSFLAGS
Definition: winpos.c:23
#define OBJID_WINDOW
Definition: winable.h:15
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define NULLREGION
Definition: wingdi.h:361
#define HSHELL_WINDOWCREATED
Definition: winuser.h:1245
long bottom
Definition: polytest.cpp:53
static BOOL IntValidateParent(PWND Child, PREGION ValidateRgn)
Definition: winpos.c:1056
HWND hwndInsertAfter
Definition: winuser.h:3579
#define WS_SIZEBOX
Definition: pedump.c:642
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
static BOOL FASTCALL co_WinPosDoWinPosChanging(PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
Definition: winpos.c:1266
UINT_PTR WPARAM
Definition: windef.h:207
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2727
#define WS_CHILD
Definition: pedump.c:617
#define RDW_FRAME
Definition: winuser.h:1202
#define SWP_NOZORDER
Definition: winuser.h:1237
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
#define WS_CLIPCHILDREN
Definition: pedump.c:619
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2377
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define DCX_INTERSECTRGN
Definition: winuser.h:2112
#define DCX_WINDOW
Definition: winuser.h:2103
#define SWP_HIDEWINDOW
Definition: winuser.h:1231
#define WNDS_BEINGACTIVATED
Definition: ntuser.h:620
#define RGN_AND
Definition: wingdi.h:356
#define SWP_NOCOPYBITS
Definition: winuser.h:1233
long right
Definition: polytest.cpp:53
Definition: window.c:28
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2426
VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
Definition: window.c:971
#define FALSE
Definition: types.h:117
#define WM_CHILDACTIVATE
Definition: winuser.h:1628
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GA_PARENT
Definition: winuser.h:2778
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3675
long top
Definition: polytest.cpp:53
static HWND FASTCALL WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter)
Definition: winpos.c:1354
#define CHILDID_SELF
Definition: winable.h:14
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
THRDESKHEAD head
Definition: ntuser.h:690
static LONG FASTCALL co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
Definition: winpos.c:1179
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:68
#define HRGN_WINDOW
Definition: ntuser.h:356
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1243
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
LONG_PTR LPARAM
Definition: windef.h:208
Definition: region.h:7
UINT flags
Definition: winuser.h:3584
#define WEF_SETBYWNDPTI
Definition: ntuser.h:235
#define SWP_AGG_NOGEOMETRYCHANGE
Definition: winpos.c:19
long left
Definition: polytest.cpp:53
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2506
BOOL FASTCALL IntCheckFullscreen(PWND Window)
Definition: focus.c:79
static BOOL FASTCALL WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd)
Definition: winpos.c:1550
VOID SelectWindowRgn(PWND Window, HRGN hRgnClip)
Definition: winpos.c:258
#define TRACE(s)
Definition: solgame.cpp:4
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define RDW_ERASE
Definition: winuser.h:1201
#define SWP_STATECHANGED
Definition: msg.c:42
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
VOID FASTCALL co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse)
Definition: painting.c:403
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:180
int Window
Definition: x11stubs.h:26
GLbitfield flags
Definition: glext.h:7161
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
__kernel_entry W32KAPI INT APIENTRY NtGdiOffsetRgn(_In_ HRGN hrgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:3981
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:642
#define RDW_VALIDATE
Definition: winuser.h:1208
VOID FASTCALL DceResetActiveDCEs(PWND Window)
Definition: windc.c:816
static VOID FASTCALL WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY)
Definition: winpos.c:1520
#define RDW_NOERASE
Definition: winuser.h:1205
#define SWP_FRAMECHANGED
Definition: winuser.h:1230
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define RDW_NOFRAME
Definition: winuser.h:1206
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
Definition: window.c:3331
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1246
#define RGN_COPY
Definition: wingdi.h:357
#define SWP_NOSIZE
Definition: winuser.h:1235
Definition: ntuser.h:688
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
#define WVR_REDRAW
Definition: winuser.h:2511
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1374
#define DCX_CACHE
Definition: winuser.h:2104
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:25
#define RGN_DIFF
Definition: wingdi.h:358
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:888
#define RDW_ALLCHILDREN
Definition: winuser.h:1211
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:644
#define WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1765
#define NULL
Definition: types.h:112
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
#define SWP_SHOWWINDOW
Definition: winuser.h:1238
#define SWP_NOREDRAW
Definition: winuser.h:1236
#define SWP_DEFERERASE
Definition: winuser.h:1242
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1692
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:281
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1652
#define msg(x)
Definition: auth_time.c:54
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2392
_Out_opt_ int * cx
Definition: commctrl.h:585
#define RDW_ERASENOW
Definition: winuser.h:1209
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
#define RDW_CLIPCHILDREN
Definition: painting.h:15
VOID ForceNCPaintErase(PWND Wnd, HRGN hRgn, PREGION pRgn)
Definition: winpos.c:1690
unsigned int ULONG
Definition: retypes.h:1
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1234
#define SWP_AGG_NOPOSCHANGE
Definition: winpos.c:21
INT FASTCALL REGION_Complexity(PREGION prgn)
Definition: region.c:567
#define WS_EX_APPWINDOW
Definition: winuser.h:383
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2562
HWND hwnd
Definition: winuser.h:3578
LONG_PTR LRESULT
Definition: windef.h:209
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1550
#define WS_VISIBLE
Definition: pedump.c:620
#define SWP_NOCLIENTSIZE
Definition: msg.h:29
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define CopyRgn(hrgnDst, hrgnSrc)
Definition: windowsx.h:73
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2468
VOID FASTCALL UpdateShellHook(PWND Window)
Definition: focus.c:99
#define SRCCOPY
Definition: wingdi.h:333
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28
#define RDW_INVALIDATE
Definition: winuser.h:1204
DWORD style
Definition: ntuser.h:701

Referenced by co_IntSendActivateMessages(), co_IntSetForegroundMessageQueue(), co_IntSetParent(), co_IntShowDesktop(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserShowScrollBar(), co_WinPosArrangeIconicWindows(), co_WinPosShowWindow(), DefWndDoSizeMove(), DefWndHandleSetCursor(), DesktopWindowProc(), handle_internal_message(), IntActivateWindow(), IntDefWindowProc(), IntEndDeferWindowPosEx(), IntSetWindowPlacement(), IntUpdateLayeredWindowI(), MENU_ShowPopup(), NC_HandleNCLButtonDblClk(), NtUserCallHwndLock(), NtUserCallTwoParam(), NtUserSetMenu(), NtUserSetShellWindowEx(), NtUserSetWindowPos(), NtUserSetWindowRgn(), SpiNotifyNCMetricsChanged(), and WinPosDoOwnedPopups().

◆ co_WinPosShowWindow()

BOOLEAN FASTCALL co_WinPosShowWindow ( PWND  Wnd,
INT  Cmd 
)

Definition at line 2518 of file winpos.c.

2519 {
2520  BOOLEAN WasVisible;
2521  UINT Swp = 0, EventMsg = 0;
2522  RECTL NewPos = {0, 0, 0, 0};
2523  BOOLEAN ShowFlag;
2524  LONG style;
2525  PWND Parent;
2526  PTHREADINFO pti;
2527  //HRGN VisibleRgn;
2528  BOOL ShowOwned = FALSE;
2529  BOOL FirstTime = FALSE;
2530  ASSERT_REFS_CO(Wnd);
2531  //KeRosDumpStackFrames(NULL, 20);
2533  WasVisible = (Wnd->style & WS_VISIBLE) != 0;
2534  style = Wnd->style;
2535 
2536  TRACE("co_WinPosShowWindow START hwnd %p Cmd %d usicmd %u\n",
2537  Wnd->head.h, Cmd, pti->ppi->usi.wShowWindow);
2538 
2539  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2540  {
2541  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2542  {
2543  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
2544  {
2545  if (Wnd->spwndOwner == NULL)
2546  {
2547  if ( Cmd == SW_SHOWNORMAL || Cmd == SW_SHOW)
2548  {
2549  Cmd = SW_SHOWDEFAULT;
2550  }
2551  FirstTime = TRUE;
2552  TRACE("co_WPSW FT 1\n");
2553  }
2554  }
2555  }
2556  }
2557 
2558  if ( Cmd == SW_SHOWDEFAULT )
2559  {
2560  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2561  {
2562  Cmd = pti->ppi->usi.wShowWindow;
2563  FirstTime = TRUE;
2564  TRACE("co_WPSW FT 2\n");
2565  }
2566  }
2567 
2568  if (FirstTime)
2569  {
2571  }
2572 
2573  switch (Cmd)
2574  {
2575  case SW_HIDE:
2576  {
2577  if (!WasVisible)
2578  {
2579  //ERR("co_WinPosShowWindow Exit Bad\n");
2580  return FALSE;
2581  }
2583  if (Wnd != pti->MessageQueue->spwndActive)
2584  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2585  break;
2586  }
2587 
2588  case SW_FORCEMINIMIZE: /* FIXME: Does not work if thread is hung. */
2589  case SW_SHOWMINNOACTIVE:
2590  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2591  /* Fall through. */
2592  case SW_SHOWMINIMIZED:
2593  case SW_MINIMIZE: /* CORE-15669: SW_MINIMIZE also shows */
2594  Swp |= SWP_SHOWWINDOW;
2595  {
2596  Swp |= SWP_NOACTIVATE;
2597  if (!(style & WS_MINIMIZE))
2598  {
2599  IntShowOwnedPopups(Wnd, FALSE );
2600  // Fix wine Win test_SetFocus todo #1 & #2,
2601  if (Cmd == SW_SHOWMINIMIZED)
2602  {
2603  //ERR("co_WinPosShowWindow Set focus 1\n");
2604  if ((style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2606  else
2607  co_UserSetFocus(0);
2608  }
2609 
2610  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2611 
2612  EventMsg = EVENT_SYSTEM_MINIMIZESTART;
2613  }
2614  else
2615  {
2616  if (WasVisible)
2617  {
2618  //ERR("co_WinPosShowWindow Exit Good\n");
2619  return TRUE;
2620  }
2621  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2622  }
2623  break;
2624  }
2625 
2626  case SW_SHOWMAXIMIZED:
2627  {
2628  Swp |= SWP_SHOWWINDOW;
2629  if (!(style & WS_MAXIMIZE))
2630  {
2631  ShowOwned = TRUE;
2632 
2633  Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos);
2634 
2635  EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2636  }
2637  else
2638  {
2639  if (WasVisible)
2640  {
2641  //ERR("co_WinPosShowWindow Exit Good 1\n");
2642  return TRUE;
2643  }
2644  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2645  }
2646  break;
2647  }
2648 
2649  case SW_SHOWNA:
2651  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOZORDER;
2652  break;
2653  case SW_SHOW:
2654  if (WasVisible) return(TRUE); // Nothing to do!
2656  /* Don't activate the topmost window. */
2657  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2658  break;
2659 
2660  case SW_SHOWNOACTIVATE:
2661  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2662  /* Fall through. */
2663  case SW_SHOWNORMAL:
2664  case SW_SHOWDEFAULT:
2665  case SW_RESTORE:
2666  if (!WasVisible) Swp |= SWP_SHOWWINDOW;
2667  if (style & (WS_MINIMIZE | WS_MAXIMIZE))
2668  {
2669  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2670  if (style & WS_MINIMIZE) EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2671  }
2672  else
2673  {
2674  if (WasVisible)
2675  {
2676  //ERR("co_WinPosShowWindow Exit Good 3\n");
2677  return TRUE;
2678  }
2679  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2680  }
2681  if ( style & WS_CHILD &&
2682  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2683  !(Swp & SWP_STATECHANGED))
2684  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2685  break;
2686 
2687  default:
2688  //ERR("co_WinPosShowWindow Exit Good 4\n");
2689  return FALSE;
2690  }
2691 
2692  ShowFlag = (Cmd != SW_HIDE);
2693 
2694  if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED))
2695  {
2696  co_IntSendMessageNoWait(Wnd->head.h, WM_SHOWWINDOW, ShowFlag, 0);
2697 #if 0 // Fix wine msg test_SetParent:WmSetParentSeq_1:2
2698  if (!(Wnd->state2 & WNDS2_WIN31COMPAT)) // <------------- XP sets this bit!
2699  co_IntSendMessageNoWait(Wnd->head.h, WM_SETVISIBLE, ShowFlag, 0);
2700 #endif
2701  if (!VerifyWnd(Wnd)) return WasVisible;
2702  }
2703 
2704  /* We can't activate a child window */
2705  if ((Wnd->style & WS_CHILD) &&
2706  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2707  Cmd != SW_SHOWNA)
2708  {
2709  //ERR("SWP Child No active and ZOrder\n");
2710  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2711  }
2712 
2713 #if 0 // Explorer issues with common controls? Someone does not know how CS_SAVEBITS works.
2714  // Breaks startup and shutdown active window...
2715  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD &&
2716  Wnd->pcls->style & CS_SAVEBITS &&
2717  ((Cmd == SW_SHOW) || (Cmd == SW_NORMAL)))
2718  {
2719  ERR("WinPosShowWindow Set active\n");
2720  //UserSetActiveWindow(Wnd);
2721  co_IntSetForegroundWindow(Wnd); // HACK
2722  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2723  }
2724 #endif
2725 
2726  if (IsChildVisible(Wnd) || Swp & SWP_STATECHANGED)
2727  {
2728  TRACE("Child is Vis %s or State changed %s. ShowFlag %s Swp %04x\n",
2729  (IsChildVisible(Wnd) ? "TRUE" : "FALSE"), (Swp & SWP_STATECHANGED ? "TRUE" : "FALSE"),
2730  (ShowFlag ? "TRUE" : "FALSE"),LOWORD(Swp));
2731  co_WinPosSetWindowPos( Wnd,
2732  0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP,
2733  NewPos.left,
2734  NewPos.top,
2735  NewPos.right, // NewPos.right - NewPos.left, when minimized and restore, the window becomes smaller.
2736  NewPos.bottom,// NewPos.bottom - NewPos.top,
2737  LOWORD(Swp));
2738  }
2739  else
2740  {
2741  TRACE("Parent Vis?\n");
2742  /* if parent is not visible simply toggle WS_VISIBLE and return */
2743  if (ShowFlag) IntSetStyle( Wnd, WS_VISIBLE, 0 );
2744  else IntSetStyle( Wnd, 0, WS_VISIBLE );
2745  }
2746 
2747  if ( EventMsg ) IntNotifyWinEvent(EventMsg, Wnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2748 
2749  if ( ShowOwned ) IntShowOwnedPopups(Wnd, TRUE );
2750 
2751  if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE))
2752  {
2753  if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() )
2754  {
2755  if (UserIsDesktopWindow(Wnd->spwndParent))
2756  {
2757  if (!ActivateOtherWindowMin(Wnd))
2758  {
2760  }
2761  }
2762  else
2763  {
2765  }
2766  }
2767 
2768  /* Revert focus to parent */
2769  if (Wnd == pti->MessageQueue->spwndFocus)
2770  {
2771  Parent = Wnd->spwndParent;
2772  if (UserIsDesktopWindow(Wnd->spwndParent))
2773  Parent = 0;
2775  }
2776  // Hide, just return.
2777  if (Cmd == SW_HIDE) return WasVisible;
2778  }
2779 
2780  /* FIXME: Check for window destruction. */
2781 
2782  if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) &&
2783  !(Wnd->state2 & WNDS2_INDESTROY))
2784  {
2785  co_WinPosSendSizeMove(Wnd);
2786  }
2787 
2788  /* if previous state was minimized Windows sets focus to the window */
2789  if (style & WS_MINIMIZE)
2790  {
2791  co_UserSetFocus(Wnd);
2792  // Fix wine Win test_SetFocus todo #3,
2794  }
2795  //ERR("co_WinPosShowWindow EXIT\n");
2796  return WasVisible;
2797 }
USERSTARTUPINFO usi
Definition: win32.h:278
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define SW_NORMAL
Definition: winuser.h:763
DWORD ExStyle
Definition: ntuser.h:699
#define SW_SHOWNOACTIVATE
Definition: winuser.h:768
BOOL FASTCALL IsChildVisible(PWND pWnd)
Definition: winpos.c:225
HWND FASTCALL co_UserSetFocus(PWND Window)
Definition: focus.c:1314
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1748
#define OBJID_WINDOW
Definition: winable.h:15
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:771
long bottom
Definition: polytest.cpp:53
#define WM_SHOWWINDOW
Definition: winuser.h:1618
#define STARTF_USEPOSITION
Definition: winbase.h:493
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4656
#define HWND_TOPMOST
Definition: winuser.h:1198
#define HWND_TOP
Definition: winuser.h:1197
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:604
#define WS_CHILD
Definition: pedump.c:617
#define SWP_NOZORDER
Definition: winuser.h:1237
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
VOID FASTCALL co_WinPosActivateOtherWindow(PWND Wnd)
Definition: winpos.c:396
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1307
#define SWP_HIDEWINDOW
Definition: winuser.h:1231
PPROCESSINFO ppi
Definition: win32.h:88
long right
Definition: polytest.cpp:53
#define WS_EX_MDICHILD
Definition: winuser.h:394
UINT style
Definition: ntuser.h:575
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
long top
Definition: polytest.cpp:53
#define CHILDID_SELF
Definition: winable.h:14
struct _WND * spwndOwner
Definition: ntuser.h:710
THRDESKHEAD head
Definition: ntuser.h:690
unsigned char BOOLEAN
#define WEF_SETBYWNDPTI
Definition: ntuser.h:235
#define STARTF_USESHOWWINDOW
Definition: winbase.h:491
#define SW_SHOW
Definition: winuser.h:769
long left
Definition: polytest.cpp:53
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define WS_CAPTION
Definition: pedump.c:624
#define TRACE(s)
Definition: solgame.cpp:4
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define SWP_STATECHANGED
Definition: msg.c:42
#define WA_ACTIVE
Definition: winuser.h:2613
void FASTCALL co_WinPosSendSizeMove(PWND Wnd)
Definition: winpos.c:2333
#define SW_MINIMIZE
Definition: winuser.h:770
#define CS_SAVEBITS
Definition: winuser.h:652
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
Definition: sacdrv.h:278
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WM_SETVISIBLE
Definition: undocuser.h:31
#define SW_SHOWNA
Definition: winuser.h:772
BOOL FASTCALL ActivateOtherWindowMin(PWND Wnd)
Definition: winpos.c:284
#define SWP_NOSIZE
Definition: winuser.h:1235
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:688
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_ACTIVATE
Definition: winuser.h:1602
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
DWORD state
Definition: ntuser.h:696
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:644
#define WS_POPUP
Definition: pedump.c:616
#define STARTF_USESIZE
Definition: winbase.h:492
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define SWP_SHOWWINDOW
Definition: winuser.h:1238
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
WORD wShowWindow
Definition: win32.h:219
UINT FASTCALL co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT *NewPos)
Definition: winpos.c:2367
struct _WND * spwndParent
Definition: ntuser.h:708
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:147
DWORD state2
Definition: ntuser.h:697
#define SWP_NOMOVE
Definition: winuser.h:1234
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:86
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1550
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620
#define SW_FORCEMINIMIZE
Definition: winuser.h:775
#define SW_MAXIMIZE
Definition: winuser.h:766
#define LOWORD(l)
Definition: pedump.c:82
#define WNDS2_INDESTROY
Definition: ntuser.h:643
PCLS pcls
Definition: ntuser.h:715
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:701

Referenced by co_IntSetParent(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserShowScrollBar(), DefWndHandleSysCommand(), handle_internal_message(), IntDefWindowProc(), IntSetWindowPlacement(), NtUserMinMaximize(), and NtUserShowWindow().

◆ co_WinPosWindowFromPoint()

PWND APIENTRY co_WinPosWindowFromPoint ( IN PWND  ScopeWin,
IN POINT WinPoint,
IN OUT USHORT HitTest,
IN BOOL  Ignore 
)

Definition at line 2885 of file winpos.c.

2890 {
2891  PWND Window;
2892  POINT Point = *WinPoint;
2894 
2895  if( ScopeWin == NULL )
2896  {
2897  ScopeWin = UserGetDesktopWindow();
2898  if(ScopeWin == NULL)
2899  return NULL;
2900  }
2901 
2902  *HitTest = HTNOWHERE;
2903 
2904  ASSERT_REFS_CO(ScopeWin);
2905  UserRefObjectCo(ScopeWin, &Ref);
2906 
2907  Window = co_WinPosSearchChildren(ScopeWin, &Point, HitTest, Ignore);
2908 
2909  UserDerefObjectCo(ScopeWin);
2910  if (Window)
2912  ASSERT_REFS_CO(ScopeWin);
2913 
2914  return Window;
2915 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
#define HTNOWHERE
Definition: winuser.h:2464
Definition: window.c:28
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:40
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2800
Definition: object.h:3
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1386
Definition: ntuser.h:688
#define NULL
Definition: types.h:112

Referenced by co_IntProcessMouseMessage(), and NtUserWindowFromPoint().

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserWinpos  )

◆ FixClientRect()

static VOID FASTCALL FixClientRect ( PRECTL  ClientRect,
PRECTL  WindowRect 
)
static

Definition at line 1080 of file winpos.c.

1081 {
1082  if (ClientRect->left < WindowRect->left)
1083  {
1084  ClientRect->left = WindowRect->left;
1085  }
1086  else if (WindowRect->right < ClientRect->left)
1087  {
1088  ClientRect->left = WindowRect->right;
1089  }
1090  if (ClientRect->right < WindowRect->left)
1091  {
1092  ClientRect->right = WindowRect->left;
1093  }
1094  else if (WindowRect->right < ClientRect->right)
1095  {
1096  ClientRect->right = WindowRect->right;
1097  }
1098  if (ClientRect->top < WindowRect->top)
1099  {
1100  ClientRect->top = WindowRect->top;
1101  }
1102  else if (WindowRect->bottom < ClientRect->top)
1103  {
1104  ClientRect->top = WindowRect->bottom;
1105  }
1106  if (ClientRect->bottom < WindowRect->top)
1107  {
1108  ClientRect->bottom = WindowRect->top;
1109  }
1110  else if (WindowRect->bottom < ClientRect->bottom)
1111  {
1112  ClientRect->bottom = WindowRect->bottom;
1113  }
1114 }
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53

Referenced by co_WinPosDoNCCALCSize(), and co_WinPosGetNonClientSize().

◆ ForceNCPaintErase()

VOID ForceNCPaintErase ( PWND  Wnd,
HRGN  hRgn,
PREGION  pRgn 
)

Definition at line 1690 of file winpos.c.

1691 {
1692  HDC hDC;
1693  PREGION RgnUpdate;
1694  UINT RgnType;
1695  BOOL Create = FALSE;
1696 
1697  if (Wnd->hrgnUpdate == NULL)
1698  {
1699  Wnd->hrgnUpdate = NtGdiCreateRectRgn(0, 0, 0, 0);
1701  Create = TRUE;
1702  }
1703 
1704  if (Wnd->hrgnUpdate != HRGN_WINDOW)
1705  {
1706  RgnUpdate = REGION_LockRgn(Wnd->hrgnUpdate);
1707  if (RgnUpdate)
1708  {
1709  RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, pRgn, RGN_OR);
1710  REGION_UnlockRgn(RgnUpdate);
1711  if (RgnType == NULLREGION)
1712  {
1715  Wnd->hrgnUpdate = NULL;
1716  Create = FALSE;
1717  }
1718  }
1719  }
1720 
1721  IntSendNCPaint( Wnd, hRgn ); // Region can be deleted by the application.
1722 
1723  if (Wnd->hrgnUpdate)
1724  {
1725  hDC = UserGetDCEx( Wnd,
1726  Wnd->hrgnUpdate,
1728 
1730  // Kill the loop, so Clear before we send.
1732  {
1734  }
1735  UserReleaseDC(Wnd, hDC, FALSE);
1736  }
1737 
1738  if (Create)
1739  {
1742  Wnd->hrgnUpdate = NULL;
1743  }
1744 }
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
#define TRUE
Definition: types.h:120
_In_ BOOLEAN Create
Definition: pstypes.h:527
VOID FASTCALL IntSendNCPaint(PWND pWnd, HRGN hRgn)
Definition: painting.c:348
static HDC
Definition: imagelist.c:92
#define NULLREGION
Definition: wingdi.h:361
static HRGN hRgn
Definition: mapping.c:33
#define DCX_USESTYLE
Definition: GetDCEx.c:10
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
UINT_PTR WPARAM
Definition: windef.h:207
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2377
#define DCX_INTERSECTRGN
Definition: winuser.h:2112
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:68
#define HRGN_WINDOW
Definition: ntuser.h:356
#define RGN_OR
Definition: wingdi.h:359
Definition: region.h:7
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2506
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask)
Definition: region.c:2478
HRGN hrgnUpdate
Definition: ntuser.h:716
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
static HDC hDC
Definition: 3dtext.c:33
#define DCX_CACHE
Definition: winuser.h:2104
DWORD state
Definition: ntuser.h:696
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
#define WNDS_SENDERASEBACKGROUND
Definition: ntuser.h:609
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2392
#define WNDS_ERASEBACKGROUND
Definition: ntuser.h:610
#define WM_ERASEBKGND
Definition: winuser.h:1615

Referenced by co_WinPosSetWindowPos().

◆ get_valid_rects()

static VOID FASTCALL get_valid_rects ( RECTL old_client,
RECTL new_client,
UINT  flags,
RECTL valid 
)
static

Definition at line 1123 of file winpos.c.

1124 {
1125  int cx, cy;
1126 
1127  if (flags & WVR_REDRAW)
1128  {
1129  RECTL_vSetEmptyRect( &valid[0] );
1130  RECTL_vSetEmptyRect( &valid[1] );
1131  return;
1132  }
1133 
1134  if (flags & WVR_VALIDRECTS)
1135  {
1136  if (!RECTL_bIntersectRect( &valid[0], &valid[0], new_client ) ||
1137  !RECTL_bIntersectRect( &valid[1], &valid[1], old_client ))
1138  {
1139  RECTL_vSetEmptyRect( &valid[0] );
1140  RECTL_vSetEmptyRect( &valid[1] );
1141  return;
1142  }
1144  }
1145  else
1146  {
1147  valid[0] = *new_client;
1148  valid[1] = *old_client;
1149  }
1150 
1151  /* make sure the rectangles have the same size */
1152  cx = min( valid[0].right - valid[0].left, valid[1].right - valid[1].left );
1153  cy = min( valid[0].bottom - valid[0].top, valid[1].bottom - valid[1].top );
1154 
1155  if (flags & WVR_ALIGNBOTTOM)
1156  {
1157  valid[0].top = valid[0].bottom - cy;
1158  valid[1].top = valid[1].bottom - cy;
1159  }
1160  else
1161  {
1162  valid[0].bottom = valid[0].top + cy;
1163  valid[1].bottom = valid[1].top + cy;
1164  }
1165  if (flags & WVR_ALIGNRIGHT)
1166  {
1167  valid[0].left = valid[0].right - cx;
1168  valid[1].left = valid[1].right - cx;
1169  }
1170  else
1171  {
1172  valid[0].right = valid[0].left + cx;
1173  valid[1].right = valid[1].left + cx;
1174  }
1175 }
#define WVR_ALIGNRIGHT
Definition: winuser.h:2508
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
#define WVR_ALIGNLEFT
Definition: winuser.h:2506
#define WVR_ALIGNTOP
Definition: winuser.h:2505
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
GLint GLint bottom
Definition: glext.h:7726
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
GLint left
Definition: glext.h:7726
GLdouble GLdouble right
Definition: glext.h:10859
#define WVR_VALIDRECTS
Definition: winuser.h:2512
GLbitfield flags
Definition: glext.h:7161
BOOLEAN valid
#define WVR_REDRAW
Definition: winuser.h:2511
#define min(a, b)
Definition: monoChain.cc:55
_Out_opt_ int * cx
Definition: commctrl.h:585
#define WVR_ALIGNBOTTOM
Definition: winuser.h:2507
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859

Referenced by co_WinPosDoNCCALCSize().

◆ IntChildWindowFromPointEx()

PWND APIENTRY IntChildWindowFromPointEx ( PWND  Parent,
LONG  x,
LONG  y,
UINT  uiFlags 
)

Definition at line 2960 of file winpos.c.

2961 {
2962  POINTL Pt;
2963  HWND *List, *phWnd;
2964  PWND pwndHit = NULL;
2965 
2966  Pt.x = x;
2967  Pt.y = y;
2968 
2970  {
2971  if (Parent->ExStyle & WS_EX_LAYOUTRTL)
2972  Pt.x = Parent->rcClient.right - Pt.x;
2973  else
2974  Pt.x += Parent->rcClient.left;
2975  Pt.y += Parent->rcClient.top;
2976  }
2977 
2978  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2979 
2980  if ((List = IntWinListChildren(Parent)))
2981  {
2982  for (phWnd = List; *phWnd; phWnd++)
2983  {
2984  PWND Child;
2985  if ((Child = ValidateHwndNoErr(*phWnd)))
2986  {
2987  if (uiFlags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED))
2988  {
2989  if (!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) continue;
2990  if ((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) continue;
2991  }
2992 
2993  if (uiFlags & CWP_SKIPTRANSPARENT)
2994  {
2995  if (Child->ExStyle & WS_EX_TRANSPARENT) continue;
2996  }
2997 
2998  if (IntPtInWindow(Child, Pt.x, Pt.y))
2999  {
3000  pwndHit = Child;
3001  break;
3002  }
3003  }
3004  }
3006  }
3007  return pwndHit ? pwndHit : Parent;
3008 }
#define WS_DISABLED
Definition: pedump.c:621
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define CWP_SKIPTRANSPARENT
Definition: winuser.h:210
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
LONG y
Definition: windef.h:330
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:533
#define CWP_SKIPINVISIBLE
Definition: winuser.h:208
#define CWP_SKIPDISABLED
Definition: winuser.h:209
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
LONG x
Definition: windef.h:329
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:278
Definition: ntuser.h:688
#define NULL
Definition: types.h:112
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define USERTAG_WINDOWLIST
Definition: tags.h:298
#define WS_VISIBLE
Definition: pedump.c:620
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by NtUserChildWindowFromPointEx().

◆ IntClientToScreen()

BOOL FASTCALL IntClientToScreen ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 198 of file winpos.c.

199 {
200  if (Wnd && Wnd->fnid != FNID_DESKTOP )
201  {
202  if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
203  lpPoint->x = Wnd->rcClient.right - lpPoint->x;
204  else
205  lpPoint->x += Wnd->rcClient.left;
206  lpPoint->y += Wnd->rcClient.top;
207  }
208  return TRUE;
209 }
DWORD ExStyle
Definition: ntuser.h:699
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:712
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
DWORD fnid
Definition: ntuser.h:704
#define FNID_DESKTOP
Definition: ntuser.h:857

Referenced by IntDefWindowProc(), NC_GetSysPopupPos(), and WinPosFixupFlags().

◆ IntDeferWindowPos()

HDWP FASTCALL IntDeferWindowPos ( HDWP  hdwp,
HWND  hwnd,
HWND  hwndAfter,
INT  x,
INT  y,
INT  cx,
INT  cy,
UINT  flags 
)

Definition at line 3012 of file winpos.c.

3020 {
3021  PSMWP pDWP;
3022  int i;
3023  HDWP retvalue = hdwp;
3024 
3025  TRACE("hdwp %p, hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
3026  hdwp, hwnd, hwndAfter, x, y, cx, cy, flags);
3027 
3028  if (flags & ~(SWP_NOSIZE | SWP_NOMOVE |
3033  {
3035  return NULL;
3036  }
3037 
3038  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
3039  {
3041  return NULL;
3042  }
3043 
3044  for (i = 0; i < pDWP->ccvr; i++)
3045  {
3046  if (pDWP->acvr[i].pos.hwnd == hwnd)
3047  {
3048  /* Merge with the other changes */
3049  if (!(flags & SWP_NOZORDER))
3050  {
3051  pDWP->acvr[i].pos.hwndInsertAfter = hwndAfter;
3052  }
3053  if (!(flags & SWP_NOMOVE))
3054  {
3055  pDWP->acvr[i].pos.x = x;
3056  pDWP->acvr[i].pos.y = y;
3057  }
3058  if (!(flags & SWP_NOSIZE))
3059  {
3060  pDWP->acvr[i].pos.cx = cx;
3061  pDWP->acvr[i].pos.cy = cy;
3062  }
3063  pDWP->acvr[i].pos.flags &= flags | ~(SWP_NOSIZE | SWP_NOMOVE |
3067  pDWP->acvr[i].pos.flags |= flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW |
3069  goto END;
3070  }
3071  }
3072  if (pDWP->ccvr >= pDWP->ccvrAlloc)
3073  {
3074  PCVR newpos = ExAllocatePoolWithTag(PagedPool, pDWP->ccvrAlloc * 2 * sizeof(CVR), USERTAG_SWP);
3075  if (!newpos)
3076  {
3077  retvalue = NULL;
3078  goto END;
3079  }
3080  RtlZeroMemory(newpos, pDWP->ccvrAlloc * 2 * sizeof(CVR));
3081  RtlCopyMemory(newpos, pDWP->acvr, pDWP->ccvrAlloc * sizeof(CVR));
3083  pDWP->ccvrAlloc *= 2;
3084  pDWP->acvr = newpos;
3085  }
3086  pDWP->acvr[pDWP->ccvr].pos.hwnd = hwnd;
3087  pDWP->acvr[pDWP->ccvr].pos.hwndInsertAfter = hwndAfter;
3088  pDWP->acvr[pDWP->ccvr].pos.x = x;
3089  pDWP->acvr[pDWP->ccvr].pos.y = y;
3090  pDWP->acvr[pDWP->ccvr].pos.cx = cx;
3091  pDWP->acvr[pDWP->ccvr].pos.cy = cy;
3092  pDWP->acvr[pDWP->ccvr].pos.flags = flags;
3093  pDWP->acvr[pDWP->ccvr].hrgnClip = NULL;
3094  pDWP->acvr[pDWP->ccvr].hrgnInterMonitor = NULL;
3095  pDWP->ccvr++;
3096 END:
3097  return retvalue;
3098 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
HRGN hrgnClip
Definition: winpos.h:16
HWND hwndInsertAfter
Definition: winuser.h:3579
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1237
WINDOWPOS pos
Definition: winpos.h:5
#define SWP_HIDEWINDOW
Definition: winuser.h:1231
#define SWP_NOCOPYBITS
Definition: winuser.h:1233
INT ccvr
Definition: winpos.h:25
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
UINT flags
Definition: winuser.h:3584
Definition: infcodes.c:25
#define TRACE(s)
Definition: solgame.cpp:4
HRGN hrgnInterMonitor
Definition: winpos.h:17
#define SWP_NOACTIVATE
Definition: winuser.h:1232
Definition: winpos.h:3
Definition: winpos.h:20
GLbitfield flags
Definition: glext.h:7161
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define SWP_FRAMECHANGED
Definition: winuser.h:1230
#define SWP_NOSIZE
Definition: winuser.h:1235
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:495
INT ccvrAlloc
Definition: winpos.h:26
#define NULL
Definition: types.h:112
#define SWP_SHOWWINDOW
Definition: winuser.h:1238
#define SWP_NOREDRAW
Definition: winuser.h:1236
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:281
_Out_opt_ int * cx
Definition: commctrl.h:585
PCVR acvr
Definition: winpos.h:27
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define SWP_NOMOVE
Definition: winuser.h:1234
HWND hwnd
Definition: winuser.h:3578
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28
#define SWP_NOOWNERZORDER
Definition: winuser.h:1239

Referenced by NtUserDeferWindowPos().

◆ IntEndDeferWindowPosEx()

BOOL FASTCALL IntEndDeferWindowPosEx ( HDWP  hdwp,
BOOL  sAsync 
)

Definition at line 3100 of file winpos.c.

3101 {
3102  PSMWP pDWP;
3103  PCVR winpos;
3104  BOOL res = TRUE;
3105  int i;
3106 
3107  TRACE("%p\n", hdwp);
3108 
3109  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
3110  {
3112  return FALSE;
3113  }
3114 
3115  for (i = 0, winpos = pDWP->acvr; res && i < pDWP->ccvr; i++, winpos++)
3116  {
3117  PWND pwnd;
3119 
3120  TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
3121  winpos->pos.hwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y,
3122  winpos->pos.cx, winpos->pos.cy, winpos->pos.flags);
3123 
3124  pwnd = ValidateHwndNoErr(winpos->pos.hwnd);
3125  if (!pwnd)
3126  continue;
3127 
3128  UserRefObjectCo(pwnd, &Ref);
3129 
3130  if ( sAsync )
3131  {
3132  LRESULT lRes;
3134  if ( ppos )
3135  {
3136  *ppos = winpos->pos;
3137  /* Yes it's a pointer inside Win32k! */
3138  lRes = co_IntSendMessageNoWait( winpos->pos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
3139  /* We handle this the same way as Event Hooks and Hooks. */
3140  if ( !lRes )
3141  {
3143  }
3144  }
3145  }
3146  else
3147  res = co_WinPosSetWindowPos( pwnd,
3148  winpos->pos.hwndInsertAfter,
3149  winpos->pos.x,
3150  winpos->pos.y,
3151  winpos->pos.cx,
3152  winpos->pos.cy,
3153  winpos->pos.flags);
3154 
3155  // Hack to pass tests.... Must have some work to do so clear the error.
3156  if (res && (winpos->pos.flags & (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER)) == SWP_NOZORDER )
3158 
3159  UserDerefObjectCo(pwnd);
3160  }
3162  UserDereferenceObject(pDWP);
3164  return res;
3165 }
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:717
#define ERROR_SUCCESS
Definition: deptool.c:10
#define TRUE
Definition: types.h:120
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1748
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
HWND hwndInsertAfter
Definition: winuser.h:3579
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
#define SWP_NOZORDER
Definition: winuser.h:1237
WINDOWPOS pos
Definition: winpos.h:5
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:40
Definition: object.h:3
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3584
#define TRACE(s)
Definition: solgame.cpp:4
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
Definition: winpos.h:3
Definition: winpos.h:20
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define SWP_NOSIZE
Definition: winuser.h:1235
Definition: ntuser.h:688
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:495
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
#define USERTAG_SWP
Definition: tags.h:281
GLuint res
Definition: glext.h:9613
PCVR acvr
Definition: winpos.h:27
#define SWP_NOMOVE
Definition: winuser.h:1234
HWND hwnd
Definition: winuser.h:3578
LONG_PTR LRESULT
Definition: windef.h:209
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28

Referenced by NtUserEndDeferWindowPosEx().

◆ IntGetClientOrigin()

BOOL FASTCALL IntGetClientOrigin ( PWND Window  OPTIONAL,
LPPOINT  Point 
)

Definition at line 70 of file winpos.c.

71 {
73  if (Window == NULL)
74  {
75  Point->x = Point->y = 0;
76  return FALSE;
77  }
78  Point->x = Window->rcClient.left;
79  Point->y = Window->rcClient.top;
80 
81  return TRUE;
82 }
#define TRUE
Definition: types.h:120
Definition: window.c:28
#define FALSE
Definition: types.h:117
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1386
#define NULL
Definition: types.h:112

Referenced by co_IntFixCaret(), and IntScrollWindowEx().

◆ IntGetClientRect()

VOID FASTCALL IntGetClientRect ( PWND  Wnd,
RECTL Rect 
)

Internal function. Returns client window rectangle relative to the upper-left corner of client area.

Note
Does not check the validity of the parameters

Definition at line 91 of file winpos.c.

92 {
93  ASSERT( Wnd );
94  ASSERT( Rect );
95  if (Wnd->style & WS_MINIMIZED)
96  {
97  Rect->left = Rect->top = 0;
100  return;
101  }
102  if (!UserIsDesktopWindow(Wnd))
103  {
104  *Rect = Wnd->rcClient;
106  }
107  else
108  {
109  Rect->left = Rect->top = 0;
110  Rect->right = Wnd->rcClient.right;
111  Rect->bottom = Wnd->rcClient.bottom;
112  /* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
113  Rect->right = UserGetSystemMetrics(SM_CXSCREEN);
114  Rect->bottom = UserGetSystemMetrics(SM_CYSCREEN);
115  */
116  }
117 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define SM_CXMINIMIZED
Definition: winuser.h:1014
LONG top
Definition: windef.h:307
RECT rcClient
Definition: ntuser.h:712
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define WS_MINIMIZED
Definition: undocuser.h:18
#define ASSERT(a)
Definition: mode.c:44
#define SM_CYMINIMIZED
Definition: winuser.h:1015
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
LONG bottom
Definition: windef.h:309
DWORD style
Definition: ntuser.h:701

Referenced by co_IntDrawCaret(), co_WinPosArrangeIconicWindows(), co_WinPosGetMinMaxInfo(), co_WinPosSendSizeMove(), DefWndDoSizeMove(), DefWndHandleWindowPosChanged(), IntBeginPaint(), IntCalculateThumb(), IntDefWindowProc(), IntFillWindow(), IntGetScrollBarRect(), IntScrollWindowEx(), MENU_DrawPopupMenu(), MENU_EnsureMenuItemVisible(), NC_DoNCPaint(), and WinPosFindIconPos().

◆ IntGetLastTopMostWindow()

PWND FASTCALL IntGetLastTopMostWindow ( VOID  )

Definition at line 237 of file winpos.c.

238 {
239  PWND pWnd;
240  PDESKTOP rpdesk = gptiCurrent->rpdesk;
241 
242  if ( rpdesk &&
243  (pWnd = rpdesk->pDeskInfo->spwnd->spwndChild) &&
244  pWnd->ExStyle & WS_EX_TOPMOST)
245  {
246  for (;;)
247  {
248  if (!pWnd->spwndNext) break;
249  if (!(pWnd->spwndNext->ExStyle & WS_EX_TOPMOST)) break;
250  pWnd = pWnd->spwndNext;
251  }
252  return pWnd;
253  }
254  return NULL;
255 }
DWORD ExStyle
Definition: ntuser.h:699
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
struct _DESKTOP * rpdesk
Definition: win32.h:92
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
struct _WND * spwndNext
Definition: ntuser.h:706
#define WS_EX_TOPMOST
Definition: pedump.c:647
struct _WND * spwnd
Definition: ntuser.h:137
Definition: ntuser.h:688
#define NULL
Definition: types.h:112

Referenced by ActivateOtherWindowMin().

◆ IntGetWindowBorderMeasures()

VOID FASTCALL IntGetWindowBorderMeasures ( PWND  Wnd,
UINT cx,
UINT cy 
)

Definition at line 860 of file winpos.c.

861 {
862  if(HAS_DLGFRAME(Wnd->style, Wnd->ExStyle) && !(Wnd->style & WS_MINIMIZE))
863  {
866  }
867  else
868  {
869  if(HAS_THICKFRAME(Wnd->style, Wnd->ExStyle)&& !(Wnd->style & WS_MINIMIZE))
870  {
873  }
874  else if(HAS_THINFRAME(Wnd->style, Wnd->ExStyle))
875  {
878  }
879  else
880  {
881  *cx = *cy = 0;
882  }
883  }
884 }
DWORD ExStyle
Definition: ntuser.h:699
#define SM_CYFRAME
Definition: winuser.h:990
#define SM_CXFRAME
Definition: winuser.h:988
#define WS_MINIMIZE
Definition: pedump.c:622
#define SM_CYDLGFRAME
Definition: winuser.h:962
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
#define HAS_THINFRAME(Style, ExStyle)
Definition: window.h:16
#define HAS_THICKFRAME(Style, ExStyle)
Definition: window.h:12
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:208
#define SM_CXDLGFRAME
Definition: winuser.h:960
#define SM_CYBORDER
Definition: winuser.h:959
#define SM_CXBORDER
Definition: winuser.h:958
_Out_opt_ int * cx
Definition: commctrl.h:585
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:8
DWORD style
Definition: ntuser.h:701

◆ IntGetWindowBorders()

DWORD IntGetWindowBorders ( DWORD  Style,
DWORD  ExStyle 
)

Definition at line 914 of file winpos.c.

915 {
916  DWORD adjust = 0;
917 
918  if ( ExStyle & WS_EX_WINDOWEDGE ) // 1st
919  adjust = 2; /* outer */
920  else if ( ExStyle & WS_EX_STATICEDGE ) // 2nd
921  adjust = 1; /* for the outer frame always present */
922 
924  adjust += 2;
925 
927  adjust++; /* The other border */
928 
929  return adjust;
930 }
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_CAPTION
Definition: pedump.c:624
const DWORD Style
Definition: appswitch.c:71
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define WS_EX_STATICEDGE
Definition: winuser.h:403
const DWORD ExStyle
Definition: appswitch.c:72

Referenced by co_WinPosGetMinMaxInfo().

◆ IntGetWindowPlacement()

BOOL FASTCALL IntGetWindowPlacement ( PWND  Wnd,
WINDOWPLACEMENT lpwndpl 
)

Definition at line 558 of file winpos.c.

559 {
560  if (!Wnd) return FALSE;
561 
562  if(lpwndpl->length != sizeof(WINDOWPLACEMENT))
563  {
564  return FALSE;
565  }
566 
567  lpwndpl->flags = 0;
568 
569  WinPosInitInternalPos(Wnd, &Wnd->rcWindow);
570 
571  lpwndpl->showCmd = SW_HIDE;
572 
573  if ( Wnd->style & WS_MINIMIZE )
574  lpwndpl->showCmd = SW_SHOWMINIMIZED;
575  else
576  lpwndpl->showCmd = ( Wnd->style & WS_MAXIMIZE ) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ;
577 
578  lpwndpl->rcNormalPosition = Wnd->InternalPos.NormalRect;
579 
580  if (Wnd->InternalPos.flags & WPF_MININIT) // Return if it was set!
581  {
582  lpwndpl->ptMinPosition.x = Wnd->InternalPos.IconPos.x;
583  lpwndpl->ptMinPosition.y = Wnd->InternalPos.IconPos.y;
584  }
585  else
586  lpwndpl->ptMinPosition.x = lpwndpl->ptMinPosition.y = -1;
587 
588  if ( Wnd->InternalPos.flags & WPF_MAXINIT && // Return if set and not maximized to monitor!
589  !(Wnd->state & WNDS_MAXIMIZESTOMONITOR))
590  {
591  lpwndpl->ptMaxPosition.x = Wnd->InternalPos.MaxPos.x;
592  lpwndpl->ptMaxPosition.y = Wnd->InternalPos.MaxPos.y;
593  }
594  else
595  lpwndpl->ptMaxPosition.x = lpwndpl->ptMaxPosition.y = -1;
596 
597  if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd &&
598  !(Wnd->ExStyle & WS_EX_TOOLWINDOW))
599  {
600  PMONITOR pmonitor = UserMonitorFromRect(&lpwndpl->rcNormalPosition, MONITOR_DEFAULTTOPRIMARY );
601 
602  // FIXME: support DPI aware, rcWorkDPI/Real etc..
603  if (Wnd->InternalPos.flags & WPF_MININIT)
604  {
605  lpwndpl->ptMinPosition.x -= (pmonitor->rcWork.left - pmonitor->rcMonitor.left);
606  lpwndpl->ptMinPosition.y -= (pmonitor->rcWork.top - pmonitor->rcMonitor.top);
607  }
609  pmonitor->rcMonitor.left - pmonitor->rcWork.left,
610  pmonitor->rcMonitor.top - pmonitor->rcWork.top);
611  }
612 
613  if ( Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED || Wnd->style & WS_MAXIMIZE )
614  lpwndpl->flags |= WPF_RESTORETOMAXIMIZED;
615 
616  if ( ((Wnd->style & (WS_CHILD|WS_POPUP)) == WS_CHILD) && Wnd->InternalPos.flags & WPF_SETMINPOSITION)
617  lpwndpl->flags |= WPF_SETMINPOSITION;
618 
619  return TRUE;
620 }
DWORD ExStyle
Definition: ntuser.h:699
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
VOID FASTCALL WinPosInitInternalPos(PWND Wnd, RECTL *RestoreRect)
Definition: winpos.c:479
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
LONG top
Definition: windef.h:307
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2522
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
RECT rcWork
Definition: monitor.h:19
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
Definition: monitor.c:405
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
THRDESKHEAD head
Definition: ntuser.h:690
#define WPF_SETMINPOSITION
Definition: winuser.h:2523
#define WPF_MAXINIT
Definition: ntuser.h:682
#define WPF_MININIT
Definition: ntuser.h:681
RECT rcWindow
Definition: ntuser.h:711
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
POINT ptMinPosition
Definition: winuser.h:3283
#define SW_SHOWNORMAL
Definition: winuser.h:764
POINT ptMaxPosition
Definition: winuser.h:3284
DWORD state
Definition: ntuser.h:696
#define WS_POPUP
Definition: pedump.c:616
RECT rcNormalPosition
Definition: winuser.h:3285
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:630
struct _WND * spwndParent
Definition: ntuser.h:708
RECT rcMonitor
Definition: monitor.h:18
struct _WND::@4898 InternalPos
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:701

Referenced by co_WinPosMinMaximize(), NtUserGetInternalWindowPos(), and NtUserGetWindowPlacement().

◆ IntGetWindowRect()

BOOL FASTCALL IntGetWindowRect ( PWND  Wnd,
RECTL Rect 
)

Definition at line 120 of file winpos.c.

121 {
122  ASSERT( Wnd );
123  ASSERT( Rect );
124  if (!Wnd) return FALSE;
125  if (!UserIsDesktopWindow(Wnd))
126  {
127  *Rect = Wnd->rcWindow;
128  }
129  else
130  {
131  Rect->left = Rect->top = 0;
132  Rect->right = Wnd->rcWindow.right;
133  Rect->bottom = Wnd->rcWindow.bottom;
134 /* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
135  Rect->right = GetSystemMetrics(SM_CXSCREEN);
136  Rect->bottom = GetSystemMetrics(SM_CYSCREEN);
137 */ }
138  return TRUE;
139 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
#define TRUE
Definition: types.h:120
LONG right
Definition: windef.h:308
#define FALSE
Definition: types.h:117
#define ASSERT(a)
Definition: mode.c:44
RECT rcWindow
Definition: ntuser.h:711
LONG bottom
Definition: windef.h:309

Referenced by DefWndScreenshot(), IntGetNCUpdateRgn(), IntIsWindowFullscreen(), MENU_FindItemByCoords(), MENU_ShowSubPopup(), NC_DoNCPaint(), NC_GetSysPopupPos(), UserDrawCaptionBar(), and UserDrawCaptionButtonWnd().

◆ IntMapWindowPoints()

INT FASTCALL IntMapWindowPoints ( PWND  FromWnd,
PWND  ToWnd,
LPPOINT  lpPoints,
UINT  cPoints 
)

Definition at line 143 of file winpos.c.

144 {
145  BOOL mirror_from, mirror_to;
146  POINT Delta;
147  UINT i;
148  int Change = 1;
149 
150  /* Note: Desktop Top and Left is always 0! */
151  Delta.x = Delta.y = 0;
152  mirror_from = mirror_to = FALSE;
153 
154  if (FromWnd && !UserIsDesktopWindow(FromWnd))
155  {
156  if (FromWnd->ExStyle & WS_EX_LAYOUTRTL)
157  {
158  mirror_from = TRUE;
159  Change = -Change;
160  Delta.x = -FromWnd->rcClient.right;
161  }
162  else
163  Delta.x = FromWnd->rcClient.left;
164  Delta.y = FromWnd->rcClient.top;
165  }
166 
167  if (ToWnd && !UserIsDesktopWindow(ToWnd))
168  {
169  if (ToWnd->ExStyle & WS_EX_LAYOUTRTL)
170  {
171  mirror_to = TRUE;
172  Change = -Change;
173  Delta.x += Change * ToWnd->rcClient.right;
174  }
175  else
176  Delta.x -= Change * ToWnd->rcClient.left;
177  Delta.y -= ToWnd->rcClient.top;
178  }
179 
180  for (i = 0; i != cPoints; i++)
181  {
182  lpPoints[i].x += Delta.x;
183  lpPoints[i].x *= Change;
184  lpPoints[i].y += Delta.y;
185  }
186 
187  if ((mirror_from || mirror_to) && cPoints == 2) /* special case for rectangle */
188  {
189  int tmp = min(lpPoints[0].x, lpPoints[1].x);
190  lpPoints[1].x = max(lpPoints[0].x, lpPoints[1].x);
191  lpPoints[0].x = tmp;
192  }
193 
194  return MAKELONG(LOWORD(Delta.x), LOWORD(Delta.y));
195 }
#define max(a, b)
Definition: svc.c:63
DWORD ExStyle
Definition: ntuser.h:699
long y
Definition: polytest.cpp:48
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
RECT rcClient
Definition: ntuser.h:712
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MAKELONG(a, b)
Definition: typedefs.h:249
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static ULONG Delta
Definition: xboxvideo.c:33
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82

Referenced by DefWndDoSizeMove(), and DefWndHandleWindowPosChanged().

◆ IntRealChildWindowFromPoint()

PWND FASTCALL IntRealChildWindowFromPoint ( PWND  Parent,
LONG  x,
LONG  y 
)

Definition at line 2918 of file winpos.c.

2919 {
2920  POINTL Pt;
2921  HWND *List, *phWnd;
2922  PWND pwndHit = NULL;
2923 
2924  Pt.x = x;
2925  Pt.y = y;
2926 
2928  {
2929  Pt.x += Parent->rcClient.left;
2930  Pt.y += Parent->rcClient.top;
2931  }
2932 
2933  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2934 
2935  if ((List = IntWinListChildren(Parent)))
2936  {
2937  for (phWnd = List; *phWnd; phWnd++)
2938  {
2939  PWND Child;
2940  if ((Child = ValidateHwndNoErr(*phWnd)))
2941  {
2942  if ( Child->style & WS_VISIBLE && IntPtInWindow(Child, Pt.x, Pt.y) )
2943  {
2944  if ( Child->pcls->atomClassName != gpsi->atomSysClass[ICLS_BUTTON] ||
2945  (Child->style & BS_TYPEMASK) != BS_GROUPBOX )
2946  {
2948  return Child;
2949  }
2950  pwndHit = Child;
2951  }
2952  }
2953  }
2955  }
2956  return pwndHit ? pwndHit : Parent;
2957 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
PSERVERINFO gpsi
Definition: imm.c:18
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
#define BS_GROUPBOX
Definition: pedump.c:658
LONG y
Definition: windef.h:330
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:533
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:84
LONG x
Definition: windef.h:329
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:278
Definition: ntuser.h:688
#define BS_TYPEMASK
Definition: winuser.h:270
#define NULL
Definition: types.h:112
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define ICLS_BUTTON
Definition: ntuser.h:907
#define USERTAG_WINDOWLIST
Definition: tags.h:298
#define WS_VISIBLE
Definition: pedump.c:620
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1055

Referenced by NtUserRealChildWindowFromPoint().

◆ IntScreenToClient()

BOOL FASTCALL IntScreenToClient ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 212 of file winpos.c.

213 {
214  if (Wnd && Wnd->fnid != FNID_DESKTOP )
215  {
216  if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
217  lpPoint->x = Wnd->rcClient.right - lpPoint->x;
218  else
219  lpPoint->x -= Wnd->rcClient.left;
220  lpPoint->y -= Wnd->rcClient.top;
221  }
222  return TRUE;
223 }
DWORD ExStyle
Definition: ntuser.h:699
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:712
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
DWORD fnid
Definition: ntuser.h:704
#define FNID_DESKTOP
Definition: ntuser.h:857

Referenced by co_IntSetParent(), IntDefWindowProc(), and MENU_TrackMouseMenuBar().

◆ IntSetWindowPlacement()

BOOL FASTCALL IntSetWindowPlacement ( PWND  Wnd,
WINDOWPLACEMENT wpl,
UINT  Flags 
)

Definition at line 664 of file winpos.c.

665 {
666  BOOL sAsync;
667  UINT SWP_Flags;
668 
672 
673  if (!Wnd || Wnd == Wnd->head.rpdesk->pDeskInfo->spwnd) return FALSE;
674 
675  if ( Flags & PLACE_MIN ) Wnd->InternalPos.IconPos = wpl->ptMinPosition;
676  if ( Flags & PLACE_MAX ) Wnd->InternalPos.MaxPos = wpl->ptMaxPosition;
677  if ( Flags & PLACE_RECT) Wnd->InternalPos.NormalRect = wpl->rcNormalPosition;
678 
679  SWP_Flags = SWP_NOZORDER | SWP_NOACTIVATE | ((wpl->flags & WPF_ASYNCWINDOWPLACEMENT) ? SWP_ASYNCWINDOWPOS : 0);
680 
681  if (Wnd->style & WS_MINIMIZE )
682  {
683  if (Flags & PLACE_MIN || Wnd->InternalPos.flags & WPF_SETMINPOSITION)
684  {
686  wpl->ptMinPosition.x, wpl->ptMinPosition.y, 0, 0,
687  SWP_NOSIZE | SWP_Flags);
688  Wnd->InternalPos.flags |= WPF_MININIT;
689  }
690  }
691  else if (Wnd->style & WS_MAXIMIZE )
692  {
693  if (Flags & PLACE_MAX)
694  {
696  wpl->ptMaxPosition.x, wpl->ptMaxPosition.y, 0, 0,
697  SWP_NOSIZE | SWP_Flags);
698  Wnd->InternalPos.flags |= WPF_MAXINIT;
699  }
700  }
701  else if (Flags & PLACE_RECT)
702  {