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);
134 for (size_t ii = 0; ii < cModeless; ++ii)
136 if (aModeless[ ii ] == hDlg)
141 for (ii = 0; ii < cModeless; ++ii)
143 if (aModeless[ ii ] == 0)
148 (void)REALLOC (aModeless, cModeless, 1+ii, cREALLOC_MODELESS);
152 aModeless[ ii ] = hDlg;
153 Subclass_AddHook (hDlg, Modeless_HookProc);
157 LeaveCriticalSection (pcsPump);
161 void AfsAppLib_SetPumpRoutine (void (*fnPump)(MSG *lpm))
167 void AfsAppLib_MainPump (void)
171 while (GetMessage (&msg, NULL, 0, 0))
173 if (AfsAppLib_IsModelessDialogMessage (&msg))
180 TranslateMessage (&msg);
181 DispatchMessage (&msg);
188 * WINDOW-DATA ________________________________________________________________
192 BOOL CALLBACK WindowData_HookProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
194 PVOID oldProc = Subclass_FindNextHook (hWnd, WindowData_HookProc);
196 if (msg == WM_DESTROY)
198 EnterCriticalSection (pcsData);
199 for (size_t ii = 0; ii < cWindows; ++ii)
201 if (aWindows[ ii ].hWnd == hWnd)
203 if (aWindows[ ii ].adwData)
204 Free (aWindows[ ii ].adwData);
205 memset (&aWindows[ii], 0x00, sizeof(aWindows[ii]));
208 LeaveCriticalSection (pcsData);
209 Subclass_RemoveHook (hWnd, WindowData_HookProc);
213 return CallWindowProc ((WNDPROC)oldProc, hWnd, msg, wp, lp);
215 return DefWindowProc (hWnd, msg, wp, lp);
219 size_t GetWindowDataField (LPTSTR pszField)
221 size_t rc = (size_t)-1;
225 pcsData = New (CRITICAL_SECTION);
226 InitializeCriticalSection (pcsData);
228 EnterCriticalSection (pcsData);
230 for (size_t ii = 0; ii < cFields; ++ii)
232 if (!lstrcmpi (aFields[ ii ].szField, pszField))
237 for (ii = 0; ii < cFields; ++ii)
239 if (aFields[ ii ].szField[0] == TEXT('\0'))
244 (void)REALLOC (aFields, cFields, 1+ii, cREALLOC_WINDOWDATA_FIELDS);
248 lstrcpy (aFields[ ii ].szField, pszField);
256 LeaveCriticalSection (pcsData);
261 DWORD GetWindowData (HWND hWnd, LPTSTR pszField)
267 pcsData = New (CRITICAL_SECTION);
268 InitializeCriticalSection (pcsData);
270 EnterCriticalSection (pcsData);
273 if ((iField = GetWindowDataField (pszField)) != (size_t)-1)
275 for (size_t ii = 0; ii < cWindows; ++ii)
277 if (aWindows[ ii ].hWnd == hWnd)
279 if (iField < aWindows[ ii ].cdwData)
280 rc = aWindows[ ii ].adwData[ iField ];
286 LeaveCriticalSection (pcsData);
291 DWORD SetWindowData (HWND hWnd, LPTSTR pszField, DWORD dwNewData)
297 pcsData = New (CRITICAL_SECTION);
298 InitializeCriticalSection (pcsData);
300 EnterCriticalSection (pcsData);
303 if ((iField = GetWindowDataField (pszField)) != (size_t)-1)
305 for (size_t ii = 0; ii < cWindows; ++ii)
307 if (aWindows[ ii ].hWnd == hWnd)
309 if (iField < aWindows[ ii ].cdwData)
310 rc = aWindows[ ii ].adwData[ iField ];
316 for (ii = 0; ii < cWindows; ++ii)
318 if (aWindows[ ii ].hWnd == 0)
323 (void)REALLOC (aWindows, cWindows, 1+ii, cREALLOC_WINDOWDATA_WINDOWS);
328 if (aWindows[ ii ].hWnd == 0)
330 aWindows[ ii ].hWnd = hWnd;
331 Subclass_AddHook (hWnd, WindowData_HookProc);
333 if ((dwNewData) && (iField >= aWindows[ ii ].cdwData))
335 (void)REALLOC (aWindows[ ii ].adwData, aWindows[ ii ].cdwData, 1+iField, cREALLOC_WINDOWDATA_DATA);
337 if (iField < aWindows[ ii ].cdwData)
339 aWindows[ ii ].adwData[ iField ] = dwNewData;
344 LeaveCriticalSection (pcsData);