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", lpNewProp
);
162 if (lpProp
== NULL
) {
163 wndPtr
->hProp
= hNewProp
;
164 lpNewProp
->lpPrevProp
= NULL
;
165 dprintf_prop(stddeb
, "SetProp // first entry \n");
168 lpProp
->lpNextProp
= lpNewProp
;
169 lpNewProp
->lpPrevProp
= lpProp
;
171 lpNewProp
->lpNextProp
= NULL
;
172 lpNewProp
->hData
= hData
;
173 if (((DWORD
)lpStr
& 0xFFFF0000) == 0L) {
174 lpNewProp
->PropName
= NULL
;
175 lpNewProp
->Atom
= LOWORD((DWORD
)lpStr
);
179 lpNewProp
->PropName
= malloc(strlen(lpStr
) + 1);
180 if (lpNewProp
->PropName
== NULL
) {
181 printf("SetProp // Can't allocate memory for Property Name !\n");
182 GlobalUnlock(wndPtr
->hProp
);
185 strcpy(lpNewProp
->PropName
, lpStr
);
187 GlobalUnlock(hNewProp
);
188 GlobalUnlock(wndPtr
->hProp
);
193 /*************************************************************************
194 * EnumProps [USER.27]
196 int EnumProps(HWND hWnd
, FARPROC lpEnumFunc
)
202 printf("EnumProps(%04X, %08X)\n", hWnd
, lpEnumFunc
);
203 wndPtr
= WIN_FindWndPtr(hWnd
);
204 if (wndPtr
== NULL
) {
205 printf("EnumProps // Bad Window handle !\n");
208 lpProp
= (LPPROPENTRY
) GlobalLock(wndPtr
->hProp
);
209 if (lpProp
== NULL
) {
210 printf("Property List Empty !\n");
213 if (lpEnumFunc
== NULL
) return 0;
215 printf("EnumProps // lpProp->Atom=%04X !\n", lpProp
->Atom
);
216 str
= (LPSTR
)MAKELONG(lpProp
->Atom
, 0);
217 if (lpProp
->PropName
!= NULL
) {
218 printf("EnumProps // lpProp->PropName='%s' !\n", lpProp
->PropName
);
219 str
= lpProp
->PropName
;
222 nRet
= (*lpEnumFunc
)((HWND
)hWnd
, (WORD
)0,
223 (LPSTR
)str
, (HANDLE
)lpProp
->hData
);
225 nRet
= CallBack16(lpEnumFunc
, 3,
226 CALLBACK_SIZE_WORD
, (HWND
)hWnd
,
227 CALLBACK_SIZE_LONG
, (LPSTR
)str
,
228 CALLBACK_SIZE_WORD
, (HANDLE
)lpProp
->hData
);
230 if (nRet
== 0) break;
231 if (lpProp
->lpNextProp
== NULL
) break;
232 lpProp
= lpProp
->lpNextProp
;
234 GlobalUnlock(wndPtr
->hProp
);