ReactOS  0.4.13-dev-92-gf251225
engwindow.c File Reference
#include <win32k.h>
#include <debug.h>
Include dependency graph for engwindow.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (EngWnd)
 
VOID FASTCALL IntEngWndCallChangeProc (_In_ EWNDOBJ *Clip, _In_ FLONG flChanged)
 
BOOLEAN FASTCALL IntEngWndUpdateClipObj (EWNDOBJ *Clip, PWND Window)
 
VOID FASTCALL IntEngWindowChanged (_In_ PWND Window, _In_ FLONG flChanged)
 
WNDOBJ *APIENTRY EngCreateWnd (SURFOBJ *pso, HWND hWnd, WNDOBJCHANGEPROC pfn, FLONG fl, int iPixelFormat)
 
VOID APIENTRY EngDeleteWnd (IN WNDOBJ *pwo)
 
BOOL APIENTRY WNDOBJ_bEnum (IN WNDOBJ *pwo, IN ULONG cj, OUT ULONG *pul)
 
ULONG APIENTRY WNDOBJ_cEnumStart (IN WNDOBJ *pwo, IN ULONG iType, IN ULONG iDirection, IN ULONG cLimit)
 
VOID APIENTRY WNDOBJ_vSetConsumer (IN WNDOBJ *pwo, IN PVOID pvConsumer)
 

Variables

INT gcountPWO = 0
 

Function Documentation

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( EngWnd  )

◆ EngCreateWnd()

WNDOBJ* APIENTRY EngCreateWnd ( SURFOBJ pso,
HWND  hWnd,
WNDOBJCHANGEPROC  pfn,
FLONG  fl,
int  iPixelFormat 
)

Definition at line 145 of file engwindow.c.

151 {
152  EWNDOBJ *Clip = NULL;
153  WNDOBJ *WndObjUser = NULL;
154  PWND Window;
155 
156  TRACE("EngCreateWnd: pso = 0x%p, hwnd = 0x%p, pfn = 0x%p, fl = 0x%lx, pixfmt = %d\n",
157  pso, hWnd, pfn, fl, iPixelFormat);
158 
160 
162  {
163  FIXME("Unsupported flags: 0x%lx\n", fl & ~(WO_RGN_CLIENT_DELTA | WO_RGN_CLIENT | WO_RGN_SURFACE_DELTA | WO_RGN_SURFACE));
164  }
165 
166  /* Get window object */
168  if (Window == NULL)
169  {
170  goto Exit;
171  }
172 
173  /* Create WNDOBJ */
175  if (Clip == NULL)
176  {
177  ERR("Failed to allocate memory for a WND structure!\n");
178  goto Exit;
179  }
180  IntEngInitClipObj((XCLIPOBJ*)Clip);
181 
182  /* Fill the clipobj */
183  if (!IntEngWndUpdateClipObj(Clip, Window))
184  {
185  EngFreeMem(Clip);
186  goto Exit;
187  }
188 
189  /* Fill user object */
190  WndObjUser = (WNDOBJ *)Clip;
191  WndObjUser->psoOwner = pso;
192  WndObjUser->pvConsumer = NULL;
193 
194  /* Fill internal object */
195  Clip->Hwnd = hWnd;
196  Clip->ChangeProc = pfn;
197  /* Keep track of relevant flags */
199  if (fl & WO_SPRITE_NOTIFY)
201  /* Those should always be sent */
202  Clip->Flags |= WOC_CHANGED | WOC_DELETE;
203  Clip->PixelFormat = iPixelFormat;
204 
205  /* associate object with window */
206  UserSetProp(Window, AtomWndObj, Clip, TRUE);
207  ++gcountPWO;
208 
209  TRACE("EngCreateWnd: SUCCESS: %p!\n", WndObjUser);
210 
211 Exit:
212  UserLeave();
213  return WndObjUser;
214 }
HWND Hwnd
Definition: engobjects.h:98
#define WOC_SPRITE_OVERLAP
Definition: winddi.h:1271
#define TRUE
Definition: types.h:120
VOID FASTCALL IntEngInitClipObj(XCLIPOBJ *Clip)
Definition: clip.c:158
#define WO_DRAW_NOTIFY
Definition: winddi.h:1599
#define EngFreeMem
Definition: polytest.cpp:56
SURFOBJ * psoOwner
Definition: winddi.h:1230
#define WO_RGN_WINDOW
Definition: winddi.h:1598
#define WO_RGN_DESKTOP_COORD
Definition: winddi.h:1601
HWND hWnd
Definition: settings.c:17
#define WO_RGN_CLIENT
Definition: winddi.h:1594
#define WO_SPRITE_NOTIFY
Definition: winddi.h:1600
Definition: window.c:29
_In_ FLONG fl
Definition: winddi.h:1279
#define WO_RGN_SURFACE
Definition: winddi.h:1596
#define WOC_DELETE
Definition: winddi.h:1269
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
#define GDITAG_WNDOBJ
Definition: tags.h:179
WNDOBJCHANGEPROC ChangeProc
Definition: engobjects.h:99
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
FLONG Flags
Definition: engobjects.h:100
_In_ HANDLE _In_ SURFOBJ * pso
Definition: winddi.h:3664
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
#define TRACE(s)
Definition: solgame.cpp:4
static void Exit(void)
Definition: sock.c:1331
int Window
Definition: x11stubs.h:26
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
BOOLEAN FASTCALL IntEngWndUpdateClipObj(EWNDOBJ *Clip, PWND Window)
Definition: engwindow.c:51
#define FL_ZERO_MEMORY
Definition: polytest.cpp:58
#define WO_RGN_CLIENT_DELTA
Definition: winddi.h:1593
ATOM AtomWndObj
Definition: ntuser.c:20
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
_In_ LONG iPixelFormat
Definition: winddi.h:3488
#define WO_RGN_UPDATE_ALL
Definition: winddi.h:1597
INT gcountPWO
Definition: engwindow.c:13
#define WOC_CHANGED
Definition: winddi.h:1268
PVOID pvConsumer
Definition: winddi.h:1228
int PixelFormat
Definition: engobjects.h:101
#define WO_RGN_SURFACE_DELTA
Definition: winddi.h:1595
#define WOC_SPRITE_NO_OVERLAP
Definition: winddi.h:1272

◆ EngDeleteWnd()

VOID APIENTRY EngDeleteWnd ( IN WNDOBJ pwo)

Definition at line 222 of file engwindow.c.

224 {
225  EWNDOBJ* Clip = (EWNDOBJ *)pwo;//CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
226  PWND Window;
227 
228  TRACE("EngDeleteWnd: pwo = 0x%p\n", pwo);
229 
231 
232  /* Get window object */
234  if (Window == NULL)
235  {
236  ERR("Couldnt get window object for WndObjInt->Hwnd!!!\n");
237  }
238  else
239  {
240  /* Remove object from window */
242  }
243  --gcountPWO;
244 
245  UserLeave();
246 
247  /* Free resources */
249  EngFreeMem(Clip);
250 }
HWND Hwnd
Definition: engobjects.h:98
#define TRUE
Definition: types.h:120
#define EngFreeMem
Definition: polytest.cpp:56
_In_ WNDOBJ * pwo
Definition: winddi.h:4147
Definition: window.c:29
VOID FASTCALL IntEngFreeClipResources(XCLIPOBJ *Clip)
Definition: clip.c:164
smooth NULL
Definition: ftsmooth.c:416
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:103
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
#define TRACE(s)
Definition: solgame.cpp:4
int Window
Definition: x11stubs.h:26
ATOM AtomWndObj
Definition: ntuser.c:20
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
INT gcountPWO
Definition: engwindow.c:13
HANDLE FASTCALL UserRemoveProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)

◆ IntEngWindowChanged()

VOID FASTCALL IntEngWindowChanged ( _In_ PWND  Window,
_In_ FLONG  flChanged 
)

Definition at line 99 of file engwindow.c.

102 {
103  EWNDOBJ *Clip;
104 
106 
107  Clip = UserGetProp(Window, AtomWndObj, TRUE);
108  if (!Clip)
109  {
110  return;
111  }
112 
113  ASSERT(Clip->Hwnd == Window->head.h);
114  // if (Clip->pvConsumer != NULL)
115  {
116  /* Update the WNDOBJ */
117  switch (flChanged)
118  {
119  case WOC_RGN_CLIENT:
120  /* Update the clipobj and client rect of the WNDOBJ */
122  break;
123 
124  case WOC_DELETE:
125  /* FIXME: Should the WNDOBJs be deleted by win32k or by the driver? */
126  break;
127  }
128 
129  /* Call the change proc */
130  IntEngWndCallChangeProc(Clip, flChanged);
131 
132  /* HACK: Send WOC_CHANGED after WOC_RGN_CLIENT */
133  if (flChanged == WOC_RGN_CLIENT)
134  {
136  }
137  }
138 }
HWND Hwnd
Definition: engobjects.h:98
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition: debug.h:251
#define TRUE
Definition: types.h:120
Definition: window.c:29
#define WOC_DELETE
Definition: winddi.h:1269
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
HANDLE FASTCALL UserGetProp(_In_ PWND Window, _In_ ATOM Atom, _In_ BOOLEAN SystemProp)
Definition: prop.c:46
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
BOOLEAN FASTCALL IntEngWndUpdateClipObj(EWNDOBJ *Clip, PWND Window)
Definition: engwindow.c:51
VOID FASTCALL IntEngWndCallChangeProc(_In_ EWNDOBJ *Clip, _In_ FLONG flChanged)
Definition: engwindow.c:20
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
ATOM AtomWndObj
Definition: ntuser.c:20
#define WOC_CHANGED
Definition: winddi.h:1268

◆ IntEngWndCallChangeProc()

VOID FASTCALL IntEngWndCallChangeProc ( _In_ EWNDOBJ Clip,
_In_ FLONG  flChanged 
)

Definition at line 20 of file engwindow.c.

23 {
24  if (Clip->ChangeProc == NULL)
25  {
26  return;
27  }
28 
29  /* check flags of the WNDOBJ */
30  flChanged &= Clip->Flags;
31  if (flChanged == 0)
32  {
33  return;
34  }
35 
36  TRACE("Calling WNDOBJCHANGEPROC (0x%p), Changed = 0x%x\n",
37  Clip->ChangeProc, flChanged);
38 
39  /* Call the WNDOBJCHANGEPROC */
40  if (flChanged == WOC_CHANGED)
41  Clip->ChangeProc(NULL, flChanged);
42  else
43  Clip->ChangeProc((WNDOBJ *)Clip, flChanged);
44 }
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define WOC_CHANGED
Definition: winddi.h:1268

Referenced by IntEngWindowChanged(), and WNDOBJ_vSetConsumer().

◆ IntEngWndUpdateClipObj()

BOOLEAN FASTCALL IntEngWndUpdateClipObj ( EWNDOBJ Clip,
PWND  Window 
)

Definition at line 51 of file engwindow.c.

54 {
55  PREGION visRgn;
56 
57  TRACE("IntEngWndUpdateClipObj\n");
58 
60  if (visRgn != NULL)
61  {
62  if (visRgn->rdh.nCount > 0)
63  {
64  IntEngUpdateClipRegion((XCLIPOBJ*)Clip, visRgn->rdh.nCount, visRgn->Buffer, &visRgn->rdh.rcBound);
65  TRACE("Created visible region with %lu rects\n", visRgn->rdh.nCount);
66  TRACE(" BoundingRect: %d, %d %d, %d\n",
67  visRgn->rdh.rcBound.left, visRgn->rdh.rcBound.top,
68  visRgn->rdh.rcBound.right, visRgn->rdh.rcBound.bottom);
69  {
70  ULONG i;
71  for (i = 0; i < visRgn->rdh.nCount; i++)
72  {
73  TRACE(" Rect #%lu: %ld,%ld %ld,%ld\n", i+1,
74  visRgn->Buffer[i].left, visRgn->Buffer[i].top,
75  visRgn->Buffer[i].right, visRgn->Buffer[i].bottom);
76  }
77  }
78  }
79  REGION_Delete(visRgn);
80  }
81  else
82  {
83  /* Fall back to client rect */
84  IntEngUpdateClipRegion((XCLIPOBJ*)Clip, 1, &Window->rcClient, &Window->rcClient);
85  }
86 
87  /* Update the WNDOBJ */
88  Clip->rclClient = Window->rcClient;
89  Clip->iUniq++;
90 
91  return TRUE;
92 }
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:292
long bottom
Definition: polytest.cpp:53
LONG left
Definition: windef.h:291
LONG right
Definition: windef.h:293
long right
Definition: polytest.cpp:53
Definition: window.c:29
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
long top
Definition: polytest.cpp:53
RECTL * Buffer
Definition: region.h:16
smooth NULL
Definition: ftsmooth.c:416
Definition: region.h:7
long left
Definition: polytest.cpp:53
#define TRACE(s)
Definition: solgame.cpp:4
RGNDATAHEADER rdh
Definition: region.h:15
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
VOID FASTCALL IntEngUpdateClipRegion(XCLIPOBJ *Clip, ULONG count, const RECTL *pRect, const RECTL *rcBounds)
Definition: clip.c:173
unsigned int ULONG
Definition: retypes.h:1
LONG bottom
Definition: windef.h:294
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2471

Referenced by EngCreateWnd(), and IntEngWindowChanged().

◆ WNDOBJ_bEnum()

BOOL APIENTRY WNDOBJ_bEnum ( IN WNDOBJ pwo,
IN ULONG  cj,
OUT ULONG pul 
)

Definition at line 258 of file engwindow.c.

262 {
263  /* Relay */
264  return CLIPOBJ_bEnum(&pwo->coClient, cj, pul);
265 }
_In_ ULONG cj
Definition: winddi.h:3540
_In_ WNDOBJ * pwo
Definition: winddi.h:4147
ENGAPI BOOL APIENTRY CLIPOBJ_bEnum(_In_ CLIPOBJ *pco, _In_ ULONG cj, _Out_bytecap_(cj) ULONG *pul)
Definition: clip.c:319

◆ WNDOBJ_cEnumStart()

ULONG APIENTRY WNDOBJ_cEnumStart ( IN WNDOBJ pwo,
IN ULONG  iType,
IN ULONG  iDirection,
IN ULONG  cLimit 
)

Definition at line 273 of file engwindow.c.

278 {
279  /* Relay */
280  // FIXME: Should we enumerate all rectangles or not?
281  return CLIPOBJ_cEnumStart(&pwo->coClient, FALSE, iType, iDirection, cLimit);
282 }
_In_ ULONG iType
Definition: winddi.h:3748
_In_ WNDOBJ * pwo
Definition: winddi.h:4147
ENGAPI ULONG APIENTRY CLIPOBJ_cEnumStart(_Inout_ CLIPOBJ *pco, _In_ BOOL bAll, _In_ ULONG iType, _In_ ULONG iDirection, _In_ ULONG cLimit)
Definition: clip.c:255

◆ WNDOBJ_vSetConsumer()

VOID APIENTRY WNDOBJ_vSetConsumer ( IN WNDOBJ pwo,
IN PVOID  pvConsumer 
)

Definition at line 290 of file engwindow.c.

293 {
294  EWNDOBJ* Clip = (EWNDOBJ *)pwo;//CONTAINING_RECORD(pwo, XCLIPOBJ, WndObj);
295  BOOL Hack;
296 
297  TRACE("WNDOBJ_vSetConsumer: pwo = 0x%p, pvConsumer = 0x%p\n", pwo, pvConsumer);
298 
299  Hack = (pwo->pvConsumer == NULL);
300  pwo->pvConsumer = pvConsumer;
301 
302  /* HACKHACKHACK
303  *
304  * MSDN says that the WNDOBJCHANGEPROC will be called with the most recent state
305  * when a WNDOBJ is created - we do it here because most drivers will need pvConsumer
306  * in the callback to identify the WNDOBJ I think.
307  *
308  * - blight
309  */
310  if (Hack)
311  {
312  FIXME("Is this hack really needed?\n");
316  }
317 }
_In_ WNDOBJ * pwo
Definition: winddi.h:4147
#define WOC_DRAWN
Definition: winddi.h:1270
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FIXME(fmt,...)
Definition: debug.h:110
smooth NULL
Definition: ftsmooth.c:416
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
#define TRACE(s)
Definition: solgame.cpp:4
VOID FASTCALL IntEngWndCallChangeProc(_In_ EWNDOBJ *Clip, _In_ FLONG flChanged)
Definition: engwindow.c:20
#define WOC_CHANGED
Definition: winddi.h:1268

Variable Documentation

◆ gcountPWO

INT gcountPWO = 0

Definition at line 13 of file engwindow.c.

Referenced by EngCreateWnd(), and EngDeleteWnd().