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 && !lstrcmpi( 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 !lstrcmpi( 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( func, hwnd,
138 (LONG)MAKELONG( prop->atom, 0 )
140 (LONG)(USER_HEAP_SEG_ADDR(hProp) +
141 ((int)prop->string - (int)prop)),