/*********************************************************************** * GetThemeDocumentationProperty (UXTHEME.@) * * Try and retrieve the documentation property from string resources * if that fails, get it from the [documentation] section of themes.ini */ HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR pszThemeName, LPCWSTR pszPropertyName, LPWSTR pszValueBuff, int cchMaxValChars) { const WORD wDocToRes[] = { TMT_DISPLAYNAME,5000, TMT_TOOLTIP,5001, TMT_COMPANY,5002, TMT_AUTHOR,5003, TMT_COPYRIGHT,5004, TMT_URL,5005, TMT_VERSION,5006, TMT_DESCRIPTION,5007 }; PTHEME_FILE pt; HRESULT hr; unsigned int i; int iDocId; TRACE("(%s,%s,%p,%d)\n", debugstr_w(pszThemeName), debugstr_w(pszPropertyName), pszValueBuff, cchMaxValChars); hr = MSSTYLES_OpenThemeFile(pszThemeName, NULL, NULL, &pt); if(FAILED(hr)) return hr; /* Try to load from string resources */ hr = E_PROP_ID_UNSUPPORTED; if(MSSTYLES_LookupProperty(pszPropertyName, NULL, &iDocId)) { for(i=0; i<sizeof(wDocToRes)/sizeof(wDocToRes[0]); i+=2) { if(wDocToRes[i] == iDocId) { if(LoadStringW(pt->hTheme, wDocToRes[i+1], pszValueBuff, cchMaxValChars)) { hr = S_OK; break; } } } } /* If loading from string resource failed, try getting it from the theme.ini */ if(FAILED(hr)) { PUXINI_FILE uf = MSSTYLES_GetThemeIni(pt); if(UXINI_FindSection(uf, szIniDocumentation)) { LPCWSTR lpValue; DWORD dwLen; if(UXINI_FindValue(uf, pszPropertyName, &lpValue, &dwLen)) { lstrcpynW(pszValueBuff, lpValue, min(dwLen+1,cchMaxValChars)); hr = S_OK; } } UXINI_CloseINI(uf); } MSSTYLES_CloseThemeFile(pt); return hr; }
/*********************************************************************** * MSSTYLES_ParseThemeIni * * Parse the theme ini for the selected color/style * * PARAMS * tf Theme to parse */ void MSSTYLES_ParseThemeIni(PTHEME_FILE tf) { static const WCHAR szSysMetrics[] = {'S','y','s','M','e','t','r','i','c','s','\0'}; static const WCHAR szGlobals[] = {'g','l','o','b','a','l','s','\0'}; PTHEME_CLASS cls; PTHEME_CLASS globals; PTHEME_PARTSTATE ps; PUXINI_FILE ini; WCHAR szAppName[MAX_THEME_APP_NAME]; WCHAR szClassName[MAX_THEME_CLASS_NAME]; WCHAR szPropertyName[MAX_THEME_VALUE_NAME]; int iPartId; int iStateId; int iPropertyPrimitive; int iPropertyId; DWORD dwLen; LPCWSTR lpName; DWORD dwValueLen; LPCWSTR lpValue; if(tf->classes) return; ini = MSSTYLES_GetActiveThemeIni(tf); while((lpName=UXINI_GetNextSection(ini, &dwLen))) { if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpName, dwLen, szSysMetrics, -1) == CSTR_EQUAL) { while((lpName=UXINI_GetNextValue(ini, &dwLen, &lpValue, &dwValueLen))) { lstrcpynW(szPropertyName, lpName, min(dwLen+1, sizeof(szPropertyName)/sizeof(szPropertyName[0]))); if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive, &iPropertyId)) { /* Catch all metrics, including colors */ MSSTYLES_AddMetric(tf, iPropertyPrimitive, iPropertyId, lpValue, dwValueLen); } else { TRACE("Unknown system metric %s\n", debugstr_w(szPropertyName)); } } continue; } if(MSSTYLES_ParseIniSectionName(lpName, dwLen, szAppName, szClassName, &iPartId, &iStateId)) { BOOL isGlobal = FALSE; if(!lstrcmpiW(szClassName, szGlobals)) { isGlobal = TRUE; } cls = MSSTYLES_AddClass(tf, szAppName, szClassName); ps = MSSTYLES_AddPartState(cls, iPartId, iStateId); while((lpName=UXINI_GetNextValue(ini, &dwLen, &lpValue, &dwValueLen))) { lstrcpynW(szPropertyName, lpName, min(dwLen+1, sizeof(szPropertyName)/sizeof(szPropertyName[0]))); if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive, &iPropertyId)) { MSSTYLES_AddProperty(ps, iPropertyPrimitive, iPropertyId, lpValue, dwValueLen, isGlobal); } else { TRACE("Unknown property %s\n", debugstr_w(szPropertyName)); } } } } /* App/Class combos override values defined by the base class, map these overrides */ globals = MSSTYLES_FindClass(tf, NULL, szGlobals); cls = tf->classes; while(cls) { if(*cls->szAppName) { cls->overrides = MSSTYLES_FindClass(tf, NULL, cls->szClassName); if(!cls->overrides) { TRACE("No overrides found for app %s class %s\n", debugstr_w(cls->szAppName), debugstr_w(cls->szClassName)); } else { cls->overrides = globals; } } else { /* Everything overrides globals..except globals */ if(cls != globals) cls->overrides = globals; } cls = cls->next; } UXINI_CloseINI(ini); if(!tf->classes) { ERR("Failed to parse theme ini\n"); } }