/****************************** Module Header ******************************\ * Module Name: notify.c * * Copyright (c) 1992, Microsoft Corporation * * Handles notification of key value changes in the registry that affect * the Program Manager. * * History: * 04-16-92 JohanneC Created. \***************************************************************************/ #include "progman.h" BOOL InHandleProgramGroupsEvent = FALSE; BOOL bHandleProgramGroupsEvent = TRUE; // // 2 watch events: common groups key & personal groups key // HANDLE gahEvents[2]; HANDLE hEventCommonGroups; HANDLE hEventPersGroups; HANDLE hEventGroupValueSet; HANDLE hChangeNotifyThread; /***************************************************************************\ * * * * History: * 04-16-91 Johannec Created \***************************************************************************/ BOOL APIENTRY InitializeGroupKeyNotification() { hEventCommonGroups = CreateEvent(NULL, FALSE, FALSE, NULL); hEventPersGroups = CreateEvent(NULL, FALSE, FALSE, NULL); hEventGroupValueSet = CreateEvent(NULL, FALSE, FALSE, TEXT(" Progman.GroupValueSet")); gahEvents[0] = hEventPersGroups; gahEvents[1] = hEventCommonGroups; if (hEventPersGroups && hkeyProgramGroups) { RegNotifyChangeKeyValue(hkeyProgramGroups, TRUE, REG_NOTIFY_CHANGE_NAME, hEventPersGroups, TRUE); } if (hEventCommonGroups && hkeyCommonGroups) { RegNotifyChangeKeyValue(hkeyCommonGroups, TRUE, REG_NOTIFY_CHANGE_NAME, hEventCommonGroups, TRUE); } if (!hEventCommonGroups && !hEventPersGroups) { return(FALSE); } return(TRUE); } VOID APIENTRY ResetProgramGroupsEvent(BOOL bCommonGroup) { if (bCommonGroup) { if (hEventCommonGroups && hkeyCommonGroups) { ResetEvent(hEventCommonGroups); RegNotifyChangeKeyValue(hkeyCommonGroups, TRUE, REG_NOTIFY_CHANGE_NAME, hEventCommonGroups, TRUE); } } else { if (hEventPersGroups && hkeyProgramGroups) { ResetEvent(hEventPersGroups); RegNotifyChangeKeyValue(hkeyProgramGroups, TRUE, REG_NOTIFY_CHANGE_NAME, hEventPersGroups, TRUE); } } } /***************************************************************************\ * * * * * History: * 04-16-91 Johannec Created \***************************************************************************/ VOID HandleGroupKeyChange(BOOL bCommonGroup) { int i = 0; DWORD cbGroupKey = MAXKEYLEN; TCHAR szGroupKey[MAXKEYLEN]; FILETIME ft; HWND hwndT; PGROUP pGroup; PGROUP *ppGroup; PITEM pItem; HKEY hkeyGroups; HKEY hkey; TCHAR szT[10]; if (InHandleProgramGroupsEvent || !bHandleProgramGroupsEvent) { goto RegNotify; } InHandleProgramGroupsEvent = TRUE; if (bCommonGroup) { hkeyGroups = hkeyCommonGroups; } else { hkeyGroups = hkeyProgramGroups; } while (!RegEnumKeyEx(hkeyGroups, i, szGroupKey, &cbGroupKey, 0, 0, 0, &ft)) { if (cbGroupKey) { /* Search for the group... if it already exists, activate it. */ hwndT = GetWindow(hwndMDIClient, GW_CHILD); while (hwndT) { /* Skip icon titles. */ if (!GetWindow(hwndT, GW_OWNER)) { /* Compare the group title with the request. */ pGroup = (PGROUP)GetWindowLongPtr(hwndT,GWLP_PGROUP); if (!lstrcmpi(szGroupKey, pGroup->lpKey)) { if (pGroup->fCommon && bCommonGroup || !pGroup->fCommon && !bCommonGroup) break; } } hwndT = GetWindow(hwndT, GW_HWNDNEXT); } /* If we didn't find it, load it. */ if (!hwndT) { // // Wait until the value is set before loading the group. // WaitForSingleObject(hEventGroupValueSet, 300); ResetEvent(hEventGroupValueSet); LoadGroupWindow(szGroupKey, 0, bCommonGroup); } } i++; cbGroupKey = MAXKEYLEN; } // // Test if any groups were deleted through regedt32.exe. // for (hwndT = GetWindow(hwndMDIClient, GW_CHILD); hwndT; hwndT = GetWindow(hwndT, GW_HWNDNEXT)) { /* Skip icon titles. */ if (GetWindow(hwndT, GW_OWNER)) continue; /* Compare the group title with the request. */ pGroup = (PGROUP)GetWindowLongPtr(hwndT, GWLP_PGROUP); if ( (pGroup->fCommon && !bCommonGroup) || (!pGroup->fCommon && bCommonGroup) ) { continue; } if (RegOpenKey(hkeyGroups, pGroup->lpKey, &hkey) == ERROR_SUCCESS) { RegCloseKey(hkey); } else { // // Couldn't find the group in the registry so delete it // in progman. // /* Destroy the window, the global memory block, and the file. */ SendMessage(hwndMDIClient, WM_MDIDESTROY, (WPARAM)hwndT, 0L); NukeIconBitmap(pGroup); GlobalFree(pGroup->hGroup); if (!bCommonGroup) { // // Remove the program manager's settings for that personal group. // wsprintf(szT,TEXT("Group%d"),pGroup->wIndex); RegDeleteValue(hkeyPMGroups, szT); } /* Unlink the group structure. */ for (ppGroup=&pFirstGroup; *ppGroup && *ppGroup != pGroup; ppGroup = &(*ppGroup)->pNext) ; if (*ppGroup) *ppGroup = pGroup->pNext; if (pLastGroup == &pGroup->pNext) pLastGroup = ppGroup; /* Destroying the window should activate another one, but if it is the * last one, nothing will get activated, so to make sure punt the * current group pointer... */ if (pCurrentGroup == pGroup) pCurrentGroup = NULL; /* Lastly, toss out the group and item structures. */ while (pGroup->pItems) { pItem = pGroup->pItems; pGroup->pItems = pItem->pNext; LocalFree((HANDLE)pItem); } LocalFree((HANDLE)pGroup->lpKey); LocalFree((HANDLE)pGroup); if (!bCommonGroup) { // // Change the program manager's settings for that personal group. // WriteGroupsSection(); } } } RegNotify: ResetProgramGroupsEvent(bCommonGroup); InHandleProgramGroupsEvent = FALSE; }