2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Window properties
5 * FILE: subsys/win32k/ntuser/prop.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
10 DBG_DEFAULT_CHANNEL(UserProp
);
12 /* STATIC FUNCTIONS **********************************************************/
15 IntGetProp(PWND Window
, ATOM Atom
)
17 PLIST_ENTRY ListEntry
;
21 ListEntry
= Window
->PropListHead
.Flink
;
22 for (i
= 0; i
< Window
->PropListItems
; i
++ )
24 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
25 if (Property
->Atom
== Atom
)
29 ListEntry
= ListEntry
->Flink
;
36 UserGetProp(PWND pWnd
, ATOM Atom
)
39 Prop
= IntGetProp(pWnd
, Atom
);
40 return Prop
? Prop
->Data
: NULL
;
44 IntRemoveProp(PWND Window
, ATOM Atom
)
47 Prop
= IntGetProp(Window
, Atom
);
53 RemoveEntryList(&Prop
->PropListEntry
);
55 Window
->PropListItems
--;
60 IntSetProp(PWND pWnd
, ATOM Atom
, HANDLE Data
)
64 Prop
= IntGetProp(pWnd
, Atom
);
68 Prop
= UserHeapAlloc(sizeof(PROPERTY
));
74 InsertTailList(&pWnd
->PropListHead
, &Prop
->PropListEntry
);
75 pWnd
->PropListItems
++;
83 IntRemoveWindowProp(PWND Window
)
85 PLIST_ENTRY ListEntry
;
87 int i
, Count
= Window
->PropListItems
;
89 ListEntry
= Window
->PropListHead
.Flink
;
90 for (i
= 0; i
< Count
; i
++ )
92 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
93 ListEntry
= ListEntry
->Flink
;
94 RemoveEntryList(&Property
->PropListEntry
);
95 UserHeapFree(Property
);
96 Window
->PropListItems
--;
101 /* FUNCTIONS *****************************************************************/
104 NtUserBuildPropList(HWND hWnd
,
111 PLIST_ENTRY ListEntry
;
112 PROPLISTITEM listitem
, *li
;
115 DECLARE_RETURN(NTSTATUS
);
117 TRACE("Enter NtUserBuildPropList\n");
120 if (!(Window
= UserGetWindowObject(hWnd
)))
122 RETURN( STATUS_INVALID_HANDLE
);
127 if(!BufferSize
|| (BufferSize
% sizeof(PROPLISTITEM
) != 0))
129 RETURN( STATUS_INVALID_PARAMETER
);
133 li
= (PROPLISTITEM
*)Buffer
;
134 ListEntry
= Window
->PropListHead
.Flink
;
135 while((BufferSize
>= sizeof(PROPLISTITEM
)) && (ListEntry
!= &Window
->PropListHead
))
137 Property
= CONTAINING_RECORD(ListEntry
, PROPERTY
, PropListEntry
);
138 listitem
.Atom
= Property
->Atom
;
139 listitem
.Data
= Property
->Data
;
141 Status
= MmCopyToCaller(li
, &listitem
, sizeof(PROPLISTITEM
));
142 if(!NT_SUCCESS(Status
))
147 BufferSize
-= sizeof(PROPLISTITEM
);
150 ListEntry
= ListEntry
->Flink
;
156 Cnt
= Window
->PropListItems
* sizeof(PROPLISTITEM
);
161 Status
= MmCopyToCaller(Count
, &Cnt
, sizeof(DWORD
));
162 if(!NT_SUCCESS(Status
))
168 RETURN( STATUS_SUCCESS
);
171 TRACE("Leave NtUserBuildPropList, ret=%i\n",_ret_
);
177 NtUserRemoveProp(HWND hWnd
, ATOM Atom
)
182 DECLARE_RETURN(HANDLE
);
184 TRACE("Enter NtUserRemoveProp\n");
185 UserEnterExclusive();
187 if (!(Window
= UserGetWindowObject(hWnd
)))
192 Prop
= IntGetProp(Window
, Atom
);
199 RemoveEntryList(&Prop
->PropListEntry
);
201 Window
->PropListItems
--;
206 TRACE("Leave NtUserRemoveProp, ret=%p\n", _ret_
);
212 NtUserSetProp(HWND hWnd
, ATOM Atom
, HANDLE Data
)
215 DECLARE_RETURN(BOOL
);
217 TRACE("Enter NtUserSetProp\n");
218 UserEnterExclusive();
220 if (!(Window
= UserGetWindowObject(hWnd
)))
225 RETURN( IntSetProp(Window
, Atom
, Data
));
228 TRACE("Leave NtUserSetProp, ret=%i\n",_ret_
);