ReactOS  0.4.15-dev-3207-ga415bd4
scroll.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  tagSBTRACK
 

Macros

#define IntGetScrollbarInfoFromWindow(Window, i)   ((PSCROLLBARINFO)(&((Window)->pSBInfoex + i)->ScrollBarInfo))
 
#define IntGetScrollInfoFromWindow(Window, i)   ((LPSCROLLINFO)(&((Window)->pSBInfoex + i)->ScrollInfo))
 
#define SBOBJ_TO_SBID(Obj)   ((Obj) - OBJID_HSCROLL)
 
#define SBID_IS_VALID(id)   (id == SB_HORZ || id == SB_VERT || id == SB_CTL)
 

Typedefs

typedef struct tagSBTRACK SBTRACK
 
typedef struct tagSBTRACKPSBTRACK
 

Functions

typedef VOID (NEAR NTAPI *PFN_SCROLLBAR)(PWND
 
BOOL FASTCALL co_IntCreateScrollBars (PWND)
 
BOOL FASTCALL IntDestroyScrollBars (PWND)
 
DWORD FASTCALL co_UserShowScrollBar (PWND, int, BOOL, BOOL)
 
BOOL FASTCALL co_IntGetScrollBarInfo (PWND, LONG, PSCROLLBARINFO)
 
BOOL FASTCALL co_IntSetScrollBarInfo (PWND, LONG, PSETSCROLLBARINFO)
 
void IntDrawScrollBar (PWND, HDC, INT)
 
BOOL FASTCALL IntScrollWindow (PWND, int, int, CONST RECT *, CONST RECT *)
 
DWORD FASTCALL IntScrollWindowEx (PWND, INT, INT, const RECT *, const RECT *, HRGN, LPRECT, UINT)
 

Variables

typedef UINT
 
typedef WPARAM
 
typedef LPARAM
 
typedef PSBCALC
 

Macro Definition Documentation

◆ IntGetScrollbarInfoFromWindow

#define IntGetScrollbarInfoFromWindow (   Window,
  i 
)    ((PSCROLLBARINFO)(&((Window)->pSBInfoex + i)->ScrollBarInfo))

Definition at line 33 of file scroll.h.

◆ IntGetScrollInfoFromWindow

#define IntGetScrollInfoFromWindow (   Window,
  i 
)    ((LPSCROLLINFO)(&((Window)->pSBInfoex + i)->ScrollInfo))

Definition at line 36 of file scroll.h.

◆ SBID_IS_VALID

#define SBID_IS_VALID (   id)    (id == SB_HORZ || id == SB_VERT || id == SB_CTL)

Definition at line 40 of file scroll.h.

◆ SBOBJ_TO_SBID

#define SBOBJ_TO_SBID (   Obj)    ((Obj) - OBJID_HSCROLL)

Definition at line 39 of file scroll.h.

Typedef Documentation

◆ PSBTRACK

◆ SBTRACK

Function Documentation

◆ co_IntCreateScrollBars()

BOOL FASTCALL co_IntCreateScrollBars ( PWND  )

Definition at line 819 of file scrollbar.c.

820 {
821  PSCROLLBARINFO psbi;
822  PSBDATA pSBData;
823  ULONG Size, s;
824  INT i;
825 
827 
828  if (Window->pSBInfo && Window->pSBInfoex)
829  {
830  /* No need to create it anymore */
831  return TRUE;
832  }
833 
834  /* Allocate memory for all scrollbars (HORZ, VERT, CONTROL) */
835  Size = 3 * (sizeof(SBINFOEX));
837  {
838  ERR("Unable to allocate memory for scrollbar information for window %p\n", Window->head.h);
839  return FALSE;
840  }
841 
842  RtlZeroMemory(Window->pSBInfoex, Size);
843 
844  if(!(Window->pSBInfo = DesktopHeapAlloc( Window->head.rpdesk, sizeof(SBINFO))))
845  {
846  ERR("Unable to allocate memory for scrollbar information for window %p\n", Window->head.h);
847  return FALSE;
848  }
849 
850  RtlZeroMemory(Window->pSBInfo, sizeof(SBINFO));
851  Window->pSBInfo->Vert.posMax = 100;
852  Window->pSBInfo->Horz.posMax = 100;
853 
855  &Window->rcWindow,
856  &Window->rcClient);
857 
858  for(s = SB_HORZ; s <= SB_VERT; s++)
859  {
861  psbi->cbSize = sizeof(SCROLLBARINFO);
862  for (i = 0; i < CCHILDREN_SCROLLBAR + 1; i++)
863  psbi->rgstate[i] = 0;
864 
865  pSBData = IntGetSBData(Window, s);
866 
868  IntCalculateThumb(Window, s, psbi, pSBData);
869  }
870 
871  return TRUE;
872 }
BOOL FASTCALL IntGetScrollBarRect(PWND Wnd, INT nBar, RECTL *lprect)
Definition: scrollbar.c:110
PSBDATA FASTCALL IntGetSBData(PWND pwnd, INT Bar)
Definition: scrollbar.c:83
#define SB_VERT
Definition: winuser.h:553
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SB_HORZ
Definition: winuser.h:552
#define CCHILDREN_SCROLLBAR
Definition: winuser.h:3721
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
int32_t INT
Definition: typedefs.h:58
#define TAG_SBARINFO
Definition: tags.h:9
#define IntGetScrollbarInfoFromWindow(Window, i)
Definition: scroll.h:33
Definition: window.c:28
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:230
#define FALSE
Definition: types.h:117
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3730
BOOL FASTCALL IntCalculateThumb(PWND Wnd, LONG idObject, PSCROLLBARINFO psbi, PSBDATA pSBData)
Definition: scrollbar.c:172
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
GLdouble s
Definition: gl.h:2039
#define ERR(fmt,...)
Definition: debug.h:110
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
struct tagSCROLLBARINFO SCROLLBARINFO
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
struct _SBINFOEX SBINFOEX
LRESULT FASTCALL co_WinPosGetNonClientSize(PWND Window, RECT *WindowRect, RECT *ClientRect)
Definition: winpos.c:2289

Referenced by co_IntGetScrollBarInfo(), co_IntSetScrollBarInfo(), co_IntSetScrollInfo(), NtUserEnableScrollBar(), and NtUserSetScrollBarInfo().

◆ co_IntGetScrollBarInfo()

BOOL FASTCALL co_IntGetScrollBarInfo ( PWND  ,
LONG  ,
PSCROLLBARINFO   
)

Definition at line 737 of file scrollbar.c.

738 {
739  INT Bar;
740  PSCROLLBARINFO sbi;
741  PSBDATA pSBData;
743 
744  Bar = SBOBJ_TO_SBID(idObject);
745 
746  if(!SBID_IS_VALID(Bar))
747  {
749  ERR("Trying to get scrollinfo for unknown scrollbar type %d\n", Bar);
750  return FALSE;
751  }
752 
754  {
755  ERR("Failed to create scrollbars for window.\n");
756  return FALSE;
757  }
758 
760  pSBData = IntGetSBData(Window, Bar);
761 
763  IntCalculateThumb(Window, Bar, sbi, pSBData);
764 
765  /* Scroll bar state */
766  psbi->rgstate[0] = 0;
767  if ((Bar == SB_HORZ && !(Window->style & WS_HSCROLL))
768  || (Bar == SB_VERT && !(Window->style & WS_VSCROLL)))
769  psbi->rgstate[0] |= STATE_SYSTEM_INVISIBLE;
770  if (pSBData->posMin >= pSBData->posMax - max(pSBData->page - 1, 0))
771  {
772  if (!(psbi->rgstate[0] & STATE_SYSTEM_INVISIBLE))
773  psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE;
774  else
775  psbi->rgstate[0] |= STATE_SYSTEM_OFFSCREEN;
776  }
777  if (Bar == SB_CTL && !(Window->style & WS_DISABLED))
778  psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE;
779 
780  RtlCopyMemory(psbi, sbi, sizeof(SCROLLBARINFO));
781 
782  return TRUE;
783 }
BOOL FASTCALL IntGetScrollBarRect(PWND Wnd, INT nBar, RECTL *lprect)
Definition: scrollbar.c:110
PSBDATA FASTCALL IntGetSBData(PWND pwnd, INT Bar)
Definition: scrollbar.c:83
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define WS_DISABLED
Definition: pedump.c:621
#define max(a, b)
Definition: svc.c:63
#define STATE_SYSTEM_UNAVAILABLE
Definition: winuser.h:2838
#define STATE_SYSTEM_OFFSCREEN
Definition: winuser.h:2854
#define SB_CTL
Definition: winuser.h:554
#define SB_VERT
Definition: winuser.h:553
#define TRUE
Definition: types.h:120
INT page
Definition: ntuser.h:481
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SB_HORZ
Definition: winuser.h:552
#define SBOBJ_TO_SBID(Obj)
Definition: scroll.h:39
int32_t INT
Definition: typedefs.h:58
#define IntGetScrollbarInfoFromWindow(Window, i)
Definition: scroll.h:33
Definition: window.c:28
#define FALSE
Definition: types.h:117
void Bar(void)
Definition: terminate.cpp:70
BOOL FASTCALL co_IntCreateScrollBars(PWND Window)
Definition: scrollbar.c:819
BOOL FASTCALL IntCalculateThumb(PWND Wnd, LONG idObject, PSCROLLBARINFO psbi, PSBDATA pSBData)
Definition: scrollbar.c:172
#define WS_HSCROLL
Definition: pedump.c:628
INT posMin
Definition: ntuser.h:479
#define ERR(fmt,...)
Definition: debug.h:110
#define WS_VSCROLL
Definition: pedump.c:627
#define SBID_IS_VALID(id)
Definition: scroll.h:40
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2853
INT posMax
Definition: ntuser.h:480

Referenced by IntDrawScrollBar(), IntIsScrollBarVisible(), IntRefeshScrollInterior(), and NtUserGetScrollBarInfo().

◆ co_IntSetScrollBarInfo()

BOOL FASTCALL co_IntSetScrollBarInfo ( PWND  ,
LONG  ,
PSETSCROLLBARINFO   
)

Definition at line 786 of file scrollbar.c.

787 {
788  INT Bar;
789  PSCROLLBARINFO sbi;
790  LPSCROLLINFO psi;
792 
793  Bar = SBOBJ_TO_SBID(idObject);
794 
795  if(!SBID_IS_VALID(Bar))
796  {
798  ERR("Trying to get scrollinfo for unknown scrollbar type %d\n", Bar);
799  return FALSE;
800  }
801 
803  {
804  ERR("Failed to create scrollbars for window.\n");
805  return FALSE;
806  }
807 
810 
811  psi->nTrackPos = psbi->nTrackPos;
812  sbi->reserved = psbi->reserved;
813  RtlCopyMemory(&sbi->rgstate, &psbi->rgstate, sizeof(psbi->rgstate));
814 
815  return TRUE;
816 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SBOBJ_TO_SBID(Obj)
Definition: scroll.h:39
int32_t INT
Definition: typedefs.h:58
#define IntGetScrollbarInfoFromWindow(Window, i)
Definition: scroll.h:33
Definition: window.c:28
#define FALSE
Definition: types.h:117
void Bar(void)
Definition: terminate.cpp:70
BOOL FASTCALL co_IntCreateScrollBars(PWND Window)
Definition: scrollbar.c:819
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3730
#define ERR(fmt,...)
Definition: debug.h:110
#define IntGetScrollInfoFromWindow(Window, i)
Definition: scroll.h:36
#define SBID_IS_VALID(id)
Definition: scroll.h:40
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

◆ co_UserShowScrollBar()

DWORD FASTCALL co_UserShowScrollBar ( PWND  ,
int  ,
BOOL  ,
BOOL   
)

Definition at line 928 of file scrollbar.c.

929 {
930  ULONG old_style, set_bits = 0, clear_bits = 0;
931 
932  ASSERT_REFS_CO(Wnd);
933 
934  switch(nBar)
935  {
936  case SB_CTL:
937  {
938  //IntUpdateSBInfo(Wnd, SB_CTL); // Is this needed? Was tested w/o!
939 
940  co_WinPosShowWindow(Wnd, fShowH ? SW_SHOW : SW_HIDE);
941  return TRUE;
942  }
943  case SB_BOTH:
944  case SB_HORZ:
945  if (fShowH) set_bits |= WS_HSCROLL;
946  else clear_bits |= WS_HSCROLL;
947  if( nBar == SB_HORZ ) break;
948  /* Fall through */
949  case SB_VERT:
950  if (fShowV) set_bits |= WS_VSCROLL;
951  else clear_bits |= WS_VSCROLL;
952  break;
953  default:
955  return FALSE; /* Nothing to do! */
956  }
957 
958  old_style = IntSetStyle( Wnd, set_bits, clear_bits );
959  if ((old_style & clear_bits) != 0 || (old_style & set_bits) != set_bits)
960  {
962  //if (Wnd->style & WS_HSCROLL) IntUpdateSBInfo(Wnd, SB_HORZ);
963  //if (Wnd->style & WS_VSCROLL) IntUpdateSBInfo(Wnd, SB_VERT);
965  /* Frame has been changed, let the window redraw itself */
966  co_WinPosSetWindowPos( Wnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
968  return TRUE;
969  }
970  return FALSE; /* no frame changes */
971 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SB_CTL
Definition: winuser.h:554
#define SB_VERT
Definition: winuser.h:553
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SB_HORZ
Definition: winuser.h:552
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1720
#define SWP_NOZORDER
Definition: winuser.h:1233
#define FALSE
Definition: types.h:117
#define SW_SHOW
Definition: winuser.h:769
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2488
#define SWP_NOACTIVATE
Definition: winuser.h:1228
#define WS_HSCROLL
Definition: pedump.c:628
#define SWP_FRAMECHANGED
Definition: winuser.h:1226
#define SB_BOTH
Definition: winuser.h:555
#define SWP_NOSIZE
Definition: winuser.h:1231
#define WS_VSCROLL
Definition: pedump.c:627
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:124
unsigned int ULONG
Definition: retypes.h:1
#define SWP_NOMOVE
Definition: winuser.h:1230
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

Referenced by co_IntSetScrollInfo(), co_UserCreateWindowEx(), and NtUserShowScrollBar().

◆ IntDestroyScrollBars()

BOOL FASTCALL IntDestroyScrollBars ( PWND  )

Definition at line 875 of file scrollbar.c.

876 {
877  if (Window->pSBInfo && Window->pSBInfoex)
878  {
879  DesktopHeapFree(Window->head.rpdesk, Window->pSBInfo);
880  Window->pSBInfo = NULL;
882  Window->pSBInfoex = NULL;
883  return TRUE;
884  }
885  return FALSE;
886 }
#define TRUE
Definition: types.h:120
#define TAG_SBARINFO
Definition: tags.h:9
Definition: window.c:28
#define FALSE
Definition: types.h:117
#define NULL
Definition: types.h:112
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:241
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by co_UserFreeWindow().

◆ IntDrawScrollBar()

void IntDrawScrollBar ( PWND  ,
HDC  ,
INT   
)

Definition at line 1157 of file scrollbar.c.

1158 {
1159  //PSBWND pSBWnd;
1160  //INT ThumbSize;
1161  PTHREADINFO pti;
1163  BOOL Vertical;
1164 
1166 
1167  /*
1168  * Get scroll bar info.
1169  */
1170  switch (Bar)
1171  {
1172  case SB_HORZ:
1173  Vertical = FALSE;
1174  break;
1175 
1176  case SB_VERT:
1177  Vertical = TRUE;
1178  break;
1179 
1180  case SB_CTL:
1181  Vertical = (Wnd->style & SBS_VERT) != 0;
1182  break;
1183 
1184  default:
1185  return;
1186  }
1187 
1189  {
1190  return;
1191  }
1192 
1193  if (RECTL_bIsEmptyRect(&Info.rcScrollBar))
1194  {
1195  return;
1196  }
1197 
1198  //ThumbSize = pSBWnd->pSBCalc->pxThumbBottom - pSBWnd->pSBCalc->pxThumbTop;
1199 
1200  /*
1201  * Draw the arrows.
1202  */
1203  if (Info.dxyLineButton)
1204  {
1205  IntDrawScrollArrows(DC, &Info, Vertical);
1206  }
1207 
1208  /*
1209  * Draw the interior.
1210  */
1211  IntDrawScrollInterior(Wnd, DC, Bar, Vertical, &Info);
1212 
1213  /*
1214  * If scroll bar has focus, reposition the caret.
1215  */
1216  if ( Wnd == pti->MessageQueue->spwndFocus && Bar == SB_CTL )
1217  {
1218  if (Vertical)
1219  {
1220  co_IntSetCaretPos(Info.rcScrollBar.top + 1, Info.dxyLineButton + 1);
1221  }
1222  else
1223  {
1224  co_IntSetCaretPos(Info.dxyLineButton + 1, Info.rcScrollBar.top + 1);
1225  }
1226  }
1227 }
BOOL FASTCALL co_IntGetScrollBarInfo(PWND Window, LONG idObject, PSCROLLBARINFO psbi)
Definition: scrollbar.c:737
static void IntDrawScrollInterior(PWND pWnd, HDC hDC, INT nBar, BOOL Vertical, PSCROLLBARINFO ScrollBarInfo)
Definition: scrollbar.c:974
#define SB_CTL
Definition: winuser.h:554
#define SB_VERT
Definition: winuser.h:553
#define TRUE
Definition: types.h:120
#define SB_HORZ
Definition: winuser.h:552
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
void Bar(void)
Definition: terminate.cpp:70
static LONG FASTCALL IntScrollGetObjectId(INT SBType)
Definition: scrollbar.c:1132
#define SBS_VERT
Definition: winuser.h:334
Definition: polytest.cpp:40
BOOL FASTCALL co_IntSetCaretPos(int X, int Y)
Definition: caret.c:205
static VOID FASTCALL IntDrawScrollArrows(HDC hDC, PSCROLLBARINFO ScrollBarInfo, BOOL Vertical)
Definition: scrollbar.c:1089
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
Definition: rect.h:44

Referenced by NC_DoNCPaint(), SCROLL_RefreshScrollBar(), and ScrollBarWndProc_common().

◆ IntScrollWindow()

BOOL FASTCALL IntScrollWindow ( PWND  ,
int  ,
int  ,
CONST RECT ,
CONST RECT  
)

Definition at line 458 of file scrollex.c.

463 {
464  return IntScrollWindowEx( pWnd, dx, dy, lpRect, prcClip, 0, NULL,
466 }
#define ERROR(name)
Definition: error_private.h:53
GLint dy
Definition: linetemp.h:97
#define SW_ERASE
Definition: winuser.h:2556
DWORD FASTCALL IntScrollWindowEx(PWND Window, INT dx, INT dy, const RECT *prcScroll, const RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate, UINT flags)
Definition: scrollex.c:228
#define SW_SCROLLWNDDCE
Definition: undocuser.h:91
#define SW_INVALIDATE
Definition: winuser.h:2555
#define NULL
Definition: types.h:112
#define SW_SCROLLCHILDREN
Definition: winuser.h:2554
GLint dx
Definition: linetemp.h:97

Referenced by MENU_EnsureMenuItemVisible().

◆ IntScrollWindowEx()

DWORD FASTCALL IntScrollWindowEx ( PWND  ,
INT  ,
INT  ,
const RECT ,
const RECT ,
HRGN  ,
LPRECT  ,
UINT   
)

Definition at line 228 of file scrollex.c.

237 {
238  INT Result;
239  RECTL rcScroll, rcClip, rcCaret;
240  PWND CaretWnd;
241  HDC hDC;
242  PREGION RgnUpdate = NULL, RgnTemp, RgnWinupd = NULL;
243  HWND hwndCaret;
244  DWORD dcxflags = 0;
245  int rdw_flags;
246  USER_REFERENCE_ENTRY CaretRef;
247 
249  {
250  return ERROR;
251  }
252 
253  IntGetClientRect(Window, &rcClip);
254 
255  if (prcScroll)
256  RECTL_bIntersectRect(&rcScroll, &rcClip, prcScroll);
257  else
258  rcScroll = rcClip;
259 
260  if (prcClip)
261  RECTL_bIntersectRect(&rcClip, &rcClip, prcClip);
262 
263  if (rcClip.right <= rcClip.left || rcClip.bottom <= rcClip.top ||
264  (dx == 0 && dy == 0))
265  {
266  return NULLREGION;
267  }
268 
269  /* We must use a copy of the region, as we can't hold an exclusive lock
270  * on it while doing callouts to user-mode */
271  RgnUpdate = IntSysCreateRectpRgn(0, 0, 0, 0);
272  if(!RgnUpdate)
273  {
275  return ERROR;
276  }
277 
278  if (hrgnUpdate)
279  {
280  RgnTemp = REGION_LockRgn(hrgnUpdate);
281  if (!RgnTemp)
282  {
284  Result = ERROR;
285  goto Cleanup;
286  }
287  IntGdiCombineRgn(RgnUpdate, RgnTemp, NULL, RGN_COPY);
288  REGION_UnlockRgn(RgnTemp);
289  }
290 
291  /* ScrollWindow uses the window DC, ScrollWindowEx doesn't */
292  if (flags & SW_SCROLLWNDDCE)
293  {
294  dcxflags = DCX_USESTYLE;
295 
296  if (!(Window->pcls->style & (CS_OWNDC|CS_CLASSDC)))
297  dcxflags |= DCX_CACHE; // AH??? wine~ If not Powned or with Class go Cheap!
298 
299  if (flags & SW_SCROLLCHILDREN && Window->style & WS_CLIPCHILDREN)
300  dcxflags |= DCX_CACHE|DCX_NOCLIPCHILDREN;
301  }
302  else
303  {
304  /* So in this case ScrollWindowEx uses Cache DC. */
305  dcxflags = DCX_CACHE|DCX_USESTYLE;
306  if (flags & SW_SCROLLCHILDREN) dcxflags |= DCX_NOCLIPCHILDREN;
307  }
308 
309  hDC = UserGetDCEx(Window, 0, dcxflags);
310  if (!hDC)
311  {
312  /* FIXME: SetLastError? */
313  Result = ERROR;
314  goto Cleanup;
315  }
316 
318 
319  rcCaret = rcScroll;
320  hwndCaret = co_IntFixCaret(Window, &rcCaret, flags);
321 
323  dx,
324  dy,
325  &rcScroll,
326  &rcClip,
327  NULL,
328  RgnUpdate,
329  prcUpdate);
330 
332 
333  /*
334  * Take into account the fact that some damage may have occurred during
335  * the scroll. Keep a copy in hrgnWinupd to be added to hrngUpdate at the end.
336  */
337 
338  RgnTemp = IntSysCreateRectpRgn(0, 0, 0, 0);
339  if (!RgnTemp)
340  {
342  Result = ERROR;
343  goto Cleanup;
344  }
345 
346  if (co_IntGetUpdateRgn(Window, RgnTemp, FALSE) != NULLREGION)
347  {
348  PREGION RgnClip = IntSysCreateRectpRgnIndirect(&rcClip);
349  if (RgnClip)
350  {
351  if (hrgnUpdate)
352  {
353  RgnWinupd = IntSysCreateRectpRgn(0, 0, 0, 0);
354  // FIXME: What to do if RgnWinupd == NULL??
355  IntGdiCombineRgn( RgnWinupd, RgnTemp, 0, RGN_COPY);
356  }
357 
358  REGION_bOffsetRgn(RgnTemp, dx, dy);
359 
360  IntGdiCombineRgn(RgnTemp, RgnTemp, RgnClip, RGN_AND);
361 
362  if (hrgnUpdate)
363  IntGdiCombineRgn( RgnWinupd, RgnWinupd, RgnTemp, RGN_OR );
364 
365  co_UserRedrawWindow(Window, NULL, RgnTemp, rdw_flags );
366 
367  REGION_Delete(RgnClip);
368  }
369  }
370  REGION_Delete(RgnTemp);
371 
372  if (flags & SW_SCROLLCHILDREN)
373  {
374  PWND Child;
375  RECTL rcChild;
376  POINT ClientOrigin;
377  USER_REFERENCE_ENTRY WndRef;
378  RECTL rcDummy;
379  LPARAM lParam;
380 
381  IntGetClientOrigin(Window, &ClientOrigin);
382 
383  for (Child = Window->spwndChild; Child; Child = Child->spwndNext)
384  {
385  rcChild = Child->rcWindow;
386  RECTL_vOffsetRect(&rcChild, -ClientOrigin.x, -ClientOrigin.y);
387 
388  /* Adjust window positions */
389  RECTL_vOffsetRect(&Child->rcWindow, dx, dy);
390  RECTL_vOffsetRect(&Child->rcClient, dx, dy);
391 
392  if (!prcScroll || RECTL_bIntersectRect(&rcDummy, &rcChild, &rcScroll))
393  {
394  UserRefObjectCo(Child, &WndRef);
395 
396  if (UserIsDesktopWindow(Window->spwndParent))
397  lParam = MAKELONG(Child->rcClient.left, Child->rcClient.top);
398  else
399  lParam = MAKELONG(rcChild.left + dx, rcChild.top + dy);
400 
401  /* wine sends WM_POSCHANGING, WM_POSCHANGED messages */
402  /* windows sometimes a WM_MOVE */
404 
406  }
407  }
408  }
409 
410  if (flags & (SW_INVALIDATE | SW_ERASE))
411  {
413  NULL,
414  RgnUpdate,
415  rdw_flags | /* HACK */
417  }
418 
419  if (hwndCaret && (CaretWnd = UserGetWindowObject(hwndCaret)))
420  {
421  UserRefObjectCo(CaretWnd, &CaretRef);
422 
423  co_IntSetCaretPos(rcCaret.left + dx, rcCaret.top + dy);
424  co_UserShowCaret(CaretWnd);
425 
426  UserDerefObjectCo(CaretWnd);
427  }
428 
429  if (hrgnUpdate && (Result != ERROR))
430  {
431  /* Give everything back to the caller */
432  RgnTemp = REGION_LockRgn(hrgnUpdate);
433  /* The handle should still be valid */
434  ASSERT(RgnTemp);
435  if (RgnWinupd)
436  IntGdiCombineRgn(RgnTemp, RgnUpdate, RgnWinupd, RGN_OR);
437  else
438  IntGdiCombineRgn(RgnTemp, RgnUpdate, NULL, RGN_COPY);
439  REGION_UnlockRgn(RgnTemp);
440  }
441 
442 Cleanup:
443  if (RgnWinupd)
444  {
445  REGION_Delete(RgnWinupd);
446  }
447 
448  if (RgnUpdate)
449  {
450  REGION_Delete(RgnUpdate);
451  }
452 
453  return Result;
454 }
#define RDW_NOCHILDREN
Definition: winuser.h:1208
long y
Definition: polytest.cpp:48
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
long x
Definition: polytest.cpp:48
#define ERROR(name)
Definition: error_private.h:53
GLint dy
Definition: linetemp.h:97
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
static HDC
Definition: imagelist.c:92
#define NULLREGION
Definition: wingdi.h:360
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
long bottom
Definition: polytest.cpp:53
#define DCX_USESTYLE
Definition: GetDCEx.c:10
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define WM_MOVE
Definition: winuser.h:1593
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2727
VOID FASTCALL IntGetClientRect(PWND WindowObject, RECTL *Rect)
Definition: winpos.c:91
#define CS_OWNDC
Definition: winuser.h:650
INT FASTCALL co_IntGetUpdateRgn(PWND Window, PREGION Rgn, BOOL bErase)
Definition: scrollex.c:63
#define WS_CLIPCHILDREN
Definition: pedump.c:619
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2377
int32_t INT
Definition: typedefs.h:58
#define RGN_AND
Definition: wingdi.h:355
long right
Definition: polytest.cpp:53
Definition: window.c:28
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2426
#define FALSE
Definition: types.h:117
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:533
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
BOOL FASTCALL IntIsWindowDrawable(PWND Wnd)
Definition: painting.c:861
long top
Definition: polytest.cpp:53
#define SW_ERASE
Definition: winuser.h:2556
BOOL FASTCALL IntGetClientOrigin(PWND Window OPTIONAL, LPPOINT Point)
Definition: winpos.c:70
Definition: object.h:3
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define RGN_OR
Definition: wingdi.h:358
_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
#define DCX_NOCLIPCHILDREN
Definition: dce.h:40
Definition: region.h:7
#define SW_SCROLLWNDDCE
Definition: undocuser.h:91
long left
Definition: polytest.cpp:53
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2506
#define IntSysCreateRectpRgnIndirect(prc)
Definition: region.h:93
#define UserHMGetHandle(obj)
Definition: ntuser.h:213
#define ASSERT(a)
Definition: mode.c:44
#define RDW_ERASE
Definition: winuser.h:1197
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
BOOL FASTCALL co_IntSetCaretPos(int X, int Y)
Definition: caret.c:205
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
BOOL FASTCALL co_UserShowCaret(PWND Window OPTIONAL)
Definition: caret.c:272
static const WCHAR Cleanup[]
Definition: register.c:80
#define SW_INVALIDATE
Definition: winuser.h:2555
#define RGN_COPY
Definition: wingdi.h:356
#define CS_CLASSDC
Definition: winuser.h:645
static HWND FASTCALL co_IntFixCaret(PWND Window, RECTL *lprc, UINT flags)
Definition: scrollex.c:15
Definition: ntuser.h:663
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
static HDC hDC
Definition: 3dtext.c:33
#define DCX_CACHE
Definition: winuser.h:2097
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:888
#define RDW_ALLCHILDREN
Definition: winuser.h:1207
static INT FASTCALL UserScrollDC(HDC hDC, INT dx, INT dy, const RECTL *prcScroll, const RECTL *prcClip, HRGN hrgnUpdate, PREGION RgnUpdate, RECTL *prcUpdate)
Definition: scrollex.c:100
#define NULL
Definition: types.h:112
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define SW_SCROLLCHILDREN
Definition: winuser.h:2554
GLint dx
Definition: linetemp.h:97
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2392
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2468
LPARAM lParam
Definition: combotst.c:139
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define RDW_INVALIDATE
Definition: winuser.h:1200

Referenced by IntScrollWindow(), and NtUserScrollWindowEx().

◆ VOID()

typedef VOID ( NEAR NTAPI PFN_SCROLLBAR)

Variable Documentation

◆ LPARAM

typedef LPARAM

Definition at line 3 of file scroll.h.

◆ PSBCALC

typedef PSBCALC

Definition at line 3 of file scroll.h.

◆ UINT

typedef UINT

Definition at line 3 of file scroll.h.

◆ WPARAM

typedef WPARAM

Definition at line 3 of file scroll.h.