2 * Windows Properties Functions
4 static char Copyright[] = "Copyright Martin Ayotte, 1994";
16 /* #define DEBUG_PROP */
17 /* #undef DEBUG_PROP */
20 typedef struct tagPROPENTRY
{
24 struct tagPROPENTRY
*lpPrevProp
;
25 struct tagPROPENTRY
*lpNextProp
;
27 typedef PROPENTRY
*LPPROPENTRY
;
30 /*************************************************************************
31 * RemoveProp [USER.24]
33 HANDLE
RemoveProp(HWND hWnd
, LPSTR lpStr
)
38 if (((DWORD
)lpStr
& 0xFFFF0000) == 0L)
39 dprintf_prop(stddeb
, "RemoveProp(%04X, Atom %04X)\n", hWnd
, LOWORD((DWORD
)lpStr
));
41 dprintf_prop(stddeb
, "RemoveProp(%04X, '%s')\n", hWnd
, lpStr
);
42 wndPtr
= WIN_FindWndPtr(hWnd
);
44 printf("RemoveProp // Bad Window handle !\n");
47 lpProp
= (LPPROPENTRY
) GlobalLock(wndPtr
->hProp
);
49 dprintf_prop(stddeb
, "Property List Empty !\n");
53 if ((((DWORD
)lpStr
& 0xFFFF0000) == 0L &&
54 lpProp
->Atom
== LOWORD((DWORD
)lpStr
)) ||
55 (((DWORD
)lpStr
& 0xFFFF0000) != 0L &&
56 lpProp
->PropName
!= NULL
&&
57 strcmp(lpProp
->PropName
, lpStr
) == 0)) {
58 dprintf_prop(stddeb
, "RemoveProp // Property found ! hData=%04X\n", lpProp
->hData
);
59 hOldData
= lpProp
->hData
;
60 if (lpProp
->lpPrevProp
!= NULL
)
61 lpProp
->lpPrevProp
->lpNextProp
= lpProp
->lpNextProp
;
62 if (lpProp
->lpNextProp
!= NULL
)
63 lpProp
->lpNextProp
->lpPrevProp
= lpProp
->lpPrevProp
;
64 if (lpProp
->PropName
!= NULL
) free(lpProp
->PropName
);
66 GlobalUnlock(wndPtr
->hProp
);
69 if (lpProp
->lpNextProp
== NULL
) break;
70 lpProp
= lpProp
->lpNextProp
;
72 GlobalUnlock(wndPtr
->hProp
);
73 dprintf_prop(stddeb
, "RemoveProp // Property not found !\n");
78 /*************************************************************************
81 HANDLE
GetProp(HWND hWnd
, LPSTR lpStr
)
85 if (((DWORD
)lpStr
& 0xFFFF0000) == 0L)
86 dprintf_prop(stddeb
, "GetProp(%04X, Atom %04X)\n", hWnd
, LOWORD((DWORD
)lpStr
));
88 dprintf_prop(stddeb
, "GetProp(%04X, '%s')\n", hWnd
, lpStr
);
89 wndPtr
= WIN_FindWndPtr(hWnd
);
91 printf("GetProp // Bad Window handle !\n");
94 lpProp
= (LPPROPENTRY
) GlobalLock(wndPtr
->hProp
);
96 dprintf_prop(stddeb
, "Property List Empty !\n");
100 if ((((DWORD
)lpStr
& 0xFFFF0000) == 0L &&
101 lpProp
->Atom
== LOWORD((DWORD
)lpStr
)) ||
102 (((DWORD
)lpStr
& 0xFFFF0000) != 0L &&
103 lpProp
->PropName
!= NULL
&&
104 strcmp(lpProp
->PropName
, lpStr
) == 0)) {
105 dprintf_prop(stddeb
, "GetProp // Property found ! hData=%04X\n", lpProp
->hData
);
106 GlobalUnlock(wndPtr
->hProp
);
107 return lpProp
->hData
;
109 if (lpProp
->lpNextProp
== NULL
) break;
110 lpProp
= lpProp
->lpNextProp
;
112 dprintf_prop(stddeb
, "GetProp // Property not found !\n");
113 GlobalUnlock(wndPtr
->hProp
);
118 /*************************************************************************
121 BOOL
SetProp(HWND hWnd
, LPSTR lpStr
, HANDLE hData
)
125 LPPROPENTRY lpNewProp
;
127 if (((DWORD
)lpStr
& 0xFFFF0000) == 0L)
128 dprintf_prop(stddeb
, "SetProp(%04X, Atom %04X, %04X)\n",
129 hWnd
, LOWORD((DWORD
)lpStr
), hData
);
131 dprintf_prop(stddeb
, "SetProp(%04X, '%s', %04X)\n", hWnd
, lpStr
, hData
);
132 wndPtr
= WIN_FindWndPtr(hWnd
);
133 if (wndPtr
== NULL
) {
134 printf("SetProp // Bad Window handle !\n");
137 lpProp
= (LPPROPENTRY
) GlobalLock(wndPtr
->hProp
);
138 if (lpProp
!= NULL
) {
140 if ((((DWORD
)lpStr
& 0xFFFF0000) == 0L &&
141 lpProp
->Atom
== LOWORD((DWORD
)lpStr
)) ||
142 (((DWORD
)lpStr
& 0xFFFF0000) != 0L &&
143 lpProp
->PropName
!= NULL
&&
144 strcmp(lpProp
->PropName
, lpStr
) == 0)) {
145 dprintf_prop(stddeb
, "SetProp // change already exinsting property !\n");
146 lpProp
->hData
= hData
;
147 GlobalUnlock(wndPtr
->hProp
);
150 if (lpProp
->lpNextProp
== NULL
) break;
151 lpProp
= lpProp
->lpNextProp
;
154 hNewProp
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(PROPENTRY
));
155 lpNewProp
= (LPPROPENTRY
) GlobalLock(hNewProp
);
156 if (lpNewProp
== NULL
) {
157 printf("SetProp // Can't allocate Property entry !\n");
158 GlobalUnlock(wndPtr
->hProp
);
161 dprintf_prop(stddeb
, "SetProp // entry allocated %08X\n",
162 (unsigned int) lpNewProp
);
163 if (lpProp
== NULL
) {
164 wndPtr
->hProp
= hNewProp
;
165 lpNewProp
->lpPrevProp
= NULL
;
166 dprintf_prop(stddeb
, "SetProp // first entry \n");
169 lpProp
->lpNextProp
= lpNewProp
;
170 lpNewProp
->lpPrevProp
= lpProp
;
172 lpNewProp
->lpNextProp
= NULL
;
173 lpNewProp
->hData
= hData
;
174 if (((DWORD
)lpStr
& 0xFFFF0000) == 0L) {
175 lpNewProp
->PropName
= NULL
;
176 lpNewProp
->Atom
= LOWORD((DWORD
)lpStr
);
180 lpNewProp
->PropName
= malloc(strlen(lpStr
) + 1);
181 if (lpNewProp
->PropName
== NULL
) {
182 printf("SetProp // Can't allocate memory for Property Name !\n");
183 GlobalUnlock(wndPtr
->hProp
);
186 strcpy(lpNewProp
->PropName
, lpStr
);
188 GlobalUnlock(hNewProp
);
189 GlobalUnlock(wndPtr
->hProp
);
194 /*************************************************************************
195 * EnumProps [USER.27]
197 int EnumProps(HWND hWnd
, FARPROC lpEnumFunc
)
203 printf("EnumProps(%04X, %08X)\n", hWnd
, (unsigned int) lpEnumFunc
);
204 wndPtr
= WIN_FindWndPtr(hWnd
);
205 if (wndPtr
== NULL
) {
206 printf("EnumProps // Bad Window handle !\n");
209 lpProp
= (LPPROPENTRY
) GlobalLock(wndPtr
->hProp
);
210 if (lpProp
== NULL
) {
211 printf("Property List Empty !\n");
214 if (lpEnumFunc
== NULL
) return 0;
216 printf("EnumProps // lpProp->Atom=%04X !\n", lpProp
->Atom
);
217 str
= (LPSTR
)MAKELONG(lpProp
->Atom
, 0);
218 if (lpProp
->PropName
!= NULL
) {
219 printf("EnumProps // lpProp->PropName='%s' !\n", lpProp
->PropName
);
220 str
= lpProp
->PropName
;
223 nRet
= (*lpEnumFunc
)((HWND
)hWnd
, (WORD
)0,
224 (LPSTR
)str
, (HANDLE
)lpProp
->hData
);
226 nRet
= CallBack16(lpEnumFunc
, 3,
227 CALLBACK_SIZE_WORD
, (HWND
)hWnd
,
228 CALLBACK_SIZE_LONG
, (LPSTR
)str
,
229 CALLBACK_SIZE_WORD
, (HANDLE
)lpProp
->hData
);
231 if (nRet
== 0) break;
232 if (lpProp
->lpNextProp
== NULL
) break;
233 lpProp
= lpProp
->lpNextProp
;
235 GlobalUnlock(wndPtr
->hProp
);