ReactOS  0.4.15-dev-5606-gf34e425
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 842 of file scrollbar.c.

843 {
844  PSCROLLBARINFO psbi;
845  PSBDATA pSBData;
846  ULONG Size, s;
847  INT i;
848 
850 
851  if (Window->pSBInfo && Window->pSBInfoex)
852  {
853  /* No need to create it anymore */
854  return TRUE;
855  }
856 
857  /* Allocate memory for all scrollbars (HORZ, VERT, CONTROL) */
858  Size = 3 * (sizeof(SBINFOEX));
860  {
861  ERR("Unable to allocate memory for scrollbar information for window %p\n", Window->head.h);
862  return FALSE;
863  }
864 
865  RtlZeroMemory(Window->pSBInfoex, Size);
866 
867  if(!(Window->pSBInfo = DesktopHeapAlloc( Window->head.rpdesk, sizeof(SBINFO))))
868  {
869  ERR("Unable to allocate memory for scrollbar information for window %p\n", Window->head.h);
870  return FALSE;
871  }
872 
873  RtlZeroMemory(Window->pSBInfo, sizeof(SBINFO));
874  Window->pSBInfo->Vert.posMax = 100;
875  Window->pSBInfo->Horz.posMax = 100;
876 
878  &Window->rcWindow,
879  &Window->rcClient);
880 
881  for(s = SB_HORZ; s <= SB_VERT; s++)
882  {
884  psbi->cbSize = sizeof(SCROLLBARINFO);
885  for (i = 0; i < CCHILDREN_SCROLLBAR + 1; i++)
886  psbi->rgstate[i] = 0;
887 
888  pSBData = IntGetSBData(Window, s);
889 
891  IntCalculateThumb(Window, s, psbi, pSBData);
892  }
893 
894  return TRUE;
895 }
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:14
#define SB_HORZ
Definition: winuser.h:552
#define CCHILDREN_SCROLLBAR
Definition: winuser.h:3735
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:204
#define FALSE
Definition: types.h:117
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3744
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:2321

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

◆ co_IntGetScrollBarInfo()

BOOL FASTCALL co_IntGetScrollBarInfo ( PWND  ,
LONG  ,
PSCROLLBARINFO   
)

Definition at line 760 of file scrollbar.c.

761 {
762  INT Bar;
763  PSCROLLBARINFO sbi;
764  PSBDATA pSBData;
766 
767  Bar = SBOBJ_TO_SBID(idObject);
768 
769  if(!SBID_IS_VALID(Bar))
770  {
772  ERR("Trying to get scrollinfo for unknown scrollbar type %d\n", Bar);
773  return FALSE;
774  }
775 
777  {
778  ERR("Failed to create scrollbars for window.\n");
779  return FALSE;
780  }
781 
783  pSBData = IntGetSBData(Window, Bar);
784 
786  IntCalculateThumb(Window, Bar, sbi, pSBData);
787 
788  /* Scroll bar state */
789  psbi->rgstate[0] = 0;
790  if ((Bar == SB_HORZ && !(Window->style & WS_HSCROLL))
791  || (Bar == SB_VERT && !(Window->style & WS_VSCROLL)))
792  psbi->rgstate[0] |= STATE_SYSTEM_INVISIBLE;
793  if (pSBData->posMin >= pSBData->posMax - max(pSBData->page - 1, 0))
794  {
795  if (!(psbi->rgstate[0] & STATE_SYSTEM_INVISIBLE))
796  psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE;
797  else
798  psbi->rgstate[0] |= STATE_SYSTEM_OFFSCREEN;
799  }
800  if (Bar == SB_CTL && !(Window->style & WS_DISABLED))
801  psbi->rgstate[0] |= STATE_SYSTEM_UNAVAILABLE;
802 
803  RtlCopyMemory(psbi, sbi, sizeof(SCROLLBARINFO));
804 
805  return TRUE;
806 }
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:2852
#define STATE_SYSTEM_OFFSCREEN
Definition: winuser.h:2868
#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:502
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
#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:842
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:500
#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:28
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2867
INT posMax
Definition: ntuser.h:501

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

◆ co_IntSetScrollBarInfo()

BOOL FASTCALL co_IntSetScrollBarInfo ( PWND  ,
LONG  ,
PSETSCROLLBARINFO   
)

Definition at line 809 of file scrollbar.c.

810 {
811  INT Bar;
812  PSCROLLBARINFO sbi;
813  LPSCROLLINFO psi;
815 
816  Bar = SBOBJ_TO_SBID(idObject);
817 
818  if(!SBID_IS_VALID(Bar))
819  {
821  ERR("Trying to get scrollinfo for unknown scrollbar type %d\n", Bar);
822  return FALSE;
823  }
824 
826  {
827  ERR("Failed to create scrollbars for window.\n");
828  return FALSE;
829  }
830 
833 
834  psi->nTrackPos = psbi->nTrackPos;
835  sbi->reserved = psbi->reserved;
836  RtlCopyMemory(&sbi->rgstate, &psbi->rgstate, sizeof(psbi->rgstate));
837 
838  return TRUE;
839 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:14
#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:842
DWORD rgstate[CCHILDREN_SCROLLBAR+1]
Definition: winuser.h:3744
#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:28

◆ co_UserShowScrollBar()

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

Definition at line 951 of file scrollbar.c.

952 {
953  ULONG old_style, set_bits = 0, clear_bits = 0;
954 
955  ASSERT_REFS_CO(Wnd);
956 
957  switch(nBar)
958  {
959  case SB_CTL:
960  {
961  //IntUpdateSBInfo(Wnd, SB_CTL); // Is this needed? Was tested w/o!
962 
963  co_WinPosShowWindow(Wnd, fShowH ? SW_SHOW : SW_HIDE);
964  return TRUE;
965  }
966  case SB_BOTH:
967  case SB_HORZ:
968  if (fShowH) set_bits |= WS_HSCROLL;
969  else clear_bits |= WS_HSCROLL;
970  if( nBar == SB_HORZ ) break;
971  /* Fall through */
972  case SB_VERT:
973  if (fShowV) set_bits |= WS_VSCROLL;
974  else clear_bits |= WS_VSCROLL;
975  break;
976  default:
978  return FALSE; /* Nothing to do! */
979  }
980 
981  old_style = IntSetStyle( Wnd, set_bits, clear_bits );
982  if ((old_style & clear_bits) != 0 || (old_style & set_bits) != set_bits)
983  {
985  //if (Wnd->style & WS_HSCROLL) IntUpdateSBInfo(Wnd, SB_HORZ);
986  //if (Wnd->style & WS_VSCROLL) IntUpdateSBInfo(Wnd, SB_VERT);
988  /* Frame has been changed, let the window redraw itself */
989  co_WinPosSetWindowPos( Wnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
991  return TRUE;
992  }
993  return FALSE; /* no frame changes */
994 }
#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:14
#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:1748
#define SWP_NOZORDER
Definition: winuser.h:1237
#define FALSE
Definition: types.h:117
#define SW_SHOW
Definition: winuser.h:769
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2521
#define SWP_NOACTIVATE
Definition: winuser.h:1232
#define WS_HSCROLL
Definition: pedump.c:628
#define SWP_FRAMECHANGED
Definition: winuser.h:1230
#define SB_BOTH
Definition: winuser.h:555
#define SWP_NOSIZE
Definition: winuser.h:1235
#define WS_VSCROLL
Definition: pedump.c:627
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:155
unsigned int ULONG
Definition: retypes.h:1
#define SWP_NOMOVE
Definition: winuser.h:1234
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:28

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

◆ IntDestroyScrollBars()

BOOL FASTCALL IntDestroyScrollBars ( PWND  )

Definition at line 898 of file scrollbar.c.

899 {
900  if (Window->pSBInfo && Window->pSBInfoex)
901  {
902  DesktopHeapFree(Window->head.rpdesk, Window->pSBInfo);
903  Window->pSBInfo = NULL;
905  Window->pSBInfoex = NULL;
906  return TRUE;
907  }
908  return FALSE;
909 }
#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:215
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

Referenced by co_UserFreeWindow().

◆ IntDrawScrollBar()

void IntDrawScrollBar ( PWND  ,
HDC  ,
INT   
)

Definition at line 1180 of file scrollbar.c.

1181 {
1182  //PSBWND pSBWnd;
1183  //INT ThumbSize;
1184  PTHREADINFO pti;
1186  BOOL Vertical;
1187 
1189 
1190  /*
1191  * Get scroll bar info.
1192  */
1193  switch (Bar)
1194  {
1195  case SB_HORZ:
1196  Vertical = FALSE;
1197  break;
1198 
1199  case SB_VERT:
1200  Vertical = TRUE;
1201  break;
1202 
1203  case SB_CTL:
1204  Vertical = (Wnd->style & SBS_VERT) != 0;
1205  break;
1206 
1207  default:
1208  return;
1209  }
1210 
1212  {
1213  return;
1214  }
1215 
1216  if (RECTL_bIsEmptyRect(&Info.rcScrollBar))
1217  {
1218  return;
1219  }
1220 
1221  //ThumbSize = pSBWnd->pSBCalc->pxThumbBottom - pSBWnd->pSBCalc->pxThumbTop;
1222 
1223  /*
1224  * Draw the arrows.
1225  */
1226  if (Info.dxyLineButton)
1227  {
1228  IntDrawScrollArrows(DC, &Info, Vertical);
1229  }
1230 
1231  /*
1232  * Draw the interior.
1233  */
1234  IntDrawScrollInterior(Wnd, DC, Bar, Vertical, &Info);
1235 
1236  /*
1237  * If scroll bar has focus, reposition the caret.
1238  */
1239  if ( Wnd == pti->MessageQueue->spwndFocus && Bar == SB_CTL )
1240  {
1241  if (Vertical)
1242  {
1243  co_IntSetCaretPos(Info.rcScrollBar.top + 1, Info.dxyLineButton + 1);
1244  }
1245  else
1246  {
1247  co_IntSetCaretPos(Info.dxyLineButton + 1, Info.rcScrollBar.top + 1);
1248  }
1249  }
1250 }
BOOL FASTCALL co_IntGetScrollBarInfo(PWND Window, LONG idObject, PSCROLLBARINFO psbi)
Definition: scrollbar.c:760
static void IntDrawScrollInterior(PWND pWnd, HDC hDC, INT nBar, BOOL Vertical, PSCROLLBARINFO ScrollBarInfo)
Definition: scrollbar.c:997
#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:1155
#define SBS_VERT
Definition: winuser.h:334
Definition: polytest.cpp:40
BOOL FASTCALL co_IntSetCaretPos(int X, int Y)
Definition: caret.c:193
static VOID FASTCALL IntDrawScrollArrows(HDC hDC, PSCROLLBARINFO ScrollBarInfo, BOOL Vertical)
Definition: scrollbar.c:1112
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
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:2570
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:92
#define SW_INVALIDATE
Definition: winuser.h:2569
#define NULL
Definition: types.h:112
#define SW_SCROLLCHILDREN
Definition: winuser.h:2568
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:1212
long y
Definition: polytest.cpp:48
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:194
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:361
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
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:1600
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:356
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:40
BOOL FASTCALL IntIsWindowDrawable(PWND Wnd)
Definition: painting.c:861
long top
Definition: polytest.cpp:53
#define SW_ERASE
Definition: winuser.h:2570
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:359
_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:92
long left
Definition: polytest.cpp:53
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:134
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:230
#define ASSERT(a)
Definition: mode.c:44
#define RDW_ERASE
Definition: winuser.h:1201
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:193
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:260
static const WCHAR Cleanup[]
Definition: register.c:80
#define SW_INVALIDATE
Definition: winuser.h:2569
#define RGN_COPY
Definition: wingdi.h:357
#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:688
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:2104
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:888
#define RDW_ALLCHILDREN
Definition: winuser.h:1211
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:918
#define SW_SCROLLCHILDREN
Definition: winuser.h:2568
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:28
#define RDW_INVALIDATE
Definition: winuser.h:1204

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.