4 * Copyright 1995 Alexandre Julliard
12 /* #define DEBUG_PROP */
18 HANDLE next
; /* Next property in window list */
19 ATOM atom
; /* Atom (or 0 if string) */
20 HANDLE hData
; /* User's data */
21 char string
[1]; /* Property string */
25 /***********************************************************************
28 BOOL
SetProp( HWND hwnd
, SEGPTR str
, HANDLE hData
)
34 dprintf_prop( stddeb
, "SetProp: %04x %08lx %04x\n",
35 hwnd
, (DWORD
)str
, hData
);
36 if (!(wndPtr
= WIN_FindWndPtr( hwnd
))) return FALSE
;
37 hProp
= USER_HEAP_ALLOC( sizeof(PROPERTY
) +
38 (HIWORD(str
) ? strlen(PTR_SEG_TO_LIN(str
)) : 0 ));
39 if (!hProp
) return FALSE
;
40 prop
= (PROPERTY
*) USER_HEAP_LIN_ADDR( hProp
);
41 if (HIWORD(str
)) /* string */
44 strcpy( prop
->string
, PTR_SEG_TO_LIN(str
) );
48 prop
->atom
= LOWORD(str
);
49 prop
->string
[0] = '\0';
52 prop
->next
= wndPtr
->hProp
;
53 wndPtr
->hProp
= hProp
;
58 /***********************************************************************
61 HANDLE
GetProp( HWND hwnd
, SEGPTR str
)
66 dprintf_prop( stddeb
, "GetProp: %04x %08lx\n", hwnd
, (DWORD
)str
);
67 if (!(wndPtr
= WIN_FindWndPtr( hwnd
))) return 0;
68 hProp
= wndPtr
->hProp
;
71 PROPERTY
*prop
= (PROPERTY
*)USER_HEAP_LIN_ADDR(hProp
);
74 if (!prop
->atom
&& !lstrcmpi32A(prop
->string
, PTR_SEG_TO_LIN(str
)))
77 else if (prop
->atom
&& (prop
->atom
== LOWORD(str
))) return prop
->hData
;
84 /***********************************************************************
85 * RemoveProp (USER.24)
87 HANDLE
RemoveProp( HWND hwnd
, SEGPTR str
)
92 dprintf_prop( stddeb
, "RemoveProp: %04x %08lx\n", hwnd
, (DWORD
)str
);
93 if (!(wndPtr
= WIN_FindWndPtr( hwnd
))) return 0;
94 hProp
= &wndPtr
->hProp
;
97 PROPERTY
*prop
= (PROPERTY
*)USER_HEAP_LIN_ADDR( *hProp
);
98 if ((HIWORD(str
) && !prop
->atom
&&
99 !lstrcmpi32A( prop
->string
, PTR_SEG_TO_LIN(str
))) ||
100 (!HIWORD(str
) && prop
->atom
&& (prop
->atom
== LOWORD(str
))))
102 HANDLE hNext
= prop
->next
;
103 HANDLE hData
= prop
->hData
;
104 USER_HEAP_FREE( *hProp
);
114 /***********************************************************************
115 * EnumProps (USER.27)
117 INT
EnumProps( HWND hwnd
, PROPENUMPROC func
)
123 dprintf_prop( stddeb
, "EnumProps: %04x %08lx\n", hwnd
, (LONG
)func
);
124 if (!(wndPtr
= WIN_FindWndPtr( hwnd
))) return 0;
125 hProp
= wndPtr
->hProp
;
128 PROPERTY
*prop
= (PROPERTY
*)USER_HEAP_LIN_ADDR(hProp
);
130 dprintf_prop( stddeb
, " Callback: atom=%04x data=%04x str='%s'\n",
131 prop
->atom
, prop
->hData
, prop
->string
);
133 /* Already get the next in case the callback */
134 /* function removes the current property. */
136 ret
= CallEnumPropProc( (FARPROC16
)func
, hwnd
,
138 (LONG
)MAKELONG( prop
->atom
, 0 )
140 (LONG
)(USER_HEAP_SEG_ADDR(hProp
) +
141 ((int)prop
->string
- (int)prop
)),