Author: gadamopoulos
Date: Mon Apr 22 16:46:43 2013
New Revision: 58831
URL:
http://svn.reactos.org/svn/reactos?rev=58831&view=rev
Log:
[uxtheme]
- Do not apply non client metrics defined in the theme, while applying the theme. This is
now done by desk.cpl
- Implement OpenThemeDataFromFile to let desk.cpl open a theme file and query the metrics
stored in the theme file
- Make use of the HTHEME hTheme parameter in GetThemeSysBool, GetThemeSysColor,
GetThemeSysFont, GetThemeSysInt, GetThemeSysSize and GetThemeSysString
Modified:
trunk/reactos/dll/win32/uxtheme/metric.c
trunk/reactos/dll/win32/uxtheme/msstyles.c
trunk/reactos/dll/win32/uxtheme/system.c
trunk/reactos/dll/win32/uxtheme/uxthemep.h
Modified: trunk/reactos/dll/win32/uxtheme/metric.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/metric.c…
==============================================================================
--- trunk/reactos/dll/win32/uxtheme/metric.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/uxtheme/metric.c [iso-8859-1] Mon Apr 22 16:46:43 2013
@@ -35,7 +35,9 @@
TRACE("(%p, %d)\n", hTheme, iBoolID);
SetLastError(0);
if(hTheme) {
- if((tp = MSSTYLES_FindMetric(TMT_BOOL, iBoolID))) {
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
+
+ if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_BOOL, iBoolID))) {
hr = MSSTYLES_GetPropertyBool(tp, &ret);
if(SUCCEEDED(hr))
return ret;
@@ -62,10 +64,15 @@
HRESULT hr;
PTHEME_PROPERTY tp;
+ // TODO: Check if this is correct
+ if ( iColorID >= 0 && iColorID < 32)
+ iColorID += TMT_SCROLLBAR;
+
TRACE("(%p, %d)\n", hTheme, iColorID);
SetLastError(0);
if(hTheme) {
- if((tp = MSSTYLES_FindMetric(TMT_COLOR, iColorID))) {
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
+ if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_COLOR, iColorID))) {
COLORREF color;
hr = MSSTYLES_GetPropertyColor(tp, &color);
if(SUCCEEDED(hr))
@@ -96,7 +103,8 @@
TRACE("(%p, %d)\n", hTheme, iFontID);
if(hTheme) {
- if((tp = MSSTYLES_FindMetric(TMT_FONT, iFontID))) {
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
+ if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_FONT, iFontID))) {
HDC hdc = GetDC(NULL);
hr = MSSTYLES_GetPropertyFont(tp, hdc, plf);
ReleaseDC(NULL, hdc);
@@ -134,6 +142,7 @@
HRESULT WINAPI GetThemeSysInt(HTHEME hTheme, int iIntID, int *piValue)
{
PTHEME_PROPERTY tp;
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
TRACE("(%p, %d)\n", hTheme, iIntID);
if(!hTheme)
@@ -142,7 +151,7 @@
WARN("Unknown IntID: %d\n", iIntID);
return STG_E_INVALIDPARAMETER;
}
- if((tp = MSSTYLES_FindMetric(TMT_INT, iIntID)))
+ if((tp = MSSTYLES_FindMetric(ptc->tf , TMT_INT, iIntID)))
return MSSTYLES_GetPropertyInt(tp, piValue);
return E_PROP_ID_UNSUPPORTED;
}
@@ -168,6 +177,8 @@
};
if(hTheme) {
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
+
for(i=0; i<sizeof(metricMap)/sizeof(metricMap[0]); i+=2) {
if(metricMap[i] == iSizeID) {
id = metricMap[i+1];
@@ -176,7 +187,7 @@
}
SetLastError(0);
if(id != -1) {
- if((tp = MSSTYLES_FindMetric(TMT_SIZE, id))) {
+ if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_SIZE, id))) {
if(SUCCEEDED(MSSTYLES_GetPropertyInt(tp, &i))) {
return i;
}
@@ -188,6 +199,12 @@
return 0;
}
}
+
+
+ // TODO: Check if this is correct
+ // In windows for SM_CXFRAME this function returns what seems to be the non client
metric iBorderWidth
+ if (iSizeID == SM_CXFRAME)
+ return GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME);
return GetSystemMetrics(iSizeID);
}
@@ -198,6 +215,7 @@
LPWSTR pszStringBuff, int cchMaxStringChars)
{
PTHEME_PROPERTY tp;
+ PTHEME_CLASS ptc = (PTHEME_CLASS) hTheme;
TRACE("(%p, %d)\n", hTheme, iStringID);
if(!hTheme)
@@ -206,7 +224,7 @@
WARN("Unknown StringID: %d\n", iStringID);
return STG_E_INVALIDPARAMETER;
}
- if((tp = MSSTYLES_FindMetric(TMT_STRING, iStringID)))
+ if((tp = MSSTYLES_FindMetric(ptc->tf, TMT_STRING, iStringID)))
return MSSTYLES_GetPropertyString(tp, pszStringBuff, cchMaxStringChars);
return E_PROP_ID_UNSUPPORTED;
}
Modified: trunk/reactos/dll/win32/uxtheme/msstyles.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/msstyles…
==============================================================================
--- trunk/reactos/dll/win32/uxtheme/msstyles.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/uxtheme/msstyles.c [iso-8859-1] Mon Apr 22 16:46:43 2013
@@ -30,7 +30,6 @@
static BOOL MSSTYLES_GetNextInteger(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR
*lpValEnd, int *value);
static BOOL MSSTYLES_GetNextToken(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR
*lpValEnd, LPWSTR lpBuff, DWORD buffSize);
-static void MSSTYLES_ParseThemeIni(PTHEME_FILE tf, BOOL setMetrics);
static HRESULT MSSTYLES_GetFont (LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR
*lpValEnd, LOGFONTW* logfont);
extern HINSTANCE hDllInst;
@@ -41,8 +40,6 @@
static const WCHAR szThemesIniResource[] = {
't','h','e','m','e','s','_','i','n','i','\0'
};
-
-static PTHEME_FILE tfActiveTheme;
/***********************************************************************/
@@ -214,21 +211,13 @@
}
/***********************************************************************
- * MSSTYLES_SetActiveTheme
- *
- * Set the current active theme
- */
-HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf, BOOL setMetrics)
-{
- if(tfActiveTheme)
- MSSTYLES_CloseThemeFile(tfActiveTheme);
- tfActiveTheme = tf;
- if (tfActiveTheme)
- {
- tfActiveTheme->dwRefCount++;
- if(!tfActiveTheme->classes)
- MSSTYLES_ParseThemeIni(tfActiveTheme, setMetrics);
- }
+ * MSSTYLES_ReferenceTheme
+ *
+ * Increase the reference count of the theme file
+ */
+HRESULT MSSTYLES_ReferenceTheme(PTHEME_FILE tf)
+{
+ tf->dwRefCount++;
return S_OK;
}
@@ -545,7 +534,7 @@
}
/***********************************************************************
- * MSSTYLES_FFindMetric
+ * MSSTYLES_FindMetric
*
* Find a metric property for a theme file
*
@@ -557,28 +546,9 @@
* RETURNS
* The property found, or NULL
*/
-static inline PTHEME_PROPERTY MSSTYLES_FFindMetric(PTHEME_FILE tf, int
iPropertyPrimitive, int iPropertyId)
+PTHEME_PROPERTY MSSTYLES_FindMetric(PTHEME_FILE tf, int iPropertyPrimitive, int
iPropertyId)
{
return MSSTYLES_LFindProperty(tf->metrics, iPropertyPrimitive, iPropertyId);
-}
-
-/***********************************************************************
- * MSSTYLES_FindMetric
- *
- * Find a metric property for the current installed theme
- *
- * PARAMS
- * tf Theme file
- * iPropertyPrimitive Type of value expected
- * iPropertyId ID of the required value
- *
- * RETURNS
- * The property found, or NULL
- */
-PTHEME_PROPERTY MSSTYLES_FindMetric(int iPropertyPrimitive, int iPropertyId)
-{
- if(!tfActiveTheme) return NULL;
- return MSSTYLES_FFindMetric(tfActiveTheme, iPropertyPrimitive, iPropertyId);
}
/***********************************************************************
@@ -639,7 +609,7 @@
*/
static PTHEME_PROPERTY MSSTYLES_AddMetric(PTHEME_FILE tf, int iPropertyPrimitive, int
iPropertyId, LPCWSTR lpValue, DWORD dwValueLen)
{
- PTHEME_PROPERTY cur = MSSTYLES_FFindMetric(tf, iPropertyPrimitive, iPropertyId);
+ PTHEME_PROPERTY cur = MSSTYLES_FindMetric(tf, iPropertyPrimitive, iPropertyId);
/* Should duplicate properties overwrite the original, or be ignored? */
if(cur) return cur;
@@ -656,185 +626,6 @@
return cur;
}
-/* Color-related state for theme ini parsing */
-struct PARSECOLORSTATE
-{
- int colorCount;
- int colorElements[TMT_LASTCOLOR-TMT_FIRSTCOLOR];
- COLORREF colorRgb[TMT_LASTCOLOR-TMT_FIRSTCOLOR];
- int captionColors;
-};
-
-static inline void parse_init_color (struct PARSECOLORSTATE* state)
-{
- memset (state, 0, sizeof (*state));
-}
-
-static BOOL parse_handle_color_property (struct PARSECOLORSTATE* state,
- int iPropertyId, LPCWSTR lpValue,
- DWORD dwValueLen)
-{
- int r,g,b;
- LPCWSTR lpValueEnd = lpValue + dwValueLen;
- if(MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &r) &&
- MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &g) &&
- MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &b)) {
- state->colorElements[state->colorCount] = iPropertyId - TMT_FIRSTCOLOR;
- state->colorRgb[state->colorCount++] = RGB(r,g,b);
- switch (iPropertyId)
- {
- case TMT_ACTIVECAPTION:
- state->captionColors |= 0x1;
- break;
- case TMT_INACTIVECAPTION:
- state->captionColors |= 0x2;
- break;
- case TMT_GRADIENTACTIVECAPTION:
- state->captionColors |= 0x4;
- break;
- case TMT_GRADIENTINACTIVECAPTION:
- state->captionColors |= 0x8;
- break;
- }
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-static void parse_apply_color (struct PARSECOLORSTATE* state)
-{
- if (state->colorCount > 0)
- SetSysColors(state->colorCount, state->colorElements, state->colorRgb);
- if (state->captionColors == 0xf)
- SystemParametersInfoW (SPI_SETGRADIENTCAPTIONS, 0, (PVOID)TRUE, 0);
-}
-
-/* Non-client-metrics-related state for theme ini parsing */
-struct PARSENONCLIENTSTATE
-{
- NONCLIENTMETRICSW metrics;
- BOOL metricsDirty;
- LOGFONTW iconTitleFont;
-};
-
-static inline void parse_init_nonclient (struct PARSENONCLIENTSTATE* state)
-{
- memset (state, 0, sizeof (*state));
- state->metrics.cbSize = sizeof (NONCLIENTMETRICSW);
- SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, sizeof (NONCLIENTMETRICSW),
- &state->metrics, 0);
- SystemParametersInfoW (SPI_GETICONTITLELOGFONT, sizeof (LOGFONTW),
- &state->iconTitleFont, 0);
-}
-
-static BOOL parse_handle_nonclient_font (struct PARSENONCLIENTSTATE* state,
- int iPropertyId, LPCWSTR lpValue,
- DWORD dwValueLen)
-{
- LOGFONTW font;
-
- memset (&font, 0, sizeof (font));
- if (SUCCEEDED (MSSTYLES_GetFont (lpValue, lpValue + dwValueLen, &lpValue,
- &font)))
- {
- switch (iPropertyId)
- {
- case TMT_CAPTIONFONT:
- state->metrics.lfCaptionFont = font;
- state->metricsDirty = TRUE;
- break;
- case TMT_SMALLCAPTIONFONT:
- state->metrics.lfSmCaptionFont = font;
- state->metricsDirty = TRUE;
- break;
- case TMT_MENUFONT:
- state->metrics.lfMenuFont = font;
- state->metricsDirty = TRUE;
- break;
- case TMT_STATUSFONT:
- state->metrics.lfStatusFont = font;
- state->metricsDirty = TRUE;
- break;
- case TMT_MSGBOXFONT:
- state->metrics.lfMessageFont = font;
- state->metricsDirty = TRUE;
- break;
- case TMT_ICONTITLEFONT:
- state->iconTitleFont = font;
- state->metricsDirty = TRUE;
- break;
- }
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static BOOL parse_handle_nonclient_size (struct PARSENONCLIENTSTATE* state,
- int iPropertyId, LPCWSTR lpValue,
- DWORD dwValueLen)
-{
- int size;
- LPCWSTR lpValueEnd = lpValue + dwValueLen;
- if(MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &size)) {
- switch (iPropertyId)
- {
- case TMT_SIZINGBORDERWIDTH:
- state->metrics.iBorderWidth = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_SCROLLBARWIDTH:
- state->metrics.iScrollWidth = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_SCROLLBARHEIGHT:
- state->metrics.iScrollHeight = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_CAPTIONBARWIDTH:
- state->metrics.iCaptionWidth = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_CAPTIONBARHEIGHT:
- state->metrics.iCaptionHeight = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_SMCAPTIONBARWIDTH:
- state->metrics.iSmCaptionWidth = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_SMCAPTIONBARHEIGHT:
- state->metrics.iSmCaptionHeight = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_MENUBARWIDTH:
- state->metrics.iMenuWidth = size;
- state->metricsDirty = TRUE;
- break;
- case TMT_MENUBARHEIGHT:
- state->metrics.iMenuHeight = size;
- state->metricsDirty = TRUE;
- break;
- }
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static void parse_apply_nonclient (struct PARSENONCLIENTSTATE* state)
-{
- if (state->metricsDirty)
- {
- SystemParametersInfoW (SPI_SETNONCLIENTMETRICS, sizeof (state->metrics),
- &state->metrics, 0);
- SystemParametersInfoW (SPI_SETICONTITLELOGFONT, sizeof
(state->iconTitleFont),
- &state->iconTitleFont, 0);
- }
-}
-
/***********************************************************************
* MSSTYLES_ParseThemeIni
*
@@ -843,7 +634,7 @@
* PARAMS
* tf Theme to parse
*/
-static void MSSTYLES_ParseThemeIni(PTHEME_FILE tf, BOOL setMetrics)
+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'};
@@ -863,73 +654,50 @@
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) {
- struct PARSECOLORSTATE colorState;
- struct PARSENONCLIENTSTATE nonClientState;
-
- parse_init_color (&colorState);
- parse_init_nonclient (&nonClientState);
-
- while((lpName=UXINI_GetNextValue(ini, &dwLen, &lpValue,
&dwValueLen))) {
+ 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)) {
- if(iPropertyId >= TMT_FIRSTCOLOR && iPropertyId <=
TMT_LASTCOLOR) {
- if (!parse_handle_color_property (&colorState, iPropertyId,
- lpValue, dwValueLen))
- FIXME("Invalid color value for %s\n",
- debugstr_w(szPropertyName));
- }
- else if (setMetrics && (iPropertyId == TMT_FLATMENUS)) {
- BOOL flatMenus = (*lpValue == 'T') || (*lpValue == 't');
- SystemParametersInfoW (SPI_SETFLATMENU, 0, (PVOID)(INT_PTR)flatMenus, 0);
- }
- else if ((iPropertyId >= TMT_FIRSTFONT)
- && (iPropertyId <= TMT_LASTFONT))
- {
- if (!parse_handle_nonclient_font (&nonClientState,
- iPropertyId, lpValue, dwValueLen))
- FIXME("Invalid font value for %s\n",
- debugstr_w(szPropertyName));
- }
- else if ((iPropertyId >= TMT_FIRSTSIZE)
- && (iPropertyId <= TMT_LASTSIZE))
- {
- if (!parse_handle_nonclient_size (&nonClientState,
- iPropertyId, lpValue, dwValueLen))
- FIXME("Invalid size value for %s\n",
- debugstr_w(szPropertyName));
- }
- /* Catch all metrics, including colors */
- MSSTYLES_AddMetric(tf, iPropertyPrimitive, iPropertyId, lpValue,
dwValueLen);
+ if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive,
&iPropertyId))
+ {
+ /* Catch all metrics, including colors */
+ MSSTYLES_AddMetric(tf, iPropertyPrimitive, iPropertyId, lpValue,
dwValueLen);
}
- else {
+ else
+ {
TRACE("Unknown system metric %s\n",
debugstr_w(szPropertyName));
}
}
- if (setMetrics)
+ continue;
+ }
+
+ if(MSSTYLES_ParseIniSectionName(lpName, dwLen, szAppName, szClassName,
&iPartId, &iStateId))
+ {
+ BOOL isGlobal = FALSE;
+ if(!lstrcmpiW(szClassName, szGlobals))
{
- parse_apply_color (&colorState);
- parse_apply_nonclient (&nonClientState);
- }
- 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))) {
+ 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)) {
+ if(MSSTYLES_LookupProperty(szPropertyName, &iPropertyPrimitive,
&iPropertyId))
+ {
MSSTYLES_AddProperty(ps, iPropertyPrimitive, iPropertyId, lpValue,
dwValueLen, isGlobal);
}
- else {
+ else
+ {
TRACE("Unknown property %s\n",
debugstr_w(szPropertyName));
}
}
@@ -939,19 +707,25 @@
/* 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) {
+ while(cls)
+ {
+ if(*cls->szAppName)
+ {
cls->overrides = MSSTYLES_FindClass(tf, NULL, cls->szClassName);
- if(!cls->overrides) {
+ if(!cls->overrides)
+ {
TRACE("No overrides found for app %s class %s\n",
debugstr_w(cls->szAppName), debugstr_w(cls->szClassName));
}
- else {
+ else
+ {
cls->overrides = globals;
}
}
- else {
+ else
+ {
/* Everything overrides globals..except globals */
- if(cls != globals) cls->overrides = globals;
+ if(cls != globals)
+ cls->overrides = globals;
}
cls = cls->next;
}
@@ -972,7 +746,7 @@
* to a particular application
* pszClassList List of requested classes, semicolon delimited
*/
-PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList)
+PTHEME_CLASS MSSTYLES_OpenThemeClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR
pszClassList)
{
PTHEME_CLASS cls = NULL;
WCHAR szClassName[MAX_THEME_CLASS_NAME];
@@ -980,12 +754,8 @@
LPCWSTR end;
DWORD len;
- if(!tfActiveTheme) {
- TRACE("there is no active theme\n");
+ if(!tf->classes) {
return NULL;
- }
- if(!tfActiveTheme->classes) {
- return NULL;
}
start = pszClassList;
@@ -993,16 +763,16 @@
len = end-start;
lstrcpynW(szClassName, start, min(len+1,
sizeof(szClassName)/sizeof(szClassName[0])));
start = end+1;
- cls = MSSTYLES_FindClass(tfActiveTheme, pszAppName, szClassName);
+ cls = MSSTYLES_FindClass(tf, pszAppName, szClassName);
if(cls) break;
}
if(!cls && *start) {
lstrcpynW(szClassName, start, sizeof(szClassName)/sizeof(szClassName[0]));
- cls = MSSTYLES_FindClass(tfActiveTheme, pszAppName, szClassName);
+ cls = MSSTYLES_FindClass(tf, pszAppName, szClassName);
}
if(cls) {
TRACE("Opened app %s, class %s from list %s\n",
debugstr_w(cls->szAppName), debugstr_w(cls->szClassName),
debugstr_w(pszClassList));
- cls->tf = tfActiveTheme;
+ cls->tf = tf;
cls->tf->dwRefCount++;
}
return cls;
Modified: trunk/reactos/dll/win32/uxtheme/system.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/system.c…
==============================================================================
--- trunk/reactos/dll/win32/uxtheme/system.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/uxtheme/system.c [iso-8859-1] Mon Apr 22 16:46:43 2013
@@ -51,9 +51,8 @@
ATOM atWndContrext;
static BOOL bThemeActive = FALSE;
-static WCHAR szCurrentTheme[MAX_PATH];
-static WCHAR szCurrentColor[64];
-static WCHAR szCurrentSize[64];
+
+static PTHEME_FILE ActiveThemeFile;
/***********************************************************************/
@@ -128,6 +127,19 @@
return dwRet;
}
+static HRESULT UXTHEME_SetActiveTheme(PTHEME_FILE tf)
+{
+ if(ActiveThemeFile)
+ MSSTYLES_CloseThemeFile(ActiveThemeFile);
+ ActiveThemeFile = tf;
+ if (ActiveThemeFile)
+ {
+ MSSTYLES_ReferenceTheme(ActiveThemeFile);
+ MSSTYLES_ParseThemeIni(ActiveThemeFile);
+ }
+ return S_OK;
+}
+
/***********************************************************************
* UXTHEME_LoadTheme
*
@@ -140,6 +152,9 @@
HRESULT hr;
WCHAR tmp[10];
PTHEME_FILE pt;
+ WCHAR szCurrentTheme[MAX_PATH];
+ WCHAR szCurrentColor[64];
+ WCHAR szCurrentSize[64];
if(bLoad == TRUE)
{
@@ -180,23 +195,17 @@
&pt);
if(FAILED(hr)) {
bThemeActive = FALSE;
- szCurrentTheme[0] = '\0';
- szCurrentColor[0] = '\0';
- szCurrentSize[0] = '\0';
}
else {
- /* Make sure the global color & size match the theme */
- lstrcpynW(szCurrentColor, pt->pszSelectedColor,
sizeof(szCurrentColor)/sizeof(szCurrentColor[0]));
- lstrcpynW(szCurrentSize, pt->pszSelectedSize,
sizeof(szCurrentSize)/sizeof(szCurrentSize[0]));
-
- MSSTYLES_SetActiveTheme(pt, FALSE);
TRACE("Theme active: %s %s %s\n", debugstr_w(szCurrentTheme),
debugstr_w(szCurrentColor), debugstr_w(szCurrentSize));
+
+ UXTHEME_SetActiveTheme(pt);
MSSTYLES_CloseThemeFile(pt);
}
}
if(!bThemeActive) {
- MSSTYLES_SetActiveTheme(NULL, FALSE);
+ UXTHEME_SetActiveTheme(NULL);
TRACE("Theming not active\n");
}
}
@@ -453,32 +462,26 @@
}
/***********************************************************************
- * UXTHEME_SetActiveTheme
+ * UXTHEME_ApplyTheme
*
* Change the current active theme
*/
-static HRESULT UXTHEME_SetActiveTheme(PTHEME_FILE tf)
+static HRESULT UXTHEME_ApplyTheme(PTHEME_FILE tf)
{
HKEY hKey;
WCHAR tmp[2];
HRESULT hr;
if(tf && !bThemeActive) UXTHEME_BackupSystemMetrics();
- hr = MSSTYLES_SetActiveTheme(tf, TRUE);
+ hr = UXTHEME_SetActiveTheme(tf);
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");
@@ -487,12 +490,12 @@
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));
+ 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);
@@ -619,10 +622,8 @@
return NULL;
}
-/***********************************************************************
- * OpenThemeDataEx (UXTHEME.61)
- */
-HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
+static HTHEME WINAPI
+OpenThemeDataInternal(PTHEME_FILE ThemeFile, HWND hwnd, LPCWSTR pszClassList, DWORD
flags)
{
WCHAR szAppBuff[256];
WCHAR szClassBuff[256];
@@ -649,7 +650,7 @@
pszUseClassList = pszClassList;
if (pszUseClassList)
- hTheme = MSSTYLES_OpenThemeClass(pszAppName, pszUseClassList);
+ hTheme = MSSTYLES_OpenThemeClass(ThemeFile, pszAppName, pszUseClassList);
}
if(IsWindow(hwnd))
SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(atWindowTheme), hTheme);
@@ -657,9 +658,24 @@
return hTheme;
}
+/***********************************************************************
+ * OpenThemeDataEx (UXTHEME.61)
+ */
+HTHEME WINAPI OpenThemeDataEx(HWND hwnd, LPCWSTR pszClassList, DWORD flags)
+{
+ return OpenThemeDataInternal(ActiveThemeFile, hwnd, pszClassList, flags);
+}
+
+/***********************************************************************
+ * OpenThemeDataEx (UXTHEME.16)
+ */
HTHEME WINAPI OpenThemeDataFromFile(HTHEMEFILE hThemeFile, HWND hwnd, LPCWSTR
pszClassList, DWORD flags)
{
- return S_OK;
+ PTHEME_FILE ThemeFile = (PTHEME_FILE)hThemeFile;
+
+ MSSTYLES_ParseThemeIni(ThemeFile);
+
+ return OpenThemeDataInternal(ThemeFile, hwnd, pszClassList, flags);
}
/***********************************************************************
@@ -667,7 +683,7 @@
*/
HTHEME WINAPI OpenThemeData(HWND hwnd, LPCWSTR classlist)
{
- return OpenThemeDataEx(hwnd, classlist, 0);
+ return OpenThemeDataInternal(ActiveThemeFile, hwnd, classlist, 0);
}
/***********************************************************************
@@ -720,11 +736,35 @@
LPWSTR pszColorBuff, int cchMaxColorChars,
LPWSTR pszSizeBuff, int cchMaxSizeChars)
{
- if(!bThemeActive)
- return E_PROP_ID_UNSUPPORTED;
- if(pszThemeFileName) lstrcpynW(pszThemeFileName, szCurrentTheme, dwMaxNameChars);
- if(pszColorBuff) lstrcpynW(pszColorBuff, szCurrentColor, cchMaxColorChars);
- if(pszSizeBuff) lstrcpynW(pszSizeBuff, szCurrentSize, cchMaxSizeChars);
+ int cchar;
+
+ if(ActiveThemeFile == NULL)
+ return E_PROP_ID_UNSUPPORTED;
+
+ if(pszThemeFileName)
+ {
+ cchar = lstrlenW(ActiveThemeFile->szThemeFile) + 1;
+ if(cchar > dwMaxNameChars)
+ return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+ lstrcpynW(pszThemeFileName, ActiveThemeFile->szThemeFile, cchar);
+ }
+
+ if(pszColorBuff)
+ {
+ cchar = lstrlenW(ActiveThemeFile->pszSelectedColor) + 1;
+ if(cchar > cchMaxColorChars)
+ return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+ lstrcpynW(pszColorBuff, ActiveThemeFile->pszSelectedColor, cchar);
+ }
+
+ if(pszSizeBuff)
+ {
+ cchar = lstrlenW(ActiveThemeFile->pszSelectedSize) + 1;
+ if(cchar > cchMaxSizeChars)
+ return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
+ lstrcpynW(pszSizeBuff, ActiveThemeFile->pszSelectedSize, cchar);
+ }
+
return S_OK;
}
@@ -936,7 +976,7 @@
{
HRESULT hr;
TRACE("(%p,%s,%p)\n", hThemeFile, unknown, hWnd);
- hr = UXTHEME_SetActiveTheme(hThemeFile);
+ hr = UXTHEME_ApplyTheme(hThemeFile);
UXTHEME_broadcast_msg (NULL, WM_THEMECHANGED);
return hr;
}
@@ -1229,6 +1269,6 @@
PNONCLIENTMETRICSW pncMetrics,
COLORREF* lpaRgbValues)
{
- return S_OK;
-}
-
+ return E_NOTIMPL;
+}
+
Modified: trunk/reactos/dll/win32/uxtheme/uxthemep.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/uxthemep…
==============================================================================
--- trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] Mon Apr 22 16:46:43 2013
@@ -79,18 +79,20 @@
typedef struct _UXINI_FILE *PUXINI_FILE;
-HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR
pszSizeName, PTHEME_FILE *tf);
-void MSSTYLES_CloseThemeFile(PTHEME_FILE tf);
-HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf, BOOL setMetrics);
-PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList);
-HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc);
BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, int *dwPrimitive, int *dwId);
BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, int dwEnum, int *dwValue);
BOOL MSSTYLES_LookupPartState(LPCWSTR pszClass, LPCWSTR pszPart, LPCWSTR pszState, int
*iPartId, int *iStateId);
+
+HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR
pszSizeName, PTHEME_FILE *tf);
+HRESULT MSSTYLES_ReferenceTheme(PTHEME_FILE tf);
+void MSSTYLES_CloseThemeFile(PTHEME_FILE tf);
+void MSSTYLES_ParseThemeIni(PTHEME_FILE tf);
+PTHEME_CLASS MSSTYLES_OpenThemeClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR
pszClassList);
+HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc);
PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf);
PTHEME_PARTSTATE MSSTYLES_FindPartState(PTHEME_CLASS tc, int iPartId, int iStateId,
PTHEME_CLASS *tcNext);
PTHEME_PROPERTY MSSTYLES_FindProperty(PTHEME_CLASS tc, int iPartId, int iStateId, int
iPropertyPrimitive, int iPropertyId);
-PTHEME_PROPERTY MSSTYLES_FindMetric(int iPropertyPrimitive, int iPropertyId);
+PTHEME_PROPERTY MSSTYLES_FindMetric(PTHEME_FILE tf, int iPropertyPrimitive, int
iPropertyId);
HBITMAP MSSTYLES_LoadBitmap(PTHEME_CLASS tc, LPCWSTR lpFilename, BOOL* hasAlpha);
HRESULT MSSTYLES_GetPropertyBool(PTHEME_PROPERTY tp, BOOL *pfVal);