|  | /* | 
|  | * Win32 5.1 Theme metrics | 
|  | * | 
|  | * Copyright (C) 2003 Kevin Koltzau | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | */ | 
|  |  | 
|  | #include "config.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "wingdi.h" | 
|  | #include "winuser.h" | 
|  | #include "uxtheme.h" | 
|  | #include "tmschema.h" | 
|  |  | 
|  | #include "msstyles.h" | 
|  | #include "uxthemedll.h" | 
|  |  | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysBool                                     (UXTHEME.@) | 
|  | */ | 
|  | BOOL WINAPI GetThemeSysBool(HTHEME hTheme, int iBoolID) | 
|  | { | 
|  | HRESULT hr; | 
|  | PTHEME_PROPERTY tp; | 
|  | BOOL ret; | 
|  |  | 
|  | TRACE("(%p, %d)\n", hTheme, iBoolID); | 
|  | SetLastError(0); | 
|  | if(hTheme) { | 
|  | if((tp = MSSTYLES_FindMetric(TMT_BOOL, iBoolID))) { | 
|  | hr = MSSTYLES_GetPropertyBool(tp, &ret); | 
|  | if(SUCCEEDED(hr)) | 
|  | return ret; | 
|  | else | 
|  | SetLastError(hr); | 
|  | } | 
|  | } | 
|  | if(iBoolID == TMT_FLATMENUS) { | 
|  | if(SystemParametersInfoW(SPI_GETFLATMENU, 0, &ret, 0)) | 
|  | return ret; | 
|  | } | 
|  | else { | 
|  | FIXME("Unknown bool id: %d\n", iBoolID); | 
|  | SetLastError(STG_E_INVALIDPARAMETER); | 
|  | } | 
|  | return FALSE; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysColor                                    (UXTHEME.@) | 
|  | */ | 
|  | COLORREF WINAPI GetThemeSysColor(HTHEME hTheme, int iColorID) | 
|  | { | 
|  | HRESULT hr; | 
|  | PTHEME_PROPERTY tp; | 
|  |  | 
|  | TRACE("(%p, %d)\n", hTheme, iColorID); | 
|  | SetLastError(0); | 
|  | if(hTheme) { | 
|  | if((tp = MSSTYLES_FindMetric(TMT_COLOR, iColorID))) { | 
|  | COLORREF color; | 
|  | hr = MSSTYLES_GetPropertyColor(tp, &color); | 
|  | if(SUCCEEDED(hr)) | 
|  | return color; | 
|  | else | 
|  | SetLastError(hr); | 
|  | } | 
|  | } | 
|  | return GetSysColor(iColorID - TMT_FIRSTCOLOR); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysColorBrush                               (UXTHEME.@) | 
|  | */ | 
|  | HBRUSH WINAPI GetThemeSysColorBrush(HTHEME hTheme, int iColorID) | 
|  | { | 
|  | TRACE("(%p, %d)\n", hTheme, iColorID); | 
|  | return CreateSolidBrush(GetThemeSysColor(hTheme, iColorID)); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysFont                                     (UXTHEME.@) | 
|  | */ | 
|  | HRESULT WINAPI GetThemeSysFont(HTHEME hTheme, int iFontID, LOGFONTW *plf) | 
|  | { | 
|  | HRESULT hr = S_OK; | 
|  | PTHEME_PROPERTY tp; | 
|  |  | 
|  | TRACE("(%p, %d)\n", hTheme, iFontID); | 
|  | if(hTheme) { | 
|  | if((tp = MSSTYLES_FindMetric(TMT_FONT, iFontID))) { | 
|  | HDC hdc = GetDC(NULL); | 
|  | hr = MSSTYLES_GetPropertyFont(tp, hdc, plf); | 
|  | ReleaseDC(NULL, hdc); | 
|  | if(SUCCEEDED(hr)) | 
|  | return S_OK; | 
|  | } | 
|  | } | 
|  | if(iFontID == TMT_ICONTITLEFONT) { | 
|  | if(!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(LOGFONTW), &plf, 0)) | 
|  | return HRESULT_FROM_WIN32(GetLastError()); | 
|  | } | 
|  | else { | 
|  | NONCLIENTMETRICSW ncm; | 
|  | LOGFONTW *font = NULL; | 
|  | ncm.cbSize = sizeof(NONCLIENTMETRICSW); | 
|  | if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSW), &ncm, 0)) | 
|  | return HRESULT_FROM_WIN32(GetLastError()); | 
|  | switch(iFontID) { | 
|  | case TMT_CAPTIONFONT: font = &ncm.lfCaptionFont; break; | 
|  | case TMT_SMALLCAPTIONFONT: font = &ncm.lfSmCaptionFont; break; | 
|  | case TMT_MENUFONT: font = &ncm.lfMenuFont; break; | 
|  | case TMT_STATUSFONT: font = &ncm.lfStatusFont; break; | 
|  | case TMT_MSGBOXFONT: font = &ncm.lfMessageFont; break; | 
|  | default: FIXME("Unknown FontID: %d\n", iFontID); break; | 
|  | } | 
|  | if(font) CopyMemory(plf, font, sizeof(LOGFONTW)); | 
|  | else     hr = STG_E_INVALIDPARAMETER; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysInt                                      (UXTHEME.@) | 
|  | */ | 
|  | HRESULT WINAPI GetThemeSysInt(HTHEME hTheme, int iIntID, int *piValue) | 
|  | { | 
|  | PTHEME_PROPERTY tp; | 
|  |  | 
|  | TRACE("(%p, %d)\n", hTheme, iIntID); | 
|  | if(!hTheme) | 
|  | return E_HANDLE; | 
|  | if(iIntID <= TMT_FIRSTINT || iIntID >= TMT_LASTINT) { | 
|  | TRACE("Unknown IntID: %d\n", iIntID); | 
|  | return STG_E_INVALIDPARAMETER; | 
|  | } | 
|  | if((tp = MSSTYLES_FindMetric(TMT_INT, iIntID))) | 
|  | return MSSTYLES_GetPropertyInt(tp, piValue); | 
|  | return E_PROP_ID_UNSUPPORTED; | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysSize                                     (UXTHEME.@) | 
|  | */ | 
|  | int WINAPI GetThemeSysSize(HTHEME hTheme, int iSizeID) | 
|  | { | 
|  | PTHEME_PROPERTY tp; | 
|  | int i, id = -1; | 
|  | int metricMap[] = { | 
|  | SM_CXVSCROLL, TMT_SCROLLBARWIDTH, | 
|  | SM_CYHSCROLL, TMT_SCROLLBARHEIGHT, | 
|  | SM_CXSIZE, TMT_CAPTIONBARWIDTH, | 
|  | SM_CYSIZE, TMT_CAPTIONBARHEIGHT, | 
|  | SM_CXFRAME, TMT_SIZINGBORDERWIDTH, | 
|  | SM_CYFRAME, TMT_SIZINGBORDERWIDTH, /* There is no TMT_SIZINGBORDERHEIGHT, but this works in windows.. */ | 
|  | SM_CXSMSIZE, TMT_SMCAPTIONBARWIDTH, | 
|  | SM_CYSMSIZE, TMT_SMCAPTIONBARHEIGHT, | 
|  | SM_CXMENUSIZE, TMT_MENUBARWIDTH, | 
|  | SM_CYMENUSIZE, TMT_MENUBARHEIGHT | 
|  | }; | 
|  |  | 
|  | if(hTheme) { | 
|  | for(i=0; i<sizeof(metricMap)/sizeof(metricMap[0]); i+=2) { | 
|  | if(metricMap[i] == iSizeID) { | 
|  | id = metricMap[i+1]; | 
|  | break; | 
|  | } | 
|  | } | 
|  | SetLastError(0); | 
|  | if(id != -1) { | 
|  | if((tp = MSSTYLES_FindMetric(TMT_SIZE, id))) { | 
|  | if(SUCCEEDED(MSSTYLES_GetPropertyInt(tp, &i))) { | 
|  | return i; | 
|  | } | 
|  | } | 
|  | TRACE("Size %d not found in theme, using system metric\n", iSizeID); | 
|  | } | 
|  | else { | 
|  | SetLastError(STG_E_INVALIDPARAMETER); | 
|  | return 0; | 
|  | } | 
|  | } | 
|  | return GetSystemMetrics(iSizeID); | 
|  | } | 
|  |  | 
|  | /*********************************************************************** | 
|  | *      GetThemeSysString                                   (UXTHEME.@) | 
|  | */ | 
|  | HRESULT WINAPI GetThemeSysString(HTHEME hTheme, int iStringID, | 
|  | LPWSTR pszStringBuff, int cchMaxStringChars) | 
|  | { | 
|  | PTHEME_PROPERTY tp; | 
|  |  | 
|  | TRACE("(%p, %d)\n", hTheme, iStringID); | 
|  | if(!hTheme) | 
|  | return E_HANDLE; | 
|  | if(iStringID <= TMT_FIRSTSTRING || iStringID >= TMT_LASTSTRING) { | 
|  | TRACE("Unknown StringID: %d\n", iStringID); | 
|  | return STG_E_INVALIDPARAMETER; | 
|  | } | 
|  | if((tp = MSSTYLES_FindMetric(TMT_STRING, iStringID))) | 
|  | return MSSTYLES_GetPropertyString(tp, pszStringBuff, cchMaxStringChars); | 
|  | return E_PROP_ID_UNSUPPORTED; | 
|  | } |