#include "uxthemep.h"
+#include <stdio.h>
#include <winreg.h>
#include <uxundoc.h>
ATOM atWindowTheme;
static ATOM atSubAppName;
static ATOM atSubIdList;
-ATOM atWndContrext;
+ATOM atWndContext;
-static PTHEME_FILE ActiveThemeFile;
+PTHEME_FILE ActiveThemeFile;
/***********************************************************************/
static DWORD query_reg_path (HKEY hKey, LPCWSTR lpszValue,
LPVOID pvData)
{
- DWORD dwRet, dwType, dwUnExpDataLen = MAX_PATH, dwExpDataLen;
+ DWORD dwRet, dwType, dwUnExpDataLen = MAX_PATH * sizeof(WCHAR), dwExpDataLen;
TRACE("(hkey=%p,%s,%p)\n", hKey, debugstr_w(lpszValue),
pvData);
return S_OK;
}
+static BOOL bIsThemeActive(LPCWSTR pszTheme, LPCWSTR pszColor, LPCWSTR pszSize)
+{
+ if (ActiveThemeFile == NULL)
+ return FALSE;
+
+ if (wcscmp(pszTheme, ActiveThemeFile->szThemeFile) != 0)
+ return FALSE;
+
+ if (!pszColor[0])
+ {
+ if (ActiveThemeFile->pszAvailColors != ActiveThemeFile->pszSelectedColor)
+ return FALSE;
+ }
+ else
+ {
+ if (wcscmp(pszColor, ActiveThemeFile->pszSelectedColor) != 0)
+ return FALSE;
+ }
+
+ if (!pszSize[0])
+ {
+ if (ActiveThemeFile->pszAvailSizes != ActiveThemeFile->pszSelectedSize)
+ return FALSE;
+ }
+ else
+ {
+ if (wcscmp(pszSize, ActiveThemeFile->pszSelectedSize) != 0)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/***********************************************************************
* UXTHEME_LoadTheme
*
/* Get current theme configuration */
if(!RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) {
TRACE("Loading theme config\n");
- buffsize = sizeof(tmp)/sizeof(tmp[0]);
+ buffsize = sizeof(tmp);
if(!RegQueryValueExW(hKey, szThemeActive, NULL, NULL, (LPBYTE)tmp, &buffsize)) {
bThemeActive = (tmp[0] != '0');
}
bThemeActive = FALSE;
TRACE("Failed to get ThemeActive: %d\n", GetLastError());
}
- buffsize = sizeof(szCurrentColor)/sizeof(szCurrentColor[0]);
+ buffsize = sizeof(szCurrentColor);
if(RegQueryValueExW(hKey, szColorName, NULL, NULL, (LPBYTE)szCurrentColor, &buffsize))
szCurrentColor[0] = '\0';
- buffsize = sizeof(szCurrentSize)/sizeof(szCurrentSize[0]);
+ buffsize = sizeof(szCurrentSize);
if(RegQueryValueExW(hKey, szSizeName, NULL, NULL, (LPBYTE)szCurrentSize, &buffsize))
szCurrentSize[0] = '\0';
if (query_reg_path (hKey, szDllName, szCurrentTheme))
bThemeActive = FALSE;
}
- if(bThemeActive) {
+ if(bThemeActive)
+ {
+ if( bIsThemeActive(szCurrentTheme, szCurrentColor, szCurrentSize) )
+ {
+ TRACE("Tried to load active theme again\n");
+ return;
+ }
+
/* Make sure the theme requested is actually valid */
hr = MSSTYLES_OpenThemeFile(szCurrentTheme,
szCurrentColor[0]?szCurrentColor:NULL,
WCHAR tmp[2];
HRESULT hr;
+ TRACE("UXTHEME_ApplyTheme\n");
+
if (tf && !ActiveThemeFile)
{
UXTHEME_BackupSystemMetrics();
atSubAppName = GlobalAddAtomW(szSubAppName);
atSubIdList = GlobalAddAtomW(szSubIdList);
atDialogThemeEnabled = GlobalAddAtomW(szDialogThemeEnabled);
- atWndContrext = GlobalAddAtomW(L"ux_WndContext");
+ atWndContext = GlobalAddAtomW(L"ux_WndContext");
}
/***********************************************************************
WCHAR tmp[10];
DWORD buffsize;
- TRACE("\n");
+ TRACE("IsThemeActive\n");
SetLastError(ERROR_SUCCESS);
if (ActiveThemeFile)
Result = RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey);
if (Result == ERROR_SUCCESS)
{
- buffsize = sizeof(tmp)/sizeof(tmp[0]);
+ buffsize = sizeof(tmp);
if (!RegQueryValueExW(hKey, szThemeActive, NULL, NULL, (LPBYTE)tmp, &buffsize))
bActive = (tmp[0] != '0');
RegCloseKey(hKey);
{
ATOM oldValue = (ATOM)(size_t)RemovePropW(hwnd, (LPCWSTR)MAKEINTATOM(aProp));
if(oldValue)
+ {
DeleteAtom(oldValue);
- if(pszValue) {
- ATOM atValue = AddAtomW(pszValue);
- if(!atValue
- || !SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(aProp), (LPWSTR)MAKEINTATOM(atValue))) {
- HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
+ }
+
+ if(pszValue)
+ {
+ ATOM atValue;
+
+ /* A string with zero lenght is not acceptatble in AddAtomW but we want to support
+ users passing an empty string meaning they want no theme for the specified window */
+ if(!pszValue[0])
+ pszValue = L"0";
+
+ atValue = AddAtomW(pszValue);
+ if (!atValue)
+ {
+ ERR("AddAtomW for %S failed with last error %d!\n", pszValue, GetLastError());
+ return HRESULT_FROM_WIN32(GetLastError());
+ }
+
+ if (!SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(aProp), (LPWSTR)MAKEINTATOM(atValue)))
+ {
+ ERR("SetPropW for atom %d failed with last error %d\n", aProp, GetLastError());
if(atValue) DeleteAtom(atValue);
- return hr;
+ return HRESULT_FROM_WIN32(GetLastError());
}
}
return S_OK;
LPCWSTR pszAppName;
LPCWSTR pszUseClassList;
HTHEME hTheme = NULL;
- TRACE("(%p,%s)\n", hwnd, debugstr_w(pszClassList));
-
+ TRACE("(%p,%s, %x)\n", hwnd, debugstr_w(pszClassList), flags);
+
if(!pszClassList)
{
SetLastError(E_POINTER);
HRESULT WINAPI SetWindowTheme(HWND hwnd, LPCWSTR pszSubAppName,
LPCWSTR pszSubIdList)
{
- HRESULT hr;
+ HRESULT hr;
TRACE("(%p,%s,%s)\n", hwnd, debugstr_w(pszSubAppName),
debugstr_w(pszSubIdList));
if (!SUCCEEDED(hr))
return hr;
- UXTHEME_broadcast_msg (hwnd, WM_THEMECHANGED);
+ UXTHEME_broadcast_msg (hwnd, WM_THEMECHANGED);
return hr;
}
HRESULT WINAPI CloseThemeData(HTHEME hTheme)
{
TRACE("(%p)\n", hTheme);
- if(!hTheme)
+ if(!hTheme || hTheme == INVALID_HANDLE_VALUE)
return E_HANDLE;
return MSSTYLES_CloseThemeClass(hTheme);
}
FIXME("%d %d 0x%08x: stub\n", iPartId, iStateId, dwOptions);
if(!hTheme)
return E_HANDLE;
- return ERROR_CALL_NOT_IMPLEMENTED;
+ return E_NOTIMPL;
}
/***********************************************************************
PARSETHEMEINIFILEPROC callback, LPVOID lpData)
{
FIXME("%s %s: stub\n", debugstr_w(pszIniFileName), debugstr_w(pszUnknown));
- return ERROR_CALL_NOT_IMPLEMENTED;
+ return E_NOTIMPL;
}
/**********************************************************************
MSSTYLES_CloseThemeFile(pt);
return S_OK;
}
-
-HRESULT WINAPI DrawNCPreview(HDC hDC,
- DWORD DNCP_Flag,
- LPRECT prcPreview,
- LPCWSTR pszThemeFileName,
- LPCWSTR pszColorName,
- LPCWSTR pszSizeName,
- PNONCLIENTMETRICSW pncMetrics,
- COLORREF* lpaRgbValues)
-{
- return E_NOTIMPL;
-}
-