2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
15 #include <WINNT/afsapplib.h>
19 * DEFINITIONS ________________________________________________________________
23 #define cREALLOC_MODELESS 16
24 #define cREALLOC_WINDOWDATA_FIELDS 4
25 #define cREALLOC_WINDOWDATA_WINDOWS 16
26 #define cREALLOC_WINDOWDATA_DATA 8
28 #define GWD_IS_MODELESS TEXT("afsapplib/al_pump.cpp - is window modeless?")
32 * VARIABLES __________________________________________________________________
36 // Modeless-dialog support
38 static HWND *aModeless = NULL;
39 static size_t cModeless = 0;
40 static LPCRITICAL_SECTION pcsPump = NULL;
42 static void (*g_fnPump)(MSG *lpm) = NULL;
44 // Window-data support
48 TCHAR szField[ cchNAME ];
50 static size_t cFields = 0;
58 static size_t cWindows = 0;
59 static LPCRITICAL_SECTION pcsData = NULL;
63 * DIALOG ROUTINES ____________________________________________________________
67 BOOL CALLBACK Modeless_HookProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
69 PVOID oldProc = Subclass_FindNextHook (hDlg, Modeless_HookProc);
71 if (msg == WM_DESTROY)
73 EnterCriticalSection (pcsPump);
74 for (size_t ii = 0; ii < cModeless; ++ii)
76 if (aModeless[ ii ] == hDlg)
79 LeaveCriticalSection (pcsPump);
80 Subclass_RemoveHook (hDlg, Modeless_HookProc);
84 return CallWindowProc ((WNDPROC)oldProc, hDlg, msg, wp, lp);
86 return DefWindowProc (hDlg, msg, wp, lp);
90 BOOL AfsAppLib_IsModelessDialogMessage (MSG *lpm)
96 EnterCriticalSection (pcsPump);
98 for (size_t ii = 0; (!rc) && (ii < cModeless); ++ii)
100 if (aModeless[ ii ] != 0)
102 if (IsPropSheet (aModeless[ ii ]))
104 if (!PropSheet_GetCurrentPageHwnd(aModeless[ ii ]))
105 DestroyWindow (aModeless[ ii ]);
106 if (PropSheet_IsDialogMessage(aModeless[ ii ], lpm))
111 if (IsDialogMessage (aModeless[ ii ], lpm))
117 LeaveCriticalSection (pcsPump);
124 void AfsAppLib_RegisterModelessDialog (HWND hDlg)
128 pcsPump = New (CRITICAL_SECTION);
129 InitializeCriticalSection (pcsPump);
132 EnterCriticalSection (pcsPump);
135 for (ii = 0; ii < cModeless; ++ii)
137 if (aModeless[ ii ] == hDlg)
142 for (ii = 0; ii < cModeless; ++ii)
144 if (aModeless[ ii ] == 0)
149 (void)REALLOC (aModeless, cModeless, 1+ii, cREALLOC_MODELESS);
153 aModeless[ ii ] = hDlg;
154 Subclass_AddHook (hDlg, Modeless_HookProc);
158 LeaveCriticalSection (pcsPump);
162 void AfsAppLib_SetPumpRoutine (void (*fnPump)(MSG *lpm))
168 void AfsAppLib_MainPump (void)
172 while (GetMessage (&msg, NULL, 0, 0))
174 if (AfsAppLib_IsModelessDialogMessage (&msg))
181 TranslateMessage (&msg);
182 DispatchMessage (&msg);
189 * WINDOW-DATA ________________________________________________________________
193 BOOL CALLBACK WindowData_HookProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
195 PVOID oldProc = Subclass_FindNextHook (hWnd, WindowData_HookProc);
197 if (msg == WM_DESTROY)
199 EnterCriticalSection (pcsData);
200 for (size_t ii = 0; ii < cWindows; ++ii)
202 if (aWindows[ ii ].hWnd == hWnd)
204 if (aWindows[ ii ].adwData)
205 Free (aWindows[ ii ].adwData);
206 memset (&aWindows[ii], 0x00, sizeof(aWindows[ii]));
209 LeaveCriticalSection (pcsData);
210 Subclass_RemoveHook (hWnd, WindowData_HookProc);
214 return CallWindowProc ((WNDPROC)oldProc, hWnd, msg, wp, lp);
216 return DefWindowProc (hWnd, msg, wp, lp);
220 size_t GetWindowDataField (LPTSTR pszField)
222 size_t rc = (size_t)-1;
226 pcsData = New (CRITICAL_SECTION);
227 InitializeCriticalSection (pcsData);
229 EnterCriticalSection (pcsData);
232 for (ii = 0; ii < cFields; ++ii)
234 if (!lstrcmpi (aFields[ ii ].szField, pszField))
239 for (ii = 0; ii < cFields; ++ii)
241 if (aFields[ ii ].szField[0] == TEXT('\0'))
246 (void)REALLOC (aFields, cFields, 1+ii, cREALLOC_WINDOWDATA_FIELDS);
250 lstrcpy (aFields[ ii ].szField, pszField);
258 LeaveCriticalSection (pcsData);
263 DWORD GetWindowData (HWND hWnd, LPTSTR pszField)
269 pcsData = New (CRITICAL_SECTION);
270 InitializeCriticalSection (pcsData);
272 EnterCriticalSection (pcsData);
275 if ((iField = GetWindowDataField (pszField)) != (size_t)-1)
277 for (size_t ii = 0; ii < cWindows; ++ii)
279 if (aWindows[ ii ].hWnd == hWnd)
281 if (iField < aWindows[ ii ].cdwData)
282 rc = aWindows[ ii ].adwData[ iField ];
288 LeaveCriticalSection (pcsData);
293 DWORD SetWindowData (HWND hWnd, LPTSTR pszField, DWORD dwNewData)
299 pcsData = New (CRITICAL_SECTION);
300 InitializeCriticalSection (pcsData);
302 EnterCriticalSection (pcsData);
305 if ((iField = GetWindowDataField (pszField)) != (size_t)-1)
308 for (ii = 0; ii < cWindows; ++ii)
310 if (aWindows[ ii ].hWnd == hWnd)
312 if (iField < aWindows[ ii ].cdwData)
313 rc = aWindows[ ii ].adwData[ iField ];
319 for (ii = 0; ii < cWindows; ++ii)
321 if (aWindows[ ii ].hWnd == 0)
326 (void)REALLOC (aWindows, cWindows, 1+ii, cREALLOC_WINDOWDATA_WINDOWS);
331 if (aWindows[ ii ].hWnd == 0)
333 aWindows[ ii ].hWnd = hWnd;
334 Subclass_AddHook (hWnd, WindowData_HookProc);
336 if ((dwNewData) && (iField >= aWindows[ ii ].cdwData))
338 (void)REALLOC (aWindows[ ii ].adwData, aWindows[ ii ].cdwData, 1+iField, cREALLOC_WINDOWDATA_DATA);
340 if (iField < aWindows[ ii ].cdwData)
342 aWindows[ ii ].adwData[ iField ] = dwNewData;
347 LeaveCriticalSection (pcsData);