ReactOS  0.4.12-dev-934-g9a4676f
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)
 
BOOL WINAPI UserAdjustWindowRectEx (LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle)
 
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)
 
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, DWORD Unknown1)
 
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:668
#define TRUE
Definition: types.h:120
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
unsigned int BOOL
Definition: ntddk_ex.h:94
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
Definition: object.h:3
smooth NULL
Definition: ftsmooth.c:416
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
struct _WND * spwndNext
Definition: ntuser.h:675
PWND FASTCALL IntGetLastTopMostWindow(VOID)
Definition: winpos.c:237
#define WS_ICONIC
Definition: pedump.c:641
#define for
Definition: utility.h:88
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
struct _WND * spwndParent
Definition: ntuser.h:677
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:64
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1432
struct _WND * spwndChild
Definition: ntuser.h:678
#define WS_VISIBLE
Definition: pedump.c:620
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO pti)
Definition: desktop.c:1323
DWORD style
Definition: ntuser.h:670

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  return TRUE;
383  /* FIXME: This window could be disable because the child that closed
384  was a popup. */
385  //return !(style & WS_DISABLED);
386 }
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#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 395 of file winpos.c.

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

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

◆ co_WinPosArrangeIconicWindows()

UINT FASTCALL co_WinPosArrangeIconicWindows ( PWND  parent)

Definition at line 728 of file winpos.c.

729 {
730  RECTL rectParent;
731  PWND Child;
732  INT x, y, xspacing, yspacing, sx, sy;
733 
735 
736  IntGetClientRect( parent, &rectParent );
737  // FIXME: Support Minimize Metrics gspv.mm.iArrange.
738  // Default: ARW_BOTTOMLEFT
739  x = rectParent.left;
740  y = rectParent.bottom;
741 
744 
745  Child = parent->spwndChild;
746  while(Child)
747  {
748  if((Child->style & WS_MINIMIZE) != 0 )
749  {
751  UserRefObjectCo(Child, &Ref);
752 
754  sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
755 
756  Child->InternalPos.IconPos.x = sx;
757  Child->InternalPos.IconPos.y = sy;
758  Child->InternalPos.flags |= WPF_MININIT;
759 
761 
763 
764  if (x <= rectParent.right - xspacing)
765  x += xspacing;
766  else
767  {
768  x = rectParent.left;
769  y -= yspacing;
770  }
771  }
772  Child = Child->spwndNext;
773  }
774  return yspacing;
775 }
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
long bottom
Definition: polytest.cpp:53
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1232
int32_t INT
Definition: typedefs.h:56
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
#define WS_MINIMIZE
Definition: pedump.c:622
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
Definition: object.h:3
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1238
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
r parent
Definition: btrfs.c:2659
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define SM_CYBORDER
Definition: winuser.h:955
#define WPF_MININIT
Definition: ntuser.h:654
#define SM_CYMINIMIZED
Definition: winuser.h:1011
#define SM_CXBORDER
Definition: winuser.h:954
Definition: ntuser.h:657
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:716
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 1170 of file winpos.c.

1171 {
1172  PWND Parent;
1173  UINT wvrFlags = 0;
1174 
1176 
1177  /* Send WM_NCCALCSIZE message to get new client area */
1178  if ((WinPos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE)
1179  {
1181  WINDOWPOS winposCopy;
1182 
1183  params.rgrc[0] = *WindowRect; // new coordinates of a window that has been moved or resized
1184  params.rgrc[1] = Window->rcWindow; // window before it was moved or resized
1185  params.rgrc[2] = Window->rcClient; // client area before the window was moved or resized
1186 
1187  Parent = Window->spwndParent;
1188  if (0 != (Window->style & WS_CHILD) && Parent)
1189  {
1190  RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->rcClient.left, - Parent->rcClient.top);
1191  RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->rcClient.left, - Parent->rcClient.top);
1192  RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->rcClient.left, - Parent->rcClient.top);
1193  }
1194 
1195  params.lppos = &winposCopy;
1196  winposCopy = *WinPos;
1197 
1198  wvrFlags = co_IntSendMessage(Window->head.h, WM_NCCALCSIZE, TRUE, (LPARAM) &params);
1199 
1200  /* If the application send back garbage, ignore it */
1201  if (params.rgrc[0].left <= params.rgrc[0].right &&
1202  params.rgrc[0].top <= params.rgrc[0].bottom)
1203  {
1204  *ClientRect = params.rgrc[0]; // First rectangle contains the coordinates of the new client rectangle resulting from the move or resize
1205  if ((Window->style & WS_CHILD) && Parent)
1206  {
1207  RECTL_vOffsetRect(ClientRect, Parent->rcClient.left, Parent->rcClient.top);
1208  }
1209  FixClientRect(ClientRect, WindowRect);
1210  }
1211 
1212  if (ClientRect->left != Window->rcClient.left ||
1213  ClientRect->top != Window->rcClient.top)
1214  {
1215  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1216  }
1217 
1218  if (ClientRect->right - ClientRect->left != Window->rcClient.right - Window->rcClient.left)
1219  {
1220  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1221  }
1222  else
1223  wvrFlags &= ~WVR_HREDRAW;
1224 
1225  if (ClientRect->bottom - ClientRect->top != Window->rcClient.bottom - Window->rcClient.top)
1226  {
1227  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1228  }
1229  else
1230  wvrFlags &= ~WVR_VREDRAW;
1231 
1232  validRects[0] = params.rgrc[1]; // second rectangle contains the valid destination rectangle
1233  validRects[1] = params.rgrc[2]; // third rectangle contains the valid source rectangle
1234  }
1235  else
1236  {
1237  if (!(WinPos->flags & SWP_NOMOVE) &&
1238  (ClientRect->left != Window->rcClient.left ||
1239  ClientRect->top != Window->rcClient.top))
1240  {
1241  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1242  }
1243  }
1244 
1246  {
1247  RECTL_vSetEmptyRect( &validRects[0] );
1248  RECTL_vSetEmptyRect( &validRects[1] );
1249  }
1250  else get_valid_rects( &Window->rcClient, ClientRect, wvrFlags, validRects );
1251 
1252  return wvrFlags;
1253 }
#define TRUE
Definition: types.h:120
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define WM_NCCALCSIZE
Definition: winuser.h:1667
long bottom
Definition: polytest.cpp:53
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
Definition: window.c:29
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:3536
long left
Definition: polytest.cpp:53
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
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:1071
#define WVR_HREDRAW
Definition: winuser.h:2473
unsigned int UINT
Definition: ndis.h:50
#define WVR_VREDRAW
Definition: winuser.h:2474
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
static VOID FASTCALL get_valid_rects(RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
Definition: winpos.c:1114
#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 1257 of file winpos.c.

1261 {
1263 
1264  /* Send WM_WINDOWPOSCHANGING message */
1265 
1266  if (!(WinPos->flags & SWP_NOSENDCHANGING)
1267  && !((WinPos->flags & SWP_AGG_NOCLIENTCHANGE) && (WinPos->flags & SWP_SHOWWINDOW)))
1268  {
1269  TRACE("Sending WM_WINDOWPOSCHANGING to hwnd %p flags %04x.\n", Window->head.h,WinPos->flags);
1270  co_IntSendMessage(Window->head.h, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos);
1271  }
1272 
1273  /* Calculate new position and size */
1274 
1275  *WindowRect = Window->rcWindow;
1276  *ClientRect = (Window->style & WS_MINIMIZE) ? Window->rcWindow : Window->rcClient;
1277 
1278  if (!(WinPos->flags & SWP_NOSIZE))
1279  {
1280  if (Window->style & WS_MINIMIZE)
1281  {
1282  WindowRect->right = WindowRect->left + UserGetSystemMetrics(SM_CXMINIMIZED);
1283  WindowRect->bottom = WindowRect->top + UserGetSystemMetrics(SM_CYMINIMIZED);
1284  }
1285  else
1286  {
1287  WindowRect->right = WindowRect->left + WinPos->cx;
1288  WindowRect->bottom = WindowRect->top + WinPos->cy;
1289  }
1290  }
1291 
1292  if (!(WinPos->flags & SWP_NOMOVE))
1293  {
1294  INT X, Y;
1295  PWND Parent;
1296  X = WinPos->x;
1297  Y = WinPos->y;
1298 
1299  Parent = Window->spwndParent;
1300 
1301  // Parent child position issue is in here. SetParent_W7 test CORE-6651.
1302  if (//((Window->style & WS_CHILD) != 0) && <- Fixes wine msg test_SetParent: "rects do not match", the last test.
1303  Parent &&
1304  Parent != Window->head.rpdesk->pDeskInfo->spwnd)
1305  {
1306  TRACE("Not SWP_NOMOVE 1 Parent client offset X %d Y %d\n",X,Y);
1307  X += Parent->rcClient.left;
1308  Y += Parent->rcClient.top;
1309  TRACE("Not SWP_NOMOVE 2 Parent client offset X %d Y %d\n",X,Y);
1310  }
1311 
1312  WindowRect->left = X;
1313  WindowRect->top = Y;
1314  WindowRect->right += X - Window->rcWindow.left;
1315  WindowRect->bottom += Y - Window->rcWindow.top;
1316 
1317  RECTL_vOffsetRect(ClientRect, X - Window->rcWindow.left,
1318  Y - Window->rcWindow.top);
1319  }
1321 
1322  TRACE( "hwnd %p, after %p, swp %d,%d %dx%d flags %08x\n",
1323  WinPos->hwnd, WinPos->hwndInsertAfter, WinPos->x, WinPos->y,
1324  WinPos->cx, WinPos->cy, WinPos->flags );
1325  TRACE("WindowRect: %d %d %d %d\n", WindowRect->left,WindowRect->top,WindowRect->right,WindowRect->bottom);
1326  TRACE("ClientRect: %d %d %d %d\n", ClientRect->left,ClientRect->top,ClientRect->right,ClientRect->bottom);
1327 
1328  return TRUE;
1329 }
#define TRUE
Definition: types.h:120
#define Y(I)
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
long bottom
Definition: polytest.cpp:53
HWND hwndInsertAfter
Definition: winuser.h:3531
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
int32_t INT
Definition: typedefs.h:56
#define SWP_NOSENDCHANGING
Definition: winuser.h:1236
long right
Definition: polytest.cpp:53
Definition: window.c:29
#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:3536
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define TRACE(s)
Definition: solgame.cpp:4
if(!(yy_init))
Definition: macro.lex.yy.c:714
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1643
#define SM_CYMINIMIZED
Definition: winuser.h:1011
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
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:1233
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
HWND hwnd
Definition: winuser.h:3530
#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 936 of file winpos.c.

938 {
939  MINMAXINFO MinMax;
940  PMONITOR monitor;
941  INT xinc, yinc;
942  LONG style = Window->style;
943  LONG adjustedStyle;
944  LONG exstyle = Window->ExStyle;
945  RECT rc;
946 
948 
949  /* Compute default values */
950 
951  rc = Window->rcWindow;
952  MinMax.ptReserved.x = rc.left;
953  MinMax.ptReserved.y = rc.top;
954 
955  if ((style & WS_CAPTION) == WS_CAPTION)
956  adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
957  else
958  adjustedStyle = style;
959 
960  if(Window->spwndParent)
961  IntGetClientRect(Window->spwndParent, &rc);
962  UserAdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && Window->IDMenu), exstyle);
963 
964  xinc = -rc.left;
965  yinc = -rc.top;
966 
967  MinMax.ptMaxSize.x = rc.right - rc.left;
968  MinMax.ptMaxSize.y = rc.bottom - rc.top;
969  if (style & (WS_DLGFRAME | WS_BORDER))
970  {
973  }
974  else
975  {
976  MinMax.ptMinTrackSize.x = 2 * xinc;
977  MinMax.ptMinTrackSize.y = 2 * yinc;
978  }
981  MinMax.ptMaxPosition.x = -xinc;
982  MinMax.ptMaxPosition.y = -yinc;
983 
984  if (!EMPTYPOINT(Window->InternalPos.MaxPos)) MinMax.ptMaxPosition = Window->InternalPos.MaxPos;
985 
986  co_IntSendMessage(Window->head.h, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax);
987 
988  /* if the app didn't change the values, adapt them for the current monitor */
989  if ((monitor = UserGetPrimaryMonitor()))
990  {
991  RECT rc_work;
992 
993  rc_work = monitor->rcMonitor;
994 
995  if (style & WS_MAXIMIZEBOX)
996  {
997  if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP)))
998  rc_work = monitor->rcWork;
999  }
1000 
1001  if (MinMax.ptMaxSize.x == UserGetSystemMetrics(SM_CXSCREEN) + 2 * xinc &&
1002  MinMax.ptMaxSize.y == UserGetSystemMetrics(SM_CYSCREEN) + 2 * yinc)
1003  {
1004  MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
1005  MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
1006  }
1007  if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
1008  {
1009  MinMax.ptMaxPosition.x = rc_work.left - xinc;
1010  MinMax.ptMaxPosition.y = rc_work.top - yinc;
1011  }
1012  if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
1013  MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
1014  Window->state |= WNDS_MAXIMIZESTOMONITOR;
1015  else
1016  Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
1017  }
1018 
1019 
1020  MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
1021  MinMax.ptMinTrackSize.x);
1022  MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
1023  MinMax.ptMinTrackSize.y);
1024 
1025  if (MaxSize)
1026  *MaxSize = MinMax.ptMaxSize;
1027  if (MaxPos)
1028  *MaxPos = MinMax.ptMaxPosition;
1029  if (MinTrack)
1030  *MinTrack = MinMax.ptMinTrackSize;
1031  if (MaxTrack)
1032  *MaxTrack = MinMax.ptMaxTrackSize;
1033 
1034  return 0; // FIXME: What does it return?
1035 }
POINT ptMinTrackSize
Definition: winuser.h:3572
#define max(a, b)
Definition: svc.c:63
long y
Definition: polytest.cpp:48
POINT ptReserved
Definition: winuser.h:3569
POINT ptMaxSize
Definition: winuser.h:3570
#define SM_CYMINTRACK
Definition: winuser.h:988
long x
Definition: polytest.cpp:48
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
LONG top
Definition: windef.h:292
#define WS_DLGFRAME
Definition: pedump.c:626
#define WS_CHILD
Definition: pedump.c:617
#define SM_CYMAXTRACK
Definition: winuser.h:1013
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
int32_t INT
Definition: typedefs.h:56
RECT rcWork
Definition: monitor.h:19
#define EMPTYPOINT(pt)
Definition: winpos.c:28
#define SM_CXSCREEN
Definition: winuser.h:949
Definition: window.c:29
long LONG
Definition: pedump.c:60
LONG_PTR LPARAM
Definition: windef.h:208
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_CAPTION
Definition: pedump.c:624
#define SM_CYSCREEN
Definition: winuser.h:950
#define SM_CXMINTRACK
Definition: winuser.h:987
POINT ptMaxPosition
Definition: winuser.h:3571
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1291
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:603
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102
#define SM_CXMAXTRACK
Definition: winuser.h:1012
RECT rcMonitor
Definition: monitor.h:18
LONG bottom
Definition: windef.h:294
POINT ptMaxTrackSize
Definition: winuser.h:3573
BOOL WINAPI UserAdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle)
Definition: winpos.c:908
Arabic default style
Definition: afstyles.h:93
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91
#define WM_GETMINMAXINFO
Definition: winuser.h:1622

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

◆ co_WinPosGetNonClientSize()

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

Definition at line 2194 of file winpos.c.

2195 {
2196  LRESULT Result;
2197 
2199 
2200  *ClientRect = *WindowRect;
2201  Result = co_IntSendMessageNoWait(Window->head.h, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect);
2202 
2203  FixClientRect(ClientRect, WindowRect);
2204 
2205  return Result;
2206 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define WM_NCCALCSIZE
Definition: winuser.h:1667
Definition: window.c:29
_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:1071
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
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 2243 of file winpos.c.

2244 {
2245  POINT Size;
2246  WINDOWPLACEMENT wpl;
2247  LONG old_style;
2248  UINT SwpFlags = 0;
2249 
2250  ASSERT_REFS_CO(Wnd);
2251 
2252  wpl.length = sizeof(wpl);
2253  IntGetWindowPlacement( Wnd, &wpl );
2254 
2255  if (co_HOOK_CallHooks( WH_CBT, HCBT_MINMAX, (WPARAM)Wnd->head.h, ShowFlag))
2256  {
2257  ERR("WinPosMinMaximize WH_CBT Call Hook return!\n");
2258  return SWP_NOSIZE | SWP_NOMOVE;
2259  }
2260  if (Wnd->style & WS_MINIMIZE)
2261  {
2262  switch (ShowFlag)
2263  {
2264  case SW_MINIMIZE:
2265  case SW_SHOWMINNOACTIVE:
2266  case SW_SHOWMINIMIZED:
2267  case SW_FORCEMINIMIZE:
2268  return SWP_NOSIZE | SWP_NOMOVE;
2269  }
2270  if (!co_IntSendMessageNoWait(Wnd->head.h, WM_QUERYOPEN, 0, 0))
2271  {
2272  return(SWP_NOSIZE | SWP_NOMOVE);
2273  }
2274  SwpFlags |= SWP_NOCOPYBITS;
2275  }
2276  switch (ShowFlag)
2277  {
2278  case SW_MINIMIZE:
2279  case SW_SHOWMINNOACTIVE:
2280  case SW_SHOWMINIMIZED:
2281  case SW_FORCEMINIMIZE:
2282  {
2283  //ERR("MinMaximize Minimize\n");
2284  if (Wnd->style & WS_MAXIMIZE)
2285  {
2286  Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
2287  }
2288  else
2289  {
2290  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2291  }
2292 
2293  old_style = IntSetStyle( Wnd, WS_MINIMIZE, WS_MAXIMIZE );
2294 
2296 
2297  if (!(Wnd->InternalPos.flags & WPF_SETMINPOSITION))
2298  Wnd->InternalPos.flags &= ~WPF_MININIT;
2299 
2300  WinPosFindIconPos(Wnd, &wpl.ptMinPosition);
2301 
2302  if (!(old_style & WS_MINIMIZE))
2303  {
2304  SwpFlags |= SWP_STATECHANGED;
2305  IntShowOwnedPopups(Wnd, FALSE);
2306  }
2307 
2308  RECTL_vSetRect(NewPos, wpl.ptMinPosition.x, wpl.ptMinPosition.y,
2311  SwpFlags |= SWP_NOCOPYBITS;
2312  break;
2313  }
2314 
2315  case SW_MAXIMIZE:
2316  {
2317  //ERR("MinMaximize Maximize\n");
2318  if ((Wnd->style & WS_MAXIMIZE) && (Wnd->style & WS_VISIBLE))
2319  {
2320  SwpFlags = SWP_NOSIZE | SWP_NOMOVE;
2321  break;
2322  }
2324 
2325  /*ERR("Maximize: %d,%d %dx%d\n",
2326  wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, Size.x, Size.y);
2327  */
2328  old_style = IntSetStyle( Wnd, WS_MAXIMIZE, WS_MINIMIZE );
2329  /*if (old_style & WS_MINIMIZE)
2330  {
2331  IntShowOwnedPopups(Wnd, TRUE);
2332  }*/
2333 
2334  if (!(old_style & WS_MAXIMIZE)) SwpFlags |= SWP_STATECHANGED;
2335  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2336  //wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2337  Size.x, Size.y);
2338  break;
2339  }
2340 
2341  case SW_SHOWNOACTIVATE:
2342  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2343  /* fall through */
2344  case SW_SHOWNORMAL:
2345  case SW_RESTORE:
2346  case SW_SHOWDEFAULT: /* FIXME: should have its own handler */
2347  {
2348  //ERR("MinMaximize Restore\n");
2349  old_style = IntSetStyle( Wnd, 0, WS_MINIMIZE | WS_MAXIMIZE );
2350  if (old_style & WS_MINIMIZE)
2351  {
2352  IntShowOwnedPopups(Wnd, TRUE);
2353 
2354  if (Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED)
2355  {
2357  IntSetStyle( Wnd, WS_MAXIMIZE, 0 );
2358  SwpFlags |= SWP_STATECHANGED;
2359  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2360  wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2361  break;
2362  }
2363  else
2364  {
2365  *NewPos = wpl.rcNormalPosition;
2366  NewPos->right -= NewPos->left;
2367  NewPos->bottom -= NewPos->top;
2368  break;
2369  }
2370  }
2371  else
2372  {
2373  if (!(old_style & WS_MAXIMIZE))
2374  {
2375  break;
2376  }
2377  SwpFlags |= SWP_STATECHANGED;
2378  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2379  *NewPos = wpl.rcNormalPosition;
2380  NewPos->right -= NewPos->left;
2381  NewPos->bottom -= NewPos->top;
2382  break;
2383  }
2384  }
2385  }
2386  return SwpFlags;
2387 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1203
static VOID FASTCALL WinPosFindIconPos(PWND Window, POINT *Pos)
Definition: winpos.c:778
struct _WND::@4105 InternalPos
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define TRUE
Definition: types.h:120
#define SW_SHOWNOACTIVATE
Definition: winuser.h:768
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:771
BOOL FASTCALL IntGetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:556
LONG top
Definition: windef.h:292
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4427
UINT_PTR WPARAM
Definition: windef.h:207
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2486
LONG left
Definition: windef.h:291
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
LONG right
Definition: windef.h:293
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
THRDESKHEAD head
Definition: ntuser.h:659
smooth NULL
Definition: ftsmooth.c:416
#define WH_CBT
Definition: winuser.h:35
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:936
#define SWP_STATECHANGED
Definition: msg.c:47
#define WPF_SETMINPOSITION
Definition: winuser.h:2487
#define SW_MINIMIZE
Definition: winuser.h:770
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1089
#define RDW_VALIDATE
Definition: winuser.h:1204
#define WPF_MININIT
Definition: ntuser.h:654
#define SM_CYMINIMIZED
Definition: winuser.h:1011
#define RDW_NOERASE
Definition: winuser.h:1201
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
#define HCBT_MINMAX
Definition: winuser.h:56
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:109
POINT ptMinPosition
Definition: winuser.h:3235
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:3236
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:876
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
unsigned int UINT
Definition: ndis.h:50
RECT rcNormalPosition
Definition: winuser.h:3237
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:124
LONG bottom
Definition: windef.h:294
#define SWP_NOMOVE
Definition: winuser.h:1229
#define WM_QUERYOPEN
Definition: winuser.h:1606
#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:670

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 2676 of file winpos.c.

2682 {
2683  HWND *List, *phWnd;
2684  PWND pwndChild = NULL;
2685 
2686  /* not visible */
2687  if (!(ScopeWin->style & WS_VISIBLE))
2688  {
2689  return NULL;
2690  }
2691 
2692  /* not in window or in window region */
2693  if (!IntPtInWindow(ScopeWin, Point->x, Point->y))
2694  {
2695  return NULL;
2696  }
2697 
2698  /* transparent */
2699  if ((ScopeWin->ExStyle & (WS_EX_LAYERED|WS_EX_TRANSPARENT)) == (WS_EX_LAYERED|WS_EX_TRANSPARENT))
2700  {
2701  return NULL;
2702  }
2703 
2704  if (!Ignore && (ScopeWin->style & WS_DISABLED))
2705  { /* disabled child */
2706  if ((ScopeWin->style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return NULL;
2707  /* process the hit error */
2708  *HitTest = HTERROR;
2709  return ScopeWin;
2710  }
2711 
2712  /* not minimized and check if point is inside the window */
2713  if (!(ScopeWin->style & WS_MINIMIZE) &&
2714  RECTL_bPointInRect(&ScopeWin->rcClient, Point->x, Point->y) )
2715  {
2716  UserReferenceObject(ScopeWin);
2717 
2718  List = IntWinListChildren(ScopeWin);
2719  if (List)
2720  {
2721  for (phWnd = List; *phWnd; ++phWnd)
2722  {
2723  if (!(pwndChild = ValidateHwndNoErr(*phWnd)))
2724  {
2725  continue;
2726  }
2727 
2728  pwndChild = co_WinPosSearchChildren(pwndChild, Point, HitTest, Ignore);
2729 
2730  if (pwndChild != NULL)
2731  {
2732  /* We found a window. Don't send any more WM_NCHITTEST messages */
2734  UserDereferenceObject(ScopeWin);
2735  return pwndChild;
2736  }
2737  }
2739  }
2740  UserDereferenceObject(ScopeWin);
2741  }
2742 
2743  if (ScopeWin->head.pti == PsGetCurrentThreadWin32Thread())
2744  {
2745  *HitTest = (USHORT)co_IntSendMessage(ScopeWin->head.h, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y));
2746 
2747  if ((*HitTest) == (USHORT)HTTRANSPARENT)
2748  {
2749  return NULL;
2750  }
2751  }
2752  else
2753  {
2754  if (*HitTest == HTNOWHERE && pwndChild == NULL) *HitTest = HTCLIENT;
2755  }
2756 
2757  return ScopeWin;
2758 }
#define WS_DISABLED
Definition: pedump.c:621
#define HTTRANSPARENT
Definition: winuser.h:2427
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
#define WM_NCHITTEST
Definition: winuser.h:1668
#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:2428
#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:2676
#define MAKELONG(a, b)
Definition: typedefs.h:248
smooth NULL
Definition: ftsmooth.c:416
#define HTERROR
Definition: winuser.h:2426
LIST_ENTRY List
Definition: psmgr.c:57
#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:1291
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
unsigned short USHORT
Definition: pedump.c:61
#define WS_POPUP
Definition: pedump.c:616
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define HTCLIENT
Definition: winuser.h:2429
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

Referenced by co_WinPosWindowFromPoint().

◆ co_WinPosSendSizeMove()

void FASTCALL co_WinPosSendSizeMove ( PWND  Wnd)

Definition at line 2209 of file winpos.c.

2210 {
2211  RECTL Rect;
2212  LPARAM lParam;
2214 
2215  IntGetClientRect(Wnd, &Rect);
2216  lParam = MAKELONG(Rect.right-Rect.left, Rect.bottom-Rect.top);
2217 
2218  Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS;
2219 
2220  if (Wnd->style & WS_MAXIMIZE)
2221  {
2223  }
2224  else if (Wnd->style & WS_MINIMIZE)
2225  {
2227  lParam = 0;
2228  }
2229 
2231 
2232  if (UserIsDesktopWindow(Wnd->spwndParent))
2233  lParam = MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top);
2234  else
2235  lParam = MAKELONG(Wnd->rcClient.left-Wnd->spwndParent->rcClient.left, Wnd->rcClient.top-Wnd->spwndParent->rcClient.top);
2236 
2238 
2240 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define SIZE_MAXIMIZED
Definition: winuser.h:2461
#define SIZE_RESTORED
Definition: winuser.h:2459
LONG top
Definition: windef.h:292
#define WM_MOVE
Definition: winuser.h:1592
UINT_PTR WPARAM
Definition: windef.h:207
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:577
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
WPARAM wParam
Definition: combotst.c:138
#define WS_MINIMIZE
Definition: pedump.c:622
#define MAKELONG(a, b)
Definition: typedefs.h:248
LONG_PTR LPARAM
Definition: windef.h:208
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WM_SIZE
Definition: winuser.h:1593
#define SIZE_MINIMIZED
Definition: winuser.h:2460
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
DWORD state
Definition: ntuser.h:665
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
struct _WND * spwndParent
Definition: ntuser.h:677
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:670

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 1651 of file winpos.c.

1660 {
1661  WINDOWPOS WinPos;
1662  RECTL NewWindowRect;
1663  RECTL NewClientRect;
1664  RECTL valid_rects[2];
1665  PREGION VisBefore = NULL;
1666  PREGION VisBeforeJustClient = NULL;
1667  PREGION VisAfter = NULL;
1668  PREGION CopyRgn = NULL;
1669  ULONG WvrFlags = 0;
1670  RECTL OldWindowRect, OldClientRect;
1671  int RgnType;
1672  HDC Dc;
1673  RECTL CopyRect;
1674  PWND Ancestor;
1675  BOOL bPointerInWindow, PosChanged = FALSE;
1677 
1679 
1680  TRACE("pwnd %p, after %p, %d,%d (%dx%d), flags %s",
1681  Window, WndInsertAfter, x, y, cx, cy, flags);
1682 #if DBG
1683  dump_winpos_flags(flags);
1684 #endif
1685 
1686  /* FIXME: Get current active window from active queue. Why? since r2915. */
1687 
1688  bPointerInWindow = IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y);
1689 
1690  WinPos.hwnd = Window->head.h;
1691  WinPos.hwndInsertAfter = WndInsertAfter;
1692  WinPos.x = x;
1693  WinPos.y = y;
1694  WinPos.cx = cx;
1695  WinPos.cy = cy;
1696  WinPos.flags = flags;
1697 
1698  if ( flags & SWP_ASYNCWINDOWPOS )
1699  {
1700  LRESULT lRes;
1702  if ( ppos )
1703  {
1704  WinPos.flags &= ~SWP_ASYNCWINDOWPOS; // Clear flag.
1705  *ppos = WinPos;
1706  /* Yes it's a pointer inside Win32k! */
1707  lRes = co_IntSendMessageNoWait( WinPos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
1708  /* We handle this the same way as Event Hooks and Hooks. */
1709  if ( !lRes )
1710  {
1712  return FALSE;
1713  }
1714  return TRUE;
1715  }
1716  return FALSE;
1717  }
1718 
1719  co_WinPosDoWinPosChanging(Window, &WinPos, &NewWindowRect, &NewClientRect);
1720 
1721  /* Does the window still exist? */
1722  if (!IntIsWindow(WinPos.hwnd))
1723  {
1724  TRACE("WinPosSetWindowPos: Invalid handle 0x%p!\n",WinPos.hwnd);
1726  return FALSE;
1727  }
1728 
1729  /* Fix up the flags. */
1730  if (!WinPosFixupFlags(&WinPos, Window))
1731  {
1732  // See Note.
1733  return TRUE;
1734  }
1735 
1736  Ancestor = UserGetAncestor(Window, GA_PARENT);
1737  if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER &&
1738  Ancestor && Ancestor->head.h == IntGetDesktopWindow() )
1739  {
1741  }
1742 
1743  if (!(WinPos.flags & SWP_NOREDRAW))
1744  {
1745  /* Compute the visible region before the window position is changed */
1746  if (!(WinPos.flags & SWP_SHOWWINDOW) &&
1747  (WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
1750  {
1752  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1753 
1754  if ( VisBefore != NULL &&
1755  REGION_Complexity(VisBefore) == NULLREGION )
1756  {
1757  REGION_Delete(VisBefore);
1758  VisBefore = NULL;
1759  }
1760  else if(VisBefore)
1761  {
1762  REGION_bOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top);
1763  }
1764 
1765  /* Calculate the non client area for resizes, as this is used in the copy region */
1766  if (!(WinPos.flags & SWP_NOSIZE))
1767  {
1768  VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
1769  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1770 
1771  if ( VisBeforeJustClient != NULL &&
1772  REGION_Complexity(VisBeforeJustClient) == NULLREGION )
1773  {
1774  REGION_Delete(VisBeforeJustClient);
1775  VisBeforeJustClient = NULL;
1776  }
1777  else if(VisBeforeJustClient)
1778  {
1779  REGION_bOffsetRgn(VisBeforeJustClient, -Window->rcWindow.left, -Window->rcWindow.top);
1780  }
1781  }
1782  }
1783  }
1784 
1786  if (Window->hrgnNewFrame)
1787  {
1788  SelectWindowRgn( Window, Window->hrgnNewFrame ); // Should be PSMWP->acvr->hrgnClip
1789  Window->hrgnNewFrame = NULL;
1790  }
1791 
1792  WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect, valid_rects);
1793 
1794 // ERR("co_WinPosDoNCCALCSize returned 0x%x\n valid dest: %d %d %d %d\n valid src : %d %d %d %d\n", WvrFlags,
1795 // valid_rects[0].left,valid_rects[0].top,valid_rects[0].right,valid_rects[0].bottom,
1796 // valid_rects[1].left,valid_rects[1].top,valid_rects[1].right,valid_rects[1].bottom);
1797 
1798  /* Validate link windows. (also take into account shell window in hwndShellWindow) */
1799  if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow())
1800  {
1802  }
1803 
1804  OldWindowRect = Window->rcWindow;
1805  OldClientRect = Window->rcClient;
1806 
1807  if (NewClientRect.left != OldClientRect.left ||
1808  NewClientRect.top != OldClientRect.top)
1809  {
1810  // Move child window if their parent is moved. Keep Child window relative to Parent...
1812  NewClientRect.left - OldClientRect.left,
1813  NewClientRect.top - OldClientRect.top);
1814  PosChanged = TRUE;
1815  }
1816 
1817  Window->rcWindow = NewWindowRect;
1818  Window->rcClient = NewClientRect;
1819 
1820  /* erase parent when hiding or resizing child */
1821  if (WinPos.flags & SWP_HIDEWINDOW)
1822  {
1823  /* Clear the update region */
1825  NULL,
1826  0,
1828 
1829  if (UserIsDesktopWindow(Window->spwndParent))
1831 
1832  Window->style &= ~WS_VISIBLE; //IntSetStyle( Window, 0, WS_VISIBLE );
1833  Window->head.pti->cVisWindows--;
1835  }
1836  else if (WinPos.flags & SWP_SHOWWINDOW)
1837  {
1838  if (UserIsDesktopWindow(Window->spwndParent) &&
1839  Window->spwndOwner == NULL &&
1840  (!(Window->ExStyle & WS_EX_TOOLWINDOW) ||
1841  (Window->ExStyle & WS_EX_APPWINDOW)))
1843 
1844  Window->style |= WS_VISIBLE; //IntSetStyle( Window, WS_VISIBLE, 0 );
1845  Window->head.pti->cVisWindows++;
1847  }
1848 
1849  if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
1850  {
1851  NtGdiOffsetRgn(Window->hrgnUpdate,
1852  NewWindowRect.left - OldWindowRect.left,
1853  NewWindowRect.top - OldWindowRect.top);
1854  }
1855 
1856  DceResetActiveDCEs(Window); // For WS_VISIBLE changes.
1857 
1858  if (!(WinPos.flags & SWP_NOREDRAW))
1859  {
1860  /* Determine the new visible region */
1862  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1863 
1864  if ( VisAfter != NULL &&
1865  REGION_Complexity(VisAfter) == NULLREGION )
1866  {
1867  REGION_Delete(VisAfter);
1868  VisAfter = NULL;
1869  }
1870  else if(VisAfter)
1871  {
1872  REGION_bOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top);
1873  }
1874 
1875  /*
1876  * Determine which pixels can be copied from the old window position
1877  * to the new. Those pixels must be visible in both the old and new
1878  * position. Also, check the class style to see if the windows of this
1879  * class need to be completely repainted on (horizontal/vertical) size
1880  * change.
1881  */
1882  if ( ( VisBefore != NULL &&
1883  VisAfter != NULL &&
1884  !(WinPos.flags & SWP_NOCOPYBITS) &&
1885  ((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
1886  !(Window->ExStyle & WS_EX_TRANSPARENT) ) ||
1887  ( !PosChanged && (WinPos.flags & SWP_FRAMECHANGED) && VisBefore) )
1888  {
1889 
1890  /*
1891  * If this is (also) a window resize, the whole nonclient area
1892  * needs to be repainted. So we limit the copy to the client area,
1893  * 'cause there is no use in copying it (would possibly cause
1894  * "flashing" too). However, if the copy region is already empty,
1895  * we don't have to crop (can't take anything away from an empty
1896  * region...)
1897  */
1898 
1899  CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
1900  if (WinPos.flags & SWP_NOSIZE)
1901  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
1902  else if (VisBeforeJustClient != NULL)
1903  {
1904  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
1905  REGION_Delete(VisBeforeJustClient);
1906  }
1907 
1908  /* Now use in copying bits which are in the update region. */
1909  if (Window->hrgnUpdate != NULL)
1910  {
1911  PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
1912  if (RgnUpdate)
1913  {
1914  REGION_bOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
1915  IntGdiCombineRgn(CopyRgn, CopyRgn, RgnUpdate, RGN_DIFF);
1916  REGION_bOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
1917  REGION_UnlockRgn(RgnUpdate);
1918  }
1919  }
1920 
1921  /*
1922  * Now, get the bounding box of the copy region. If it's empty
1923  * there's nothing to copy. Also, it's no use copying bits onto
1924  * themselves.
1925  */
1927  {
1928  /* Nothing to copy, clean up */
1930  CopyRgn = NULL;
1931  }
1932  else if ( OldWindowRect.left != NewWindowRect.left ||
1933  OldWindowRect.top != NewWindowRect.top ||
1934  (WinPos.flags & SWP_FRAMECHANGED) )
1935  {
1936  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
1937  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
1938 
1939  /*
1940  * Small trick here: there is no function to bitblt a region. So
1941  * we set the region as the clipping region, take the bounding box
1942  * of the region and bitblt that. Since nothing outside the clipping
1943  * region is copied, this has the effect of bitblt'ing the region.
1944  *
1945  * Since NtUserGetDCEx takes ownership of the clip region, we need
1946  * to create a copy of CopyRgn and pass that. We need CopyRgn later
1947  */
1948  IntGdiCombineRgn(DcRgnObj, CopyRgn, NULL, RGN_COPY);
1949  REGION_bOffsetRgn(DcRgnObj, NewWindowRect.left, NewWindowRect.top);
1950  REGION_UnlockRgn(DcRgnObj);
1951  Dc = UserGetDCEx( Window,
1952  DcRgn,
1953  DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW will set first, go read WinDC.c.
1954  NtGdiBitBlt( Dc,
1955  CopyRect.left, CopyRect.top,
1956  CopyRect.right - CopyRect.left,
1957  CopyRect.bottom - CopyRect.top,
1958  Dc,
1959  CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
1960  CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
1961  SRCCOPY,
1962  0,
1963  0);
1964 
1965  UserReleaseDC(Window, Dc, FALSE);
1967  GreDeleteObject(DcRgn);
1968  }
1969  }
1970  else
1971  {
1972  CopyRgn = NULL;
1973  }
1974 
1975  if ( !PosChanged && (WinPos.flags & SWP_FRAMECHANGED) && VisBefore )
1976  {
1977  PWND pwnd = Window;
1978  PWND Parent = pwnd->spwndParent;
1979 
1980  TRACE("SWP_FRAMECHANGED no chg\n");
1981 
1982  if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing.
1983  {
1984  TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent);
1985  pwnd = Parent ? Parent : pwnd;
1986  }
1987 
1988  if ( !(pwnd->style & WS_CHILD) )
1989  {
1990  HDC hdc;
1991  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
1992  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
1993 
1994  TRACE("SWP_FRAMECHANGED Draw\n");
1995 
1996  IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY);
1997  REGION_UnlockRgn(DcRgnObj);
1998 
1999  hdc = UserGetDCEx( pwnd,
2000  DcRgn,
2001  DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW, see note above....
2002 
2003  NC_DoNCPaint(pwnd, hdc, -1); // Force full redraw of nonclient area.
2004 
2005  UserReleaseDC(pwnd, hdc, FALSE);
2006  IntValidateParent(pwnd, DcRgnObj);
2007  GreDeleteObject(DcRgn);
2008  }
2009  }
2010 
2011  /* We need to redraw what wasn't visible before */
2012  if (VisAfter != NULL)
2013  {
2014  PREGION DirtyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2015  if (DirtyRgn)
2016  {
2017  if (CopyRgn != NULL)
2018  {
2019  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, CopyRgn, RGN_DIFF);
2020  }
2021  else
2022  {
2023  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, 0, RGN_COPY);
2024  }
2025 
2026  if (RgnType != ERROR && RgnType != NULLREGION)
2027  {
2028  /* old code
2029  NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2030  IntInvalidateWindows( Window,
2031  DirtyRgn,
2032  RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
2033  }
2034  GreDeleteObject(DirtyRgn);
2035  */
2036 
2037  PWND Parent = Window->spwndParent;
2038 
2039  REGION_bOffsetRgn( DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2040 
2041  if ( (Window->style & WS_CHILD) && (Parent) && !(Parent->style & WS_CLIPCHILDREN))
2042  {
2045  }
2046  else
2047  {
2049  }
2050  }
2051  REGION_Delete(DirtyRgn);
2052  }
2053  }
2054 
2055  if (CopyRgn != NULL)
2056  {
2058  }
2059 
2060  /* Expose what was covered before but not covered anymore */
2061  if (VisBefore != NULL)
2062  {
2063  PREGION ExposedRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2064  if (ExposedRgn)
2065  {
2066  RgnType = IntGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
2067  REGION_bOffsetRgn(ExposedRgn,
2068  OldWindowRect.left - NewWindowRect.left,
2069  OldWindowRect.top - NewWindowRect.top);
2070 
2071  if (VisAfter != NULL)
2072  RgnType = IntGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
2073 
2074  if (RgnType != ERROR && RgnType != NULLREGION)
2075  {
2076  co_VIS_WindowLayoutChanged(Window, ExposedRgn);
2077  }
2078  REGION_Delete(ExposedRgn);
2079  }
2080  REGION_Delete(VisBefore);
2081  }
2082 
2083  if (VisAfter != NULL)
2084  {
2085  REGION_Delete(VisAfter);
2086  }
2087  }
2088 
2089  if (!(WinPos.flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)))
2090  {
2091  if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2092  {
2094  }
2095  else
2096  {
2097  //ERR("SetWindowPos Set FG Window!\n");
2098  if ( pti->MessageQueue->spwndActive != Window ||
2099  pti->MessageQueue != gpqForeground )
2100  {
2101  //ERR("WPSWP : set active window\n");
2102  if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
2103  {
2104  co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
2105  }
2106  }
2107  }
2108  }
2109 
2110  if ( !PosChanged &&
2111  (WinPos.flags & SWP_FRAMECHANGED) &&
2112  !(WinPos.flags & SWP_DEFERERASE) && // Prevent sending WM_SYNCPAINT message.
2113  VisAfter )
2114  {
2115  PWND Parent = Window->spwndParent;
2116  if ( !(Window->style & WS_CHILD) && (Parent) && (Parent->style & WS_CLIPCHILDREN))
2117  {
2118  TRACE("SWP_FRAMECHANGED Parent WS_CLIPCHILDREN\n");
2120  }
2121  }
2122 
2123  // Fix wine msg test_SetFocus, prevents sending WM_WINDOWPOSCHANGED.
2124  if ( VisBefore == NULL &&
2125  VisBeforeJustClient == NULL &&
2126  !(Window->ExStyle & WS_EX_TOPMOST) &&
2128  {
2129  TRACE("No drawing, set no Z order and no redraw!\n");
2130  WinPos.flags |= SWP_NOZORDER|SWP_NOREDRAW;
2131  }
2132 
2133  if(!(flags & SWP_DEFERERASE))
2134  {
2135  /* erase parent when hiding or resizing child */
2136  if ((flags & SWP_HIDEWINDOW) ||
2137  (!(flags & SWP_SHOWWINDOW) &&
2139  {
2140  PWND Parent = Window->spwndParent;
2143  }
2144 
2145  /* Give newly shown windows a chance to redraw */
2146  if(((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2148  {
2150  }
2151  }
2152 
2153  /* And last, send the WM_WINDOWPOSCHANGED message */
2154 
2155  TRACE("\tstatus hwnd %p flags = %04x\n",Window?Window->head.h:NULL,WinPos.flags & SWP_AGG_STATUSFLAGS);
2156 
2157  if (((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2159  {
2160  /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
2161  and always contains final window position.
2162  */
2163  WinPos.x = NewWindowRect.left;
2164  WinPos.y = NewWindowRect.top;
2165  WinPos.cx = NewWindowRect.right - NewWindowRect.left;
2166  WinPos.cy = NewWindowRect.bottom - NewWindowRect.top;
2167  TRACE("WM_WINDOWPOSCHANGED hwnd %p Flags %04x\n",WinPos.hwnd,WinPos.flags);
2168  co_IntSendMessageNoWait(WinPos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM) &WinPos);
2169  }
2170 
2171  if ( WinPos.flags & SWP_FRAMECHANGED || WinPos.flags & SWP_STATECHANGED ||
2172  !(WinPos.flags & SWP_NOCLIENTSIZE) || !(WinPos.flags & SWP_NOCLIENTMOVE) )
2173  {
2174  PWND pWnd = ValidateHwndNoErr(WinPos.hwnd);
2175  if (pWnd)
2176  IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2177  }
2178 
2179  if(bPointerInWindow != IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y))
2180  {
2181  /* Generate mouse move message */
2182  MSG msg;
2183  msg.message = WM_MOUSEMOVE;
2184  msg.wParam = UserGetMouseButtonsState();
2185  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2186  msg.pt = gpsi->ptCursor;
2188  }
2189 
2190  return TRUE;
2191 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1203
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define RDW_NOCHILDREN
Definition: winuser.h:1208
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:12
__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:1153
#define TRUE
Definition: types.h:120
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:582
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define DCX_CLIPSIBLINGS
Definition: winuser.h:2077
VOID FASTCALL UserSyncAndPaintWindows(PWND pWnd, ULONG Flags)
Definition: painting.c:608
VOID FASTCALL co_VIS_WindowLayoutChanged(PWND Wnd, PREGION NewlyExposed)
Definition: vis.c:145
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define ERROR(name)
Definition: error_private.h:53
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
static HDC
Definition: imagelist.c:92
#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:360
#define HSHELL_WINDOWCREATED
Definition: winuser.h:1240
long bottom
Definition: polytest.cpp:53
static BOOL IntValidateParent(PWND Child, PREGION ValidateRgn)
Definition: winpos.c:1039
HWND hwndInsertAfter
Definition: winuser.h:3531
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:1257
UINT_PTR WPARAM
Definition: windef.h:207
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2686
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
#define RDW_FRAME
Definition: winuser.h:1198
#define SWP_NOZORDER
Definition: winuser.h:1232
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:2337
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define DCX_INTERSECTRGN
Definition: winuser.h:2083
#define DCX_WINDOW
Definition: winuser.h:2074
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define WNDS_BEINGACTIVATED
Definition: ntuser.h:593
#define RGN_AND
Definition: wingdi.h:355
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
Definition: window.c:29
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2386
VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
Definition: window.c:937
#define WM_CHILDACTIVATE
Definition: winuser.h:1620
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GA_PARENT
Definition: winuser.h:2742
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3476
long top
Definition: polytest.cpp:53
static HWND FASTCALL WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter)
Definition: winpos.c:1345
#define CHILDID_SELF
Definition: winable.h:14
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
LRESULT NC_DoNCPaint(PWND pWnd, HDC hDC, INT Flags)
Definition: nonclient.c:1021
THRDESKHEAD head
Definition: ntuser.h:659
static LONG FASTCALL co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
Definition: winpos.c:1170
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:66
smooth NULL
Definition: ftsmooth.c:416
#define HRGN_WINDOW
Definition: ntuser.h:329
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1238
__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:3536
#define WEF_SETBYWNDPTI
Definition: ntuser.h:213
#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:2466
static BOOL FASTCALL WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd)
Definition: winpos.c:1515
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:1227
#define RDW_ERASE
Definition: winuser.h:1197
#define SWP_STATECHANGED
Definition: msg.c:47
VOID FASTCALL co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse)
Definition: painting.c:391
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
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:3950
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:630
#define RDW_VALIDATE
Definition: winuser.h:1204
VOID FASTCALL DceResetActiveDCEs(PWND Window)
Definition: windc.c:815
HDC hdc
Definition: main.c:9
static VOID FASTCALL WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY)
Definition: winpos.c:1485
#define RDW_NOERASE
Definition: winuser.h:1201
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define RDW_NOFRAME
Definition: winuser.h:1202
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
Definition: window.c:3129
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1241
#define RGN_COPY
Definition: wingdi.h:356
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define WVR_REDRAW
Definition: winuser.h:2475
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1338
#define DCX_CACHE
Definition: winuser.h:2075
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:25
#define RGN_DIFF
Definition: wingdi.h:357
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:876
#define RDW_ALLCHILDREN
Definition: winuser.h:1207
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
#define WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1751
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
#define SWP_DEFERERASE
Definition: winuser.h:1237
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1656
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:280
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1644
#define msg(x)
Definition: auth_time.c:54
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2352
_Out_opt_ int * cx
Definition: commctrl.h:570
#define RDW_ERASENOW
Definition: winuser.h:1205
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
#define RDW_CLIPCHILDREN
Definition: painting.h:15
struct _WND * spwndParent
Definition: ntuser.h:677
unsigned int ULONG
Definition: retypes.h:1
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
#define SWP_AGG_NOPOSCHANGE
Definition: winpos.c:21
INT FASTCALL REGION_Complexity(PREGION prgn)
Definition: region.c:559
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2521
HWND hwnd
Definition: winuser.h:3530
LONG_PTR LRESULT
Definition: windef.h:209
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1432
#define WS_VISIBLE
Definition: pedump.c:620
#define SWP_NOCLIENTSIZE
Definition: msg.h:29
#define CopyRgn(hrgnDst, hrgnSrc)
Definition: windowsx.h:48
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2428
#define SRCCOPY
Definition: wingdi.h:332
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define RDW_INVALIDATE
Definition: winuser.h:1200
DWORD style
Definition: ntuser.h:670

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 2393 of file winpos.c.

2394 {
2395  BOOLEAN WasVisible;
2396  UINT Swp = 0, EventMsg = 0;
2397  RECTL NewPos = {0, 0, 0, 0};
2398  BOOLEAN ShowFlag;
2399  LONG style;
2400  PWND Parent;
2401  PTHREADINFO pti;
2402  //HRGN VisibleRgn;
2403  BOOL ShowOwned = FALSE;
2404  BOOL FirstTime = FALSE;
2405  ASSERT_REFS_CO(Wnd);
2406  //KeRosDumpStackFrames(NULL, 20);
2408  WasVisible = (Wnd->style & WS_VISIBLE) != 0;
2409  style = Wnd->style;
2410 
2411  TRACE("co_WinPosShowWindow START hwnd %p Cmd %d usicmd %u\n",
2412  Wnd->head.h, Cmd, pti->ppi->usi.wShowWindow);
2413 
2414  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2415  {
2416  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2417  {
2418  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
2419  {
2420  if (Wnd->spwndOwner == NULL)
2421  {
2422  if ( Cmd == SW_SHOWNORMAL || Cmd == SW_SHOW)
2423  {
2424  Cmd = SW_SHOWDEFAULT;
2425  }
2426  FirstTime = TRUE;
2427  TRACE("co_WPSW FT 1\n");
2428  }
2429  }
2430  }
2431  }
2432 
2433  if ( Cmd == SW_SHOWDEFAULT )
2434  {
2435  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2436  {
2437  Cmd = pti->ppi->usi.wShowWindow;
2438  FirstTime = TRUE;
2439  TRACE("co_WPSW FT 2\n");
2440  }
2441  }
2442 
2443  if (FirstTime)
2444  {
2446  }
2447 
2448  switch (Cmd)
2449  {
2450  case SW_HIDE:
2451  {
2452  if (!WasVisible)
2453  {
2454  //ERR("co_WinPosShowWindow Exit Bad\n");
2455  return FALSE;
2456  }
2458  if (Wnd != pti->MessageQueue->spwndActive)
2459  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2460  break;
2461  }
2462 
2463  case SW_FORCEMINIMIZE: /* FIXME: Does not work if thread is hung. */
2464  case SW_SHOWMINNOACTIVE:
2465  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2466  /* Fall through. */
2467  case SW_SHOWMINIMIZED:
2468  Swp |= SWP_SHOWWINDOW;
2469  /* Fall through. */
2470  case SW_MINIMIZE:
2471  {
2472  Swp |= SWP_NOACTIVATE;
2473  if (!(style & WS_MINIMIZE))
2474  {
2475  IntShowOwnedPopups(Wnd, FALSE );
2476  // Fix wine Win test_SetFocus todo #1 & #2,
2477  if (Cmd == SW_SHOWMINIMIZED)
2478  {
2479  //ERR("co_WinPosShowWindow Set focus 1\n");
2480  if ((style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2482  else
2483  co_UserSetFocus(0);
2484  }
2485 
2486  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2487 
2488  EventMsg = EVENT_SYSTEM_MINIMIZESTART;
2489  }
2490  else
2491  {
2492  if (WasVisible)
2493  {
2494  //ERR("co_WinPosShowWindow Exit Good\n");
2495  return TRUE;
2496  }
2497  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2498  }
2499  break;
2500  }
2501 
2502  case SW_SHOWMAXIMIZED:
2503  {
2504  Swp |= SWP_SHOWWINDOW;
2505  if (!(style & WS_MAXIMIZE))
2506  {
2507  ShowOwned = TRUE;
2508 
2509  Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos);
2510 
2511  EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2512  }
2513  else
2514  {
2515  if (WasVisible)
2516  {
2517  //ERR("co_WinPosShowWindow Exit Good 1\n");
2518  return TRUE;
2519  }
2520  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2521  }
2522  break;
2523  }
2524 
2525  case SW_SHOWNA:
2527  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOZORDER;
2528  break;
2529  case SW_SHOW:
2530  if (WasVisible) return(TRUE); // Nothing to do!
2532  /* Don't activate the topmost window. */
2533  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2534  break;
2535 
2536  case SW_SHOWNOACTIVATE:
2537  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2538  /* Fall through. */
2539  case SW_SHOWNORMAL:
2540  case SW_SHOWDEFAULT:
2541  case SW_RESTORE:
2542  if (!WasVisible) Swp |= SWP_SHOWWINDOW;
2543  if (style & (WS_MINIMIZE | WS_MAXIMIZE))
2544  {
2545  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2546  if (style & WS_MINIMIZE) EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2547  }
2548  else
2549  {
2550  if (WasVisible)
2551  {
2552  //ERR("co_WinPosShowWindow Exit Good 3\n");
2553  return TRUE;
2554  }
2555  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2556  }
2557  if ( style & WS_CHILD &&
2558  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2559  !(Swp & SWP_STATECHANGED))
2560  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2561  break;
2562 
2563  default:
2564  //ERR("co_WinPosShowWindow Exit Good 4\n");
2565  return WasVisible;
2566  }
2567 
2568  ShowFlag = (Cmd != SW_HIDE);
2569 
2570  if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED))
2571  {
2572  co_IntSendMessageNoWait(Wnd->head.h, WM_SHOWWINDOW, ShowFlag, 0);
2573 #if 0 // Fix wine msg test_SetParent:WmSetParentSeq_1:2
2574  if (!(Wnd->state2 & WNDS2_WIN31COMPAT)) // <------------- XP sets this bit!
2575  co_IntSendMessageNoWait(Wnd->head.h, WM_SETVISIBLE, ShowFlag, 0);
2576 #endif
2577  if (!VerifyWnd(Wnd)) return WasVisible;
2578  }
2579 
2580  /* We can't activate a child window */
2581  if ((Wnd->style & WS_CHILD) &&
2582  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2583  Cmd != SW_SHOWNA)
2584  {
2585  //ERR("SWP Child No active and ZOrder\n");
2586  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2587  }
2588 
2589 #if 0 // Explorer issues with common controls? Someone does not know how CS_SAVEBITS works.
2590  // Breaks startup and shutdown active window...
2591  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD &&
2592  Wnd->pcls->style & CS_SAVEBITS &&
2593  ((Cmd == SW_SHOW) || (Cmd == SW_NORMAL)))
2594  {
2595  ERR("WinPosShowWindow Set active\n");
2596  //UserSetActiveWindow(Wnd);
2597  co_IntSetForegroundWindow(Wnd); // HACK
2598  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2599  }
2600 #endif
2601 
2602  if (IsChildVisible(Wnd) || Swp & SWP_STATECHANGED)
2603  {
2604  TRACE("Child is Vis %s or State changed %s. ShowFlag %s Swp %04x\n",
2605  (IsChildVisible(Wnd) ? "TRUE" : "FALSE"), (Swp & SWP_STATECHANGED ? "TRUE" : "FALSE"),
2606  (ShowFlag ? "TRUE" : "FALSE"),LOWORD(Swp));
2607  co_WinPosSetWindowPos( Wnd,
2608  0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP,
2609  NewPos.left,
2610  NewPos.top,
2611  NewPos.right, // NewPos.right - NewPos.left, when minimized and restore, the window becomes smaller.
2612  NewPos.bottom,// NewPos.bottom - NewPos.top,
2613  LOWORD(Swp));
2614  }
2615  else
2616  {
2617  TRACE("Parent Vis?\n");
2618  /* if parent is not visible simply toggle WS_VISIBLE and return */
2619  if (ShowFlag) IntSetStyle( Wnd, WS_VISIBLE, 0 );
2620  else IntSetStyle( Wnd, 0, WS_VISIBLE );
2621  }
2622 
2623  if ( EventMsg ) IntNotifyWinEvent(EventMsg, Wnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2624 
2625  if ( ShowOwned ) IntShowOwnedPopups(Wnd, TRUE );
2626 
2627  if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE))
2628  {
2629  if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() )
2630  {
2631  if (UserIsDesktopWindow(Wnd->spwndParent))
2632  {
2633  if (!ActivateOtherWindowMin(Wnd))
2634  {
2636  }
2637  }
2638  else
2639  {
2641  }
2642  }
2643 
2644  /* Revert focus to parent */
2645  if (Wnd == pti->MessageQueue->spwndFocus)
2646  {
2647  Parent = Wnd->spwndParent;
2648  if (UserIsDesktopWindow(Wnd->spwndParent))
2649  Parent = 0;
2651  }
2652  // Hide, just return.
2653  if (Cmd == SW_HIDE) return WasVisible;
2654  }
2655 
2656  /* FIXME: Check for window destruction. */
2657 
2658  if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) &&
2659  !(Wnd->state2 & WNDS2_INDESTROY))
2660  {
2661  co_WinPosSendSizeMove(Wnd);
2662  }
2663 
2664  /* if previous state was minimized Windows sets focus to the window */
2665  if (style & WS_MINIMIZE)
2666  {
2667  co_UserSetFocus(Wnd);
2668  // Fix wine Win test_SetFocus todo #3,
2670  }
2671  //ERR("co_WinPosShowWindow EXIT\n");
2672  return WasVisible;
2673 }
USERSTARTUPINFO usi
Definition: win32.h:269
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define SW_NORMAL
Definition: winuser.h:763
DWORD ExStyle
Definition: ntuser.h:668
#define TRUE
Definition: types.h:120
#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:1196
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
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:1651
#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:1610
#define STARTF_USEPOSITION
Definition: winbase.h:474
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4427
#define HWND_TOPMOST
Definition: winuser.h:1194
#define HWND_TOP
Definition: winuser.h:1193
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:577
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
#define SWP_NOZORDER
Definition: winuser.h:1232
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
VOID FASTCALL co_WinPosActivateOtherWindow(PWND Wnd)
Definition: winpos.c:395
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
PPROCESSINFO ppi
Definition: win32.h:87
long right
Definition: polytest.cpp:53
#define WS_EX_MDICHILD
Definition: winuser.h:394
UINT style
Definition: ntuser.h:548
#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:679
THRDESKHEAD head
Definition: ntuser.h:659
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define WEF_SETBYWNDPTI
Definition: ntuser.h:213
#define STARTF_USESHOWWINDOW
Definition: winbase.h:472
#define SW_SHOW
Definition: winuser.h:769
long left
Definition: polytest.cpp:53
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WS_CAPTION
Definition: pedump.c:624
#define TRACE(s)
Definition: solgame.cpp:4
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define SWP_STATECHANGED
Definition: msg.c:47
#define WA_ACTIVE
Definition: winuser.h:2577
void FASTCALL co_WinPosSendSizeMove(PWND Wnd)
Definition: winpos.c:2209
#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:1291
Definition: sacdrv.h:277
#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:1230
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_ACTIVATE
Definition: winuser.h:1594
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
DWORD state
Definition: ntuser.h:665
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:617
#define WS_POPUP
Definition: pedump.c:616
#define STARTF_USESIZE
Definition: winbase.h:473
unsigned int UINT
Definition: ndis.h:50
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
WORD wShowWindow
Definition: win32.h:214
UINT FASTCALL co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT *NewPos)
Definition: winpos.c:2243
struct _WND * spwndParent
Definition: ntuser.h:677
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:124
DWORD state2
Definition: ntuser.h:666
#define SWP_NOMOVE
Definition: winuser.h:1229
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:64
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1432
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:616
PCLS pcls
Definition: ntuser.h:684
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

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 2761 of file winpos.c.

2766 {
2767  PWND Window;
2768  POINT Point = *WinPoint;
2770 
2771  if( ScopeWin == NULL )
2772  {
2773  ScopeWin = UserGetDesktopWindow();
2774  if(ScopeWin == NULL)
2775  return NULL;
2776  }
2777 
2778  *HitTest = HTNOWHERE;
2779 
2780  ASSERT_REFS_CO(ScopeWin);
2781  UserRefObjectCo(ScopeWin, &Ref);
2782 
2783  Window = co_WinPosSearchChildren(ScopeWin, &Point, HitTest, Ignore);
2784 
2785  UserDerefObjectCo(ScopeWin);
2786  if (Window)
2788  ASSERT_REFS_CO(ScopeWin);
2789 
2790  return Window;
2791 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
#define HTNOWHERE
Definition: winuser.h:2428
Definition: window.c:29
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2676
Definition: object.h:3
smooth NULL
Definition: ftsmooth.c:416
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1349
Definition: ntuser.h:657

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 1071 of file winpos.c.

1072 {
1073  if (ClientRect->left < WindowRect->left)
1074  {
1075  ClientRect->left = WindowRect->left;
1076  }
1077  else if (WindowRect->right < ClientRect->left)
1078  {
1079  ClientRect->left = WindowRect->right;
1080  }
1081  if (ClientRect->right < WindowRect->left)
1082  {
1083  ClientRect->right = WindowRect->left;
1084  }
1085  else if (WindowRect->right < ClientRect->right)
1086  {
1087  ClientRect->right = WindowRect->right;
1088  }
1089  if (ClientRect->top < WindowRect->top)
1090  {
1091  ClientRect->top = WindowRect->top;
1092  }
1093  else if (WindowRect->bottom < ClientRect->top)
1094  {
1095  ClientRect->top = WindowRect->bottom;
1096  }
1097  if (ClientRect->bottom < WindowRect->top)
1098  {
1099  ClientRect->bottom = WindowRect->top;
1100  }
1101  else if (WindowRect->bottom < ClientRect->bottom)
1102  {
1103  ClientRect->bottom = WindowRect->bottom;
1104  }
1105 }
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().

◆ get_valid_rects()

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

Definition at line 1114 of file winpos.c.

1115 {
1116  int cx, cy;
1117 
1118  if (flags & WVR_REDRAW)
1119  {
1120  RECTL_vSetEmptyRect( &valid[0] );
1121  RECTL_vSetEmptyRect( &valid[1] );
1122  return;
1123  }
1124 
1125  if (flags & WVR_VALIDRECTS)
1126  {
1127  if (!RECTL_bIntersectRect( &valid[0], &valid[0], new_client ) ||
1128  !RECTL_bIntersectRect( &valid[1], &valid[1], old_client ))
1129  {
1130  RECTL_vSetEmptyRect( &valid[0] );
1131  RECTL_vSetEmptyRect( &valid[1] );
1132  return;
1133  }
1135  }
1136  else
1137  {
1138  valid[0] = *new_client;
1139  valid[1] = *old_client;
1140  }
1141 
1142  /* make sure the rectangles have the same size */
1143  cx = min( valid[0].right - valid[0].left, valid[1].right - valid[1].left );
1144  cy = min( valid[0].bottom - valid[0].top, valid[1].bottom - valid[1].top );
1145 
1146  if (flags & WVR_ALIGNBOTTOM)
1147  {
1148  valid[0].top = valid[0].bottom - cy;
1149  valid[1].top = valid[1].bottom - cy;
1150  }
1151  else
1152  {
1153  valid[0].bottom = valid[0].top + cy;
1154  valid[1].bottom = valid[1].top + cy;
1155  }
1156  if (flags & WVR_ALIGNRIGHT)
1157  {
1158  valid[0].left = valid[0].right - cx;
1159  valid[1].left = valid[1].right - cx;
1160  }
1161  else
1162  {
1163  valid[0].right = valid[0].left + cx;
1164  valid[1].right = valid[1].left + cx;
1165  }
1166 }
#define WVR_ALIGNRIGHT
Definition: winuser.h:2472
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
long bottom
Definition: polytest.cpp:53
#define WVR_ALIGNLEFT
Definition: winuser.h:2470
long right
Definition: polytest.cpp:53
#define WVR_ALIGNTOP
Definition: winuser.h:2469
long top
Definition: polytest.cpp:53
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
GLint GLint bottom
Definition: glext.h:7726
long left
Definition: polytest.cpp:53
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:2476
GLbitfield flags
Definition: glext.h:7161
#define WVR_REDRAW
Definition: winuser.h:2475
#define min(a, b)
Definition: monoChain.cc:55
_Out_opt_ int * cx
Definition: commctrl.h:570
#define WVR_ALIGNBOTTOM
Definition: winuser.h:2471
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 2836 of file winpos.c.

2837 {
2838  POINTL Pt;
2839  HWND *List, *phWnd;
2840  PWND pwndHit = NULL;
2841 
2842  Pt.x = x;
2843  Pt.y = y;
2844 
2846  {
2847  if (Parent->ExStyle & WS_EX_LAYOUTRTL)
2848  Pt.x = Parent->rcClient.right - Pt.x;
2849  else
2850  Pt.x += Parent->rcClient.left;
2851  Pt.y += Parent->rcClient.top;
2852  }
2853 
2854  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2855 
2856  if ((List = IntWinListChildren(Parent)))
2857  {
2858  for (phWnd = List; *phWnd; phWnd++)
2859  {
2860  PWND Child;
2861  if ((Child = ValidateHwndNoErr(*phWnd)))
2862  {
2863  if (uiFlags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED))
2864  {
2865  if (!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) continue;
2866  if ((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) continue;
2867  }
2868 
2869  if (uiFlags & CWP_SKIPTRANSPARENT)
2870  {
2871  if (Child->ExStyle & WS_EX_TRANSPARENT) continue;
2872  }
2873 
2874  if (IntPtInWindow(Child, Pt.x, Pt.y))
2875  {
2876  pwndHit = Child;
2877  break;
2878  }
2879  }
2880  }
2882  }
2883  return pwndHit ? pwndHit : Parent;
2884 }
#define WS_DISABLED
Definition: pedump.c:621
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#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
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
LONG y
Definition: windef.h:315
#define CWP_SKIPINVISIBLE
Definition: winuser.h:208
#define CWP_SKIPDISABLED
Definition: winuser.h:209
smooth NULL
Definition: ftsmooth.c:416
LIST_ENTRY List
Definition: psmgr.c:57
LONG x
Definition: windef.h:314
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:716
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620

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:668
#define TRUE
Definition: types.h:120
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG top
Definition: windef.h:292
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
DWORD fnid
Definition: ntuser.h:673
#define FNID_DESKTOP
Definition: ntuser.h:824

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 2888 of file winpos.c.

2896 {
2897  PSMWP pDWP;
2898  int i;
2899  HDWP retvalue = hdwp;
2900 
2901  TRACE("hdwp %p, hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
2902  hdwp, hwnd, hwndAfter, x, y, cx, cy, flags);
2903 
2904  if (flags & ~(SWP_NOSIZE | SWP_NOMOVE |
2909  {
2911  return NULL;
2912  }
2913 
2914  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
2915  {
2917  return NULL;
2918  }
2919 
2920  for (i = 0; i < pDWP->ccvr; i++)
2921  {
2922  if (pDWP->acvr[i].pos.hwnd == hwnd)
2923  {
2924  /* Merge with the other changes */
2925  if (!(flags & SWP_NOZORDER))
2926  {
2927  pDWP->acvr[i].pos.hwndInsertAfter = hwndAfter;
2928  }
2929  if (!(flags & SWP_NOMOVE))
2930  {
2931  pDWP->acvr[i].pos.x = x;
2932  pDWP->acvr[i].pos.y = y;
2933  }
2934  if (!(flags & SWP_NOSIZE))
2935  {
2936  pDWP->acvr[i].pos.cx = cx;
2937  pDWP->acvr[i].pos.cy = cy;
2938  }
2939  pDWP->acvr[i].pos.flags &= flags | ~(SWP_NOSIZE | SWP_NOMOVE |
2943  pDWP->acvr[i].pos.flags |= flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW |
2945  goto END;
2946  }
2947  }
2948  if (pDWP->ccvr >= pDWP->ccvrAlloc)
2949  {
2950  PCVR newpos = ExAllocatePoolWithTag(PagedPool, pDWP->ccvrAlloc * 2 * sizeof(CVR), USERTAG_SWP);
2951  if (!newpos)
2952  {
2953  retvalue = NULL;
2954  goto END;
2955  }
2956  RtlZeroMemory(newpos, pDWP->ccvrAlloc * 2 * sizeof(CVR));
2957  RtlCopyMemory(newpos, pDWP->acvr, pDWP->ccvrAlloc * sizeof(CVR));
2959  pDWP->ccvrAlloc *= 2;
2960  pDWP->acvr = newpos;
2961  }
2962  pDWP->acvr[pDWP->ccvr].pos.hwnd = hwnd;
2963  pDWP->acvr[pDWP->ccvr].pos.hwndInsertAfter = hwndAfter;
2964  pDWP->acvr[pDWP->ccvr].pos.x = x;
2965  pDWP->acvr[pDWP->ccvr].pos.y = y;
2966  pDWP->acvr[pDWP->ccvr].pos.cx = cx;
2967  pDWP->acvr[pDWP->ccvr].pos.cy = cy;
2968  pDWP->acvr[pDWP->ccvr].pos.flags = flags;
2969  pDWP->acvr[pDWP->ccvr].hrgnClip = NULL;
2970  pDWP->acvr[pDWP->ccvr].hrgnInterMonitor = NULL;
2971  pDWP->ccvr++;
2972 END:
2973  return retvalue;
2974 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
HRGN hrgnClip
Definition: winpos.h:16
HWND hwndInsertAfter
Definition: winuser.h:3531
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1232
WINDOWPOS pos
Definition: winpos.h:5
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
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
INT ccvr
Definition: winpos.h:25
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
smooth NULL
Definition: ftsmooth.c:416
UINT flags
Definition: winuser.h:3536
Definition: infcodes.c:25
#define TRACE(s)
Definition: solgame.cpp:4
HRGN hrgnInterMonitor
Definition: winpos.h:17
#define SWP_NOACTIVATE
Definition: winuser.h:1227
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:1225
#define SWP_NOSIZE
Definition: winuser.h:1230
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:462
INT ccvrAlloc
Definition: winpos.h:26
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:280
_Out_opt_ int * cx
Definition: commctrl.h:570
PCVR acvr
Definition: winpos.h:27
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
HWND hwnd
Definition: winuser.h:3530
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define SWP_NOOWNERZORDER
Definition: winuser.h:1234

Referenced by NtUserDeferWindowPos().

◆ IntEndDeferWindowPosEx()

BOOL FASTCALL IntEndDeferWindowPosEx ( HDWP  hdwp,
BOOL  sAsync 
)

Definition at line 2976 of file winpos.c.

2977 {
2978  PSMWP pDWP;
2979  PCVR winpos;
2980  BOOL res = TRUE;
2981  int i;
2982 
2983  TRACE("%p\n", hdwp);
2984 
2985  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
2986  {
2988  return FALSE;
2989  }
2990 
2991  for (i = 0, winpos = pDWP->acvr; res && i < pDWP->ccvr; i++, winpos++)
2992  {
2993  PWND pwnd;
2995 
2996  TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
2997  winpos->pos.hwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y,
2998  winpos->pos.cx, winpos->pos.cy, winpos->pos.flags);
2999 
3000  pwnd = ValidateHwndNoErr(winpos->pos.hwnd);
3001  if (!pwnd)
3002  continue;
3003 
3004  UserRefObjectCo(pwnd, &Ref);
3005 
3006  if ( sAsync )
3007  {
3008  LRESULT lRes;
3010  if ( ppos )
3011  {
3012  *ppos = winpos->pos;
3013  /* Yes it's a pointer inside Win32k! */
3014  lRes = co_IntSendMessageNoWait( winpos->pos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
3015  /* We handle this the same way as Event Hooks and Hooks. */
3016  if ( !lRes )
3017  {
3019  }
3020  }
3021  }
3022  else
3023  res = co_WinPosSetWindowPos( pwnd,
3024  winpos->pos.hwndInsertAfter,
3025  winpos->pos.x,
3026  winpos->pos.y,
3027  winpos->pos.cx,
3028  winpos->pos.cy,
3029  winpos->pos.flags);
3030 
3031  // Hack to pass tests.... Must have some work to do so clear the error.
3032  if (res && (winpos->pos.flags & (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER)) == SWP_NOZORDER )
3034 
3035  UserDerefObjectCo(pwnd);
3036  }
3038  UserDereferenceObject(pDWP);
3040  return res;
3041 }
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:683
#define TRUE
Definition: types.h:120
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define ERROR_SUCCESS
Definition: deptool.c:10
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
HWND hwndInsertAfter
Definition: winuser.h:3531
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
#define SWP_NOZORDER
Definition: winuser.h:1232
WINDOWPOS pos
Definition: winpos.h:5
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
unsigned int BOOL
Definition: ntddk_ex.h:94
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
Definition: object.h:3
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3536
#define TRACE(s)
Definition: solgame.cpp:4
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:1230
Definition: ntuser.h:657
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:462
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
#define USERTAG_SWP
Definition: tags.h:280
GLuint res
Definition: glext.h:9613
PCVR acvr
Definition: winpos.h:27
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
HWND hwnd
Definition: winuser.h:3530
LONG_PTR LRESULT
Definition: windef.h:209
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

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:29
smooth NULL
Definition: ftsmooth.c:416
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1349

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:220
#define SM_CXMINIMIZED
Definition: winuser.h:1010
LONG top
Definition: windef.h:292
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_MINIMIZED
Definition: undocuser.h:18
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define SM_CYMINIMIZED
Definition: winuser.h:1011
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
LONG bottom
Definition: windef.h:294
DWORD style
Definition: ntuser.h:670

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:668
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
struct _DESKTOP * rpdesk
Definition: win32.h:91
smooth NULL
Definition: ftsmooth.c:416
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
struct _WND * spwndNext
Definition: ntuser.h:675
#define WS_EX_TOPMOST
Definition: pedump.c:647
struct _WND * spwnd
Definition: ntuser.h:136
Definition: ntuser.h:657

Referenced by ActivateOtherWindowMin().

◆ IntGetWindowBorderMeasures()

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

Definition at line 858 of file winpos.c.

859 {
860  if(HAS_DLGFRAME(Wnd->style, Wnd->ExStyle) && !(Wnd->style & WS_MINIMIZE))
861  {
864  }
865  else
866  {
867  if(HAS_THICKFRAME(Wnd->style, Wnd->ExStyle)&& !(Wnd->style & WS_MINIMIZE))
868  {
871  }
872  else if(HAS_THINFRAME(Wnd->style, Wnd->ExStyle))
873  {
876  }
877  else
878  {
879  *cx = *cy = 0;
880  }
881  }
882 }
DWORD ExStyle
Definition: ntuser.h:668
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
#define WS_MINIMIZE
Definition: pedump.c:622
#define SM_CYDLGFRAME
Definition: winuser.h:958
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
#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:180
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CXBORDER
Definition: winuser.h:954
_Out_opt_ int * cx
Definition: commctrl.h:570
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:8
DWORD style
Definition: ntuser.h:670

◆ IntGetWindowPlacement()

BOOL FASTCALL IntGetWindowPlacement ( PWND  Wnd,
WINDOWPLACEMENT lpwndpl 
)

Definition at line 556 of file winpos.c.

557 {
558  if (!Wnd) return FALSE;
559 
560  if(lpwndpl->length != sizeof(WINDOWPLACEMENT))
561  {
562  return FALSE;
563  }
564 
565  lpwndpl->flags = 0;
566 
567  WinPosInitInternalPos(Wnd, &Wnd->rcWindow);
568 
569  lpwndpl->showCmd = SW_HIDE;
570 
571  if ( Wnd->style & WS_MINIMIZE )
572  lpwndpl->showCmd = SW_SHOWMINIMIZED;
573  else
574  lpwndpl->showCmd = ( Wnd->style & WS_MAXIMIZE ) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ;
575 
576  lpwndpl->rcNormalPosition = Wnd->InternalPos.NormalRect;
577 
578  if (Wnd->InternalPos.flags & WPF_MININIT) // Return if it was set!
579  {
580  lpwndpl->ptMinPosition.x = Wnd->InternalPos.IconPos.x;
581  lpwndpl->ptMinPosition.y = Wnd->InternalPos.IconPos.y;
582  }
583  else
584  lpwndpl->ptMinPosition.x = lpwndpl->ptMinPosition.y = -1;
585 
586  if ( Wnd->InternalPos.flags & WPF_MAXINIT && // Return if set and not maximized to monitor!
587  !(Wnd->state & WNDS_MAXIMIZESTOMONITOR))
588  {
589  lpwndpl->ptMaxPosition.x = Wnd->InternalPos.MaxPos.x;
590  lpwndpl->ptMaxPosition.y = Wnd->InternalPos.MaxPos.y;
591  }
592  else
593  lpwndpl->ptMaxPosition.x = lpwndpl->ptMaxPosition.y = -1;
594 
595  if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd &&
596  !(Wnd->ExStyle & WS_EX_TOOLWINDOW))
597  {
598  PMONITOR pmonitor = UserMonitorFromRect(&lpwndpl->rcNormalPosition, MONITOR_DEFAULTTOPRIMARY );
599 
600  // FIXME: support DPI aware, rcWorkDPI/Real etc..
601  if (Wnd->InternalPos.flags & WPF_MININIT)
602  {
603  lpwndpl->ptMinPosition.x -= (pmonitor->rcWork.left - pmonitor->rcMonitor.left);
604  lpwndpl->ptMinPosition.y -= (pmonitor->rcWork.top - pmonitor->rcMonitor.top);
605  }
607  pmonitor->rcMonitor.left - pmonitor->rcWork.left,
608  pmonitor->rcMonitor.top - pmonitor->rcWork.top);
609  }
610 
611  if ( Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED || Wnd->style & WS_MAXIMIZE )
612  lpwndpl->flags |= WPF_RESTORETOMAXIMIZED;
613 
614  if ( ((Wnd->style & (WS_CHILD|WS_POPUP)) == WS_CHILD) && Wnd->InternalPos.flags & WPF_SETMINPOSITION)
615  lpwndpl->flags |= WPF_SETMINPOSITION;
616 
617  return TRUE;
618 }
struct _WND::@4105 InternalPos
DWORD ExStyle
Definition: ntuser.h:668
#define TRUE
Definition: types.h:120
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
VOID FASTCALL WinPosInitInternalPos(PWND Wnd, RECTL *RestoreRect)
Definition: winpos.c:478
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
LONG top
Definition: windef.h:292
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2486
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:291
#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 WS_MINIMIZE
Definition: pedump.c:622
THRDESKHEAD head
Definition: ntuser.h:659
#define WPF_SETMINPOSITION
Definition: winuser.h:2487
#define WPF_MAXINIT
Definition: ntuser.h:655
#define WPF_MININIT
Definition: ntuser.h:654
RECT rcWindow
Definition: ntuser.h:680
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
POINT ptMinPosition
Definition: winuser.h:3235
#define SW_SHOWNORMAL
Definition: winuser.h:764
POINT ptMaxPosition
Definition: winuser.h:3236
DWORD state
Definition: ntuser.h:665
#define WS_POPUP
Definition: pedump.c:616
RECT rcNormalPosition
Definition: winuser.h:3237
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:603
struct _WND * spwndParent
Definition: ntuser.h:677
RECT rcMonitor
Definition: monitor.h:18
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

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 TRUE
Definition: types.h:120
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
LONG right
Definition: windef.h:293
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
RECT rcWindow
Definition: ntuser.h:680
LONG bottom
Definition: windef.h:294

Referenced by DefWndScreenshot(), IntGetNCUpdateRgn(), 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:668
#define TRUE
Definition: types.h:120
long y
Definition: polytest.cpp:48
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
long x
Definition: polytest.cpp:48
LONG top
Definition: windef.h:292
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
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
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MAKELONG(a, b)
Definition: typedefs.h:248
static ULONG Delta
Definition: xboxvideo.c:28
#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 2794 of file winpos.c.

2795 {
2796  POINTL Pt;
2797  HWND *List, *phWnd;
2798  PWND pwndHit = NULL;
2799 
2800  Pt.x = x;
2801  Pt.y = y;
2802 
2804  {
2805  Pt.x += Parent->rcClient.left;
2806  Pt.y += Parent->rcClient.top;
2807  }
2808 
2809  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2810 
2811  if ((List = IntWinListChildren(Parent)))
2812  {
2813  for (phWnd = List; *phWnd; phWnd++)
2814  {
2815  PWND Child;
2816  if ((Child = ValidateHwndNoErr(*phWnd)))
2817  {
2818  if ( Child->style & WS_VISIBLE && IntPtInWindow(Child, Pt.x, Pt.y) )
2819  {
2820  if ( Child->pcls->atomClassName != gpsi->atomSysClass[ICLS_BUTTON] ||
2821  (Child->style & BS_TYPEMASK) != BS_GROUPBOX )
2822  {
2824  return Child;
2825  }
2826  pwndHit = Child;
2827  }
2828  }
2829  }
2831  }
2832  return pwndHit ? pwndHit : Parent;
2833 }
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:716
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
PSERVERINFO gpsi
Definition: main.c:27
#define BS_GROUPBOX
Definition: pedump.c:658
LONG y
Definition: windef.h:315
smooth NULL
Definition: ftsmooth.c:416
LIST_ENTRY List
Definition: psmgr.c:57
LONG x
Definition: windef.h:314
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
#define BS_TYPEMASK
Definition: winuser.h:270
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:716
#define ICLS_BUTTON
Definition: ntuser.h:873
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1013

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:668
#define TRUE
Definition: types.h:120
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG top
Definition: windef.h:292
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
DWORD fnid
Definition: ntuser.h:673
#define FNID_DESKTOP
Definition: ntuser.h:824

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

◆ IntSetWindowPlacement()

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

Definition at line 662 of file winpos.c.

663 {
664  BOOL sAsync;
665  UINT SWP_Flags;
666 
670 
671  if (!Wnd || Wnd == Wnd->head.rpdesk->pDeskInfo->spwnd) return FALSE;
672 
673  if ( Flags & PLACE_MIN ) Wnd->InternalPos.IconPos = wpl->ptMinPosition;
674  if ( Flags & PLACE_MAX ) Wnd->InternalPos.MaxPos = wpl->ptMaxPosition;
675  if ( Flags & PLACE_RECT) Wnd->InternalPos.NormalRect = wpl->rcNormalPosition;
676 
677  SWP_Flags = SWP_NOZORDER | SWP_NOACTIVATE | ((wpl->flags & WPF_ASYNCWINDOWPLACEMENT) ? SWP_ASYNCWINDOWPOS : 0);
678 
679  if (Wnd->style & WS_MINIMIZE )
680  {
681  if (Flags & PLACE_MIN || Wnd->InternalPos.flags & WPF_SETMINPOSITION)
682  {
684  wpl->ptMinPosition.x, wpl->ptMinPosition.y, 0, 0,
685  SWP_NOSIZE | SWP_Flags);
686  Wnd->InternalPos.flags |= WPF_MININIT;
687  }
688  }
689  else if (Wnd->style & WS_MAXIMIZE )
690  {
691  if (Flags & PLACE_MAX)
692  {
694  wpl->ptMaxPosition.x, wpl->ptMaxPosition.y, 0, 0,
695  SWP_NOSIZE | SWP_Flags);
696  Wnd->InternalPos.flags |= WPF_MAXINIT;
697  }
698  }
699  else if (Flags & PLACE_RECT)
700  {
705  SWP_Flags);
706  }
707 
708  sAsync = (Wnd->head.pti->MessageQueue != gptiCurrent->MessageQueue && wpl->flags & WPF_ASYNCWINDOWPLACEMENT);
709 
710  if ( sAsync )
712  else
713  co_WinPosShowWindow(Wnd, wpl->showCmd);
714 
715  if ( Wnd->style & WS_MINIMIZE && !sAsync )
716  {
717  if ( wpl->flags & WPF_SETMINPOSITION )
718  Wnd->InternalPos.flags |= WPF_SETMINPOSITION;
719 
720  if ( wpl->flags & WPF_RESTORETOMAXIMIZED )
721  Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
722  }
723  return TRUE;
724 }
struct _WND::@4105 InternalPos
#define TRUE
Definition: types.h:120
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
long y
Definition: polytest.cpp:48
static void make_rect_onscreen(RECT *rect)
Definition: winpos.c:621
long x
Definition: polytest.cpp:48
static void make_point_onscreen(POINT *pt)
Definition: winpos.c:651
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1651
LONG top
Definition: windef.h:292
#define HWND_TOP
Definition: winuser.h:1193
#define PLACE_MIN
Definition: winpos.c:29
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2486
LONG left
Definition: windef.h:291
#define SWP_NOZORDER
Definition: winuser.h:1232
LONG right
Definition: windef.h:293
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define WS_MINIMIZE
Definition: pedump.c:622
unsigned int BOOL
Definition: ntddk_ex.h:94
THRDESKHEAD head
Definition: ntuser.h:659
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1238
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2393
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define WPF_SETMINPOSITION
Definition: winuser.h:2487
#define WPF_MAXINIT
Definition: ntuser.h:655
#define WPF_MININIT
Definition: ntuser.h:654
#define PLACE_MAX
Definition: winpos.c:30
#define SWP_NOSIZE
Definition: winuser.h:1230
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define PLACE_RECT
Definition: winpos.c:31
POINT ptMinPosition
Definition: winuser.h:3235
POINT ptMaxPosition
Definition: winuser.h:3236
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1557
unsigned int UINT
Definition: ndis.h:50
RECT rcNormalPosition
Definition: winuser.h:3237
LONG bottom
Definition: windef.h:294
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

Referenced by NtUserSetInternalWindowPos(), and NtUserSetWindowPlacement().

◆ IntValidateParent()

static BOOL IntValidateParent ( PWND  Child,
PREGION  ValidateRgn 
)
static

Definition at line 1039 of file winpos.c.

1040 {
1041  PWND ParentWnd = Child;
1042 
1043  if (ParentWnd->style & WS_CHILD)
1044  {
1045  do
1046  ParentWnd = ParentWnd->spwndParent;
1047  while (ParentWnd->style & WS_CHILD);
1048  }
1049 
1050  ParentWnd = Child->spwndParent;
1051  while (ParentWnd)
1052  {
1053  if (ParentWnd->style & WS_CLIPCHILDREN)
1054  break;
1055 
1056  if (ParentWnd->hrgnUpdate != 0)
1057  {
1058  IntInvalidateWindows( ParentWnd,
1059  ValidateRgn,
1061  }
1062 
1063  ParentWnd = ParentWnd->spwndParent;
1064  }
1065 
1066  return TRUE;
1067 }
#define RDW_NOCHILDREN
Definition: winuser.h:1208
BOOL WINAPI ValidateRgn(_In_ HWND, _In_opt_ HRGN)
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
#define WS_CLIPCHILDREN
Definition: pedump.c:619
HRGN hrgnUpdate
Definition: ntuser.h:685
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:630
#define RDW_VALIDATE
Definition: winuser.h:1204
Definition: ntuser.h:657
struct _WND * spwndParent
Definition: ntuser.h:677
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:716
DWORD style
Definition: ntuser.h:670

Referenced by co_WinPosSetWindowPos().

◆ IsChildVisible()

BOOL FASTCALL IsChildVisible ( PWND  pWnd)

Definition at line 225 of file winpos.c.

226 {
227  do
228  {
229  if ( (pWnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD ||
230  !(pWnd = pWnd->spwndParent) )
231  return TRUE;
232  }
233  while (pWnd->style & WS_VISIBLE);
234  return FALSE;
235 }
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
#define WS_POPUP
Definition: pedump.c:616
struct _WND * spwndParent
Definition: ntuser.h:677
#define WS_VISIBLE
Definition: pedump.c:620
DWORD style
Definition: ntuser.h:670

Referenced by co_WinPosShowWindow().

◆ make_point_onscreen()

static void make_point_onscreen ( POINT pt)
static

Definition at line 651 of file winpos.c.

652 {
653  RECT rect;
654 
655  RECTL_vSetRect( &rect, pt->x, pt->y, pt->x + 1, pt->y + 1 );
657  pt->x = rect.left;
658  pt->y = rect.top;
659 }
static void make_rect_onscreen(RECT *rect)
Definition: winpos.c:621
#define pt(x, y)
Definition: drawing.c:79
& rect
Definition: startmenu.cpp:1413
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5

Referenced by IntSetWindowPlacement().

◆ make_rect_onscreen()

static void make_rect_onscreen ( RECT rect)
static

Definition at line 621 of file winpos.c.

622 {
623  PMONITOR pmonitor = UserMonitorFromRect( rect, MONITOR_DEFAULTTONEAREST ); // Wine uses this.
624 
625  // FIXME: support DPI aware, rcWorkDPI/Real etc..
626  if (!pmonitor) return;
627  /* FIXME: map coordinates from rcWork to rcMonitor */
628  if (rect->right <= pmonitor->rcWork.left)
629  {
630  rect->right += pmonitor->rcWork.left - rect->left;
631  rect->left = pmonitor->rcWork.left;
632  }
633  else if (rect->left >= pmonitor->rcWork.right)
634  {
635  rect->left += pmonitor->rcWork.right - rect->right;
636  rect->right = pmonitor->rcWork.right;
637  }
638  if (rect->bottom <= pmonitor->rcWork.top)
639  {
640  rect->bottom += pmonitor->rcWork.top - rect->top;
641  rect->top = pmonitor->rcWork.top;
642  }
643  else if (rect->top >= pmonitor->rcWork.bottom)
644  {
645  rect->top += pmonitor->rcWork.bottom - rect->bottom;
646  rect->bottom = pmonitor->rcWork.bottom;
647  }
648 }
LONG top
Definition: windef.h:292
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
& rect
Definition: startmenu.cpp:1413
RECT rcWork
Definition: monitor.h:19
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
Definition: monitor.c:405
LONG bottom
Definition: windef.h:294

Referenced by IntSetWindowPlacement(), and make_point_onscreen().

◆ NtUserChildWindowFromPointEx()

HWND APIENTRY NtUserChildWindowFromPointEx ( HWND  hwndParent,
LONG  x,
LONG  y,
UINT  uiFlags 
)

Definition at line 3047 of file winpos.c.

3051 {
3052  PWND pwndParent;
3053  TRACE("Enter NtUserChildWindowFromPointEx\n");
3054