/* * ie4 - IE4 settings */ #include "tweakui.h" #include #include #include #pragma BEGIN_CONST_DATA KL const c_klSingleClick = {&g_hkCUSMWCV, c_tszExplorerAdvanced, c_tszUseDoubleClickTimer }; const static DWORD CODESEG rgdwHelp[] = { IDC_SETTINGSGROUP, IDH_GROUP, IDC_LISTVIEW, IDH_IE4LV, 0, 0, }; #pragma END_CONST_DATA /***************************************************************************** * * IE4_GetDword * * Read a DWORD somewhere. * * Always returns exactly 0 or 1. * *****************************************************************************/ BOOL PASCAL IE4_GetDword(LPARAM lParam, LPVOID pvRef) { PKL pkl = (PKL)lParam; return GetDwordPkl(pkl, TRUE) != 0; } /***************************************************************************** * * IE4_SetDword * * Save a DWORD somewhere. * * Always given exactly 0 or 1. * *****************************************************************************/ BOOL PASCAL IE4_SetDword(BOOL f, LPARAM lParam, LPVOID pvRef) { PKL pkl = (PKL)lParam; PBOOL pf = (PBOOL)pvRef; if (pf) { *pf = TRUE; } return SetDwordPkl(pkl, f); } /***************************************************************************** * * IE4_GetRest * * Read a restriction. The first character of the restriction is * `+' if it is positive sense. All restrictions default to 0. * * Always returns exactly 0 or 1. * *****************************************************************************/ BOOL PASCAL IE4_GetRest(LPARAM lParam, LPVOID pvRef) { LPCTSTR ptszRest = (LPCTSTR)lParam; if (ptszRest[0] == TEXT('+')) { return !GetRestriction(ptszRest+1); } else { return GetRestriction(ptszRest); } } /***************************************************************************** * * IE4_GetRest4 * * Just like IE4_GetRest, except fails if shell version 5 or better. * *****************************************************************************/ BOOL PASCAL IE4_GetRest4(LPARAM lParam, LPVOID pvRef) { if (g_fShell5) { return -1; } else { return IE4_GetRest(lParam, pvRef); } } /***************************************************************************** * * IE4_GetRest5 * * Just like IE4_GetRest, except requires shell version 5 or better. * *****************************************************************************/ BOOL PASCAL IE4_GetRest5(LPARAM lParam, LPVOID pvRef) { if (g_fShell5) { return IE4_GetRest(lParam, pvRef); } else { return -1; } } /***************************************************************************** * * IE4_GetRest55 * * Just like IE4_GetRest, except requires shell version 5.5 or better. * *****************************************************************************/ BOOL PASCAL IE4_GetRest55(LPARAM lParam, LPVOID pvRef) { if (g_fShell55) { return IE4_GetRest(lParam, pvRef); } else { return -1; } } /***************************************************************************** * * HasComputersNearMe * * See if "Computers Near Me" is enabled. * * Shell 4 or lower: Disabled. * * Shell 5 on 9x: Enabled. * * Shell 5 on NT: Only if you are joined to a workgroup. * *****************************************************************************/ typedef NET_API_STATUS (CALLBACK *NETGETJOININFORMATION)(LPCWSTR, LPWSTR*, PNETSETUP_JOIN_STATUS); typedef NET_API_STATUS (CALLBACK *NETAPIBUFFERFREE)(LPVOID); BOOL s_bHasComputersNearMe = -1; BOOL PASCAL HasComputersNearMe(void) { if (!g_fShell5) { return FALSE; } if (!g_fNT) { return TRUE; } if (s_bHasComputersNearMe < 0) { NETSETUP_JOIN_STATUS nsjs = NetSetupUnknownStatus; HINSTANCE hinst = LoadLibrary("netapi32.dll"); if (hinst) { NETGETJOININFORMATION _NetGetJoinInformation = (NETGETJOININFORMATION)GetProcAddress(hinst, "NetGetJoinInformation"); NETAPIBUFFERFREE _NetApiBufferFree = (NETAPIBUFFERFREE)GetProcAddress(hinst, "NetApiBufferFree"); if (_NetGetJoinInformation && _NetApiBufferFree) { LPWSTR pszDomain; if (_NetGetJoinInformation(NULL, &pszDomain, &nsjs) == NERR_Success) { _NetApiBufferFree(pszDomain); } } FreeLibrary(hinst); } s_bHasComputersNearMe = (nsjs == NetSetupWorkgroupName); } return s_bHasComputersNearMe; } /***************************************************************************** * * IE4_GetRestCNM * * Special function just for "Computers Near Me". * *****************************************************************************/ BOOL PASCAL IE4_GetRestCNM(LPARAM lParam, LPVOID pvRef) { if (HasComputersNearMe()) { return IE4_GetRest(lParam, pvRef); } else { return -1; } } /***************************************************************************** * * IE4_SetRest * * Set the new restriction setting. * * The first character of the restriction is * `+' if it is positive sense. * *****************************************************************************/ BOOL PASCAL IE4_SetRest(BOOL f, LPARAM lParam, LPVOID pvRef) { LPCTSTR ptszRest = (LPCTSTR)lParam; PBOOL pf = (PBOOL)pvRef; if (pf) { *pf = ptszRest ? TRUE : FALSE; } if (ptszRest[0] == TEXT('+')) { f = !f; ptszRest++; } return SetRestriction(ptszRest, f); } /***************************************************************************** * * IE4_GetLinksFolderName * *****************************************************************************/ KL const c_klLinksFolder = {&g_hkCUSMIE, TEXT("Toolbar"), TEXT("LinksFolderName") }; KL const c_klLinksFolder2= {&g_hkLMSMWCV, NULL, TEXT("LinksFolderName") }; BOOL PASCAL IE4_GetLinksFolderName(LPTSTR pszBuf, UINT cchBuf) { PIDL pidl; BOOL fRc = FALSE; if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidl))) { if (SHGetPathFromIDList(pidl, pszBuf)) { /* * Find the name of the links folder underneath Favorites. */ TCHAR szLinks[MAX_PATH]; if (!GetStrPkl(szLinks, sizeof(szLinks), &c_klLinksFolder) && !GetStrPkl(szLinks, sizeof(szLinks), &c_klLinksFolder2)) { lstrcpy(szLinks, TEXT("Links")); } Path_Append(pszBuf, szLinks); fRc = TRUE; } Ole_Free(pidl); } return fRc; } /***************************************************************************** * * IE4_GetFavLink * * Say whether the Favorites\Links directory is hidden. * * -1 = No links directory at all * 0 = Links is hidden * 1 = Links is visible * *****************************************************************************/ BOOL PASCAL IE4_GetFavLink(LPARAM lParam, LPVOID pvRef) { BOOL fRc = -1; TCHAR szFavLink[MAX_PATH]; if (IE4_GetLinksFolderName(szFavLink, cA(szFavLink))) { DWORD dwAttrib = GetFileAttributes(szFavLink); if (dwAttrib != 0xFFFFFFFF) { fRc = !(dwAttrib & FILE_ATTRIBUTE_HIDDEN); } } return fRc; } /***************************************************************************** * * IE4_SetFavLink * * 0 = Make links hidden * 1 = Make links visible * *****************************************************************************/ BOOL PASCAL IE4_SetFavLink(BOOL f, LPARAM lParam, LPVOID pvRef) { BOOL fRc = FALSE; PBOOL pf = (PBOOL)pvRef; TCHAR szFavLink[MAX_PATH]; if (IE4_GetLinksFolderName(szFavLink, cA(szFavLink))) { DWORD dwAttrib = GetFileAttributes(szFavLink); if (dwAttrib != 0xFFFFFFFF) { dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN; if (!f) dwAttrib |= FILE_ATTRIBUTE_HIDDEN; if (SetFileAttributes(szFavLink, dwAttrib)) { fRc = TRUE; *pf = TRUE; } } } return fRc; } /* * Note that this needs to be in sync with the IDS_IE4 strings. */ CHECKLISTITEM c_rgcliIE4[] = { #ifdef NOINTERNET_WORKS // WARNING! If you turn this on, make sure to renumber the IDS_IE4 // strings and fix IE4_OnWhatsThis { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoInternetIcon, }, #endif { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoRecentDocsHistory, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoRecentDocsMenu, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoActiveDesktop, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoActiveDesktopChanges,}, /* * Sigh. Shell5 changed the restriction key for NoFavoritesMenu. * Fortunately, it's in the UI so I don't need to expose it any more. */ { IE4_GetRest4, IE4_SetRest, (LPARAM)c_tszNoFavoritesMenu, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszClearRecentDocsOnExit, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszClassicShell, }, { IE4_GetRest, IE4_SetRest, (LPARAM)c_tszNoLogoff, }, { IE4_GetDword, IE4_SetDword, (LPARAM)&c_klSingleClick, }, { IE4_GetFavLink, IE4_SetFavLink, 0, }, { IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoSMHelp"), }, { IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoControlPanel") }, { IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoNetworkConnections")}, { IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoWinKeys") }, { IE4_GetRestCNM,IE4_SetRest, (LPARAM)TEXT("NoComputersNearMe") }, { IE4_GetRest5, IE4_SetRest, (LPARAM)TEXT("NoSMMyDocs") }, { IE4_GetRest55,IE4_SetRest, (LPARAM)TEXT("NoSMMyPictures") }, }; /***************************************************************************** * * IE4_OnWhatsThis * *****************************************************************************/ void PASCAL IE4_OnWhatsThis(HWND hwnd, int iItem) { LV_ITEM lvi; Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM); WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP, IDH_ADDTODOCSMENU + lvi.lParam); } /***************************************************************************** * * IE4_OnCommand * * Ooh, we got a command. * *****************************************************************************/ void PASCAL IE4_OnCommand(HWND hdlg, int id, UINT codeNotify) { } /***************************************************************************** * * IE4_OnInitDialog * * Initialize the listview with the current restrictions. * *****************************************************************************/ BOOL PASCAL IE4_OnInitDialog(HWND hwnd) { #if 0 HWND hdlg = GetParent(hwnd); TCHAR tsz[MAX_PATH]; int dids; for (dids = 0; dids < cA(c_rgrest); dids++) { BOOL fState; #ifdef NOINTERNET_WORKS LoadString(hinstCur, IDS_IE4+dids, tsz, cA(tsz)); #else LoadString(hinstCur, IDS_IE4+1+dids, tsz, cA(tsz)); #endif fState = GetRestriction(c_rgrest[dids].ptsz); LV_AddItem(hwnd, dids, tsz, -1, fState); } #endif #ifdef NOINTERNET_WORKS Checklist_OnInitDialog(hwnd, c_rgcliIE4, cA(c_rgcliIE4), IDS_IE4, 0); #else Checklist_OnInitDialog(hwnd, c_rgcliIE4, cA(c_rgcliIE4), IDS_IE4+1, 0); #endif return 1; } /***************************************************************************** * * IE4_OnApply * *****************************************************************************/ void PASCAL IE4_OnApply(HWND hdlg) { BOOL fChanged = FALSE; Checklist_OnApply(hdlg, c_rgcliIE4, &fChanged, FALSE); if (fChanged) { PIDL pidl; /* * Tell the shell that we changed the policies. */ SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)c_tszIE4RegKeyChange); /* * Tickle the Start Menu folder to force the Start Menu * to rebuild with the new policies in effect. */ if (SUCCEEDED(SHGetSpecialFolderLocation(hdlg, CSIDL_STARTMENU, &pidl))) { SHChangeNotify(SHCNE_UPDATEDIR, SHCNF_IDLIST, pidl, 0); Ole_Free(pidl); } } } /***************************************************************************** * * Oh yeah, we need this too. * *****************************************************************************/ #pragma BEGIN_CONST_DATA LVCI lvciIE4[] = { { IDC_WHATSTHIS, IE4_OnWhatsThis }, { 0, 0 }, }; LVV lvvIE4 = { IE4_OnCommand, 0, /* IE4_OnInitContextMenu */ 0, /* IE4_Dirtify */ 0, /* IE4_GetIcon */ IE4_OnInitDialog, IE4_OnApply, 0, /* IE4_OnDestroy */ 0, /* IE4_OnSelChange */ 6, /* iMenu */ rgdwHelp, 0, /* Double-click action */ lvvflCanCheck, /* We need check boxes */ lvciIE4, }; #pragma END_CONST_DATA /***************************************************************************** * * Our window procedure. * *****************************************************************************/ INT_PTR EXPORT IE4_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam) { return LV_DlgProc(&lvvIE4, hdlg, wm, wParam, lParam); }