/*********************************************************************** * UXTHEME_SetActiveTheme * * Change the current active theme */ static HRESULT UXTHEME_SetActiveTheme(PTHEME_FILE tf) { HKEY hKey; WCHAR tmp[2]; HRESULT hr; if(tf && !bThemeActive) UXTHEME_BackupSystemMetrics(); hr = MSSTYLES_SetActiveTheme(tf, TRUE); if(FAILED(hr)) return hr; if(tf) { bThemeActive = TRUE; lstrcpynW(szCurrentTheme, tf->szThemeFile, sizeof(szCurrentTheme)/sizeof(szCurrentTheme[0])); lstrcpynW(szCurrentColor, tf->pszSelectedColor, sizeof(szCurrentColor)/sizeof(szCurrentColor[0])); lstrcpynW(szCurrentSize, tf->pszSelectedSize, sizeof(szCurrentSize)/sizeof(szCurrentSize[0])); } else { UXTHEME_RestoreSystemMetrics(); bThemeActive = FALSE; szCurrentTheme[0] = '\0'; szCurrentColor[0] = '\0'; szCurrentSize[0] = '\0'; } TRACE("Writing theme config to registry\n"); if(!RegCreateKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { tmp[0] = bThemeActive?'1':'0'; tmp[1] = '\0'; RegSetValueExW(hKey, szThemeActive, 0, REG_SZ, (const BYTE*)tmp, sizeof(WCHAR)*2); if(bThemeActive) { RegSetValueExW(hKey, szColorName, 0, REG_SZ, (const BYTE*)szCurrentColor, (lstrlenW(szCurrentColor)+1)*sizeof(WCHAR)); RegSetValueExW(hKey, szSizeName, 0, REG_SZ, (const BYTE*)szCurrentSize, (lstrlenW(szCurrentSize)+1)*sizeof(WCHAR)); RegSetValueExW(hKey, szDllName, 0, REG_SZ, (const BYTE*)szCurrentTheme, (lstrlenW(szCurrentTheme)+1)*sizeof(WCHAR)); } else { RegDeleteValueW(hKey, szColorName); RegDeleteValueW(hKey, szSizeName); RegDeleteValueW(hKey, szDllName); } RegCloseKey(hKey); } else TRACE("Failed to open theme registry key\n"); UXTHEME_SaveSystemMetrics (); return hr; }
/*********************************************************************** * UXTHEME_ApplyTheme * * Change the current active theme */ static HRESULT UXTHEME_ApplyTheme(PTHEME_FILE tf) { HKEY hKey; WCHAR tmp[2]; HRESULT hr; TRACE("UXTHEME_ApplyTheme\n"); if (tf && !ActiveThemeFile) { UXTHEME_BackupSystemMetrics(); } hr = UXTHEME_SetActiveTheme(tf); if (FAILED(hr)) return hr; if (!tf) { UXTHEME_RestoreSystemMetrics(); } TRACE("Writing theme config to registry\n"); if(!RegCreateKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { tmp[0] = ActiveThemeFile?'1':'0'; tmp[1] = '\0'; RegSetValueExW(hKey, szThemeActive, 0, REG_SZ, (const BYTE*)tmp, sizeof(WCHAR)*2); if (ActiveThemeFile) { RegSetValueExW(hKey, szColorName, 0, REG_SZ, (const BYTE*)tf->pszSelectedColor, (lstrlenW(tf->pszSelectedColor)+1)*sizeof(WCHAR)); RegSetValueExW(hKey, szSizeName, 0, REG_SZ, (const BYTE*)tf->pszSelectedSize, (lstrlenW(tf->pszSelectedSize)+1)*sizeof(WCHAR)); RegSetValueExW(hKey, szDllName, 0, REG_SZ, (const BYTE*)tf->szThemeFile, (lstrlenW(tf->szThemeFile)+1)*sizeof(WCHAR)); } else { RegDeleteValueW(hKey, szColorName); RegDeleteValueW(hKey, szSizeName); RegDeleteValueW(hKey, szDllName); } RegCloseKey(hKey); } else TRACE("Failed to open theme registry key\n"); UXTHEME_SaveSystemMetrics (); return hr; }
/*********************************************************************** * EnableTheming (UXTHEME.@) * * NOTES * This is a global and persistent change */ HRESULT WINAPI EnableTheming(BOOL fEnable) { HKEY hKey; WCHAR szEnabled[] = {'0','\0'}; TRACE("(%d)\n", fEnable); if (fEnable != (ActiveThemeFile != NULL)) { if(fEnable) UXTHEME_BackupSystemMetrics(); else UXTHEME_RestoreSystemMetrics(); UXTHEME_SaveSystemMetrics (); if (fEnable) szEnabled[0] = '1'; if(!RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { RegSetValueExW(hKey, szThemeActive, 0, REG_SZ, (LPBYTE)szEnabled, sizeof(WCHAR)); RegCloseKey(hKey); } UXTHEME_broadcast_msg (NULL, WM_THEMECHANGED); } return S_OK; }