diff --git a/dlls/uxtheme/system.c b/dlls/uxtheme/system.c index 06eac4e8478..51fc56e6cc1 100644 --- a/dlls/uxtheme/system.c +++ b/dlls/uxtheme/system.c @@ -898,7 +898,7 @@ HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, * pszSizeName Theme size to enumerate available colors * If NULL the default theme size is used * dwColorNum Color index to retrieve, increment from 0 - * pszColorName Output color name + * pszColorNames Output color names * * RETURNS * S_OK on success @@ -906,19 +906,20 @@ HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, * or when pszSizeName does not refer to a valid size * * NOTES - * XP fails with E_POINTER when pszColorName points to a buffer smaller then 605 - * characters + * XP fails with E_POINTER when pszColorNames points to a buffer smaller than + * sizeof(THEMENAMES). * * Not very efficient that I'm opening & validating the theme every call, but * this is undocumented and almost never called.. * (and this is how windows works too) */ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, - DWORD dwColorNum, LPWSTR pszColorName) + DWORD dwColorNum, PTHEMENAMES pszColorNames) { PTHEME_FILE pt; HRESULT hr; LPWSTR tmp; + UINT resourceId = dwColorNum + 1000; TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), debugstr_w(pszSizeName), dwColorNum); @@ -932,7 +933,13 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, } if(!dwColorNum && *tmp) { TRACE("%s\n", debugstr_w(tmp)); - lstrcpyW(pszColorName, tmp); + lstrcpyW(pszColorNames->szName, tmp); + LoadStringW (pt->hTheme, resourceId, + pszColorNames->szDisplayName, + sizeof (pszColorNames->szDisplayName) / sizeof (WCHAR)); + LoadStringW (pt->hTheme, resourceId+1000, + pszColorNames->szTooltip, + sizeof (pszColorNames->szTooltip) / sizeof (WCHAR)); } else hr = E_PROP_ID_UNSUPPORTED; @@ -951,7 +958,7 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, * pszColorName Theme color to enumerate available sizes * If NULL the default theme color is used * dwSizeNum Size index to retrieve, increment from 0 - * pszSizeName Output size name + * pszSizeNames Output size names * * RETURNS * S_OK on success @@ -959,19 +966,20 @@ HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, * or when pszColorName does not refer to a valid color * * NOTES - * XP fails with E_POINTER when pszSizeName points to a buffer smaller then 605 - * characters + * XP fails with E_POINTER when pszSizeNames points to a buffer smaller than + * sizeof(THEMENAMES). * * Not very efficient that I'm opening & validating the theme every call, but * this is undocumented and almost never called.. * (and this is how windows works too) */ HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, - DWORD dwSizeNum, LPWSTR pszSizeName) + DWORD dwSizeNum, PTHEMENAMES pszSizeNames) { PTHEME_FILE pt; HRESULT hr; LPWSTR tmp; + UINT resourceId = dwSizeNum + 3000; TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), debugstr_w(pszColorName), dwSizeNum); @@ -985,7 +993,13 @@ HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, } if(!dwSizeNum && *tmp) { TRACE("%s\n", debugstr_w(tmp)); - lstrcpyW(pszSizeName, tmp); + lstrcpyW(pszSizeNames->szName, tmp); + LoadStringW (pt->hTheme, resourceId, + pszSizeNames->szDisplayName, + sizeof (pszSizeNames->szDisplayName) / sizeof (WCHAR)); + LoadStringW (pt->hTheme, resourceId+1000, + pszSizeNames->szTooltip, + sizeof (pszSizeNames->szTooltip) / sizeof (WCHAR)); } else hr = E_PROP_ID_UNSUPPORTED; diff --git a/dlls/uxtheme/uxtheme.spec b/dlls/uxtheme/uxtheme.spec index a6fdf66cf1f..67dd3841945 100644 --- a/dlls/uxtheme/uxtheme.spec +++ b/dlls/uxtheme/uxtheme.spec @@ -5,8 +5,8 @@ 4 stdcall -noname ApplyTheme(ptr ptr ptr) 7 stdcall -noname GetThemeDefaults(wstr wstr long wstr long) 8 stdcall -noname EnumThemes(wstr ptr ptr) -9 stdcall -noname EnumThemeColors(wstr wstr long wstr) -10 stdcall -noname EnumThemeSizes(wstr wstr long wstr) +9 stdcall -noname EnumThemeColors(wstr wstr long ptr) +10 stdcall -noname EnumThemeSizes(wstr wstr long ptr) 11 stdcall -noname ParseThemeIniFile(wstr wstr ptr ptr) 13 stub -noname DrawNCPreview 14 stub -noname RegisterDefaultTheme diff --git a/dlls/uxtheme/uxthemedll.h b/dlls/uxtheme/uxthemedll.h index 2ac3873d1a6..96bb34ade21 100644 --- a/dlls/uxtheme/uxthemedll.h +++ b/dlls/uxtheme/uxthemedll.h @@ -66,6 +66,15 @@ typedef BOOL (CALLBACK*ParseThemeIniFileProc)(DWORD dwType, LPWSTR pszParam1, LPWSTR pszParam2, LPWSTR pszParam3, DWORD dwParam, LPVOID lpData); +/* Structure filled in by EnumThemeColors() and EnumeThemeSizes() with the + * various strings for a theme color or size. */ +typedef struct tagTHEMENAMES +{ + WCHAR szName[MAX_PATH+1]; + WCHAR szDisplayName[MAX_PATH+1]; + WCHAR szTooltip[MAX_PATH+1]; +} THEMENAMES, *PTHEMENAMES; + /* Declarations for undocumented functions for use internally */ DWORD WINAPI QueryThemeServices(void); HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, @@ -79,9 +88,9 @@ HRESULT WINAPI GetThemeDefaults(LPCWSTR pszThemeFileName, LPWSTR pszColorName, HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, LPVOID lpData); HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, - DWORD dwColorNum, LPWSTR pszColorName); + DWORD dwColorNum, PTHEMENAMES pszColorNames); HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, - DWORD dwSizeNum, LPWSTR pszSizeName); + DWORD dwSizeNum, PTHEMENAMES pszColorNames); HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown, ParseThemeIniFileProc callback, LPVOID lpData);