diff --git a/reactos/baseaddress.xml b/reactos/baseaddress.xml index 54748cc4215..bad48d9c338 100644 --- a/reactos/baseaddress.xml +++ b/reactos/baseaddress.xml @@ -1,6 +1,7 @@ + diff --git a/reactos/doc/README.WINE b/reactos/doc/README.WINE index 46255de1bbe..8541b761b8f 100644 --- a/reactos/doc/README.WINE +++ b/reactos/doc/README.WINE @@ -65,6 +65,7 @@ reactos/lib/shdocvw # Synced to Wine-20050419 reactos/lib/shlwapi # Synced to Wine-20050419 reactos/lib/twain # Out of sync reactos/lib/urlmon # Synced to Wine-20050419 +reactos/lib/uxtheme # Synced to Wine-20050703 reactos/lib/version # Out of sync reactos/lib/wininet # Out of sync reactos/lib/winmm # Synced to Wine-20050419 diff --git a/reactos/include/wine/winuser.h b/reactos/include/wine/winuser.h index 137b7144c4b..706b9ec3a33 100644 --- a/reactos/include/wine/winuser.h +++ b/reactos/include/wine/winuser.h @@ -21,4 +21,14 @@ typedef struct tagCWPSTRUCT *LPCWPSTRUCT; #define WM_ALTTABACTIVE 0x0029 +#ifndef E_PROP_ID_UNSUPPORTED +#define E_PROP_ID_UNSUPPORTED ((HRESULT)0x80070490) +#endif +#ifndef E_PROP_SET_UNSUPPORTED +#define E_PROP_SET_UNSUPPORTED ((HRESULT)0x80070492) +#endif + +#define MAKEINTATOMA(atom) ((LPCSTR)((ULONG_PTR)((WORD)(atom)))) +#define MAKEINTATOMW(atom) ((LPCWSTR)((ULONG_PTR)((WORD)(atom)))) + #endif /* __WINE_WINUSER_H */ diff --git a/reactos/lib/directory.xml b/reactos/lib/directory.xml index c8327eb6774..34958096107 100644 --- a/reactos/lib/directory.xml +++ b/reactos/lib/directory.xml @@ -271,6 +271,9 @@ + + + diff --git a/reactos/lib/uxtheme/Makefile.in b/reactos/lib/uxtheme/Makefile.in new file mode 100644 index 00000000000..27e46a57122 --- /dev/null +++ b/reactos/lib/uxtheme/Makefile.in @@ -0,0 +1,25 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = uxtheme.dll +IMPORTLIB = libuxtheme.$(IMPLIBEXT) +IMPORTS = shlwapi user32 gdi32 advapi32 kernel32 ntdll +DELAYIMPORTS = msimg32 +EXTRALIBS = $(LIBUNICODE) + +C_SRCS = \ + draw.c \ + main.c \ + metric.c \ + msstyles.c \ + property.c \ + stylemap.c \ + system.c \ + uxini.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ + +### Dependencies: diff --git a/reactos/lib/uxtheme/draw.c b/reactos/lib/uxtheme/draw.c new file mode 100644 index 00000000000..0d43836be20 --- /dev/null +++ b/reactos/lib/uxtheme/draw.c @@ -0,0 +1,1037 @@ +/* + * Win32 5.1 Theme drawing + * + * 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 +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "uxtheme.h" +#include "tmschema.h" + +#include "msstyles.h" +#include "uxthemedll.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * Defines and global variables + */ + +DWORD dwDialogTextureFlags; + +/***********************************************************************/ + +/*********************************************************************** + * EnableThemeDialogTexture (UXTHEME.@) + */ +HRESULT WINAPI EnableThemeDialogTexture(HWND hwnd, DWORD dwFlags) +{ + TRACE("(%p,0x%08lx\n", hwnd, dwFlags); + dwDialogTextureFlags = dwFlags; + return S_OK; + } + +/*********************************************************************** + * IsThemeDialogTextureEnabled (UXTHEME.@) + */ +BOOL WINAPI IsThemeDialogTextureEnabled(HWND hwnd) +{ + TRACE("(%p)\n", hwnd); + return (dwDialogTextureFlags & ETDT_ENABLE) && !(dwDialogTextureFlags & ETDT_DISABLE); +} + +/*********************************************************************** + * DrawThemeParentBackground (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc) +{ + RECT rt; + POINT org; + HWND hParent; + HRGN clip = NULL; + int hasClip = -1; + + TRACE("(%p,%p,%p)\n", hwnd, hdc, prc); + hParent = GetParent(hwnd); + if(!hParent) + hParent = hwnd; + if(prc) { + CopyRect(&rt, prc); + MapWindowPoints(hwnd, NULL, (LPPOINT)&rt, 2); + + clip = CreateRectRgn(0,0,1,1); + hasClip = GetClipRgn(hdc, clip); + if(hasClip == -1) + TRACE("Failed to get original clipping region\n"); + else + IntersectClipRect(hdc, prc->left, prc->top, prc->right, prc->bottom); + } + else { + GetClientRect(hParent, &rt); + MapWindowPoints(hParent, NULL, (LPPOINT)&rt, 2); + } + + SetViewportOrgEx(hdc, rt.left, rt.top, &org); + + SendMessageW(hParent, WM_ERASEBKGND, (WPARAM)hdc, 0); + SendMessageW(hParent, WM_PRINTCLIENT, (WPARAM)hdc, PRF_CLIENT); + + SetViewportOrgEx(hdc, org.x, org.y, NULL); + if(prc) { + if(hasClip == 0) + SelectClipRgn(hdc, NULL); + else if(hasClip == 1) + SelectClipRgn(hdc, clip); + DeleteObject(clip); + } + return S_OK; +} + + +/*********************************************************************** + * DrawThemeBackground (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pRect, + const RECT *pClipRect) +{ + DTBGOPTS opts; + opts.dwSize = sizeof(DTBGOPTS); + opts.dwFlags = 0; + if(pClipRect) { + opts.dwFlags |= DTBG_CLIPRECT; + CopyRect(&opts.rcClip, pClipRect); + } + return DrawThemeBackgroundEx(hTheme, hdc, iPartId, iStateId, pRect, &opts); +} + +/*********************************************************************** + * UXTHEME_SelectImage + * + * Select the image to use + */ +static PTHEME_PROPERTY UXTHEME_SelectImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph) +{ + PTHEME_PROPERTY tp; + int imageselecttype = IST_NONE; + int i; + int image; + if(glyph) + image = TMT_GLYPHIMAGEFILE; + else + image = TMT_IMAGEFILE; + + if((tp=MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, image))) + return tp; + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_IMAGESELECTTYPE, &imageselecttype); + + if(imageselecttype == IST_DPI) { + int reqdpi = 0; + int screendpi = GetDeviceCaps(hdc, LOGPIXELSX); + for(i=4; i>=0; i--) { + reqdpi = 0; + if(SUCCEEDED(GetThemeInt(hTheme, iPartId, iStateId, i + TMT_MINDPI1, &reqdpi))) { + if(reqdpi != 0 && screendpi >= reqdpi) { + TRACE("Using %d DPI, image %d\n", reqdpi, i + TMT_IMAGEFILE1); + return MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, i + TMT_IMAGEFILE1); + } + } + } + /* If an image couldnt be selected, choose the first one */ + return MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, TMT_IMAGEFILE1); + } + else if(imageselecttype == IST_SIZE) { + POINT size = {pRect->right-pRect->left, pRect->bottom-pRect->top}; + POINT reqsize; + for(i=4; i>=0; i--) { + if(SUCCEEDED(GetThemePosition(hTheme, iPartId, iStateId, i + TMT_MINSIZE1, &reqsize))) { + if(reqsize.x >= size.x && reqsize.y >= size.y) { + TRACE("Using image size %ldx%ld, image %d\n", reqsize.x, reqsize.y, i + TMT_IMAGEFILE1); + return MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, i + TMT_IMAGEFILE1); + } + } + } + /* If an image couldnt be selected, choose the smallest one */ + return MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, TMT_IMAGEFILE1); + } + return NULL; +} + +/*********************************************************************** + * UXTHEME_LoadImage + * + * Load image for part/state + */ +static HRESULT UXTHEME_LoadImage(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, BOOL glyph, + HBITMAP *hBmp, RECT *bmpRect) +{ + int imagelayout = IL_VERTICAL; + int imagecount = 0; + BITMAP bmp; + WCHAR szPath[MAX_PATH]; + PTHEME_PROPERTY tp = UXTHEME_SelectImage(hTheme, hdc, iPartId, iStateId, pRect, glyph); + if(!tp) { + FIXME("Couldn't determine image for part/state %d/%d, invalid theme?\n", iPartId, iStateId); + return E_PROP_ID_UNSUPPORTED; + } + lstrcpynW(szPath, tp->lpValue, min(tp->dwValueLen+1, sizeof(szPath)/sizeof(szPath[0]))); + *hBmp = MSSTYLES_LoadBitmap(hdc, hTheme, szPath); + if(!*hBmp) { + TRACE("Failed to load bitmap %s\n", debugstr_w(szPath)); + return HRESULT_FROM_WIN32(GetLastError()); + } + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_IMAGELAYOUT, &imagelayout); + GetThemeInt(hTheme, iPartId, iStateId, TMT_IMAGECOUNT, &imagecount); + + GetObjectW(*hBmp, sizeof(bmp), &bmp); + if(imagelayout == IL_VERTICAL) { + int height = bmp.bmHeight/imagecount; + bmpRect->left = 0; + bmpRect->right = bmp.bmWidth; + bmpRect->top = (min(imagecount, iStateId)-1) * height; + bmpRect->bottom = bmpRect->top + height; + } + else { + int width = bmp.bmWidth/imagecount; + bmpRect->left = (min(imagecount, iStateId)-1) * width; + bmpRect->right = bmpRect->left + width; + bmpRect->top = 0; + bmpRect->bottom = bmp.bmHeight; + } + return S_OK; +} + +/*********************************************************************** + * UXTHEME_StretchBlt + * + * Psudo TransparentBlt/StretchBlt + */ +static inline BOOL UXTHEME_StretchBlt(HDC hdcDst, int nXOriginDst, int nYOriginDst, int nWidthDst, int nHeightDst, + HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, + BOOL transparent, COLORREF transcolor) +{ + if(transparent) { + /* Ensure we don't pass any negative values to TransparentBlt */ + return TransparentBlt(hdcDst, nXOriginDst, nYOriginDst, abs(nWidthDst), abs(nHeightDst), + hdcSrc, nXOriginSrc, nYOriginSrc, abs(nWidthSrc), abs(nHeightSrc), + transcolor); + } + /* This should be using AlphaBlend */ + return StretchBlt(hdcDst, nXOriginDst, nYOriginDst, nWidthDst, nHeightDst, + hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, + SRCCOPY); +} + +/*********************************************************************** + * UXTHEME_Blt + * + * Simplify sending same width/height for both source and dest + */ +static inline BOOL UXTHEME_Blt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, + HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, + BOOL transparent, COLORREF transcolor) +{ + return UXTHEME_StretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, + hdcSrc, nXOriginSrc, nYOriginSrc, nWidthDest, nHeightDest, + transparent, transcolor); +} + + +/*********************************************************************** + * UXTHEME_DrawImageGlyph + * + * Draw an imagefile glyph + */ +static HRESULT UXTHEME_DrawImageGlyph(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr; + HBITMAP bmpSrc = NULL; + HDC hdcSrc = NULL; + HGDIOBJ oldSrc = NULL; + RECT rcSrc; + BOOL transparent = FALSE; + COLORREF transparentcolor = 0; + int valign = VA_CENTER; + int halign = HA_CENTER; + POINT dstSize; + POINT srcSize; + POINT topleft; + + hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, TRUE, &bmpSrc, &rcSrc); + if(FAILED(hr)) return hr; + hdcSrc = CreateCompatibleDC(hdc); + if(!hdcSrc) { + hr = HRESULT_FROM_WIN32(GetLastError()); + DeleteObject(bmpSrc); + return hr; + } + oldSrc = SelectObject(hdcSrc, bmpSrc); + + dstSize.x = pRect->right-pRect->left; + dstSize.y = pRect->bottom-pRect->top; + srcSize.x = rcSrc.right-rcSrc.left; + srcSize.y = rcSrc.bottom-rcSrc.top; + + GetThemeBool(hTheme, iPartId, iStateId, TMT_GLYPHTRANSPARENT, &transparent); + if(transparent) { + if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_GLYPHTRANSPARENTCOLOR, &transparentcolor))) { + /* If image is transparent, but no color was specified, get the color of the upper left corner */ + transparentcolor = GetPixel(hdcSrc, 0, 0); + } + } + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_VALIGN, &valign); + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_HALIGN, &halign); + + topleft.x = pRect->left; + topleft.y = pRect->top; + if(halign == HA_CENTER) topleft.x += (dstSize.x/2)-(srcSize.x/2); + else if(halign == HA_RIGHT) topleft.x += dstSize.x-srcSize.x; + if(valign == VA_CENTER) topleft.y += (dstSize.y/2)-(srcSize.y/2); + else if(valign == VA_BOTTOM) topleft.y += dstSize.y-srcSize.y; + + if(!UXTHEME_Blt(hdc, topleft.x, topleft.y, srcSize.x, srcSize.y, + hdcSrc, rcSrc.left, rcSrc.top, + transparent, transparentcolor)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + } + + SelectObject(hdcSrc, oldSrc); + DeleteDC(hdcSrc); + DeleteObject(bmpSrc); + return hr; +} + +/*********************************************************************** + * UXTHEME_DrawImageGlyph + * + * Draw glyph on top of background, if appropriate + */ +static HRESULT UXTHEME_DrawGlyph(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *pRect, + const DTBGOPTS *pOptions) +{ + int glyphtype = GT_NONE; + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_GLYPHTYPE, &glyphtype); + + if(glyphtype == GT_IMAGEGLYPH) { + return UXTHEME_DrawImageGlyph(hTheme, hdc, iPartId, iStateId, pRect, pOptions); + } + else if(glyphtype == GT_FONTGLYPH) { + /* I don't know what a font glyph is, I've never seen it used in any themes */ + FIXME("Font glyph\n"); + } + return S_OK; +} + +/*********************************************************************** + * UXTHEME_DrawImageBackground + * + * Draw an imagefile background + */ +static HRESULT UXTHEME_DrawImageBackground(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr = S_OK; + HBITMAP bmpSrc; + HGDIOBJ oldSrc; + HDC hdcSrc; + RECT rcSrc; + RECT rcDst; + POINT dstSize; + POINT srcSize; + int sizingtype = ST_TRUESIZE; + BOOL uniformsizing = FALSE; + BOOL transparent = FALSE; + COLORREF transparentcolor = 0; + + hr = UXTHEME_LoadImage(hTheme, hdc, iPartId, iStateId, pRect, FALSE, &bmpSrc, &rcSrc); + if(FAILED(hr)) return hr; + hdcSrc = CreateCompatibleDC(hdc); + if(!hdcSrc) { + hr = HRESULT_FROM_WIN32(GetLastError()); + DeleteObject(bmpSrc); + return hr; + } + oldSrc = SelectObject(hdcSrc, bmpSrc); + + CopyRect(&rcDst, pRect); + + GetThemeBool(hTheme, iPartId, iStateId, TMT_TRANSPARENT, &transparent); + if(transparent) { + if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_TRANSPARENTCOLOR, &transparentcolor))) { + /* If image is transparent, but no color was specified, get the color of the upper left corner */ + transparentcolor = GetPixel(hdcSrc, 0, 0); + } + } + + dstSize.x = rcDst.right-rcDst.left; + dstSize.y = rcDst.bottom-rcDst.top; + srcSize.x = rcSrc.right-rcSrc.left; + srcSize.y = rcSrc.bottom-rcSrc.top; + + GetThemeBool(hTheme, iPartId, iStateId, TMT_UNIFORMSIZING, &uniformsizing); + if(uniformsizing) { + /* Scale height and width equally */ + int widthDiff = abs(srcSize.x-dstSize.x); + int heightDiff = abs(srcSize.y-dstSize.x); + if(widthDiff > heightDiff) { + dstSize.y -= widthDiff-heightDiff; + rcDst.bottom = rcDst.top + dstSize.y; + } + else if(heightDiff > widthDiff) { + dstSize.x -= heightDiff-widthDiff; + rcDst.right = rcDst.left + dstSize.x; + } + } + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_SIZINGTYPE, &sizingtype); + if(sizingtype == ST_TRUESIZE) { + int truesizestretchmark = 0; + + if(dstSize.x < 0 || dstSize.y < 0) { + BOOL mirrorimage = TRUE; + GetThemeBool(hTheme, iPartId, iStateId, TMT_MIRRORIMAGE, &mirrorimage); + if(mirrorimage) { + if(dstSize.x < 0) { + rcDst.left += dstSize.x; + rcDst.right += dstSize.x; + } + if(dstSize.y < 0) { + rcDst.top += dstSize.y; + rcDst.bottom += dstSize.y; + } + } + } + /* Only stretch when target exceeds source by truesizestretchmark percent */ + GetThemeInt(hTheme, iPartId, iStateId, TMT_TRUESIZESTRETCHMARK, &truesizestretchmark); + if(dstSize.x < 0 || dstSize.y < 0 || + MulDiv(srcSize.x, 100, dstSize.x) > truesizestretchmark || + MulDiv(srcSize.y, 100, dstSize.y) > truesizestretchmark) { + if(!UXTHEME_StretchBlt(hdc, rcDst.left, rcDst.top, dstSize.x, dstSize.y, + hdcSrc, rcSrc.left, rcSrc.top, srcSize.x, srcSize.y, + transparent, transparentcolor)) + hr = HRESULT_FROM_WIN32(GetLastError()); + } + else { + rcDst.left += (dstSize.x/2)-(srcSize.x/2); + rcDst.top += (dstSize.y/2)-(srcSize.y/2); + rcDst.right = rcDst.left + srcSize.x; + rcDst.bottom = rcDst.top + srcSize.y; + if(!UXTHEME_Blt(hdc, rcDst.left, rcDst.top, srcSize.x, srcSize.y, + hdcSrc, rcSrc.left, rcSrc.top, + transparent, transparentcolor)) + hr = HRESULT_FROM_WIN32(GetLastError()); + } + } + else { + HDC hdcDst = NULL; + HBITMAP bmpDst = NULL; + HGDIOBJ oldDst = NULL; + MARGINS sm; + + dstSize.x = abs(dstSize.x); + dstSize.y = abs(dstSize.y); + + GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_SIZINGMARGINS, NULL, &sm); + + hdcDst = CreateCompatibleDC(hdc); + if(!hdcDst) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + bmpDst = CreateCompatibleBitmap(hdc, dstSize.x, dstSize.y); + if(!bmpDst) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + oldDst = SelectObject(hdcDst, bmpDst); + + /* Upper left corner */ + if(!BitBlt(hdcDst, 0, 0, sm.cxLeftWidth, sm.cyTopHeight, + hdcSrc, rcSrc.left, rcSrc.top, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + /* Upper right corner */ + if(!BitBlt(hdcDst, dstSize.x-sm.cxRightWidth, 0, sm.cxRightWidth, sm.cyTopHeight, + hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.top, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + /* Lower left corner */ + if(!BitBlt(hdcDst, 0, dstSize.y-sm.cyBottomHeight, sm.cxLeftWidth, sm.cyBottomHeight, + hdcSrc, rcSrc.left, rcSrc.bottom-sm.cyBottomHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + /* Lower right corner */ + if(!BitBlt(hdcDst, dstSize.x-sm.cxRightWidth, dstSize.y-sm.cyBottomHeight, sm.cxRightWidth, sm.cyBottomHeight, + hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.bottom-sm.cyBottomHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + + if(sizingtype == ST_TILE) { + FIXME("Tile\n"); + sizingtype = ST_STRETCH; /* Just use stretch for now */ + } + if(sizingtype == ST_STRETCH) { + int destCenterWidth = dstSize.x - (sm.cxLeftWidth + sm.cxRightWidth); + int srcCenterWidth = srcSize.x - (sm.cxLeftWidth + sm.cxRightWidth); + int destCenterHeight = dstSize.y - (sm.cyTopHeight + sm.cyBottomHeight); + int srcCenterHeight = srcSize.y - (sm.cyTopHeight + sm.cyBottomHeight); + + if(destCenterWidth > 0) { + /* Center top */ + if(!StretchBlt(hdcDst, sm.cxLeftWidth, 0, destCenterWidth, sm.cyTopHeight, + hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.top, srcCenterWidth, sm.cyTopHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + /* Center bottom */ + if(!StretchBlt(hdcDst, sm.cxLeftWidth, dstSize.y-sm.cyBottomHeight, destCenterWidth, sm.cyBottomHeight, + hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.bottom-sm.cyBottomHeight, srcCenterWidth, sm.cyTopHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + } + if(destCenterHeight > 0) { + /* Left center */ + if(!StretchBlt(hdcDst, 0, sm.cyTopHeight, sm.cxLeftWidth, destCenterHeight, + hdcSrc, rcSrc.left, rcSrc.top+sm.cyTopHeight, sm.cxLeftWidth, srcCenterHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + /* Right center */ + if(!StretchBlt(hdcDst, dstSize.x-sm.cxRightWidth, sm.cyTopHeight, sm.cxRightWidth, destCenterHeight, + hdcSrc, rcSrc.right-sm.cxRightWidth, rcSrc.top+sm.cyTopHeight, sm.cxRightWidth, srcCenterHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + } + if(destCenterHeight > 0 && destCenterWidth > 0) { + BOOL borderonly = FALSE; + GetThemeBool(hTheme, iPartId, iStateId, TMT_BORDERONLY, &borderonly); + if(!borderonly) { + /* Center */ + if(!StretchBlt(hdcDst, sm.cxLeftWidth, sm.cyTopHeight, destCenterWidth, destCenterHeight, + hdcSrc, rcSrc.left+sm.cxLeftWidth, rcSrc.top+sm.cyTopHeight, srcCenterWidth, srcCenterHeight, SRCCOPY)) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto draw_error; + } + } + } + } + + if(!UXTHEME_Blt(hdc, rcDst.left, rcDst.top, dstSize.x, dstSize.y, + hdcDst, 0, 0, + transparent, transparentcolor)) + hr = HRESULT_FROM_WIN32(GetLastError()); + +draw_error: + if(hdcDst) { + SelectObject(hdcDst, oldDst); + DeleteDC(hdcDst); + } + if(bmpDst) DeleteObject(bmpDst); + } + SelectObject(hdcSrc, oldSrc); + DeleteObject(bmpSrc); + DeleteDC(hdcSrc); + CopyRect(pRect, &rcDst); + return hr; +} + +/*********************************************************************** + * UXTHEME_DrawBorderRectangle + * + * Draw the bounding rectangle for a borderfill background + */ +static HRESULT UXTHEME_DrawBorderRectangle(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr = S_OK; + HPEN hPen; + HGDIOBJ oldPen; + COLORREF bordercolor = RGB(0,0,0); + int bordersize = 1; + + GetThemeInt(hTheme, iPartId, iStateId, TMT_BORDERSIZE, &bordersize); + if(bordersize > 0) { + POINT ptCorners[4]; + ptCorners[0].x = pRect->left; + ptCorners[0].y = pRect->top; + ptCorners[1].x = pRect->right; + ptCorners[1].y = pRect->top; + ptCorners[2].x = pRect->right; + ptCorners[2].y = pRect->bottom; + ptCorners[3].x = pRect->left; + ptCorners[3].y = pRect->bottom; + + InflateRect(pRect, -bordersize, -bordersize); + if(pOptions->dwFlags & DTBG_OMITBORDER) + return S_OK; + GetThemeColor(hTheme, iPartId, iStateId, TMT_BORDERCOLOR, &bordercolor); + hPen = CreatePen(PS_SOLID, bordersize, bordercolor); + if(!hPen) + return HRESULT_FROM_WIN32(GetLastError()); + oldPen = SelectObject(hdc, hPen); + + if(!Polyline(hdc, ptCorners, 4)) + hr = HRESULT_FROM_WIN32(GetLastError()); + + SelectObject(hdc, oldPen); + DeleteObject(hPen); + } + return hr; +} + +/*********************************************************************** + * UXTHEME_DrawBackgroundFill + * + * Fill a borderfill background rectangle + */ +static HRESULT UXTHEME_DrawBackgroundFill(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr = S_OK; + int filltype = FT_SOLID; + + TRACE("(%d,%d,%ld)\n", iPartId, iStateId, pOptions->dwFlags); + + if(pOptions->dwFlags & DTBG_OMITCONTENT) + return S_OK; + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_FILLTYPE, &filltype); + + if(filltype == FT_SOLID) { + HBRUSH hBrush; + COLORREF fillcolor = RGB(255,255,255); + + GetThemeColor(hTheme, iPartId, iStateId, TMT_FILLCOLOR, &fillcolor); + hBrush = CreateSolidBrush(fillcolor); + if(!FillRect(hdc, pRect, hBrush)) + hr = HRESULT_FROM_WIN32(GetLastError()); + DeleteObject(hBrush); + } + else if(filltype == FT_VERTGRADIENT || filltype == FT_HORZGRADIENT) { + /* FIXME: This only accounts for 2 gradient colors (out of 5) and ignores + the gradient ratios (no idea how those work) + Few themes use this, and the ones I've seen only use 2 colors with + a gradient ratio of 0 and 255 respectivly + */ + + COLORREF gradient1 = RGB(0,0,0); + COLORREF gradient2 = RGB(255,255,255); + TRIVERTEX vert[2]; + GRADIENT_RECT gRect; + + FIXME("Gradient implementation not complete\n"); + + GetThemeColor(hTheme, iPartId, iStateId, TMT_GRADIENTCOLOR1, &gradient1); + GetThemeColor(hTheme, iPartId, iStateId, TMT_GRADIENTCOLOR2, &gradient2); + + vert[0].x = pRect->left; + vert[0].y = pRect->top; + vert[0].Red = GetRValue(gradient1) << 8; + vert[0].Green = GetGValue(gradient1) << 8; + vert[0].Blue = GetBValue(gradient1) << 8; + vert[0].Alpha = 0x0000; + + vert[1].x = pRect->right; + vert[1].y = pRect->bottom; + vert[1].Red = GetRValue(gradient2) << 8; + vert[1].Green = GetGValue(gradient2) << 8; + vert[1].Blue = GetBValue(gradient2) << 8; + vert[1].Alpha = 0x0000; + + gRect.UpperLeft = 0; + gRect.LowerRight = 1; + GradientFill(hdc,vert,2,&gRect,1,filltype==FT_HORZGRADIENT?GRADIENT_FILL_RECT_H:GRADIENT_FILL_RECT_V); + } + else if(filltype == FT_RADIALGRADIENT) { + /* I've never seen this used in a theme */ + FIXME("Radial gradient\n"); + } + else if(filltype == FT_TILEIMAGE) { + /* I've never seen this used in a theme */ + FIXME("Tile image\n"); + } + return hr; +} + +/*********************************************************************** + * UXTHEME_DrawBorderBackground + * + * Draw an imagefile background + */ +static HRESULT UXTHEME_DrawBorderBackground(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr; + RECT rt; + + CopyRect(&rt, pRect); + + hr = UXTHEME_DrawBorderRectangle(hTheme, hdc, iPartId, iStateId, &rt, pOptions); + if(FAILED(hr)) + return hr; + return UXTHEME_DrawBackgroundFill(hTheme, hdc, iPartId, iStateId, &rt, pOptions); +} + +/*********************************************************************** + * DrawThemeBackgroundEx (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeBackgroundEx(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pRect, + const DTBGOPTS *pOptions) +{ + HRESULT hr; + const DTBGOPTS defaultOpts = {sizeof(DTBGOPTS), 0, {0,0,0,0}}; + const DTBGOPTS *opts; + HRGN clip = NULL; + int hasClip = -1; + int bgtype = BT_BORDERFILL; + RECT rt; + + TRACE("(%p,%p,%d,%d,%ld,%ld)\n", hTheme, hdc, iPartId, iStateId,pRect->left,pRect->top); + if(!hTheme) + return E_HANDLE; + + /* Ensure we have a DTBGOPTS structure available, simplifies some of the code */ + opts = pOptions; + if(!opts) opts = &defaultOpts; + + if(opts->dwFlags & DTBG_CLIPRECT) { + clip = CreateRectRgn(0,0,1,1); + hasClip = GetClipRgn(hdc, clip); + if(hasClip == -1) + TRACE("Failed to get original clipping region\n"); + else + IntersectClipRect(hdc, opts->rcClip.left, opts->rcClip.top, opts->rcClip.right, opts->rcClip.bottom); + } + CopyRect(&rt, pRect); + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype); + if(bgtype == BT_IMAGEFILE) + hr = UXTHEME_DrawImageBackground(hTheme, hdc, iPartId, iStateId, &rt, opts); + else if(bgtype == BT_BORDERFILL) + hr = UXTHEME_DrawBorderBackground(hTheme, hdc, iPartId, iStateId, pRect, opts); + else { + FIXME("Unknown background type\n"); + /* This should never happen, and hence I don't know what to return */ + hr = E_FAIL; + } + if(SUCCEEDED(hr)) + hr = UXTHEME_DrawGlyph(hTheme, hdc, iPartId, iStateId, &rt, opts); + if(opts->dwFlags & DTBG_CLIPRECT) { + if(hasClip == 0) + SelectClipRgn(hdc, NULL); + else if(hasClip == 1) + SelectClipRgn(hdc, clip); + DeleteObject(clip); + } + return hr; +} + +/*********************************************************************** + * DrawThemeEdge (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeEdge(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pDestRect, UINT uEdge, + UINT uFlags, RECT *pContentRect) +{ + FIXME("%d %d 0x%08x 0x%08x: stub\n", iPartId, iStateId, uEdge, uFlags); + if(!hTheme) + return E_HANDLE; + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * DrawThemeIcon (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeIcon(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + const RECT *pRect, HIMAGELIST himl, int iImageIndex) +{ + FIXME("%d %d: stub\n", iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * DrawThemeText (UXTHEME.@) + */ +HRESULT WINAPI DrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, + LPCWSTR pszText, int iCharCount, DWORD dwTextFlags, + DWORD dwTextFlags2, const RECT *pRect) +{ + HRESULT hr; + HFONT hFont = NULL; + HGDIOBJ oldFont = NULL; + LOGFONTW logfont; + COLORREF textColor; + COLORREF oldTextColor; + int oldBkMode; + RECT rt; + + TRACE("%d %d: stub\n", iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + + hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont); + if(SUCCEEDED(hr)) { + hFont = CreateFontIndirectW(&logfont); + if(!hFont) + TRACE("Failed to create font\n"); + } + CopyRect(&rt, pRect); + if(hFont) + oldFont = SelectObject(hdc, hFont); + + if(dwTextFlags2 & DTT_GRAYED) + textColor = GetSysColor(COLOR_GRAYTEXT); + else { + if(FAILED(GetThemeColor(hTheme, iPartId, iStateId, TMT_TEXTCOLOR, &textColor))) + textColor = GetTextColor(hdc); + } + oldTextColor = SetTextColor(hdc, textColor); + oldBkMode = SetBkMode(hdc, TRANSPARENT); + DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags); + SetBkMode(hdc, oldBkMode); + SetTextColor(hdc, oldTextColor); + + if(hFont) { + SelectObject(hdc, oldFont); + DeleteObject(hFont); + } + return S_OK; +} + +/*********************************************************************** + * GetThemeBackgroundContentRect (UXTHEME.@) + */ +HRESULT WINAPI GetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, + const RECT *pBoundingRect, + RECT *pContentRect) +{ + MARGINS margin; + HRESULT hr; + + TRACE("(%d,%d)\n", iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + + hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_CONTENTMARGINS, NULL, &margin); + if(FAILED(hr)) { + TRACE("Margins not found\n"); + return hr; + } + pContentRect->left = pBoundingRect->left + margin.cxLeftWidth; + pContentRect->top = pBoundingRect->top + margin.cyTopHeight; + pContentRect->right = pBoundingRect->right - margin.cxRightWidth; + pContentRect->bottom = pBoundingRect->bottom - margin.cyBottomHeight; + + TRACE("left:%ld,top:%ld,right:%ld,bottom:%ld\n", pContentRect->left, pContentRect->top, pContentRect->right, pContentRect->bottom); + + return S_OK; +} + +/*********************************************************************** + * GetThemeBackgroundExtent (UXTHEME.@) + */ +HRESULT WINAPI GetThemeBackgroundExtent(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pContentRect, + RECT *pExtentRect) +{ + MARGINS margin; + HRESULT hr; + + TRACE("(%d,%d)\n", iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + + hr = GetThemeMargins(hTheme, hdc, iPartId, iStateId, TMT_CONTENTMARGINS, NULL, &margin); + if(FAILED(hr)) { + TRACE("Margins not found\n"); + return hr; + } + pExtentRect->left = pContentRect->left - margin.cxLeftWidth; + pExtentRect->top = pContentRect->top - margin.cyTopHeight; + pExtentRect->right = pContentRect->right + margin.cxRightWidth; + pExtentRect->bottom = pContentRect->bottom + margin.cyBottomHeight; + + TRACE("left:%ld,top:%ld,right:%ld,bottom:%ld\n", pExtentRect->left, pExtentRect->top, pExtentRect->right, pExtentRect->bottom); + + return S_OK; +} + +/*********************************************************************** + * GetThemeBackgroundRegion (UXTHEME.@) + * + * Calculate the background region, taking into consideration transparent areas + * of the background image. + */ +HRESULT WINAPI GetThemeBackgroundRegion(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, const RECT *pRect, + HRGN *pRegion) +{ + HRESULT hr = S_OK; + int bgtype = BT_BORDERFILL; + + TRACE("(%p,%p,%d,%d)\n", hTheme, hdc, iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + if(!pRect || !pRegion) + return E_POINTER; + + GetThemeEnumValue(hTheme, iPartId, iStateId, TMT_BGTYPE, &bgtype); + if(bgtype == BT_IMAGEFILE) { + FIXME("Images not handled yet\n"); + hr = ERROR_CALL_NOT_IMPLEMENTED; + } + else if(bgtype == BT_BORDERFILL) { + *pRegion = CreateRectRgn(pRect->left, pRect->top, pRect->right, pRect->bottom); + if(!*pRegion) + hr = HRESULT_FROM_WIN32(GetLastError()); + } + else { + FIXME("Unknown background type\n"); + /* This should never happen, and hence I don't know what to return */ + hr = E_FAIL; + } + return hr; +} + +/*********************************************************************** + * GetThemePartSize (UXTHEME.@) + */ +HRESULT WINAPI GetThemePartSize(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, RECT *prc, THEMESIZE eSize, + SIZE *psz) +{ + FIXME("%d %d %d: stub\n", iPartId, iStateId, eSize); + if(!hTheme) + return E_HANDLE; + return ERROR_CALL_NOT_IMPLEMENTED; +} + + +/*********************************************************************** + * GetThemeTextExtent (UXTHEME.@) + */ +HRESULT WINAPI GetThemeTextExtent(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, LPCWSTR pszText, int iCharCount, + DWORD dwTextFlags, const RECT *pBoundingRect, + RECT *pExtentRect) +{ + HRESULT hr; + HFONT hFont = NULL; + HGDIOBJ oldFont = NULL; + LOGFONTW logfont; + RECT rt = {0,0,0xFFFF,0xFFFF}; + + TRACE("%d %d: stub\n", iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + + if(pBoundingRect) + CopyRect(&rt, pBoundingRect); + + hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont); + if(SUCCEEDED(hr)) { + hFont = CreateFontIndirectW(&logfont); + if(!hFont) + TRACE("Failed to create font\n"); + } + if(hFont) + oldFont = SelectObject(hdc, hFont); + + DrawTextW(hdc, pszText, iCharCount, &rt, dwTextFlags|DT_CALCRECT); + CopyRect(pExtentRect, &rt); + + if(hFont) { + SelectObject(hdc, oldFont); + DeleteObject(hFont); + } + return S_OK; +} + +/*********************************************************************** + * GetThemeTextMetrics (UXTHEME.@) + */ +HRESULT WINAPI GetThemeTextMetrics(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, TEXTMETRICW *ptm) +{ + HRESULT hr; + HFONT hFont = NULL; + HGDIOBJ oldFont = NULL; + LOGFONTW logfont; + + TRACE("(%p, %p, %d, %d)\n", hTheme, hdc, iPartId, iStateId); + if(!hTheme) + return E_HANDLE; + + hr = GetThemeFont(hTheme, hdc, iPartId, iStateId, TMT_FONT, &logfont); + if(SUCCEEDED(hr)) { + hFont = CreateFontIndirectW(&logfont); + if(!hFont) + TRACE("Failed to create font\n"); + } + if(hFont) + oldFont = SelectObject(hdc, hFont); + + if(!GetTextMetricsW(hdc, ptm)) + hr = HRESULT_FROM_WIN32(GetLastError()); + + if(hFont) { + SelectObject(hdc, oldFont); + DeleteObject(hFont); + } + return hr; +} + +/*********************************************************************** + * IsThemeBackgroundPartiallyTransparent (UXTHEME.@) + */ +BOOL WINAPI IsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, + int iStateId) +{ + BOOL transparent = FALSE; + TRACE("(%d,%d)\n", iPartId, iStateId); + GetThemeBool(hTheme, iPartId, iStateId, TMT_TRANSPARENT, &transparent); + return transparent; +} diff --git a/reactos/lib/uxtheme/main.c b/reactos/lib/uxtheme/main.c new file mode 100644 index 00000000000..7553a83dd8d --- /dev/null +++ b/reactos/lib/uxtheme/main.c @@ -0,0 +1,48 @@ +/* + * Win32 5.1 Themes + * + * 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 + +#include "windef.h" +#include "winbase.h" +#include "uxthemedll.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/***********************************************************************/ + +/* For the moment, do nothing here. */ +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) +{ + TRACE("%p 0x%lx %p: stub\n", hInstDLL, fdwReason, lpv); + switch(fdwReason) { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hInstDLL); + UXTHEME_InitSystem(hInstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} diff --git a/reactos/lib/uxtheme/metric.c b/reactos/lib/uxtheme/metric.c new file mode 100644 index 00000000000..e8936dd81f3 --- /dev/null +++ b/reactos/lib/uxtheme/metric.c @@ -0,0 +1,225 @@ +/* + * 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 + +#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= 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; +} diff --git a/reactos/lib/uxtheme/msstyles.c b/reactos/lib/uxtheme/msstyles.c new file mode 100644 index 00000000000..9ce1d17155c --- /dev/null +++ b/reactos/lib/uxtheme/msstyles.c @@ -0,0 +1,1100 @@ +/* + * Win32 5.1 msstyles theme format + * + * 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 + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#define NO_SHLWAPI_REG +#include "shlwapi.h" +#include "winnls.h" +#include "wingdi.h" +#include "uxtheme.h" +#include "tmschema.h" + +#include "uxthemedll.h" +#include "msstyles.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * Defines and global variables + */ + +BOOL MSSTYLES_GetNextInteger(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR *lpValEnd, int *value); +BOOL MSSTYLES_GetNextToken(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR *lpValEnd, LPWSTR lpBuff, DWORD buffSize); +void MSSTYLES_ParseThemeIni(PTHEME_FILE tf); + +extern HINSTANCE hDllInst; + +#define MSSTYLES_VERSION 0x0003 + +static const WCHAR szThemesIniResource[] = { + 't','h','e','m','e','s','_','i','n','i','\0' +}; + +PTHEME_FILE tfActiveTheme = NULL; + +/***********************************************************************/ + +/********************************************************************** + * MSSTYLES_OpenThemeFile + * + * Load and validate a theme + * + * PARAMS + * lpThemeFile Path to theme file to load + * pszColorName Color name wanted, can be NULL + * pszSizeName Size name wanted, can be NULL + * + * NOTES + * If pszColorName or pszSizeName are NULL, the default color/size will be used. + * If one/both are provided, they are validated against valid color/sizes and if + * a match is not found, the function fails. + */ +HRESULT MSSTYLES_OpenThemeFile(LPCWSTR lpThemeFile, LPCWSTR pszColorName, LPCWSTR pszSizeName, PTHEME_FILE *tf) +{ + HMODULE hTheme; + HRSRC hrsc; + HRESULT hr = S_OK; + static const WCHAR szPackThemVersionResource[] = { + 'P','A','C','K','T','H','E','M','_','V','E','R','S','I','O','N', '\0' + }; + static const WCHAR szColorNamesResource[] = { + 'C','O','L','O','R','N','A','M','E','S','\0' + }; + static const WCHAR szSizeNamesResource[] = { + 'S','I','Z','E','N','A','M','E','S','\0' + }; + + WORD version; + DWORD versize; + LPWSTR pszColors; + LPWSTR pszSelectedColor = NULL; + LPWSTR pszSizes; + LPWSTR pszSelectedSize = NULL; + LPWSTR tmp; + + TRACE("Opening %s\n", debugstr_w(lpThemeFile)); + + hTheme = LoadLibraryExW(lpThemeFile, NULL, LOAD_LIBRARY_AS_DATAFILE); + + /* Validate that this is really a theme */ + if(!hTheme) { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto invalid_theme; + } + if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szPackThemVersionResource))) { + TRACE("No version resource found\n"); + hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); + goto invalid_theme; + } + if((versize = SizeofResource(hTheme, hrsc)) != 2) + { + TRACE("Version resource found, but wrong size: %ld\n", versize); + hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); + goto invalid_theme; + } + version = *(WORD*)LoadResource(hTheme, hrsc); + if(version != MSSTYLES_VERSION) + { + TRACE("Version of theme file is unsupported: 0x%04x\n", version); + hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); + goto invalid_theme; + } + + if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szColorNamesResource))) { + TRACE("Color names resource not found\n"); + hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); + goto invalid_theme; + } + pszColors = (LPWSTR)LoadResource(hTheme, hrsc); + + if(!(hrsc = FindResourceW(hTheme, MAKEINTRESOURCEW(1), szSizeNamesResource))) { + TRACE("Size names resource not found\n"); + hr = HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); + goto invalid_theme; + } + pszSizes = (LPWSTR)LoadResource(hTheme, hrsc); + + /* Validate requested color against whats available from the theme */ + if(pszColorName) { + tmp = pszColors; + while(*tmp) { + if(!lstrcmpiW(pszColorName, tmp)) { + pszSelectedColor = tmp; + break; + } + tmp += lstrlenW(tmp)+1; + } + } + else + pszSelectedColor = pszColors; /* Use the default color */ + + /* Validate requested size against whats available from the theme */ + if(pszSizeName) { + tmp = pszSizes; + while(*tmp) { + if(!lstrcmpiW(pszSizeName, tmp)) { + pszSelectedSize = tmp; + break; + } + tmp += lstrlenW(tmp)+1; + } + } + else + pszSelectedSize = pszSizes; /* Use the default size */ + + if(!pszSelectedColor || !pszSelectedSize) { + TRACE("Requested color/size (%s/%s) not found in theme\n", + debugstr_w(pszColorName), debugstr_w(pszSizeName)); + hr = E_PROP_ID_UNSUPPORTED; + goto invalid_theme; + } + + *tf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(THEME_FILE)); + (*tf)->hTheme = hTheme; + + GetFullPathNameW(lpThemeFile, MAX_PATH, (*tf)->szThemeFile, NULL); + + (*tf)->pszAvailColors = pszColors; + (*tf)->pszAvailSizes = pszSizes; + (*tf)->pszSelectedColor = pszSelectedColor; + (*tf)->pszSelectedSize = pszSelectedSize; + (*tf)->dwRefCount = 1; + return S_OK; + +invalid_theme: + if(hTheme) FreeLibrary(hTheme); + return hr; +} + +/*********************************************************************** + * MSSTYLES_CloseThemeFile + * + * Close theme file and free resources + */ +void MSSTYLES_CloseThemeFile(PTHEME_FILE tf) +{ + if(tf) { + tf->dwRefCount--; + if(!tf->dwRefCount) { + if(tf->hTheme) FreeLibrary(tf->hTheme); + if(tf->classes) { + while(tf->classes) { + PTHEME_CLASS pcls = tf->classes; + tf->classes = pcls->next; + while(pcls->partstate) { + PTHEME_PARTSTATE ps = pcls->partstate; + pcls->partstate = ps->next; + HeapFree(GetProcessHeap(), 0, ps); + } + HeapFree(GetProcessHeap(), 0, pcls); + } + } + HeapFree(GetProcessHeap(), 0, tf); + } + } +} + +/*********************************************************************** + * MSSTYLES_SetActiveTheme + * + * Set the current active theme + */ +HRESULT MSSTYLES_SetActiveTheme(PTHEME_FILE tf) +{ + if(tfActiveTheme) + MSSTYLES_CloseThemeFile(tfActiveTheme); + tfActiveTheme = tf; + if (tfActiveTheme) + { + tfActiveTheme->dwRefCount++; + if(!tfActiveTheme->classes) + MSSTYLES_ParseThemeIni(tfActiveTheme); + } + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetThemeIni + * + * Retrieves themes.ini from a theme + */ +PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf) +{ + return UXINI_LoadINI(tf->hTheme, szThemesIniResource); +} + +/*********************************************************************** + * MSSTYLES_GetActiveThemeIni + * + * Retrieve the ini file for the selected color/style + */ +PUXINI_FILE MSSTYLES_GetActiveThemeIni(PTHEME_FILE tf) +{ + static const WCHAR szFileResNamesResource[] = { + 'F','I','L','E','R','E','S','N','A','M','E','S','\0' + }; + DWORD dwColorCount = 0; + DWORD dwSizeCount = 0; + DWORD dwColorNum = 0; + DWORD dwSizeNum = 0; + DWORD i; + DWORD dwResourceIndex; + LPWSTR tmp; + HRSRC hrsc; + + /* Count the number of available colors & styles, and determine the index number + of the color/style we are interested in + */ + tmp = tf->pszAvailColors; + while(*tmp) { + if(!lstrcmpiW(tf->pszSelectedColor, tmp)) + dwColorNum = dwColorCount; + tmp += lstrlenW(tmp)+1; + dwColorCount++; + } + tmp = tf->pszAvailSizes; + while(*tmp) { + if(!lstrcmpiW(tf->pszSelectedSize, tmp)) + dwSizeNum = dwSizeCount; + tmp += lstrlenW(tmp)+1; + dwSizeCount++; + } + + if(!(hrsc = FindResourceW(tf->hTheme, MAKEINTRESOURCEW(1), szFileResNamesResource))) { + TRACE("FILERESNAMES map not found\n"); + return NULL; + } + tmp = (LPWSTR)LoadResource(tf->hTheme, hrsc); + dwResourceIndex = (dwSizeCount * dwColorNum) + dwSizeNum; + for(i=0; i < dwResourceIndex; i++) { + tmp += lstrlenW(tmp)+1; + } + return UXINI_LoadINI(tf->hTheme, tmp); +} + + +/*********************************************************************** + * MSSTYLES_ParseIniSectionName + * + * Parse an ini section name into its component parts + * Valid formats are: + * [classname] + * [classname(state)] + * [classname.part] + * [classname.part(state)] + * [application::classname] + * [application::classname(state)] + * [application::classname.part] + * [application::classname.part(state)] + * + * PARAMS + * lpSection Section name + * dwLen Length of section name + * szAppName Location to store application name + * szClassName Location to store class name + * iPartId Location to store part id + * iStateId Location to store state id + */ +BOOL MSSTYLES_ParseIniSectionName(LPCWSTR lpSection, DWORD dwLen, LPWSTR szAppName, LPWSTR szClassName, int *iPartId, int *iStateId) +{ + WCHAR sec[255]; + WCHAR part[60] = {'\0'}; + WCHAR state[60] = {'\0'}; + LPWSTR tmp; + LPWSTR comp; + lstrcpynW(sec, lpSection, min(dwLen+1, sizeof(sec)/sizeof(sec[0]))); + + *szAppName = 0; + *szClassName = 0; + *iPartId = 0; + *iStateId = 0; + comp = sec; + /* Get the application name */ + tmp = StrChrW(comp, ':'); + if(tmp) { + *tmp++ = 0; + tmp++; + lstrcpynW(szAppName, comp, MAX_THEME_APP_NAME); + comp = tmp; + } + + tmp = StrChrW(comp, '.'); + if(tmp) { + *tmp++ = 0; + lstrcpynW(szClassName, comp, MAX_THEME_CLASS_NAME); + comp = tmp; + /* now get the part & state */ + tmp = StrChrW(comp, '('); + if(tmp) { + *tmp++ = 0; + lstrcpynW(part, comp, sizeof(part)/sizeof(part[0])); + comp = tmp; + /* now get the state */ + *StrChrW(comp, ')') = 0; + lstrcpynW(state, comp, sizeof(state)/sizeof(state[0])); + } + else { + lstrcpynW(part, comp, sizeof(part)/sizeof(part[0])); + } + } + else { + tmp = StrChrW(comp, '('); + if(tmp) { + *tmp++ = 0; + lstrcpynW(szClassName, comp, MAX_THEME_CLASS_NAME); + comp = tmp; + /* now get the state */ + *StrChrW(comp, ')') = 0; + lstrcpynW(state, comp, sizeof(state)/sizeof(state[0])); + } + else { + lstrcpynW(szClassName, comp, MAX_THEME_CLASS_NAME); + } + } + if(!*szClassName) return FALSE; + return MSSTYLES_LookupPartState(szClassName, part[0]?part:NULL, state[0]?state:NULL, iPartId, iStateId); +} + +/*********************************************************************** + * MSSTYLES_FindClass + * + * Find a class + * + * PARAMS + * tf Theme file + * pszAppName App name to find + * pszClassName Class name to find + * + * RETURNS + * The class found, or NULL + */ +PTHEME_CLASS MSSTYLES_FindClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR pszClassName) +{ + PTHEME_CLASS cur = tf->classes; + while(cur) { + if(!pszAppName) { + if(!*cur->szAppName && !lstrcmpiW(pszClassName, cur->szClassName)) + return cur; + } + else { + if(!lstrcmpiW(pszAppName, cur->szAppName) && !lstrcmpiW(pszClassName, cur->szClassName)) + return cur; + } + cur = cur->next; + } + return NULL; +} + +/*********************************************************************** + * MSSTYLES_AddClass + * + * Add a class to a theme file + * + * PARAMS + * tf Theme file + * pszAppName App name to add + * pszClassName Class name to add + * + * RETURNS + * The class added, or a class previously added with the same name + */ +PTHEME_CLASS MSSTYLES_AddClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR pszClassName) +{ + PTHEME_CLASS cur = MSSTYLES_FindClass(tf, pszAppName, pszClassName); + if(cur) return cur; + + cur = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_CLASS)); + cur->hTheme = tf->hTheme; + lstrcpyW(cur->szAppName, pszAppName); + lstrcpyW(cur->szClassName, pszClassName); + cur->next = tf->classes; + cur->partstate = NULL; + cur->overrides = NULL; + tf->classes = cur; + return cur; +} + +/*********************************************************************** + * MSSTYLES_FindPartState + * + * Find a part/state + * + * PARAMS + * tc Class to search + * iPartId Part ID to find + * iStateId State ID to find + * tcNext Receives the next class in the override chain + * + * RETURNS + * The part/state found, or NULL + */ +PTHEME_PARTSTATE MSSTYLES_FindPartState(PTHEME_CLASS tc, int iPartId, int iStateId, PTHEME_CLASS *tcNext) +{ + PTHEME_PARTSTATE cur = tc->partstate; + while(cur) { + if(cur->iPartId == iPartId && cur->iStateId == iStateId) { + if(tcNext) *tcNext = tc->overrides; + return cur; + } + cur = cur->next; + } + if(tc->overrides) return MSSTYLES_FindPartState(tc->overrides, iPartId, iStateId, tcNext); + return NULL; +} + +/*********************************************************************** + * MSSTYLES_AddPartState + * + * Add a part/state to a class + * + * PARAMS + * tc Theme class + * iPartId Part ID to add + * iStateId State ID to add + * + * RETURNS + * The part/state added, or a part/state previously added with the same IDs + */ +PTHEME_PARTSTATE MSSTYLES_AddPartState(PTHEME_CLASS tc, int iPartId, int iStateId) +{ + PTHEME_PARTSTATE cur = MSSTYLES_FindPartState(tc, iPartId, iStateId, NULL); + if(cur) return cur; + + cur = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_PARTSTATE)); + cur->iPartId = iPartId; + cur->iStateId = iStateId; + cur->properties = NULL; + cur->next = tc->partstate; + tc->partstate = cur; + return cur; +} + +/*********************************************************************** + * MSSTYLES_LFindProperty + * + * Find a property within a property list + * + * PARAMS + * tp property list to scan + * iPropertyPrimitive Type of value expected + * iPropertyId ID of the required value + * + * RETURNS + * The property found, or NULL + */ +PTHEME_PROPERTY MSSTYLES_LFindProperty(PTHEME_PROPERTY tp, int iPropertyPrimitive, int iPropertyId) +{ + PTHEME_PROPERTY cur = tp; + while(cur) { + if(cur->iPropertyId == iPropertyId) { + if(cur->iPrimitiveType == iPropertyPrimitive) { + return cur; + } + else { + if(!iPropertyPrimitive) + return cur; + return NULL; + } + } + cur = cur->next; + } + return NULL; +} + +/*********************************************************************** + * MSSTYLES_PSFindProperty + * + * Find a value within a part/state + * + * PARAMS + * ps Part/state to search + * iPropertyPrimitive Type of value expected + * iPropertyId ID of the required value + * + * RETURNS + * The property found, or NULL + */ +static inline PTHEME_PROPERTY MSSTYLES_PSFindProperty(PTHEME_PARTSTATE ps, int iPropertyPrimitive, int iPropertyId) +{ + return MSSTYLES_LFindProperty(ps->properties, iPropertyPrimitive, iPropertyId); +} + +/*********************************************************************** + * MSSTYLES_FFindMetric + * + * Find a metric property for a theme file + * + * PARAMS + * tf Theme file + * iPropertyPrimitive Type of value expected + * iPropertyId ID of the required value + * + * RETURNS + * The property found, or NULL + */ +static inline PTHEME_PROPERTY MSSTYLES_FFindMetric(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); +} + +/*********************************************************************** + * MSSTYLES_AddProperty + * + * Add a property to a part/state + * + * PARAMS + * ps Part/state + * iPropertyPrimitive Primitive type of the property + * iPropertyId ID of the property + * lpValue Raw value (non-NULL terminated) + * dwValueLen Length of the value + * + * RETURNS + * The property added, or a property previously added with the same IDs + */ +PTHEME_PROPERTY MSSTYLES_AddProperty(PTHEME_PARTSTATE ps, int iPropertyPrimitive, int iPropertyId, LPCWSTR lpValue, DWORD dwValueLen, BOOL isGlobal) +{ + PTHEME_PROPERTY cur = MSSTYLES_PSFindProperty(ps, iPropertyPrimitive, iPropertyId); + /* Should duplicate properties overwrite the original, or be ignored? */ + if(cur) return cur; + + cur = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_PROPERTY)); + cur->iPrimitiveType = iPropertyPrimitive; + cur->iPropertyId = iPropertyId; + cur->lpValue = lpValue; + cur->dwValueLen = dwValueLen; + + if(ps->iStateId) + cur->origin = PO_STATE; + else if(ps->iPartId) + cur->origin = PO_PART; + else if(isGlobal) + cur->origin = PO_GLOBAL; + else + cur->origin = PO_CLASS; + + cur->next = ps->properties; + ps->properties = cur; + return cur; +} + +/*********************************************************************** + * MSSTYLES_AddMetric + * + * Add a property to a part/state + * + * PARAMS + * tf Theme file + * iPropertyPrimitive Primitive type of the property + * iPropertyId ID of the property + * lpValue Raw value (non-NULL terminated) + * dwValueLen Length of the value + * + * RETURNS + * The property added, or a property previously added with the same IDs + */ +PTHEME_PROPERTY MSSTYLES_AddMetric(PTHEME_FILE tf, int iPropertyPrimitive, int iPropertyId, LPCWSTR lpValue, DWORD dwValueLen) +{ + PTHEME_PROPERTY cur = MSSTYLES_FFindMetric(tf, iPropertyPrimitive, iPropertyId); + /* Should duplicate properties overwrite the original, or be ignored? */ + if(cur) return cur; + + cur = HeapAlloc(GetProcessHeap(), 0, sizeof(THEME_PROPERTY)); + cur->iPrimitiveType = iPropertyPrimitive; + cur->iPropertyId = iPropertyId; + cur->lpValue = lpValue; + cur->dwValueLen = dwValueLen; + + cur->origin = PO_GLOBAL; + + cur->next = tf->metrics; + tf->metrics = cur; + return cur; +} + +/*********************************************************************** + * 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; + + ini = MSSTYLES_GetActiveThemeIni(tf); + + while((lpName=UXINI_GetNextSection(ini, &dwLen))) { + if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpName, dwLen, szSysMetrics, -1) == CSTR_EQUAL) { + int colorCount = 0; + int colorElements[TMT_LASTCOLOR-TMT_FIRSTCOLOR]; + COLORREF colorRgb[TMT_LASTCOLOR-TMT_FIRSTCOLOR]; + LPCWSTR lpValueEnd; + + 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) { + int r,g,b; + lpValueEnd = lpValue + dwValueLen; + MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &r); + MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &g); + if(MSSTYLES_GetNextInteger(lpValue, lpValueEnd, &lpValue, &b)) { + colorElements[colorCount] = iPropertyId - TMT_FIRSTCOLOR; + colorRgb[colorCount++] = RGB(r,g,b); + } + else { + FIXME("Invalid color value for %s\n", debugstr_w(szPropertyName)); + } + } + /* Catch all metrics, including colors */ + MSSTYLES_AddMetric(tf, iPropertyPrimitive, iPropertyId, lpValue, dwValueLen); + } + else { + TRACE("Unknown system metric %s\n", debugstr_w(szPropertyName)); + } + } + if(colorCount > 0) + SetSysColors(colorCount, colorElements, colorRgb); + 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"); + } +} + +/*********************************************************************** + * MSSTYLES_OpenThemeClass + * + * Open a theme class, uses the current active theme + * + * PARAMS + * pszAppName Application name, for theme styles specific + * to a particular application + * pszClassList List of requested classes, semicolon delimited + */ +PTHEME_CLASS MSSTYLES_OpenThemeClass(LPCWSTR pszAppName, LPCWSTR pszClassList) +{ + PTHEME_CLASS cls = NULL; + WCHAR szClassName[MAX_THEME_CLASS_NAME]; + LPCWSTR start; + LPCWSTR end; + DWORD len; + + if(!tfActiveTheme) { + TRACE("there is no active theme\n"); + return NULL; + } + if(!tfActiveTheme->classes) { + return NULL; + } + + start = pszClassList; + while((end = StrChrW(start, ';'))) { + len = end-start; + lstrcpynW(szClassName, start, min(len+1, sizeof(szClassName)/sizeof(szClassName[0]))); + start = end+1; + cls = MSSTYLES_FindClass(tfActiveTheme, pszAppName, szClassName); + if(cls) break; + } + if(!cls && *start) { + lstrcpynW(szClassName, start, sizeof(szClassName)/sizeof(szClassName[0])); + cls = MSSTYLES_FindClass(tfActiveTheme, 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)); + } + return cls; +} + +/*********************************************************************** + * MSSTYLES_CloseThemeClass + * + * Close a theme class + * + * PARAMS + * tc Theme class to close + * + * NOTES + * There is currently no need clean anything up for theme classes, + * so do nothing for now + */ +HRESULT MSSTYLES_CloseThemeClass(PTHEME_CLASS tc) +{ + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_FindProperty + * + * Locate a property in a class. Part and state IDs will be used as a + * preference, but may be ignored in the attempt to locate the property. + * Will scan the entire chain of overrides for this class. + */ +PTHEME_PROPERTY MSSTYLES_FindProperty(PTHEME_CLASS tc, int iPartId, int iStateId, int iPropertyPrimitive, int iPropertyId) +{ + PTHEME_CLASS next = tc; + PTHEME_PARTSTATE ps; + PTHEME_PROPERTY tp; + + TRACE("(%p, %d, %d, %d)\n", tc, iPartId, iStateId, iPropertyId); + /* Try and find an exact match on part & state */ + while(next && (ps = MSSTYLES_FindPartState(next, iPartId, iStateId, &next))) { + if((tp = MSSTYLES_PSFindProperty(ps, iPropertyPrimitive, iPropertyId))) { + return tp; + } + } + /* If that fails, and we didn't already try it, search for just part */ + if(iStateId != 0) + iStateId = 0; + /* As a last ditch attempt..go for just class */ + else if(iPartId != 0) + iPartId = 0; + else + return NULL; + + if((tp = MSSTYLES_FindProperty(tc, iPartId, iStateId, iPropertyPrimitive, iPropertyId))) + return tp; + return NULL; +} + +HBITMAP MSSTYLES_LoadBitmap(HDC hdc, PTHEME_CLASS tc, LPCWSTR lpFilename) +{ + WCHAR szFile[MAX_PATH]; + LPWSTR tmp; + lstrcpynW(szFile, lpFilename, sizeof(szFile)/sizeof(szFile[0])); + tmp = szFile; + do { + if(*tmp == '\\') *tmp = '_'; + if(*tmp == '/') *tmp = '_'; + if(*tmp == '.') *tmp = '_'; + } while(*tmp++); + return LoadImageW(tc->hTheme, szFile, IMAGE_BITMAP, 0, 0, LR_SHARED|LR_CREATEDIBSECTION); +} + +BOOL MSSTYLES_GetNextInteger(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR *lpValEnd, int *value) +{ + LPCWSTR cur = lpStringStart; + int total = 0; + BOOL gotNeg = FALSE; + + while(cur < lpStringEnd && (*cur < '0' || *cur > '9' || *cur == '-')) cur++; + if(cur >= lpStringEnd) { + return FALSE; + } + if(*cur == '-') { + cur++; + gotNeg = TRUE; + } + while(cur < lpStringEnd && (*cur >= '0' && *cur <= '9')) { + total = total * 10 + (*cur - '0'); + cur++; + } + if(gotNeg) total = -total; + *value = total; + if(lpValEnd) *lpValEnd = cur; + return TRUE; +} + +BOOL MSSTYLES_GetNextToken(LPCWSTR lpStringStart, LPCWSTR lpStringEnd, LPCWSTR *lpValEnd, LPWSTR lpBuff, DWORD buffSize) { + LPCWSTR cur = lpStringStart; + LPCWSTR start; + LPCWSTR end; + + while(cur < lpStringEnd && (isspace(*cur) || *cur == ',')) cur++; + if(cur >= lpStringEnd) { + return FALSE; + } + start = cur; + while(cur < lpStringEnd && *cur != ',') cur++; + end = cur; + while(isspace(*end)) end--; + + lstrcpynW(lpBuff, start, min(buffSize, end-start+1)); + + if(lpValEnd) *lpValEnd = cur; + return TRUE; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyBool + * + * Retrieve a color value for a property + */ +HRESULT MSSTYLES_GetPropertyBool(PTHEME_PROPERTY tp, BOOL *pfVal) +{ + *pfVal = FALSE; + if(*tp->lpValue == 't' || *tp->lpValue == 'T') + *pfVal = TRUE; + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyColor + * + * Retrieve a color value for a property + */ +HRESULT MSSTYLES_GetPropertyColor(PTHEME_PROPERTY tp, COLORREF *pColor) +{ + LPCWSTR lpEnd; + LPCWSTR lpCur; + int red, green, blue; + + lpCur = tp->lpValue; + lpEnd = tp->lpValue + tp->dwValueLen; + + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &red); + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &green); + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &blue)) { + TRACE("Could not parse color property\n"); + return E_PROP_ID_UNSUPPORTED; + } + *pColor = RGB(red,green,blue); + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyColor + * + * Retrieve a color value for a property + */ +HRESULT MSSTYLES_GetPropertyFont(PTHEME_PROPERTY tp, HDC hdc, LOGFONTW *pFont) +{ + static const WCHAR szBold[] = {'b','o','l','d','\0'}; + static const WCHAR szItalic[] = {'i','t','a','l','i','c','\0'}; + static const WCHAR szUnderline[] = {'u','n','d','e','r','l','i','n','e','\0'}; + static const WCHAR szStrikeOut[] = {'s','t','r','i','k','e','o','u','t','\0'}; + int pointSize; + WCHAR attr[32]; + LPCWSTR lpCur = tp->lpValue; + LPCWSTR lpEnd = tp->lpValue + tp->dwValueLen; + + ZeroMemory(pFont, sizeof(LOGFONTW)); + + if(!MSSTYLES_GetNextToken(lpCur, lpEnd, &lpCur, pFont->lfFaceName, LF_FACESIZE)) { + TRACE("Property is there, but failed to get face name\n"); + return E_PROP_ID_UNSUPPORTED; + } + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pointSize)) { + TRACE("Property is there, but failed to get point size\n"); + return E_PROP_ID_UNSUPPORTED; + } + pFont->lfHeight = -MulDiv(pointSize, GetDeviceCaps(hdc, LOGPIXELSY), 72); + pFont->lfWeight = FW_REGULAR; + pFont->lfCharSet = DEFAULT_CHARSET; + while(MSSTYLES_GetNextToken(lpCur, lpEnd, &lpCur, attr, sizeof(attr)/sizeof(attr[0]))) { + if(!lstrcmpiW(szBold, attr)) pFont->lfWeight = FW_BOLD; + else if(!!lstrcmpiW(szItalic, attr)) pFont->lfItalic = TRUE; + else if(!!lstrcmpiW(szUnderline, attr)) pFont->lfUnderline = TRUE; + else if(!!lstrcmpiW(szStrikeOut, attr)) pFont->lfStrikeOut = TRUE; + } + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyInt + * + * Retrieve an int value for a property + */ +HRESULT MSSTYLES_GetPropertyInt(PTHEME_PROPERTY tp, int *piVal) +{ + if(!MSSTYLES_GetNextInteger(tp->lpValue, (tp->lpValue + tp->dwValueLen), NULL, piVal)) { + TRACE("Could not parse int property\n"); + return E_PROP_ID_UNSUPPORTED; + } + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyIntList + * + * Retrieve an int list value for a property + */ +HRESULT MSSTYLES_GetPropertyIntList(PTHEME_PROPERTY tp, INTLIST *pIntList) +{ + int i; + LPCWSTR lpCur = tp->lpValue; + LPCWSTR lpEnd = tp->lpValue + tp->dwValueLen; + + for(i=0; i < MAX_INTLIST_COUNT; i++) { + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pIntList->iValues[i])) + break; + } + pIntList->iValueCount = i; + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyPosition + * + * Retrieve a position value for a property + */ +HRESULT MSSTYLES_GetPropertyPosition(PTHEME_PROPERTY tp, POINT *pPoint) +{ + int x,y; + LPCWSTR lpCur = tp->lpValue; + LPCWSTR lpEnd = tp->lpValue + tp->dwValueLen; + + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &x); + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &y)) { + TRACE("Could not parse position property\n"); + return E_PROP_ID_UNSUPPORTED; + } + pPoint->x = x; + pPoint->y = y; + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyString + * + * Retrieve a string value for a property + */ +HRESULT MSSTYLES_GetPropertyString(PTHEME_PROPERTY tp, LPWSTR pszBuff, int cchMaxBuffChars) +{ + lstrcpynW(pszBuff, tp->lpValue, min(tp->dwValueLen+1, cchMaxBuffChars)); + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyRect + * + * Retrieve a rect value for a property + */ +HRESULT MSSTYLES_GetPropertyRect(PTHEME_PROPERTY tp, RECT *pRect) +{ + LPCWSTR lpCur = tp->lpValue; + LPCWSTR lpEnd = tp->lpValue + tp->dwValueLen; + + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, (int*)&pRect->left); + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, (int*)&pRect->top); + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, (int*)&pRect->right); + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, (int*)&pRect->bottom)) { + TRACE("Could not parse rect property\n"); + return E_PROP_ID_UNSUPPORTED; + } + return S_OK; +} + +/*********************************************************************** + * MSSTYLES_GetPropertyMargins + * + * Retrieve a margins value for a property + */ +HRESULT MSSTYLES_GetPropertyMargins(PTHEME_PROPERTY tp, RECT *prc, MARGINS *pMargins) +{ + LPCWSTR lpCur = tp->lpValue; + LPCWSTR lpEnd = tp->lpValue + tp->dwValueLen; + + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pMargins->cxLeftWidth); + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pMargins->cxRightWidth); + MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pMargins->cyTopHeight); + if(!MSSTYLES_GetNextInteger(lpCur, lpEnd, &lpCur, &pMargins->cyBottomHeight)) { + TRACE("Could not parse margins property\n"); + return E_PROP_ID_UNSUPPORTED; + } + return S_OK; +} diff --git a/reactos/lib/uxtheme/msstyles.h b/reactos/lib/uxtheme/msstyles.h new file mode 100644 index 00000000000..350d1c83c48 --- /dev/null +++ b/reactos/lib/uxtheme/msstyles.h @@ -0,0 +1,108 @@ +/* + * Internal msstyles related defines & declarations + * + * 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 + */ + +#ifndef __WINE_MSSTYLES_H +#define __WINE_MSSTYLES_H + +#define TMT_ENUM 200 + +#define MAX_THEME_APP_NAME 60 +#define MAX_THEME_CLASS_NAME 60 +#define MAX_THEME_VALUE_NAME 60 + +typedef struct _THEME_PROPERTY { + int iPrimitiveType; + int iPropertyId; + PROPERTYORIGIN origin; + + LPCWSTR lpValue; + DWORD dwValueLen; + + struct _THEME_PROPERTY *next; +} THEME_PROPERTY, *PTHEME_PROPERTY; + +typedef struct _THEME_PARTSTATE { + int iPartId; + int iStateId; + PTHEME_PROPERTY properties; + + struct _THEME_PARTSTATE *next; +} THEME_PARTSTATE, *PTHEME_PARTSTATE; + +typedef struct _THEME_CLASS { + HMODULE hTheme; + WCHAR szAppName[MAX_THEME_APP_NAME]; + WCHAR szClassName[MAX_THEME_CLASS_NAME]; + PTHEME_PARTSTATE partstate; + struct _THEME_CLASS *overrides; + + struct _THEME_CLASS *next; +} THEME_CLASS, *PTHEME_CLASS; + +typedef struct _THEME_FILE { + DWORD dwRefCount; + HMODULE hTheme; + WCHAR szThemeFile[MAX_PATH]; + LPWSTR pszAvailColors; + LPWSTR pszAvailSizes; + + LPWSTR pszSelectedColor; + LPWSTR pszSelectedSize; + + PTHEME_CLASS classes; + PTHEME_PROPERTY metrics; +} THEME_FILE, *PTHEME_FILE; + +typedef void* 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); +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); +PUXINI_FILE MSSTYLES_GetThemeIni(PTHEME_FILE tf); +PTHEME_PARTSTATE MSSTYLES_FindPartState(PTHEME_CLASS tc, int iPartId, int iStateId, PTHEME_CLASS *tcNext); +PTHEME_CLASS MSSTYLES_FindClass(PTHEME_FILE tf, LPCWSTR pszAppName, LPCWSTR pszClassName); +PTHEME_PROPERTY MSSTYLES_FindProperty(PTHEME_CLASS tc, int iPartId, int iStateId, int iPropertyPrimitive, int iPropertyId); +PTHEME_PROPERTY MSSTYLES_FindMetric(int iPropertyPrimitive, int iPropertyId); +HBITMAP MSSTYLES_LoadBitmap(HDC hdc, PTHEME_CLASS tc, LPCWSTR lpFilename); + +HRESULT MSSTYLES_GetPropertyBool(PTHEME_PROPERTY tp, BOOL *pfVal); +HRESULT MSSTYLES_GetPropertyColor(PTHEME_PROPERTY tp, COLORREF *pColor); +HRESULT MSSTYLES_GetPropertyFont(PTHEME_PROPERTY tp, HDC hdc, LOGFONTW *pFont); +HRESULT MSSTYLES_GetPropertyInt(PTHEME_PROPERTY tp, int *piVal); +HRESULT MSSTYLES_GetPropertyIntList(PTHEME_PROPERTY tp, INTLIST *pIntList); +HRESULT MSSTYLES_GetPropertyPosition(PTHEME_PROPERTY tp, POINT *pPoint); +HRESULT MSSTYLES_GetPropertyString(PTHEME_PROPERTY tp, LPWSTR pszBuff, int cchMaxBuffChars); +HRESULT MSSTYLES_GetPropertyRect(PTHEME_PROPERTY tp, RECT *pRect); +HRESULT MSSTYLES_GetPropertyMargins(PTHEME_PROPERTY tp, RECT *prc, MARGINS *pMargins); + +PUXINI_FILE UXINI_LoadINI(HMODULE hTheme, LPCWSTR lpName); +void UXINI_CloseINI(PUXINI_FILE uf); +void UXINI_ResetINI(PUXINI_FILE uf); +LPCWSTR UXINI_GetNextSection(PUXINI_FILE uf, DWORD *dwLen); +BOOL UXINI_FindSection(PUXINI_FILE uf, LPCWSTR lpName); +LPCWSTR UXINI_GetNextValue(PUXINI_FILE uf, DWORD *dwNameLen, LPCWSTR *lpValue, DWORD *dwValueLen); +BOOL UXINI_FindValue(PUXINI_FILE uf, LPCWSTR lpName, LPCWSTR *lpValue, DWORD *dwValueLen); + +#endif diff --git a/reactos/lib/uxtheme/property.c b/reactos/lib/uxtheme/property.c new file mode 100644 index 00000000000..4caa8be2ac1 --- /dev/null +++ b/reactos/lib/uxtheme/property.c @@ -0,0 +1,296 @@ +/* + * Win32 5.1 Theme properties + * + * 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 + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "uxtheme.h" +#include "tmschema.h" + +#include "msstyles.h" +#include "uxthemedll.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * GetThemeBool (UXTHEME.@) + */ +HRESULT WINAPI GetThemeBool(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, BOOL *pfVal) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_BOOL, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyBool(tp, pfVal); +} + +/*********************************************************************** + * GetThemeColor (UXTHEME.@) + */ +HRESULT WINAPI GetThemeColor(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, COLORREF *pColor) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_COLOR, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyColor(tp, pColor); +} + +/*********************************************************************** + * GetThemeEnumValue (UXTHEME.@) + */ +HRESULT WINAPI GetThemeEnumValue(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, int *piVal) +{ + HRESULT hr; + WCHAR val[60]; + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_ENUM, iPropId))) + return E_PROP_ID_UNSUPPORTED; + + hr = MSSTYLES_GetPropertyString(tp, val, sizeof(val)/sizeof(val[0])); + if(FAILED(hr)) + return hr; + if(!MSSTYLES_LookupEnum(val, iPropId, piVal)) + return E_PROP_ID_UNSUPPORTED; + return S_OK; +} + +/*********************************************************************** + * GetThemeFilename (UXTHEME.@) + */ +HRESULT WINAPI GetThemeFilename(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, LPWSTR pszThemeFilename, + int cchMaxBuffChars) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyString(tp, pszThemeFilename, cchMaxBuffChars); +} + +/*********************************************************************** + * GetThemeFont (UXTHEME.@) + */ +HRESULT WINAPI GetThemeFont(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, int iPropId, LOGFONTW *pFont) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FONT, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyFont(tp, hdc, pFont); +} + +/*********************************************************************** + * GetThemeInt (UXTHEME.@) + */ +HRESULT WINAPI GetThemeInt(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, int *piVal) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_INT, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyInt(tp, piVal); +} + +/*********************************************************************** + * GetThemeIntList (UXTHEME.@) + */ +HRESULT WINAPI GetThemeIntList(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, INTLIST *pIntList) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_INTLIST, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyIntList(tp, pIntList); +} + +/*********************************************************************** + * GetThemePosition (UXTHEME.@) + */ +HRESULT WINAPI GetThemePosition(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, POINT *pPoint) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_POSITION, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyPosition(tp, pPoint); +} + +/*********************************************************************** + * GetThemeRect (UXTHEME.@) + */ +HRESULT WINAPI GetThemeRect(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, RECT *pRect) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_RECT, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyRect(tp, pRect); +} + +/*********************************************************************** + * GetThemeString (UXTHEME.@) + */ +HRESULT WINAPI GetThemeString(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, LPWSTR pszBuff, int cchMaxBuffChars) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_FILENAME, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyString(tp, pszBuff, cchMaxBuffChars); +} + +/*********************************************************************** + * GetThemeMargins (UXTHEME.@) + */ +HRESULT WINAPI GetThemeMargins(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, int iPropId, RECT *prc, + MARGINS *pMargins) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, TMT_MARGINS, iPropId))) + return E_PROP_ID_UNSUPPORTED; + return MSSTYLES_GetPropertyMargins(tp, prc, pMargins); +} + +/*********************************************************************** + * GetThemeMetric (UXTHEME.@) + */ +HRESULT WINAPI GetThemeMetric(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, int iPropId, int *piVal) +{ + PTHEME_PROPERTY tp; + WCHAR val[60]; + HRESULT hr; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, 0, iPropId))) + return E_PROP_ID_UNSUPPORTED; + switch(tp->iPrimitiveType) { + case TMT_POSITION: /* Only the X coord is retrieved */ + case TMT_MARGINS: /* Only the cxLeftWidth member is retrieved */ + case TMT_INTLIST: /* Only the first int is retrieved */ + case TMT_SIZE: + case TMT_INT: + return MSSTYLES_GetPropertyInt(tp, piVal); + case TMT_BOOL: + return MSSTYLES_GetPropertyBool(tp, piVal); + case TMT_COLOR: + return MSSTYLES_GetPropertyColor(tp, (COLORREF*)piVal); + case TMT_ENUM: + hr = MSSTYLES_GetPropertyString(tp, val, sizeof(val)/sizeof(val[0])); + if(FAILED(hr)) + return hr; + if(!MSSTYLES_LookupEnum(val, iPropId, piVal)) + return E_PROP_ID_UNSUPPORTED; + return S_OK; + case TMT_FILENAME: + /* Windows does return a value for this, but its value doesn't make sense */ + FIXME("Filename\n"); + break; + } + return E_PROP_ID_UNSUPPORTED; +} + +/*********************************************************************** + * GetThemePropertyOrigin (UXTHEME.@) + */ +HRESULT WINAPI GetThemePropertyOrigin(HTHEME hTheme, int iPartId, int iStateId, + int iPropId, PROPERTYORIGIN *pOrigin) +{ + PTHEME_PROPERTY tp; + + TRACE("(%d, %d, %d)\n", iPartId, iStateId, iPropId); + if(!hTheme) + return E_HANDLE; + + if(!(tp = MSSTYLES_FindProperty(hTheme, iPartId, iStateId, 0, iPropId))) { + *pOrigin = PO_NOTFOUND; + return S_OK; + } + *pOrigin = tp->origin; + return S_OK; +} diff --git a/reactos/lib/uxtheme/stylemap.c b/reactos/lib/uxtheme/stylemap.c new file mode 100644 index 00000000000..a113d703449 --- /dev/null +++ b/reactos/lib/uxtheme/stylemap.c @@ -0,0 +1,1153 @@ +/* + * msstyle data maps + * + * Copyright (C) 2004 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 + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "tmschema.h" + +#define TMT_ENUM 200 + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +typedef struct _MSSTYLES_PROPERTY_MAP { + WORD dwPrimitiveType; + WORD dwPropertyID; + WCHAR szPropertyName[24]; +} MSSTYLES_PROPERTY_MAP, *PMSSTYLES_PROPERTY_MAP; + +typedef struct _MSSTYLES_ENUM_MAP { + WORD dwEnum; + WORD dwValue; + WCHAR szValueName[18]; +} MSSTYLES_ENUM_MAP, *PMSSTYLES_ENUM_MAP; + +typedef struct _MSSTYLES_CLASS_MAP { + WORD dwPartID; + WORD dwStateID; + WCHAR szName[31]; +} MSSTYLES_CLASS_MAP, *PMSSTYLES_CLASS_MAP; + +typedef struct _MSSTYLES_CLASS_NAME { + const MSSTYLES_CLASS_MAP *lpMap; + WCHAR pszClass[12]; +} MSSTYLES_CLASS_NAME, *PMSSTYLES_CLASS_NAME; + +/*********************************************************************** + * Map property names to IDs & primitive types + * PrimitiveType,PropertyID,PropertyName + */ +static const MSSTYLES_PROPERTY_MAP mapProperty[] = { + {TMT_STRING,TMT_STRING,{'S','T','R','I','N','G','\0'}}, + {TMT_INT,TMT_INT,{'I','N','T','\0'}}, + {TMT_BOOL,TMT_BOOL,{'B','O','O','L','\0'}}, + {TMT_COLOR,TMT_COLOR,{'C','O','L','O','R','\0'}}, + {TMT_MARGINS,TMT_MARGINS,{'M','A','R','G','I','N','S','\0'}}, + {TMT_FILENAME,TMT_FILENAME,{'F','I','L','E','N','A','M','E','\0'}}, + {TMT_SIZE,TMT_SIZE,{'S','I','Z','E','\0'}}, + {TMT_POSITION,TMT_POSITION,{'P','O','S','I','T','I','O','N','\0'}}, + {TMT_RECT,TMT_RECT,{'R','E','C','T','\0'}}, + {TMT_FONT,TMT_FONT,{'F','O','N','T','\0'}}, + {TMT_INTLIST,TMT_INTLIST,{'I','N','T','L','I','S','T','\0'}}, + {TMT_STRING,TMT_COLORSCHEMES,{'C','O','L','O','R','S','C','H','E','M','E','S','\0'}}, + {TMT_STRING,TMT_SIZES,{'S','I','Z','E','S','\0'}}, + {TMT_INT,TMT_CHARSET,{'C','H','A','R','S','E','T','\0'}}, + {TMT_STRING,TMT_DISPLAYNAME,{'D','I','S','P','L','A','Y','N','A','M','E','\0'}}, + {TMT_STRING,TMT_TOOLTIP,{'T','O','O','L','T','I','P','\0'}}, + {TMT_STRING,TMT_COMPANY,{'C','O','M','P','A','N','Y','\0'}}, + {TMT_STRING,TMT_AUTHOR,{'A','U','T','H','O','R','\0'}}, + {TMT_STRING,TMT_COPYRIGHT,{'C','O','P','Y','R','I','G','H','T','\0'}}, + {TMT_STRING,TMT_URL,{'U','R','L','\0'}}, + {TMT_STRING,TMT_VERSION,{'V','E','R','S','I','O','N','\0'}}, + {TMT_STRING,TMT_DESCRIPTION,{'D','E','S','C','R','I','P','T','I','O','N','\0'}}, + {TMT_FONT,TMT_CAPTIONFONT,{'C','A','P','T','I','O','N','F','O','N','T','\0'}}, + {TMT_FONT,TMT_SMALLCAPTIONFONT,{'S','M','A','L','L','C','A','P','T','I','O','N','F','O','N','T','\0'}}, + {TMT_FONT,TMT_MENUFONT,{'M','E','N','U','F','O','N','T','\0'}}, + {TMT_FONT,TMT_STATUSFONT,{'S','T','A','T','U','S','F','O','N','T','\0'}}, + {TMT_FONT,TMT_MSGBOXFONT,{'M','S','G','B','O','X','F','O','N','T','\0'}}, + {TMT_FONT,TMT_ICONTITLEFONT,{'I','C','O','N','T','I','T','L','E','F','O','N','T','\0'}}, + {TMT_BOOL,TMT_FLATMENUS,{'F','L','A','T','M','E','N','U','S','\0'}}, + {TMT_SIZE,TMT_SIZINGBORDERWIDTH,{'S','I','Z','I','N','G','B','O','R','D','E','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SCROLLBARWIDTH,{'S','C','R','O','L','L','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SCROLLBARHEIGHT,{'S','C','R','O','L','L','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_CAPTIONBARWIDTH,{'C','A','P','T','I','O','N','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_CAPTIONBARHEIGHT,{'C','A','P','T','I','O','N','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_SMCAPTIONBARWIDTH,{'S','M','C','A','P','T','I','O','N','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_SMCAPTIONBARHEIGHT,{'S','M','C','A','P','T','I','O','N','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_SIZE,TMT_MENUBARWIDTH,{'M','E','N','U','B','A','R','W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_MENUBARHEIGHT,{'M','E','N','U','B','A','R','H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_MINCOLORDEPTH,{'M','I','N','C','O','L','O','R','D','E','P','T','H','\0'}}, + {TMT_STRING,TMT_CSSNAME,{'C','S','S','N','A','M','E','\0'}}, + {TMT_STRING,TMT_XMLNAME,{'X','M','L','N','A','M','E','\0'}}, + {TMT_COLOR,TMT_SCROLLBAR,{'S','C','R','O','L','L','B','A','R','\0'}}, + {TMT_COLOR,TMT_BACKGROUND,{'B','A','C','K','G','R','O','U','N','D','\0'}}, + {TMT_COLOR,TMT_ACTIVECAPTION,{'A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_INACTIVECAPTION,{'I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_MENU,{'M','E','N','U','\0'}}, + {TMT_COLOR,TMT_WINDOW,{'W','I','N','D','O','W','\0'}}, + {TMT_COLOR,TMT_WINDOWFRAME,{'W','I','N','D','O','W','F','R','A','M','E','\0'}}, + {TMT_COLOR,TMT_MENUTEXT,{'M','E','N','U','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_WINDOWTEXT,{'W','I','N','D','O','W','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_CAPTIONTEXT,{'C','A','P','T','I','O','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_ACTIVEBORDER,{'A','C','T','I','V','E','B','O','R','D','E','R','\0'}}, + {TMT_COLOR,TMT_INACTIVEBORDER,{'I','N','A','C','T','I','V','E','B','O','R','D','E','R','\0'}}, + {TMT_COLOR,TMT_APPWORKSPACE,{'A','P','P','W','O','R','K','S','P','A','C','E','\0'}}, + {TMT_COLOR,TMT_HIGHLIGHT,{'H','I','G','H','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_HIGHLIGHTTEXT,{'H','I','G','H','L','I','G','H','T','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNFACE,{'B','T','N','F','A','C','E','\0'}}, + {TMT_COLOR,TMT_BTNSHADOW,{'B','T','N','S','H','A','D','O','W','\0'}}, + {TMT_COLOR,TMT_GRAYTEXT,{'G','R','A','Y','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNTEXT,{'B','T','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_INACTIVECAPTIONTEXT,{'I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_BTNHIGHLIGHT,{'B','T','N','H','I','G','H','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_DKSHADOW3D,{'D','K','S','H','A','D','O','W','3','D','\0'}}, + {TMT_COLOR,TMT_LIGHT3D,{'L','I','G','H','T','3','D','\0'}}, + {TMT_COLOR,TMT_INFOTEXT,{'I','N','F','O','T','E','X','T','\0'}}, + {TMT_COLOR,TMT_INFOBK,{'I','N','F','O','B','K','\0'}}, + {TMT_COLOR,TMT_BUTTONALTERNATEFACE,{'B','U','T','T','O','N','A','L','T','E','R','N','A','T','E','F','A','C','E','\0'}}, + {TMT_COLOR,TMT_HOTTRACKING,{'H','O','T','T','R','A','C','K','I','N','G','\0'}}, + {TMT_COLOR,TMT_GRADIENTACTIVECAPTION,{'G','R','A','D','I','E','N','T','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_GRADIENTINACTIVECAPTION,{'G','R','A','D','I','E','N','T','I','N','A','C','T','I','V','E','C','A','P','T','I','O','N','\0'}}, + {TMT_COLOR,TMT_MENUHILIGHT,{'M','E','N','U','H','I','L','I','G','H','T','\0'}}, + {TMT_COLOR,TMT_MENUBAR,{'M','E','N','U','B','A','R','\0'}}, + {TMT_INT,TMT_FROMHUE1,{'F','R','O','M','H','U','E','1','\0'}}, + {TMT_INT,TMT_FROMHUE2,{'F','R','O','M','H','U','E','2','\0'}}, + {TMT_INT,TMT_FROMHUE3,{'F','R','O','M','H','U','E','3','\0'}}, + {TMT_INT,TMT_FROMHUE4,{'F','R','O','M','H','U','E','4','\0'}}, + {TMT_INT,TMT_FROMHUE5,{'F','R','O','M','H','U','E','5','\0'}}, + {TMT_INT,TMT_TOHUE1,{'T','O','H','U','E','1','\0'}}, + {TMT_INT,TMT_TOHUE2,{'T','O','H','U','E','2','\0'}}, + {TMT_INT,TMT_TOHUE3,{'T','O','H','U','E','3','\0'}}, + {TMT_INT,TMT_TOHUE4,{'T','O','H','U','E','4','\0'}}, + {TMT_INT,TMT_TOHUE5,{'T','O','H','U','E','5','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR1,{'F','R','O','M','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR2,{'F','R','O','M','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR3,{'F','R','O','M','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR4,{'F','R','O','M','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_FROMCOLOR5,{'F','R','O','M','C','O','L','O','R','5','\0'}}, + {TMT_COLOR,TMT_TOCOLOR1,{'T','O','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_TOCOLOR2,{'T','O','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_TOCOLOR3,{'T','O','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_TOCOLOR4,{'T','O','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_TOCOLOR5,{'T','O','C','O','L','O','R','5','\0'}}, + {TMT_BOOL,TMT_TRANSPARENT,{'T','R','A','N','S','P','A','R','E','N','T','\0'}}, + {TMT_BOOL,TMT_AUTOSIZE,{'A','U','T','O','S','I','Z','E','\0'}}, + {TMT_BOOL,TMT_BORDERONLY,{'B','O','R','D','E','R','O','N','L','Y','\0'}}, + {TMT_BOOL,TMT_COMPOSITED,{'C','O','M','P','O','S','I','T','E','D','\0'}}, + {TMT_BOOL,TMT_BGFILL,{'B','G','F','I','L','L','\0'}}, + {TMT_BOOL,TMT_GLYPHTRANSPARENT,{'G','L','Y','P','H','T','R','A','N','S','P','A','R','E','N','T','\0'}}, + {TMT_BOOL,TMT_GLYPHONLY,{'G','L','Y','P','H','O','N','L','Y','\0'}}, + {TMT_BOOL,TMT_ALWAYSSHOWSIZINGBAR,{'A','L','W','A','Y','S','S','H','O','W','S','I','Z','I','N','G','B','A','R','\0'}}, + {TMT_BOOL,TMT_MIRRORIMAGE,{'M','I','R','R','O','R','I','M','A','G','E','\0'}}, + {TMT_BOOL,TMT_UNIFORMSIZING,{'U','N','I','F','O','R','M','S','I','Z','I','N','G','\0'}}, + {TMT_BOOL,TMT_INTEGRALSIZING,{'I','N','T','E','G','R','A','L','S','I','Z','I','N','G','\0'}}, + {TMT_BOOL,TMT_SOURCEGROW,{'S','O','U','R','C','E','G','R','O','W','\0'}}, + {TMT_BOOL,TMT_SOURCESHRINK,{'S','O','U','R','C','E','S','H','R','I','N','K','\0'}}, + {TMT_INT,TMT_IMAGECOUNT,{'I','M','A','G','E','C','O','U','N','T','\0'}}, + {TMT_INT,TMT_ALPHALEVEL,{'A','L','P','H','A','L','E','V','E','L','\0'}}, + {TMT_INT,TMT_BORDERSIZE,{'B','O','R','D','E','R','S','I','Z','E','\0'}}, + {TMT_INT,TMT_ROUNDCORNERWIDTH,{'R','O','U','N','D','C','O','R','N','E','R','W','I','D','T','H','\0'}}, + {TMT_INT,TMT_ROUNDCORNERHEIGHT,{'R','O','U','N','D','C','O','R','N','E','R','H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO1,{'G','R','A','D','I','E','N','T','R','A','T','I','O','1','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO2,{'G','R','A','D','I','E','N','T','R','A','T','I','O','2','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO3,{'G','R','A','D','I','E','N','T','R','A','T','I','O','3','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO4,{'G','R','A','D','I','E','N','T','R','A','T','I','O','4','\0'}}, + {TMT_INT,TMT_GRADIENTRATIO5,{'G','R','A','D','I','E','N','T','R','A','T','I','O','5','\0'}}, + {TMT_INT,TMT_PROGRESSCHUNKSIZE,{'P','R','O','G','R','E','S','S','C','H','U','N','K','S','I','Z','E','\0'}}, + {TMT_INT,TMT_PROGRESSSPACESIZE,{'P','R','O','G','R','E','S','S','S','P','A','C','E','S','I','Z','E','\0'}}, + {TMT_INT,TMT_SATURATION,{'S','A','T','U','R','A','T','I','O','N','\0'}}, + {TMT_INT,TMT_TEXTBORDERSIZE,{'T','E','X','T','B','O','R','D','E','R','S','I','Z','E','\0'}}, + {TMT_INT,TMT_ALPHATHRESHOLD,{'A','L','P','H','A','T','H','R','E','S','H','O','L','D','\0'}}, + {TMT_SIZE,TMT_WIDTH,{'W','I','D','T','H','\0'}}, + {TMT_SIZE,TMT_HEIGHT,{'H','E','I','G','H','T','\0'}}, + {TMT_INT,TMT_GLYPHINDEX,{'G','L','Y','P','H','I','N','D','E','X','\0'}}, + {TMT_INT,TMT_TRUESIZESTRETCHMARK,{'T','R','U','E','S','I','Z','E','S','T','R','E','T','C','H','M','A','R','K','\0'}}, + {TMT_INT,TMT_MINDPI1,{'M','I','N','D','P','I','1','\0'}}, + {TMT_INT,TMT_MINDPI2,{'M','I','N','D','P','I','2','\0'}}, + {TMT_INT,TMT_MINDPI3,{'M','I','N','D','P','I','3','\0'}}, + {TMT_INT,TMT_MINDPI4,{'M','I','N','D','P','I','4','\0'}}, + {TMT_INT,TMT_MINDPI5,{'M','I','N','D','P','I','5','\0'}}, + {TMT_FONT,TMT_GLYPHFONT,{'G','L','Y','P','H','F','O','N','T','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE,{'I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE1,{'I','M','A','G','E','F','I','L','E','1','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE2,{'I','M','A','G','E','F','I','L','E','2','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE3,{'I','M','A','G','E','F','I','L','E','3','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE4,{'I','M','A','G','E','F','I','L','E','4','\0'}}, + {TMT_FILENAME,TMT_IMAGEFILE5,{'I','M','A','G','E','F','I','L','E','5','\0'}}, + {TMT_FILENAME,TMT_STOCKIMAGEFILE,{'S','T','O','C','K','I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_FILENAME,TMT_GLYPHIMAGEFILE,{'G','L','Y','P','H','I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_STRING,TMT_TEXT,{'T','E','X','T','\0'}}, + {TMT_POSITION,TMT_OFFSET,{'O','F','F','S','E','T','\0'}}, + {TMT_POSITION,TMT_TEXTSHADOWOFFSET,{'T','E','X','T','S','H','A','D','O','W','O','F','F','S','E','T','\0'}}, + {TMT_POSITION,TMT_MINSIZE,{'M','I','N','S','I','Z','E','\0'}}, + {TMT_POSITION,TMT_MINSIZE1,{'M','I','N','S','I','Z','E','1','\0'}}, + {TMT_POSITION,TMT_MINSIZE2,{'M','I','N','S','I','Z','E','2','\0'}}, + {TMT_POSITION,TMT_MINSIZE3,{'M','I','N','S','I','Z','E','3','\0'}}, + {TMT_POSITION,TMT_MINSIZE4,{'M','I','N','S','I','Z','E','4','\0'}}, + {TMT_POSITION,TMT_MINSIZE5,{'M','I','N','S','I','Z','E','5','\0'}}, + {TMT_POSITION,TMT_NORMALSIZE,{'N','O','R','M','A','L','S','I','Z','E','\0'}}, + {TMT_MARGINS,TMT_SIZINGMARGINS,{'S','I','Z','I','N','G','M','A','R','G','I','N','S','\0'}}, + {TMT_MARGINS,TMT_CONTENTMARGINS,{'C','O','N','T','E','N','T','M','A','R','G','I','N','S','\0'}}, + {TMT_MARGINS,TMT_CAPTIONMARGINS,{'C','A','P','T','I','O','N','M','A','R','G','I','N','S','\0'}}, + {TMT_COLOR,TMT_BORDERCOLOR,{'B','O','R','D','E','R','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_FILLCOLOR,{'F','I','L','L','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTCOLOR,{'T','E','X','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGELIGHTCOLOR,{'E','D','G','E','L','I','G','H','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEHIGHLIGHTCOLOR,{'E','D','G','E','H','I','G','H','L','I','G','H','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGESHADOWCOLOR,{'E','D','G','E','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEDKSHADOWCOLOR,{'E','D','G','E','D','K','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_EDGEFILLCOLOR,{'E','D','G','E','F','I','L','L','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TRANSPARENTCOLOR,{'T','R','A','N','S','P','A','R','E','N','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR1,{'G','R','A','D','I','E','N','T','C','O','L','O','R','1','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR2,{'G','R','A','D','I','E','N','T','C','O','L','O','R','2','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR3,{'G','R','A','D','I','E','N','T','C','O','L','O','R','3','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR4,{'G','R','A','D','I','E','N','T','C','O','L','O','R','4','\0'}}, + {TMT_COLOR,TMT_GRADIENTCOLOR5,{'G','R','A','D','I','E','N','T','C','O','L','O','R','5','\0'}}, + {TMT_COLOR,TMT_SHADOWCOLOR,{'S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLOWCOLOR,{'G','L','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTBORDERCOLOR,{'T','E','X','T','B','O','R','D','E','R','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_TEXTSHADOWCOLOR,{'T','E','X','T','S','H','A','D','O','W','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLYPHTEXTCOLOR,{'G','L','Y','P','H','T','E','X','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_GLYPHTRANSPARENTCOLOR,{'G','L','Y','P','H','T','R','A','N','S','P','A','R','E','N','T','C','O','L','O','R','\0'}}, + {TMT_COLOR,TMT_FILLCOLORHINT,{'F','I','L','L','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_COLOR,TMT_BORDERCOLORHINT,{'B','O','R','D','E','R','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_COLOR,TMT_ACCENTCOLORHINT,{'A','C','C','E','N','T','C','O','L','O','R','H','I','N','T','\0'}}, + {TMT_ENUM,TMT_BGTYPE,{'B','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_BORDERTYPE,{'B','O','R','D','E','R','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_FILLTYPE,{'F','I','L','L','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_SIZINGTYPE,{'S','I','Z','I','N','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_HALIGN,{'H','A','L','I','G','N','\0'}}, + {TMT_ENUM,TMT_CONTENTALIGNMENT,{'C','O','N','T','E','N','T','A','L','I','G','N','M','E','N','T','\0'}}, + {TMT_ENUM,TMT_VALIGN,{'V','A','L','I','G','N','\0'}}, + {TMT_ENUM,TMT_OFFSETTYPE,{'O','F','F','S','E','T','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_ICONEFFECT,{'I','C','O','N','E','F','F','E','C','T','\0'}}, + {TMT_ENUM,TMT_TEXTSHADOWTYPE,{'T','E','X','T','S','H','A','D','O','W','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_IMAGELAYOUT,{'I','M','A','G','E','L','A','Y','O','U','T','\0'}}, + {TMT_ENUM,TMT_GLYPHTYPE,{'G','L','Y','P','H','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_IMAGESELECTTYPE,{'I','M','A','G','E','S','E','L','E','C','T','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_GLYPHFONTSIZINGTYPE,{'G','L','Y','P','H','F','O','N','T','S','I','Z','I','N','G','T','Y','P','E','\0'}}, + {TMT_ENUM,TMT_TRUESIZESCALINGTYPE,{'T','R','U','E','S','I','Z','E','S','C','A','L','I','N','G','T','Y','P','E','\0'}}, + {TMT_BOOL,TMT_USERPICTURE,{'U','S','E','R','P','I','C','T','U','R','E','\0'}}, + {TMT_RECT,TMT_DEFAULTPANESIZE,{'D','E','F','A','U','L','T','P','A','N','E','S','I','Z','E','\0'}}, + {TMT_COLOR,TMT_BLENDCOLOR,{'B','L','E','N','D','C','O','L','O','R','\0'}}, + {0,0,{'\0'}} +}; + +/*********************************************************************** + * Map strings to enumeration values + * Enum,Value,ValueName + */ +static const MSSTYLES_ENUM_MAP mapEnum[] = { + {TMT_BGTYPE,BT_IMAGEFILE,{'I','M','A','G','E','F','I','L','E','\0'}}, + {TMT_BGTYPE,BT_BORDERFILL,{'B','O','R','D','E','R','F','I','L','L','\0'}}, + {TMT_BGTYPE,BT_NONE,{'N','O','N','E','\0'}}, + {TMT_IMAGELAYOUT,IL_VERTICAL,{'V','E','R','T','I','C','A','L','\0'}}, + {TMT_IMAGELAYOUT,IL_HORIZONTAL,{'H','O','R','I','Z','O','N','T','A','L','\0'}}, + {TMT_BORDERTYPE,BT_RECT,{'R','E','C','T','\0'}}, + {TMT_BORDERTYPE,BT_ROUNDRECT,{'R','O','U','N','D','R','E','C','T','\0'}}, + {TMT_BORDERTYPE,BT_ELLIPSE,{'E','L','L','I','P','S','E','\0'}}, + {TMT_FILLTYPE,FT_SOLID,{'S','O','L','I','D','\0'}}, + {TMT_FILLTYPE,FT_VERTGRADIENT,{'V','E','R','T','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_HORZGRADIENT,{'H','O','R','Z','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_RADIALGRADIENT,{'R','A','D','I','A','L','G','R','A','D','I','E','N','T','\0'}}, + {TMT_FILLTYPE,FT_TILEIMAGE,{'T','I','L','E','I','M','A','G','E','\0'}}, + {TMT_SIZINGTYPE,ST_TRUESIZE,{'T','R','U','E','S','I','Z','E','\0'}}, + {TMT_SIZINGTYPE,ST_STRETCH,{'S','T','R','E','T','C','H','\0'}}, + {TMT_SIZINGTYPE,ST_TILE,{'T','I','L','E','\0'}}, + {TMT_HALIGN,HA_LEFT,{'L','E','F','T','\0'}}, + {TMT_HALIGN,HA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_HALIGN,HA_RIGHT,{'R','I','G','H','T','\0'}}, + {TMT_CONTENTALIGNMENT,CA_LEFT,{'L','E','F','T','\0'}}, + {TMT_CONTENTALIGNMENT,CA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_CONTENTALIGNMENT,CA_RIGHT,{'R','I','G','H','T','\0'}}, + {TMT_VALIGN,VA_TOP,{'T','O','P','\0'}}, + {TMT_VALIGN,VA_CENTER,{'C','E','N','T','E','R','\0'}}, + {TMT_VALIGN,VA_BOTTOM,{'B','O','T','T','O','M','\0'}}, + {TMT_OFFSETTYPE,OT_TOPLEFT,{'T','O','P','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_TOPRIGHT,{'T','O','P','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_TOPMIDDLE,{'T','O','P','M','I','D','D','L','E','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMLEFT,{'B','O','T','T','O','M','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMRIGHT,{'B','O','T','T','O','M','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_BOTTOMMIDDLE,{'B','O','T','T','O','M','M','I','D','D','L','E','\0'}}, + {TMT_OFFSETTYPE,OT_MIDDLELEFT,{'M','I','D','D','L','E','L','E','F','T','\0'}}, + {TMT_OFFSETTYPE,OT_MIDDLERIGHT,{'M','I','D','D','L','E','R','I','G','H','T','\0'}}, + {TMT_OFFSETTYPE,OT_LEFTOFCAPTION,{'L','E','F','T','O','F','C','A','P','T','I','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_RIGHTOFCAPTION,{'R','I','G','H','T','O','F','C','A','P','T','I','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_LEFTOFLASTBUTTON,{'L','E','F','T','O','F','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_RIGHTOFLASTBUTTON,{'R','I','G','H','T','O','F','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_ABOVELASTBUTTON,{'A','B','O','V','E','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_OFFSETTYPE,OT_BELOWLASTBUTTON,{'B','E','L','O','W','L','A','S','T','B','U','T','T','O','N','\0'}}, + {TMT_ICONEFFECT,ICE_NONE,{'N','O','N','E','\0'}}, + {TMT_ICONEFFECT,ICE_GLOW,{'G','L','O','W','\0'}}, + {TMT_ICONEFFECT,ICE_SHADOW,{'S','H','A','D','O','W','\0'}}, + {TMT_ICONEFFECT,ICE_PULSE,{'P','U','L','S','E','\0'}}, + {TMT_ICONEFFECT,ICE_ALPHA,{'A','L','P','H','A','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_NONE,{'N','O','N','E','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_SINGLE,{'S','I','N','G','L','E','\0'}}, + {TMT_TEXTSHADOWTYPE,TST_CONTINUOUS,{'C','O','N','T','I','N','U','O','U','S','\0'}}, + {TMT_GLYPHTYPE,GT_NONE,{'N','O','N','E','\0'}}, + {TMT_GLYPHTYPE,GT_IMAGEGLYPH,{'I','M','A','G','E','G','L','Y','P','H','\0'}}, + {TMT_GLYPHTYPE,GT_FONTGLYPH,{'F','O','N','T','G','L','Y','P','H','\0'}}, + {TMT_IMAGESELECTTYPE,IST_NONE,{'N','O','N','E','\0'}}, + {TMT_IMAGESELECTTYPE,IST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_IMAGESELECTTYPE,IST_DPI,{'D','P','I','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_NONE,{'N','O','N','E','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_TRUESIZESCALINGTYPE,TSST_DPI,{'D','P','I','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_NONE,{'N','O','N','E','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_SIZE,{'S','I','Z','E','\0'}}, + {TMT_GLYPHFONTSIZINGTYPE,GFST_DPI,{'D','P','I','\0'}}, + {0,0,{'\0'}} +}; + + +/*********************************************************************** + * Classes defined below + * Defined as PartID,StateID,TextName + * If StateID == 0 then its a part being defined + */ + +/* These are globals to all classes, but its treated as a separate class */ +static const MSSTYLES_CLASS_MAP classGlobals[] = { + {GP_BORDER,0,{'B','O','R','D','E','R','\0'}}, + {GP_BORDER,BSS_FLAT,{'F','L','A','T','\0'}}, + {GP_BORDER,BSS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_BORDER,BSS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {GP_LINEHORZ,0,{'L','I','N','E','H','O','R','Z','\0'}}, + {GP_LINEHORZ,LHS_FLAT,{'F','L','A','T','\0'}}, + {GP_LINEHORZ,LHS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_LINEHORZ,LHS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {GP_LINEVERT,0,{'L','I','N','E','V','E','R','T','\0'}}, + {GP_LINEVERT,LVS_FLAT,{'F','L','A','T','\0'}}, + {GP_LINEVERT,LVS_RAISED,{'R','A','I','S','E','D','\0'}}, + {GP_LINEVERT,LVS_SUNKEN,{'S','U','N','K','E','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classButton[] = { + {BP_PUSHBUTTON,0,{'P','U','S','H','B','U','T','T','O','N','\0'}}, + {BP_PUSHBUTTON,PBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {BP_PUSHBUTTON,PBS_HOT,{'H','O','T','\0'}}, + {BP_PUSHBUTTON,PBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {BP_PUSHBUTTON,PBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {BP_PUSHBUTTON,PBS_DEFAULTED,{'D','E','F','A','U','L','T','E','D','\0'}}, + {BP_RADIOBUTTON,0,{'R','A','D','I','O','B','U','T','T','O','N','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDNORMAL,{'U','N','C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDHOT,{'U','N','C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDPRESSED,{'U','N','C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_UNCHECKEDDISABLED,{'U','N','C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDNORMAL,{'C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDHOT,{'C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDPRESSED,{'C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,RBS_CHECKEDDISABLED,{'C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_CHECKBOX,0,{'C','H','E','C','K','B','O','X','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDNORMAL,{'U','N','C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDHOT,{'U','N','C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDPRESSED,{'U','N','C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_UNCHECKEDDISABLED,{'U','N','C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDNORMAL,{'C','H','E','C','K','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDHOT,{'C','H','E','C','K','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDPRESSED,{'C','H','E','C','K','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_CHECKEDDISABLED,{'C','H','E','C','K','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDNORMAL,{'M','I','X','E','D','N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDHOT,{'M','I','X','E','D','H','O','T','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDPRESSED,{'M','I','X','E','D','P','R','E','S','S','E','D','\0'}}, + {BP_RADIOBUTTON,CBS_MIXEDDISABLED,{'M','I','X','E','D','D','I','S','A','B','L','E','D','\0'}}, + {BP_GROUPBOX,0,{'G','R','O','U','P','B','O','X','\0'}}, + {BP_RADIOBUTTON,GBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {BP_RADIOBUTTON,GBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {BP_USERBUTTON,0,{'U','S','E','R','B','U','T','T','O','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classClock[] = { + {CLP_TIME,0,{'T','I','M','E','\0'}}, + {CLP_TIME,CLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classCombobox[] = { + {CP_DROPDOWNBUTTON,0,{'D','R','O','P','D','O','W','N','B','U','T','T','O','N','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_HOT,{'H','O','T','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {CP_DROPDOWNBUTTON,CBXS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classEdit[] = { + {EP_EDITTEXT,0,{'E','D','I','T','T','E','X','T','\0'}}, + {EP_EDITTEXT,ETS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EP_EDITTEXT,ETS_HOT,{'H','O','T','\0'}}, + {EP_EDITTEXT,ETS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {EP_EDITTEXT,ETS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {EP_EDITTEXT,ETS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {EP_EDITTEXT,ETS_READONLY,{'R','E','A','D','O','N','L','Y','\0'}}, + {EP_EDITTEXT,ETS_ASSIST,{'A','S','S','I','S','T','\0'}}, + {EP_CARET,0,{'C','A','R','E','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classExplorerbar[] = { + {EBP_HEADERBACKGROUND,0,{'H','E','A','D','E','R','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_HEADERCLOSE,0,{'H','E','A','D','E','R','C','L','O','S','E','\0'}}, + {EBP_HEADERCLOSE,EBHC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_HEADERCLOSE,EBHC_HOT,{'H','O','T','\0'}}, + {EBP_HEADERCLOSE,EBHC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_HEADERPIN,0,{'H','E','A','D','E','R','P','I','N','\0'}}, + {EBP_HEADERPIN,EBHP_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_HEADERPIN,EBHP_HOT,{'H','O','T','\0'}}, + {EBP_HEADERPIN,EBHP_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDNORMAL,{'S','E','L','E','C','T','E','D','N','O','R','M','A','L','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDHOT,{'S','E','L','E','C','T','E','D','H','O','T','\0'}}, + {EBP_HEADERPIN,EBHP_SELECTEDPRESSED,{'S','E','L','E','C','T','E','D','P','R','E','S','S','E','D','\0'}}, + {EBP_IEBARMENU,0,{'I','E','B','A','R','M','E','N','U','\0'}}, + {EBP_IEBARMENU,EBM_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_IEBARMENU,EBM_HOT,{'H','O','T','\0'}}, + {EBP_IEBARMENU,EBM_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPBACKGROUND,0,{'N','O','R','M','A','L','G','R','O','U','P','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,0,{'N','O','R','M','A','L','G','R','O','U','P','C','O','L','L','A','P','S','E','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_HOT,{'H','O','T','\0'}}, + {EBP_NORMALGROUPCOLLAPSE,EBNGC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPEXPAND,0,{'N','O','R','M','A','L','G','R','O','U','P','E','X','P','A','N','D','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_HOT,{'H','O','T','\0'}}, + {EBP_NORMALGROUPEXPAND,EBNGE_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_NORMALGROUPHEAD,0,{'N','O','R','M','A','L','G','R','O','U','P','H','E','A','D','\0'}}, + {EBP_SPECIALGROUPBACKGROUND,0,{'S','P','E','C','I','A','L','G','R','O','U','P','B','A','C','K','G','R','O','U','N','D','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,0,{'S','P','E','C','I','A','L','G','R','O','U','P','C','O','L','L','A','P','S','E','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_HOT,{'H','O','T','\0'}}, + {EBP_SPECIALGROUPCOLLAPSE,EBSGC_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_SPECIALGROUPEXPAND,0,{'S','P','E','C','I','A','L','G','R','O','U','P','E','X','P','A','N','D','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_NORMAL,{'N','O','R','M','A','L','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_HOT,{'H','O','T','\0'}}, + {EBP_SPECIALGROUPEXPAND,EBSGE_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {EBP_SPECIALGROUPHEAD,0,{'S','P','E','C','I','A','L','G','R','O','U','P','H','E','A','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classHeader[] = { + {HP_HEADERITEM,0,{'H','E','A','D','E','R','I','T','E','M','\0'}}, + {HP_HEADERITEM,HIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEM,HIS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEM,HIS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERITEMLEFT,0,{'H','E','A','D','E','R','I','T','E','M','L','E','F','T','\0'}}, + {HP_HEADERITEMLEFT,HILS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEMLEFT,HILS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEMLEFT,HILS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERITEMRIGHT,0,{'H','E','A','D','E','R','I','T','E','M','R','I','G','H','T','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_HOT,{'H','O','T','\0'}}, + {HP_HEADERITEMRIGHT,HIRS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {HP_HEADERSORTARROW,0,{'H','E','A','D','E','R','S','O','R','T','A','R','R','O','W','\0'}}, + {HP_HEADERSORTARROW,HSAS_SORTEDUP,{'S','O','R','T','E','D','U','P','\0'}}, + {HP_HEADERSORTARROW,HSAS_SORTEDDOWN,{'S','O','R','T','E','D','D','O','W','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classListview[] = { + {LVP_LISTITEM,0,{'L','I','S','T','I','T','E','M','\0'}}, + {LVP_LISTITEM,LIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {LVP_LISTITEM,LIS_HOT,{'H','O','T','\0'}}, + {LVP_LISTITEM,LIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {LVP_LISTITEM,LIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {LVP_LISTITEM,LIS_SELECTEDNOTFOCUS,{'S','E','L','E','C','T','E','D','N','O','T','F','O','C','U','S','\0'}}, + {LVP_LISTGROUP,0,{'L','I','S','T','G','R','O','U','P','\0'}}, + {LVP_LISTDETAIL,0,{'L','I','S','T','D','E','T','A','I','L','\0'}}, + {LVP_LISTSORTEDDETAIL,0,{'L','I','S','T','S','O','R','T','E','D','D','E','T','A','I','L','\0'}}, + {LVP_EMPTYTEXT,0,{'E','M','P','T','Y','T','E','X','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classMenu[] = { + {MP_MENUITEM,0,{'M','E','N','U','I','T','E','M','\0'}}, + {MP_MENUITEM,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUITEM,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUITEM,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUDROPDOWN,0,{'M','E','N','U','D','R','O','P','D','O','W','N','\0'}}, + {MP_MENUDROPDOWN,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUDROPDOWN,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUDROPDOWN,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUBARITEM,0,{'M','E','N','U','B','A','R','I','T','E','M','\0'}}, + {MP_MENUBARITEM,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUBARITEM,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUBARITEM,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_MENUBARDROPDOWN,0,{'M','E','N','U','B','A','R','D','R','O','P','D','O','W','N','\0'}}, + {MP_MENUBARDROPDOWN,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_MENUBARDROPDOWN,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_MENUBARDROPDOWN,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_CHEVRON,0,{'C','H','E','V','R','O','N','\0'}}, + {MP_CHEVRON,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_CHEVRON,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_CHEVRON,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {MP_SEPARATOR,0,{'S','E','P','A','R','A','T','O','R','\0'}}, + {MP_SEPARATOR,MS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MP_SEPARATOR,MS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {MP_SEPARATOR,MS_DEMOTED,{'D','E','M','O','T','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classMenuband[] = { + {MDP_NEWAPPBUTTON,0,{'N','E','W','A','P','P','B','U','T','T','O','N','\0'}}, + {MDP_NEWAPPBUTTON,MDS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {MDP_NEWAPPBUTTON,MDS_HOT,{'H','O','T','\0'}}, + {MDP_NEWAPPBUTTON,MDS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {MDP_NEWAPPBUTTON,MDS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {MDP_SEPERATOR,0,{'S','E','P','E','R','A','T','O','R','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classPage[] = { + {PGRP_UP,0,{'U','P','\0'}}, + {PGRP_UP,UPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_UP,UPS_HOT,{'H','O','T','\0'}}, + {PGRP_UP,UPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_UP,UPS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_DOWN,0,{'D','O','W','N','\0'}}, + {PGRP_DOWN,DNS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_DOWN,DNS_HOT,{'H','O','T','\0'}}, + {PGRP_DOWN,DNS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_DOWN,DNS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_UPHORZ,0,{'U','P','H','O','R','Z','\0'}}, + {PGRP_UPHORZ,UPHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_UPHORZ,UPHZS_HOT,{'H','O','T','\0'}}, + {PGRP_UPHORZ,UPHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_UPHORZ,UPHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {PGRP_DOWNHORZ,0,{'D','O','W','N','H','O','R','Z','\0'}}, + {PGRP_DOWNHORZ,DNHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {PGRP_DOWNHORZ,DNHZS_HOT,{'H','O','T','\0'}}, + {PGRP_DOWNHORZ,DNHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {PGRP_DOWNHORZ,DNHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classProgress[] = { + {PP_BAR,0,{'B','A','R','\0'}}, + {PP_BARVERT,0,{'B','A','R','V','E','R','T','\0'}}, + {PP_CHUNK,0,{'C','H','U','N','K','\0'}}, + {PP_CHUNKVERT,0,{'C','H','U','N','K','V','E','R','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classRebar[] = { + {RP_GRIPPER,0,{'G','R','I','P','P','E','R','\0'}}, + {RP_GRIPPERVERT,0,{'G','R','I','P','P','E','R','V','E','R','T','\0'}}, + {RP_BAND,0,{'B','A','N','D','\0'}}, + {RP_CHEVRON,0,{'C','H','E','V','R','O','N','\0'}}, + {RP_CHEVRON,CHEVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {RP_CHEVRON,CHEVS_HOT,{'H','O','T','\0'}}, + {RP_CHEVRON,CHEVS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {RP_CHEVRONVERT,0,{'C','H','E','V','R','O','N','V','E','R','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classScrollbar[] = { + {SBP_ARROWBTN,0,{'A','R','R','O','W','B','T','N','\0'}}, + {SBP_ARROWBTN,ABS_UPNORMAL,{'U','P','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_UPHOT,{'U','P','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_UPPRESSED,{'U','P','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_UPDISABLED,{'U','P','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_DOWNNORMAL,{'D','O','W','N','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_DOWNHOT,{'D','O','W','N','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_DOWNPRESSED,{'D','O','W','N','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_DOWNDISABLED,{'D','O','W','N','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_LEFTNORMAL,{'L','E','F','T','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_LEFTHOT,{'L','E','F','T','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_LEFTPRESSED,{'L','E','F','T','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_LEFTDISABLED,{'L','E','F','T','D','I','S','A','B','L','E','D','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTNORMAL,{'R','I','G','H','T','N','O','R','M','A','L','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTHOT,{'R','I','G','H','T','H','O','T','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTPRESSED,{'R','I','G','H','T','P','R','E','S','S','E','D','\0'}}, + {SBP_ARROWBTN,ABS_RIGHTDISABLED,{'R','I','G','H','T','D','I','S','A','B','L','E','D','\0'}}, + {SBP_THUMBBTNHORZ,0,{'T','H','U','M','B','B','T','N','H','O','R','Z','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_THUMBBTNHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_THUMBBTNVERT,0,{'T','H','U','M','B','B','T','N','V','E','R','T','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_THUMBBTNVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_LOWERTRACKHORZ,0,{'L','O','W','E','R','T','R','A','C','K','H','O','R','Z','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_LOWERTRACKHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_UPPERTRACKHORZ,0,{'U','P','P','E','R','T','R','A','C','K','H','O','R','Z','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_UPPERTRACKHORZ,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_LOWERTRACKVERT,0,{'L','O','W','E','R','T','R','A','C','K','V','E','R','T','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_LOWERTRACKVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_UPPERTRACKVERT,0,{'U','P','P','E','R','T','R','A','C','K','V','E','R','T','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_HOT,{'H','O','T','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SBP_UPPERTRACKVERT,SCRBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SBP_GRIPPERHORZ,0,{'G','R','I','P','P','E','R','H','O','R','Z','\0'}}, + {SBP_GRIPPERVERT,0,{'G','R','I','P','P','E','R','V','E','R','T','\0'}}, + {SBP_SIZEBOX,0,{'S','I','Z','E','B','O','X','\0'}}, + {SBP_SIZEBOX,SZB_RIGHTALIGN,{'R','I','G','H','T','A','L','I','G','N','\0'}}, + {SBP_SIZEBOX,SZB_LEFTALIGN,{'L','E','F','T','A','L','I','G','N','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classSpin[] = { + {SPNP_UP,0,{'U','P','\0'}}, + {SPNP_UP,UPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_UP,UPS_HOT,{'H','O','T','\0'}}, + {SPNP_UP,UPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_UP,UPS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_DOWN,0,{'D','O','W','N','\0'}}, + {SPNP_DOWN,DNS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_DOWN,DNS_HOT,{'H','O','T','\0'}}, + {SPNP_DOWN,DNS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_DOWN,DNS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_UPHORZ,0,{'U','P','H','O','R','Z','\0'}}, + {SPNP_UPHORZ,UPHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_UPHORZ,UPHZS_HOT,{'H','O','T','\0'}}, + {SPNP_UPHORZ,UPHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_UPHORZ,UPHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {SPNP_DOWNHORZ,0,{'D','O','W','N','H','O','R','Z','\0'}}, + {SPNP_DOWNHORZ,DNHZS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPNP_DOWNHORZ,DNHZS_HOT,{'H','O','T','\0'}}, + {SPNP_DOWNHORZ,DNHZS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPNP_DOWNHORZ,DNHZS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classStartpanel[] = { + {SPP_USERPANE,0,{'U','S','E','R','P','A','N','E','\0'}}, + {SPP_MOREPROGRAMS,0,{'M','O','R','E','P','R','O','G','R','A','M','S','\0'}}, + {SPP_MOREPROGRAMSARROW,0,{'M','O','R','E','P','R','O','G','R','A','M','S','A','R','R','O','W','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_HOT,{'H','O','T','\0'}}, + {SPP_MOREPROGRAMSARROW,SPS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPP_PROGLIST,0,{'P','R','O','G','L','I','S','T','\0'}}, + {SPP_PROGLISTSEPARATOR,0,{'P','R','O','G','L','I','S','T','S','E','P','A','R','A','T','O','R','\0'}}, + {SPP_PLACESLIST,0,{'P','L','A','C','E','S','L','I','S','T','\0'}}, + {SPP_PLACESLISTSEPARATOR,0,{'P','L','A','C','E','S','L','I','S','T','S','E','P','A','R','A','T','O','R','\0'}}, + {SPP_LOGOFF,0,{'L','O','G','O','F','F','\0'}}, + {SPP_LOGOFFBUTTONS,0,{'L','O','G','O','F','F','B','U','T','T','O','N','S','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_HOT,{'H','O','T','\0'}}, + {SPP_LOGOFFBUTTONS,SPLS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {SPP_USERPICTURE,0,{'U','S','E','R','P','I','C','T','U','R','E','\0'}}, + {SPP_PREVIEW,0,{'P','R','E','V','I','E','W','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classStatus[] = { + {SP_PANE,0,{'P','A','N','E','\0'}}, + {SP_GRIPPERPANE,0,{'G','R','I','P','P','E','R','P','A','N','E','\0'}}, + {SP_GRIPPER,0,{'G','R','I','P','P','E','R','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTab[] = { + {TABP_TABITEM,0,{'T','A','B','I','T','E','M','\0'}}, + {TABP_TABITEM,TIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEM,TIS_HOT,{'H','O','T','\0'}}, + {TABP_TABITEM,TIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEM,TIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEM,TIS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,0,{'T','A','B','I','T','E','M','L','E','F','T','E','D','G','E','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMLEFTEDGE,TILES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,0,{'T','A','B','I','T','E','M','R','I','G','H','T','E','D','G','E','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMRIGHTEDGE,TIRES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,0,{'T','A','B','I','T','E','M','B','O','T','H','E','D','G','E','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_HOT,{'H','O','T','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TABITEMBOTHEDGE,TIBES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEM,0,{'T','O','P','T','A','B','I','T','E','M','\0'}}, + {TABP_TOPTABITEM,TTIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEM,TTIS_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEM,TTIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEM,TTIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEM,TTIS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,0,{'T','O','P','T','A','B','I','T','E','M','L','E','F','T','E','D','G','E','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMLEFTEDGE,TTILES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,0,{'T','O','P','T','A','B','I','T','E','M','R','I','G','H','T','E','D','G','E','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMRIGHTEDGE,TTIRES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,0,{'T','O','P','T','A','B','I','T','E','M','B','O','T','H','E','D','G','E','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_HOT,{'H','O','T','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TABP_TOPTABITEMBOTHEDGE,TTIBES_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TABP_PANE,0,{'P','A','N','E','\0'}}, + {TABP_BODY,0,{'B','O','D','Y','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTaskband[] = { + {TDP_GROUPCOUNT,0,{'G','R','O','U','P','C','O','U','N','T','\0'}}, + {TDP_FLASHBUTTON,0,{'F','L','A','S','H','B','U','T','T','O','N','\0'}}, + {TDP_FLASHBUTTONGROUPMENU,0,{'F','L','A','S','H','B','U','T','T','O','N','G','R','O','U','P','M','E','N','U','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTaskbar[] = { + {TBP_BACKGROUNDBOTTOM,0,{'B','A','C','K','G','R','O','U','N','D','B','O','T','T','O','M','\0'}}, + {TBP_BACKGROUNDRIGHT,0,{'B','A','C','K','G','R','O','U','N','D','R','I','G','H','T','\0'}}, + {TBP_BACKGROUNDTOP,0,{'B','A','C','K','G','R','O','U','N','D','T','O','P','\0'}}, + {TBP_BACKGROUNDLEFT,0,{'B','A','C','K','G','R','O','U','N','D','L','E','F','T','\0'}}, + {TBP_SIZINGBARBOTTOM,0,{'S','I','Z','I','N','G','B','A','R','B','O','T','T','O','M','\0'}}, + {TBP_SIZINGBARRIGHT,0,{'S','I','Z','I','N','G','B','A','R','R','I','G','H','T','\0'}}, + {TBP_SIZINGBARTOP,0,{'S','I','Z','I','N','G','B','A','R','T','O','P','\0'}}, + {TBP_SIZINGBARLEFT,0,{'S','I','Z','I','N','G','B','A','R','L','E','F','T','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classToolbar[] = { + {TP_BUTTON,0,{'B','U','T','T','O','N','\0'}}, + {TP_BUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_BUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_BUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_BUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_BUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_BUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_DROPDOWNBUTTON,0,{'D','R','O','P','D','O','W','N','B','U','T','T','O','N','\0'}}, + {TP_DROPDOWNBUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_DROPDOWNBUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_DROPDOWNBUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_DROPDOWNBUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTON,0,{'S','P','L','I','T','B','U','T','T','O','N','\0'}}, + {TP_SPLITBUTTON,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SPLITBUTTON,TS_HOT,{'H','O','T','\0'}}, + {TP_SPLITBUTTON,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SPLITBUTTON,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SPLITBUTTON,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTON,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,0,{'S','P','L','I','T','B','U','T','T','O','N','D','R','O','P','D','O','W','N','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_HOT,{'H','O','T','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SPLITBUTTONDROPDOWN,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATOR,0,{'S','E','P','A','R','A','T','O','R','\0'}}, + {TP_SEPARATOR,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SEPARATOR,TS_HOT,{'H','O','T','\0'}}, + {TP_SEPARATOR,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SEPARATOR,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SEPARATOR,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATOR,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATORVERT,0,{'S','E','P','A','R','A','T','O','R','V','E','R','T','\0'}}, + {TP_SEPARATORVERT,TS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TP_SEPARATORVERT,TS_HOT,{'H','O','T','\0'}}, + {TP_SEPARATORVERT,TS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TP_SEPARATORVERT,TS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TP_SEPARATORVERT,TS_CHECKED,{'C','H','E','C','K','E','D','\0'}}, + {TP_SEPARATORVERT,TS_HOTCHECKED,{'H','O','T','C','H','E','C','K','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTooltip[] = { + {TTP_STANDARD,0,{'S','T','A','N','D','A','R','D','\0'}}, + {TTP_STANDARD,TTSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_STANDARD,TTSS_LINK,{'L','I','N','K','\0'}}, + {TTP_STANDARDTITLE,0,{'S','T','A','N','D','A','R','D','T','I','T','L','E','\0'}}, + {TTP_STANDARDTITLE,TTSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_STANDARDTITLE,TTSS_LINK,{'L','I','N','K','\0'}}, + {TTP_BALLOON,0,{'B','A','L','L','O','O','N','\0'}}, + {TTP_BALLOON,TTBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_BALLOON,TTBS_LINK,{'L','I','N','K','\0'}}, + {TTP_BALLOONTITLE,0,{'B','A','L','L','O','O','N','T','I','T','L','E','\0'}}, + {TTP_BALLOONTITLE,TTBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_BALLOONTITLE,TTBS_LINK,{'L','I','N','K','\0'}}, + {TTP_CLOSE,0,{'C','L','O','S','E','\0'}}, + {TTP_CLOSE,TTCS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TTP_CLOSE,TTCS_HOT,{'H','O','T','\0'}}, + {TTP_CLOSE,TTCS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTrackbar[] = { + {TKP_TRACK,0,{'T','R','A','C','K','\0'}}, + {TKP_TRACK,TRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_TRACKVERT,0,{'T','R','A','C','K','V','E','R','T','\0'}}, + {TKP_TRACKVERT,TRVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMB,0,{'T','H','U','M','B','\0'}}, + {TKP_THUMB,TUS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMB,TUS_HOT,{'H','O','T','\0'}}, + {TKP_THUMB,TUS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMB,TUS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMB,TUS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBBOTTOM,0,{'T','H','U','M','B','B','O','T','T','O','M','\0'}}, + {TKP_THUMBBOTTOM,TUBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBBOTTOM,TUBS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBBOTTOM,TUBS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBBOTTOM,TUBS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBBOTTOM,TUBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBTOP,0,{'T','H','U','M','B','T','O','P','\0'}}, + {TKP_THUMBTOP,TUTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBTOP,TUTS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBTOP,TUTS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBTOP,TUTS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBTOP,TUTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBVERT,0,{'T','H','U','M','B','V','E','R','T','\0'}}, + {TKP_THUMBVERT,TUVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBVERT,TUVS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBVERT,TUVS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBVERT,TUVS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBVERT,TUVS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBLEFT,0,{'T','H','U','M','B','L','E','F','T','\0'}}, + {TKP_THUMBLEFT,TUVLS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBLEFT,TUVLS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBLEFT,TUVLS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBLEFT,TUVLS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBLEFT,TUVLS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_THUMBRIGHT,0,{'T','H','U','M','B','R','I','G','H','T','\0'}}, + {TKP_THUMBRIGHT,TUVRS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_THUMBRIGHT,TUVRS_HOT,{'H','O','T','\0'}}, + {TKP_THUMBRIGHT,TUVRS_PRESSED,{'P','R','E','S','S','E','D','\0'}}, + {TKP_THUMBRIGHT,TUVRS_FOCUSED,{'F','O','C','U','S','E','D','\0'}}, + {TKP_THUMBRIGHT,TUVRS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TKP_TICS,0,{'T','I','C','S','\0'}}, + {TKP_TICS,TSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TKP_TICSVERT,0,{'T','I','C','S','V','E','R','T','\0'}}, + {TKP_TICSVERT,TSVS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTraynotify[] = { + {TNP_BACKGROUND,0,{'B','A','C','K','G','R','O','U','N','D','\0'}}, + {TNP_ANIMBACKGROUND,0,{'A','N','I','M','B','A','C','K','G','R','O','U','N','D','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classTreeview[] = { + {TVP_TREEITEM,0,{'T','R','E','E','I','T','E','M','\0'}}, + {TVP_TREEITEM,TREIS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {TVP_TREEITEM,TREIS_HOT,{'H','O','T','\0'}}, + {TVP_TREEITEM,TREIS_SELECTED,{'S','E','L','E','C','T','E','D','\0'}}, + {TVP_TREEITEM,TREIS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {TVP_TREEITEM,TREIS_SELECTEDNOTFOCUS,{'S','E','L','E','C','T','E','D','N','O','T','F','O','C','U','S','\0'}}, + {TVP_GLYPH,0,{'G','L','Y','P','H','\0'}}, + {TVP_GLYPH,GLPS_CLOSED,{'C','L','O','S','E','D','\0'}}, + {TVP_GLYPH,GLPS_OPENED,{'O','P','E','N','E','D','\0'}}, + {TVP_BRANCH,0,{'B','R','A','N','C','H','\0'}}, + {0,0,{'\0'}} +}; + +static const MSSTYLES_CLASS_MAP classWindow[] = { + {WP_CAPTION,0,{'C','A','P','T','I','O','N','\0'}}, + {WP_CAPTION,CS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_CAPTION,CS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_CAPTION,CS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLCAPTION,0,{'S','M','A','L','L','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLCAPTION,CS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLCAPTION,CS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLCAPTION,CS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MINCAPTION,0,{'M','I','N','C','A','P','T','I','O','N','\0'}}, + {WP_MINCAPTION,MNCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_MINCAPTION,MNCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_MINCAPTION,MNCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLMINCAPTION,0,{'S','M','A','L','L','M','I','N','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLMINCAPTION,MNCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLMINCAPTION,MNCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLMINCAPTION,MNCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MAXCAPTION,0,{'M','A','X','C','A','P','T','I','O','N','\0'}}, + {WP_MAXCAPTION,MXCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_MAXCAPTION,MXCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_MAXCAPTION,MXCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLMAXCAPTION,0,{'S','M','A','L','L','M','A','X','C','A','P','T','I','O','N','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLMAXCAPTION,MXCS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_FRAMELEFT,0,{'F','R','A','M','E','L','E','F','T','\0'}}, + {WP_FRAMELEFT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMELEFT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_FRAMERIGHT,0,{'F','R','A','M','E','R','I','G','H','T','\0'}}, + {WP_FRAMERIGHT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMERIGHT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_FRAMEBOTTOM,0,{'F','R','A','M','E','B','O','T','T','O','M','\0'}}, + {WP_FRAMEBOTTOM,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_FRAMEBOTTOM,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMELEFT,0,{'S','M','A','L','L','F','R','A','M','E','L','E','F','T','\0'}}, + {WP_SMALLFRAMELEFT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMELEFT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMERIGHT,0,{'S','M','A','L','L','F','R','A','M','E','R','I','G','H','T','\0'}}, + {WP_SMALLFRAMERIGHT,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMERIGHT,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMEBOTTOM,0,{'S','M','A','L','L','F','R','A','M','E','B','O','T','T','O','M','\0'}}, + {WP_SMALLFRAMEBOTTOM,FS_ACTIVE,{'A','C','T','I','V','E','\0'}}, + {WP_SMALLFRAMEBOTTOM,FS_INACTIVE,{'I','N','A','C','T','I','V','E','\0'}}, + {WP_SYSBUTTON,0,{'S','Y','S','B','U','T','T','O','N','\0'}}, + {WP_SYSBUTTON,SBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_SYSBUTTON,SBS_HOT,{'H','O','T','\0'}}, + {WP_SYSBUTTON,SBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_SYSBUTTON,SBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDISYSBUTTON,0,{'M','D','I','S','Y','S','B','U','T','T','O','N','\0'}}, + {WP_MDISYSBUTTON,SBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDISYSBUTTON,SBS_HOT,{'H','O','T','\0'}}, + {WP_MDISYSBUTTON,SBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDISYSBUTTON,SBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MINBUTTON,0,{'M','I','N','B','U','T','T','O','N','\0'}}, + {WP_MINBUTTON,MINBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MINBUTTON,MINBS_HOT,{'H','O','T','\0'}}, + {WP_MINBUTTON,MINBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MINBUTTON,MINBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIMINBUTTON,0,{'M','D','I','M','I','N','B','U','T','T','O','N','\0'}}, + {WP_MDIMINBUTTON,MINBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIMINBUTTON,MINBS_HOT,{'H','O','T','\0'}}, + {WP_MDIMINBUTTON,MINBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIMINBUTTON,MINBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MAXBUTTON,0,{'M','A','X','B','U','T','T','O','N','\0'}}, + {WP_MAXBUTTON,MAXBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MAXBUTTON,MAXBS_HOT,{'H','O','T','\0'}}, + {WP_MAXBUTTON,MAXBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MAXBUTTON,MAXBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_CLOSEBUTTON,0,{'C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_CLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_CLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_CLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_CLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_SMALLCLOSEBUTTON,0,{'S','M','A','L','L','C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_SMALLCLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDICLOSEBUTTON,0,{'M','D','I','C','L','O','S','E','B','U','T','T','O','N','\0'}}, + {WP_MDICLOSEBUTTON,CBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDICLOSEBUTTON,CBS_HOT,{'H','O','T','\0'}}, + {WP_MDICLOSEBUTTON,CBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDICLOSEBUTTON,CBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_RESTOREBUTTON,0,{'R','E','S','T','O','R','E','B','U','T','T','O','N','\0'}}, + {WP_RESTOREBUTTON,RBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_RESTOREBUTTON,RBS_HOT,{'H','O','T','\0'}}, + {WP_RESTOREBUTTON,RBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_RESTOREBUTTON,RBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIRESTOREBUTTON,0,{'M','D','I','R','E','S','T','O','R','E','B','U','T','T','O','N','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_HOT,{'H','O','T','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIRESTOREBUTTON,RBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HELPBUTTON,0,{'H','E','L','P','B','U','T','T','O','N','\0'}}, + {WP_HELPBUTTON,HBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HELPBUTTON,HBS_HOT,{'H','O','T','\0'}}, + {WP_HELPBUTTON,HBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HELPBUTTON,HBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_MDIHELPBUTTON,0,{'M','D','I','H','E','L','P','B','U','T','T','O','N','\0'}}, + {WP_MDIHELPBUTTON,HBS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_MDIHELPBUTTON,HBS_HOT,{'H','O','T','\0'}}, + {WP_MDIHELPBUTTON,HBS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_MDIHELPBUTTON,HBS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HORZSCROLL,0,{'H','O','R','Z','S','C','R','O','L','L','\0'}}, + {WP_HORZSCROLL,HSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HORZSCROLL,HSS_HOT,{'H','O','T','\0'}}, + {WP_HORZSCROLL,HSS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HORZSCROLL,HSS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_HORZTHUMB,0,{'H','O','R','Z','T','H','U','M','B','\0'}}, + {WP_HORZTHUMB,HTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_HORZTHUMB,HTS_HOT,{'H','O','T','\0'}}, + {WP_HORZTHUMB,HTS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_HORZTHUMB,HTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_VERTSCROLL,0,{'V','E','R','T','S','C','R','O','L','L','\0'}}, + {WP_VERTSCROLL,VSS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_VERTSCROLL,VSS_HOT,{'H','O','T','\0'}}, + {WP_VERTSCROLL,VSS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_VERTSCROLL,VSS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_VERTTHUMB,0,{'V','E','R','T','T','H','U','M','B','\0'}}, + {WP_VERTTHUMB,VTS_NORMAL,{'N','O','R','M','A','L','\0'}}, + {WP_VERTTHUMB,VTS_HOT,{'H','O','T','\0'}}, + {WP_VERTTHUMB,VTS_PUSHED,{'P','U','S','H','E','D','\0'}}, + {WP_VERTTHUMB,VTS_DISABLED,{'D','I','S','A','B','L','E','D','\0'}}, + {WP_DIALOG,0,{'D','I','A','L','O','G','\0'}}, + {WP_CAPTIONSIZINGTEMPLATE,0,{'C','A','P','T','I','O','N','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLCAPTIONSIZINGTEMPLATE,0,{'S','M','A','L','L','C','A','P','T','I','O','N','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMELEFTSIZINGTEMPLATE,0,{'F','R','A','M','E','L','E','F','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMELEFTSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','L','E','F','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMERIGHTSIZINGTEMPLATE,0,{'F','R','A','M','E','R','I','G','H','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMERIGHTSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','R','I','G','H','T','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_FRAMEBOTTOMSIZINGTEMPLATE,0,{'F','R','A','M','E','B','O','T','T','O','M','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE,0,{'S','M','A','L','L','F','R','A','M','E','B','O','T','T','O','M','S','I','Z','I','N','G','T','E','M','P','L','A','T','E','\0'}}, + {0,0,{'\0'}} +}; + +/* Map class names to part/state maps */ +static const MSSTYLES_CLASS_NAME mapClass[] = { + {classGlobals, {'G','L','O','B','A','L','S','\0'}}, + {classButton, {'B','U','T','T','O','N','\0'}}, + {classClock, {'C','L','O','C','K','\0'}}, + {classCombobox, {'C','O','M','B','O','B','O','X','\0'}}, + {classEdit, {'E','D','I','T','\0'}}, + {classExplorerbar, {'E','X','P','L','O','R','E','R','B','A','R','\0'}}, + {classHeader, {'H','E','A','D','E','R','\0'}}, + {classListview, {'L','I','S','T','V','I','E','W','\0'}}, + {classMenu, {'M','E','N','U','\0'}}, + {classMenuband, {'M','E','N','U','B','A','N','D','\0'}}, + {classPage, {'P','A','G','E','\0'}}, + {classProgress, {'P','R','O','G','R','E','S','S','\0'}}, + {classRebar, {'R','E','B','A','R','\0'}}, + {classScrollbar, {'S','C','R','O','L','L','B','A','R','\0'}}, + {classSpin, {'S','P','I','N','\0'}}, + {classStartpanel, {'S','T','A','R','T','P','A','N','E','L','\0'}}, + {classStatus, {'S','T','A','T','U','S','\0'}}, + {classTab, {'T','A','B','\0'}}, + {classTaskband, {'T','A','S','K','B','A','N','D','\0'}}, + {classTaskbar, {'T','A','S','K','B','A','R','\0'}}, + {classToolbar, {'T','O','O','L','B','A','R','\0'}}, + {classTooltip, {'T','O','O','L','T','I','P','\0'}}, + {classTrackbar, {'T','R','A','C','K','B','A','R','\0'}}, + {classTraynotify, {'T','R','A','Y','N','O','T','I','F','Y','\0'}}, + {classTreeview, {'T','R','E','E','V','I','E','W','\0'}}, + {classWindow, {'W','I','N','D','O','W','\0'}} +}; + +BOOL MSSTYLES_LookupPartState(LPCWSTR pszClass, LPCWSTR pszPart, LPCWSTR pszState, int *iPartId, int *iStateId) +{ + unsigned int i; + const MSSTYLES_CLASS_MAP *map; + + *iPartId = 0; + *iStateId = 0; + for(i=0; idwStateID == 0 && !lstrcmpiW(map->szName, pszPart)) { + *iPartId = map->dwPartID; + break; + } + } while(*((++map)->szName)); + } + if(pszState) { + if(pszPart && *iPartId == 0) { + break; + } + do { + if(pszPart) { + if(map->dwPartID == *iPartId && !lstrcmpiW(map->szName, pszState)) { + *iStateId = map->dwStateID; + break; + } + } + else { + if(!lstrcmpiW(map->szName, pszState)) { + *iStateId = map->dwStateID; + break; + } + } + } while(*((++map)->szName)); + } + break; + } + } + if(pszPart && *iPartId == 0) { + return FALSE; + } + if(pszState && *iStateId == 0) { + return FALSE; + } + return TRUE; +} + +/********************************************************************** + * MSSTYLES_LookupProperty + * + * Find a property ID from name + * + * PARAMS + * pszPropertyName Name of property to lookup + * dwPrimitive Location to store primitive type of property + * dwId Location to store ID of property + * + * RETURNS + * FALSE if value is not found, TRUE otherwise + */ +BOOL MSSTYLES_LookupProperty(LPCWSTR pszPropertyName, int *dwPrimitive, int *dwId) +{ + DWORD item = 0; + do { + if(!lstrcmpiW(mapProperty[item].szPropertyName, pszPropertyName)) { + if(dwPrimitive) *dwPrimitive = mapProperty[item].dwPrimitiveType; + if(dwId) *dwId = mapProperty[item].dwPropertyID; + return TRUE; + } + } while(*mapProperty[++item].szPropertyName); + return FALSE; +} + +/********************************************************************** + * MSSTYLES_LookupEnum + * + * Lookup the value for an enumeration + * + * PARAMS + * pszValueName Value name to lookup + * dwEnum Enumeration property ID to search + * dwValue Location to store value + * + * RETURNS + * FALSE if value is not found, TRUE otherwise + */ +BOOL MSSTYLES_LookupEnum(LPCWSTR pszValueName, int dwEnum, int *dwValue) +{ + DWORD item = 0; + /* Locate the enum block */ + while(*mapEnum[item].szValueName && mapEnum[item].dwEnum != dwEnum) item++; + /* Now find the value in that block */ + while(*mapEnum[item].szValueName && mapEnum[item].dwEnum == dwEnum) { + if(!lstrcmpiW(mapEnum[item].szValueName, pszValueName)) { + if(dwValue) *dwValue = mapEnum[item].dwValue; + return TRUE; + } + item++; + } + return FALSE; +} diff --git a/reactos/lib/uxtheme/system.c b/reactos/lib/uxtheme/system.c new file mode 100644 index 00000000000..f3f203d9d7f --- /dev/null +++ b/reactos/lib/uxtheme/system.c @@ -0,0 +1,806 @@ +/* + * Win32 5.1 Theme system + * + * 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 + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "winreg.h" +#include "shlwapi.h" +#include "uxtheme.h" +#include "tmschema.h" + +#include "uxthemedll.h" +#include "msstyles.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * Defines and global variables + */ + +static const WCHAR szThemeManager[] = { + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'T','h','e','m','e','M','a','n','a','g','e','r','\0' +}; +static const WCHAR szThemeActive[] = {'T','h','e','m','e','A','c','t','i','v','e','\0'}; +static const WCHAR szSizeName[] = {'S','i','z','e','N','a','m','e','\0'}; +static const WCHAR szColorName[] = {'C','o','l','o','r','N','a','m','e','\0'}; +static const WCHAR szDllName[] = {'D','l','l','N','a','m','e','\0'}; + +static const WCHAR szIniDocumentation[] = {'d','o','c','u','m','e','n','t','a','t','i','o','n','\0'}; + +HINSTANCE hDllInst; + +DWORD dwThemeAppProperties = STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS; +ATOM atWindowTheme; +ATOM atSubAppName; +ATOM atSubIdList; + +BOOL bThemeActive = FALSE; +WCHAR szCurrentTheme[MAX_PATH]; +WCHAR szCurrentColor[64]; +WCHAR szCurrentSize[64]; + +/***********************************************************************/ + +/*********************************************************************** + * UXTHEME_LoadTheme + * + * Set the current active theme from the registry + */ +static void UXTHEME_LoadTheme(void) +{ + HKEY hKey; + LONG buffsize; + HRESULT hr; + WCHAR tmp[10]; + PTHEME_FILE pt; + + /* Get current theme configuration */ + if(!RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { + TRACE("Loading theme config\n"); + buffsize = sizeof(tmp)/sizeof(tmp[0]); + if(!RegQueryValueExW(hKey, szThemeActive, NULL, NULL, (LPBYTE)tmp, &buffsize)) { + bThemeActive = (tmp[0] != '0'); + } + else { + bThemeActive = FALSE; + TRACE("Failed to get ThemeActive: %ld\n", GetLastError()); + } + buffsize = sizeof(szCurrentColor)/sizeof(szCurrentColor[0]); + if(RegQueryValueExW(hKey, szColorName, NULL, NULL, (LPBYTE)szCurrentColor, &buffsize)) + szCurrentColor[0] = '\0'; + buffsize = sizeof(szCurrentSize)/sizeof(szCurrentSize[0]); + if(RegQueryValueExW(hKey, szSizeName, NULL, NULL, (LPBYTE)szCurrentSize, &buffsize)) + szCurrentSize[0] = '\0'; + if(SHRegGetPathW(hKey, NULL, szDllName, szCurrentTheme, 0)) + szCurrentTheme[0] = '\0'; + RegCloseKey(hKey); + } + else + TRACE("Failed to open theme registry key\n"); + + if(bThemeActive) { + /* Make sure the theme requested is actually valid */ + hr = MSSTYLES_OpenThemeFile(szCurrentTheme, + szCurrentColor[0]?szCurrentColor:NULL, + szCurrentSize[0]?szCurrentSize:NULL, + &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); + TRACE("Theme active: %s %s %s\n", debugstr_w(szCurrentTheme), + debugstr_w(szCurrentColor), debugstr_w(szCurrentSize)); + MSSTYLES_CloseThemeFile(pt); + } + } + if(!bThemeActive) { + MSSTYLES_SetActiveTheme(NULL); + TRACE("Themeing not active\n"); + } +} + +/*********************************************************************** + * UXTHEME_SetActiveTheme + * + * Change the current active theme + */ +HRESULT UXTHEME_SetActiveTheme(PTHEME_FILE tf) +{ + HKEY hKey; + WCHAR tmp[2]; + HRESULT hr; + + hr = MSSTYLES_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 { + bThemeActive = FALSE; + szCurrentTheme[0] = '\0'; + szCurrentColor[0] = '\0'; + szCurrentSize[0] = '\0'; + } + + TRACE("Writing theme config to registry\n"); + if(!RegCreateKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { + tmp[0] = bThemeActive?'1':'0'; + 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); + RegSetValueExW(hKey, szSizeName, 0, REG_SZ, (const BYTE*)szCurrentSize, lstrlenW(szCurrentSize)+1); + RegSetValueExW(hKey, szDllName, 0, REG_SZ, (const BYTE*)szCurrentTheme, lstrlenW(szCurrentTheme)+1); + } + else { + RegDeleteValueW(hKey, szColorName); + RegDeleteValueW(hKey, szSizeName); + RegDeleteValueW(hKey, szDllName); + + } + RegCloseKey(hKey); + } + else + TRACE("Failed to open theme registry key\n"); + return hr; +} + +/*********************************************************************** + * UXTHEME_InitSystem + */ +void UXTHEME_InitSystem(HINSTANCE hInst) +{ + static const WCHAR szWindowTheme[] = { + 'u','x','_','t','h','e','m','e','\0' + }; + static const WCHAR szSubAppName[] = { + 'u','x','_','s','u','b','a','p','p','\0' + }; + static const WCHAR szSubIdList[] = { + 'u','x','_','s','u','b','i','d','l','s','t','\0' + }; + + hDllInst = hInst; + + atWindowTheme = GlobalAddAtomW(szWindowTheme); + atSubAppName = GlobalAddAtomW(szSubAppName); + atSubIdList = GlobalAddAtomW(szSubIdList); + + UXTHEME_LoadTheme(); +} + +/*********************************************************************** + * IsAppThemed (UXTHEME.@) + */ +BOOL WINAPI IsAppThemed(void) +{ + return IsThemeActive(); +} + +/*********************************************************************** + * IsThemeActive (UXTHEME.@) + */ +BOOL WINAPI IsThemeActive(void) +{ + TRACE("\n"); + return bThemeActive; +} + +/*********************************************************************** + * EnableTheming (UXTHEME.@) + * + * NOTES + * This is a global and persistent change + */ +HRESULT WINAPI EnableTheming(BOOL fEnable) +{ + HKEY hKey; + WCHAR szEnabled[] = {'0','\0'}; + + TRACE("(%d)\n", fEnable); + + if(fEnable != bThemeActive) { + bThemeActive = fEnable; + if(bThemeActive) szEnabled[0] = '1'; + if(!RegOpenKeyW(HKEY_CURRENT_USER, szThemeManager, &hKey)) { + RegSetValueExW(hKey, szThemeActive, 0, REG_SZ, (LPBYTE)szEnabled, sizeof(WCHAR)); + RegCloseKey(hKey); + } + PostMessageW(HWND_BROADCAST, WM_THEMECHANGED, 0, 0); + } + return S_OK; +} + +/*********************************************************************** + * UXTHEME_SetWindowProperty + * + * I'm using atoms as there may be large numbers of duplicated strings + * and they do the work of keeping memory down as a cause of that quite nicely + */ +HRESULT UXTHEME_SetWindowProperty(HWND hwnd, ATOM aProp, LPCWSTR pszValue) +{ + ATOM oldValue = (ATOM)(size_t)RemovePropW(hwnd, MAKEINTATOMW(aProp)); + if(oldValue) + DeleteAtom(oldValue); + if(pszValue) { + ATOM atValue = AddAtomW(pszValue); + if(!atValue + || !SetPropW(hwnd, MAKEINTATOMW(aProp), (LPWSTR)MAKEINTATOMW(atValue))) { + HRESULT hr = HRESULT_FROM_WIN32(GetLastError()); + if(atValue) DeleteAtom(atValue); + return hr; + } + } + return S_OK; +} + +LPWSTR UXTHEME_GetWindowProperty(HWND hwnd, ATOM aProp, LPWSTR pszBuffer, int dwLen) +{ + ATOM atValue = (ATOM)(size_t)GetPropW(hwnd, MAKEINTATOMW(aProp)); + if(atValue) { + if(GetAtomNameW(atValue, pszBuffer, dwLen)) + return pszBuffer; + TRACE("property defined, but unable to get value\n"); + } + return NULL; +} + +/*********************************************************************** + * OpenThemeData (UXTHEME.@) + */ +HTHEME WINAPI OpenThemeData(HWND hwnd, LPCWSTR pszClassList) +{ + WCHAR szAppBuff[256]; + WCHAR szClassBuff[256]; + LPCWSTR pszAppName; + LPCWSTR pszUseClassList; + HTHEME hTheme; + TRACE("(%p,%s)\n", hwnd, debugstr_w(pszClassList)); + if(!bThemeActive) + return NULL; + + pszAppName = UXTHEME_GetWindowProperty(hwnd, atSubAppName, szAppBuff, sizeof(szAppBuff)/sizeof(szAppBuff[0])); + /* If SetWindowTheme was used on the window, that overrides the class list passed to this function */ + pszUseClassList = UXTHEME_GetWindowProperty(hwnd, atSubIdList, szClassBuff, sizeof(szClassBuff)/sizeof(szClassBuff[0])); + if(!pszUseClassList) + pszUseClassList = pszClassList; + + hTheme = MSSTYLES_OpenThemeClass(pszAppName, pszUseClassList); + if(IsWindow(hwnd)) + SetPropW(hwnd, MAKEINTATOMW(atWindowTheme), hTheme); + return hTheme; +} + +/*********************************************************************** + * GetWindowTheme (UXTHEME.@) + * + * Retrieve the last theme opened for a window + */ +HTHEME WINAPI GetWindowTheme(HWND hwnd) +{ + TRACE("(%p)\n", hwnd); + return GetPropW(hwnd, MAKEINTATOMW(atWindowTheme)); +} + +/*********************************************************************** + * SetWindowTheme (UXTHEME.@) + * + * Persistent through the life of the window, even after themes change + */ +HRESULT WINAPI SetWindowTheme(HWND hwnd, LPCWSTR pszSubAppName, + LPCWSTR pszSubIdList) +{ + HRESULT hr; + TRACE("(%p,%s,%s)\n", hwnd, debugstr_w(pszSubAppName), + debugstr_w(pszSubIdList)); + hr = UXTHEME_SetWindowProperty(hwnd, atSubAppName, pszSubAppName); + if(SUCCEEDED(hr)) + hr = UXTHEME_SetWindowProperty(hwnd, atSubIdList, pszSubIdList); + if(SUCCEEDED(hr)) + PostMessageW(hwnd, WM_THEMECHANGED, 0, 0); + return hr; +} + +/*********************************************************************** + * GetCurrentThemeName (UXTHEME.@) + */ +HRESULT WINAPI GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, + 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); + return S_OK; +} + +/*********************************************************************** + * GetThemeAppProperties (UXTHEME.@) + */ +DWORD WINAPI GetThemeAppProperties(void) +{ + return dwThemeAppProperties; +} + +/*********************************************************************** + * SetThemeAppProperties (UXTHEME.@) + */ +void WINAPI SetThemeAppProperties(DWORD dwFlags) +{ + TRACE("(0x%08lx)\n", dwFlags); + dwThemeAppProperties = dwFlags; +} + +/*********************************************************************** + * CloseThemeData (UXTHEME.@) + */ +HRESULT WINAPI CloseThemeData(HTHEME hTheme) +{ + TRACE("(%p)\n", hTheme); + if(!hTheme) + return E_HANDLE; + return MSSTYLES_CloseThemeClass(hTheme); +} + +/*********************************************************************** + * HitTestThemeBackground (UXTHEME.@) + */ +HRESULT WINAPI HitTestThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, + int iStateId, DWORD dwOptions, + const RECT *pRect, HRGN hrgn, + POINT ptTest, WORD *pwHitTestCode) +{ + FIXME("%d %d 0x%08lx: stub\n", iPartId, iStateId, dwOptions); + if(!hTheme) + return E_HANDLE; + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * IsThemePartDefined (UXTHEME.@) + */ +BOOL WINAPI IsThemePartDefined(HTHEME hTheme, int iPartId, int iStateId) +{ + TRACE("(%p,%d,%d)\n", hTheme, iPartId, iStateId); + if(!hTheme) { + SetLastError(E_HANDLE); + return FALSE; + } + if(MSSTYLES_FindPartState(hTheme, iPartId, iStateId, NULL)) + return TRUE; + return FALSE; +} + +/*********************************************************************** + * 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; ihTheme, 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; +} + +/********************************************************************** + * Undocumented functions + */ + +/********************************************************************** + * QueryThemeServices (UXTHEME.1) + * + * RETURNS + * some kind of status flag + */ +DWORD WINAPI QueryThemeServices() +{ + FIXME("stub\n"); + return 3; /* This is what is returned under XP in most cases */ +} + + +/********************************************************************** + * OpenThemeFile (UXTHEME.2) + * + * Opens a theme file, which can be used to change the current theme, etc + * + * PARAMS + * pszThemeFileName Path to a msstyles theme file + * pszColorName Color defined in the theme, eg. NormalColor + * pszSizeName Size defined in the theme, eg. NormalSize + * hThemeFile Handle to theme file + */ +HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, + LPCWSTR pszSizeName, HTHEMEFILE *hThemeFile, + DWORD unknown) +{ + TRACE("(%s,%s,%s,%p,%ld)\n", debugstr_w(pszThemeFileName), + debugstr_w(pszColorName), debugstr_w(pszSizeName), + hThemeFile, unknown); + return MSSTYLES_OpenThemeFile(pszThemeFileName, pszColorName, pszSizeName, (PTHEME_FILE*)hThemeFile); +} + +/********************************************************************** + * CloseThemeFile (UXTHEME.3) + * + * Releases theme file handle returned by OpenThemeFile + * + * PARAMS + * hThemeFile Handle to theme file + */ +HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile) +{ + TRACE("(%p)\n", hThemeFile); + MSSTYLES_CloseThemeFile(hThemeFile); + return S_OK; +} + +/********************************************************************** + * ApplyTheme (UXTHEME.4) + * + * Set a theme file to be the currently active theme + * + * PARAMS + * hThemeFile Handle to theme file + * unknown See notes + * hWnd Window requesting the theme change + * + * NOTES + * I'm not sure what the second parameter is (the datatype is likely wrong), other then this: + * Under XP if I pass + * char b[] = ""; + * the theme is applied with the screen redrawing really badly (flickers) + * char b[] = "\0"; where \0 can be one or more of any character, makes no difference + * the theme is applied smoothly (screen does not flicker) + * char *b = "\0" or NULL; where \0 can be zero or more of any character, makes no difference + * the function fails returning invalid parameter...very strange + */ +HRESULT WINAPI ApplyTheme(HTHEMEFILE hThemeFile, char *unknown, HWND hWnd) +{ + HRESULT hr; + TRACE("(%p,%s,%p)\n", hThemeFile, unknown, hWnd); + hr = UXTHEME_SetActiveTheme(hThemeFile); + PostMessageW(HWND_BROADCAST, WM_THEMECHANGED, 0, 0); + return hr; +} + +/********************************************************************** + * GetThemeDefaults (UXTHEME.7) + * + * Get the default color & size for a theme + * + * PARAMS + * pszThemeFileName Path to a msstyles theme file + * pszColorName Buffer to receive the default color name + * dwColorNameLen Length, in characters, of color name buffer + * pszSizeName Buffer to receive the default size name + * dwSizeNameLen Length, in characters, of size name buffer + */ +HRESULT WINAPI GetThemeDefaults(LPCWSTR pszThemeFileName, LPWSTR pszColorName, + DWORD dwColorNameLen, LPWSTR pszSizeName, + DWORD dwSizeNameLen) +{ + PTHEME_FILE pt; + HRESULT hr; + TRACE("(%s,%p,%ld,%p,%ld)\n", debugstr_w(pszThemeFileName), + pszColorName, dwColorNameLen, + pszSizeName, dwSizeNameLen); + + hr = MSSTYLES_OpenThemeFile(pszThemeFileName, NULL, NULL, &pt); + if(FAILED(hr)) return hr; + + lstrcpynW(pszColorName, pt->pszSelectedColor, dwColorNameLen); + lstrcpynW(pszSizeName, pt->pszSelectedSize, dwSizeNameLen); + + MSSTYLES_CloseThemeFile(pt); + return S_OK; +} + +/********************************************************************** + * EnumThemes (UXTHEME.8) + * + * Enumerate available themes, calls specified EnumThemeProc for each + * theme found. Passes lpData through to callback function. + * + * PARAMS + * pszThemePath Path containing themes + * callback Called for each theme found in path + * lpData Passed through to callback + */ +HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, + LPVOID lpData) +{ + WCHAR szDir[MAX_PATH]; + WCHAR szPath[MAX_PATH]; + static const WCHAR szStar[] = {'*','.','*','\0'}; + static const WCHAR szFormat[] = {'%','s','%','s','\\','%','s','.','m','s','s','t','y','l','e','s','\0'}; + static const WCHAR szDisplayName[] = {'d','i','s','p','l','a','y','n','a','m','e','\0'}; + static const WCHAR szTooltip[] = {'t','o','o','l','t','i','p','\0'}; + WCHAR szName[60]; + WCHAR szTip[60]; + HANDLE hFind; + WIN32_FIND_DATAW wfd; + HRESULT hr; + + TRACE("(%s,%p,%p)\n", debugstr_w(pszThemePath), callback, lpData); + + if(!pszThemePath || !callback) + return E_POINTER; + + lstrcpyW(szDir, pszThemePath); + PathAddBackslashW(szDir); + + lstrcpyW(szPath, szDir); + lstrcatW(szPath, szStar); + TRACE("searching %s\n", debugstr_w(szPath)); + + hFind = FindFirstFileW(szPath, &wfd); + if(hFind != INVALID_HANDLE_VALUE) { + do { + if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY + && !(wfd.cFileName[0] == '.' && ((wfd.cFileName[1] == '.' && wfd.cFileName[2] == 0) || wfd.cFileName[1] == 0))) { + wsprintfW(szPath, szFormat, szDir, wfd.cFileName, wfd.cFileName); + + hr = GetThemeDocumentationProperty(szPath, szDisplayName, szName, sizeof(szName)/sizeof(szName[0])); + if(SUCCEEDED(hr)) + hr = GetThemeDocumentationProperty(szPath, szTooltip, szTip, sizeof(szTip)/sizeof(szTip[0])); + if(SUCCEEDED(hr)) { + TRACE("callback(%s,%s,%s,%p)\n", debugstr_w(szPath), debugstr_w(szName), debugstr_w(szTip), lpData); + if(!callback(NULL, szPath, szName, szTip, NULL, lpData)) { + TRACE("callback ended enum\n"); + break; + } + } + } + } while(FindNextFileW(hFind, &wfd)); + FindClose(hFind); + } + return S_OK; +} + + +/********************************************************************** + * EnumThemeColors (UXTHEME.9) + * + * Enumerate theme colors available with a particular size + * + * PARAMS + * pszThemeFileName Path to a msstyles theme file + * 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 + * + * RETURNS + * S_OK on success + * E_PROP_ID_UNSUPPORTED when dwColorName does not refer to a color + * 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 + * + * 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) +{ + PTHEME_FILE pt; + HRESULT hr; + LPWSTR tmp; + TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), + debugstr_w(pszSizeName), dwColorNum); + + hr = MSSTYLES_OpenThemeFile(pszThemeFileName, NULL, pszSizeName, &pt); + if(FAILED(hr)) return hr; + + tmp = pt->pszAvailColors; + while(dwColorNum && *tmp) { + dwColorNum--; + tmp += lstrlenW(tmp)+1; + } + if(!dwColorNum && *tmp) { + TRACE("%s\n", debugstr_w(tmp)); + lstrcpyW(pszColorName, tmp); + } + else + hr = E_PROP_ID_UNSUPPORTED; + + MSSTYLES_CloseThemeFile(pt); + return hr; +} + +/********************************************************************** + * EnumThemeSizes (UXTHEME.10) + * + * Enumerate theme colors available with a particular size + * + * PARAMS + * pszThemeFileName Path to a msstyles theme file + * 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 + * + * RETURNS + * S_OK on success + * E_PROP_ID_UNSUPPORTED when dwSizeName does not refer to a size + * 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 + * + * 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) +{ + PTHEME_FILE pt; + HRESULT hr; + LPWSTR tmp; + TRACE("(%s,%s,%ld)\n", debugstr_w(pszThemeFileName), + debugstr_w(pszColorName), dwSizeNum); + + hr = MSSTYLES_OpenThemeFile(pszThemeFileName, pszColorName, NULL, &pt); + if(FAILED(hr)) return hr; + + tmp = pt->pszAvailSizes; + while(dwSizeNum && *tmp) { + dwSizeNum--; + tmp += lstrlenW(tmp)+1; + } + if(!dwSizeNum && *tmp) { + TRACE("%s\n", debugstr_w(tmp)); + lstrcpyW(pszSizeName, tmp); + } + else + hr = E_PROP_ID_UNSUPPORTED; + + MSSTYLES_CloseThemeFile(pt); + return hr; +} + +/********************************************************************** + * ParseThemeIniFile (UXTHEME.11) + * + * Enumerate data in a theme INI file. + * + * PARAMS + * pszIniFileName Path to a theme ini file + * pszUnknown Cannot be NULL, L"" is valid + * callback Called for each found entry + * lpData Passed through to callback + * + * RETURNS + * S_OK on success + * 0x800706488 (Unknown property) when enumeration is canceled from callback + * + * NOTES + * When pszUnknown is NULL the callback is never called, the value does not seem to surve + * any other purpose + */ +HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown, + ParseThemeIniFileProc callback, LPVOID lpData) +{ + FIXME("%s %s: stub\n", debugstr_w(pszIniFileName), debugstr_w(pszUnknown)); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/********************************************************************** + * CheckThemeSignature (UXTHEME.29) + * + * Validates the signature of a theme file + * + * PARAMS + * pszIniFileName Path to a theme file + */ +HRESULT WINAPI CheckThemeSignature(LPCWSTR pszThemeFileName) +{ + PTHEME_FILE pt; + HRESULT hr; + TRACE("(%s)\n", debugstr_w(pszThemeFileName)); + hr = MSSTYLES_OpenThemeFile(pszThemeFileName, NULL, NULL, &pt); + if(FAILED(hr)) + return hr; + MSSTYLES_CloseThemeFile(pt); + return S_OK; +} diff --git a/reactos/lib/uxtheme/uxini.c b/reactos/lib/uxtheme/uxini.c new file mode 100644 index 00000000000..aaf3b122de6 --- /dev/null +++ b/reactos/lib/uxtheme/uxini.c @@ -0,0 +1,315 @@ +/* + * Win32 5.1 uxtheme ini file processing + * + * Copyright (C) 2004 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 + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uxtheme); + +/*********************************************************************** + * Defines and global variables + */ + +static const WCHAR szTextFileResource[] = { + 'T','E','X','T','F','I','L','E','\0' +}; + +typedef struct _UXINI_FILE { + LPCWSTR lpIni; + LPCWSTR lpCurLoc; + LPCWSTR lpEnd; +} UXINI_FILE, *PUXINI_FILE; + +/***********************************************************************/ + +/********************************************************************** + * UXINI_LoadINI + * + * Load a theme INI file out of resources from the specified + * theme + * + * PARAMS + * tf Theme to load INI file out of resources + * lpName Resource name of the INI file + * + * RETURNS + * INI file, or NULL if not found + */ +PUXINI_FILE UXINI_LoadINI(HMODULE hTheme, LPCWSTR lpName) { + HRSRC hrsc; + LPCWSTR lpThemesIni = NULL; + PUXINI_FILE uf; + DWORD dwIniSize; + + TRACE("Loading resource INI %s\n", debugstr_w(lpName)); + + if((hrsc = FindResourceW(hTheme, lpName, szTextFileResource))) { + if(!(lpThemesIni = (LPCWSTR)LoadResource(hTheme, hrsc))) { + TRACE("%s resource not found\n", debugstr_w(lpName)); + return NULL; + } + } + + dwIniSize = SizeofResource(hTheme, hrsc) / sizeof(WCHAR); + uf = HeapAlloc(GetProcessHeap(), 0, sizeof(UXINI_FILE)); + uf->lpIni = lpThemesIni; + uf->lpCurLoc = lpThemesIni; + uf->lpEnd = lpThemesIni + dwIniSize; + return uf; +} + +/********************************************************************** + * UXINI_CloseINI + * + * Close an open theme INI file + * + * PARAMS + * uf Theme INI file to close + */ +void UXINI_CloseINI(PUXINI_FILE uf) +{ + HeapFree(GetProcessHeap(), 0, uf); +} + +/********************************************************************** + * UXINI_ResetINI + * + * Reset the current pointer into INI file to the beginning of the file + * + * PARAMS + * uf Theme INI file to reset + */ +void UXINI_ResetINI(PUXINI_FILE uf) +{ + uf->lpCurLoc = uf->lpIni; +} + +/********************************************************************** + * UXINI_eof + * + * Determines if we are at the end of the INI file + * + * PARAMS + * uf Theme INI file to test + */ +static inline BOOL UXINI_eof(PUXINI_FILE uf) +{ + return uf->lpCurLoc >= uf->lpEnd; +} + +/********************************************************************** + * UXINI_isspace + * + * Check if a character is a space character + * + * PARAMS + * c Character to test + */ +static inline BOOL UXINI_isspace(WCHAR c) +{ + if (isspace(c)) return TRUE; + if (c=='\r') return TRUE; + return FALSE; +} + +/********************************************************************** + * UXINI_GetNextLine + * + * Get the next line in the INI file, non NULL terminated + * removes whitespace at beginning and end of line, and removes comments + * + * PARAMS + * uf INI file to retrieve next line + * dwLen Location to store pointer to line length + * + * RETURNS + * The section name, non NULL terminated + */ +static LPCWSTR UXINI_GetNextLine(PUXINI_FILE uf, DWORD *dwLen) +{ + LPCWSTR lpLineEnd; + LPCWSTR lpLineStart; + DWORD len; + do { + if(UXINI_eof(uf)) return NULL; + /* Skip whitespace and empty lines */ + while(!UXINI_eof(uf) && (UXINI_isspace(*uf->lpCurLoc) || *uf->lpCurLoc == '\n')) uf->lpCurLoc++; + lpLineStart = uf->lpCurLoc; + lpLineEnd = uf->lpCurLoc; + while(!UXINI_eof(uf) && *uf->lpCurLoc != '\n' && *uf->lpCurLoc != ';') lpLineEnd = ++uf->lpCurLoc; + /* If comment was found, skip the rest of the line */ + if(*uf->lpCurLoc == ';') + while(!UXINI_eof(uf) && *uf->lpCurLoc != '\n') uf->lpCurLoc++; + len = (lpLineEnd - lpLineStart); + if(*lpLineStart != ';' && len == 0) + return NULL; + } while(*lpLineStart == ';'); + /* Remove whitespace from end of line */ + while(UXINI_isspace(lpLineStart[len-1])) len--; + *dwLen = len; + + return lpLineStart; +} + +static inline void UXINI_UnGetToLine(PUXINI_FILE uf, LPCWSTR lpLine) +{ + uf->lpCurLoc = lpLine; +} + +/********************************************************************** + * UXINI_GetNextSection + * + * Locate the next section in the ini file, and return pointer to + * section name, non NULL terminated. Use dwLen to determine length + * + * PARAMS + * uf INI file to search, search starts at current location + * dwLen Location to store pointer to section name length + * + * RETURNS + * The section name, non NULL terminated + */ +LPCWSTR UXINI_GetNextSection(PUXINI_FILE uf, DWORD *dwLen) +{ + LPCWSTR lpLine; + while((lpLine = UXINI_GetNextLine(uf, dwLen))) { + /* Assuming a ']' ending to the section name */ + if(lpLine[0] == '[') { + lpLine++; + *dwLen -= 2; + break; + } + } + return lpLine; +} + +/********************************************************************** + * UXINI_FindSection + * + * Locate a section with the specified name, search starts + * at current location in ini file + * to start search from start, call UXINI_ResetINI + * + * PARAMS + * uf INI file to search, search starts at current location + * lpName Name of the section to locate + * + * RETURNS + * TRUE if section was found, FALSE otherwise + */ +BOOL UXINI_FindSection(PUXINI_FILE uf, LPCWSTR lpName) +{ + LPCWSTR lpSection; + DWORD dwLen; + while((lpSection = UXINI_GetNextSection(uf, &dwLen))) { + if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpSection, dwLen, lpName, -1) == CSTR_EQUAL) { + return TRUE; + } + } + return FALSE; +} + +/********************************************************************** + * UXINI_GetNextValue + * + * Locate the next value in the current section + * + * PARAMS + * uf INI file to search, search starts at current location + * dwNameLen Location to store pointer to value name length + * lpValue Location to store pointer to the value + * dwValueLen Location to store pointer to value length + * + * RETURNS + * The value name, non NULL terminated + */ +LPCWSTR UXINI_GetNextValue(PUXINI_FILE uf, DWORD *dwNameLen, LPCWSTR *lpValue, DWORD *dwValueLen) +{ + LPCWSTR lpLine; + LPCWSTR lpLineEnd; + LPCWSTR name = NULL; + LPCWSTR value = NULL; + DWORD vallen = 0; + DWORD namelen = 0; + DWORD dwLen; + lpLine = UXINI_GetNextLine(uf, &dwLen); + if(!lpLine) + return NULL; + if(lpLine[0] == '[') { + UXINI_UnGetToLine(uf, lpLine); + return NULL; + } + lpLineEnd = lpLine + dwLen; + + name = lpLine; + while(namelen < dwLen && *lpLine != '=') { + lpLine++; + namelen++; + } + if(*lpLine != '=') return NULL; + lpLine++; + + /* Remove whitespace from end of name */ + while(UXINI_isspace(name[namelen-1])) namelen--; + /* Remove whitespace from beginning of value */ + while(UXINI_isspace(*lpLine) && lpLine < lpLineEnd) lpLine++; + value = lpLine; + vallen = dwLen-(value-name); + + *dwNameLen = namelen; + *dwValueLen = vallen; + *lpValue = value; + + return name; +} + +/********************************************************************** + * UXINI_FindValue + * + * Locate a value by name + * + * PARAMS + * uf INI file to search, search starts at current location + * lpName Value name to locate + * lpValue Location to store pointer to the value + * dwValueLen Location to store pointer to value length + * + * RETURNS + * The value name, non NULL terminated + */ +BOOL UXINI_FindValue(PUXINI_FILE uf, LPCWSTR lpName, LPCWSTR *lpValue, DWORD *dwValueLen) +{ + LPCWSTR name; + DWORD namelen; + + while((name = UXINI_GetNextValue(uf, &namelen, lpValue, dwValueLen))) { + if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, name, namelen, lpName, -1) == CSTR_EQUAL) { + return TRUE; + } + } + return FALSE; +} diff --git a/reactos/lib/uxtheme/uxtheme.spec b/reactos/lib/uxtheme/uxtheme.spec new file mode 100644 index 00000000000..e9757ab8972 --- /dev/null +++ b/reactos/lib/uxtheme/uxtheme.spec @@ -0,0 +1,93 @@ +# Undocumented functions - Names derived from debug symbols +1 stdcall -noname QueryThemeServices() +2 stdcall -noname OpenThemeFile(wstr wstr wstr ptr long) +3 stdcall -noname CloseThemeFile(ptr) +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) +11 stdcall -noname ParseThemeIniFile(wstr wstr ptr ptr) +13 stub -noname DrawNCPreview +14 stub -noname RegisterDefaultTheme +15 stub -noname DumpLoadedThemeToTextFile +16 stub -noname OpenThemeDataFromFile +17 stub -noname OpenThemeFileFromData +18 stub -noname GetThemeSysSize96 +19 stub -noname GetThemeSysFont96 +20 stub -noname SessionAllocate +21 stub -noname SessionFree +22 stub -noname ThemeHooksOn +23 stub -noname ThemeHooksOff +24 stub -noname AreThemeHooksActive +25 stub -noname GetCurrentChangeNumber +26 stub -noname GetNewChangeNumber +27 stub -noname SetGlobalTheme +28 stub -noname GetGlobalTheme +29 stdcall -noname CheckThemeSignature(wstr) +30 stub -noname LoadTheme +31 stub -noname InitUserTheme +32 stub -noname InitUserRegistry +33 stub -noname ReestablishServerConnection +34 stub -noname ThemeHooksInstall +35 stub -noname ThemeHooksRemove +36 stub -noname RefreshThemeForTS +43 stub -noname ClassicGetSystemMetrics +44 stub -noname ClassicSystemParametersInfoA +45 stub -noname ClassicSystemParametersInfoW +46 stub -noname ClassicAdjustWindowRectEx +48 stub -noname GetThemeParseErrorInfo +60 stub -noname CreateThemeDataFromObjects +61 stub -noname OpenThemeDataEx +62 stub -noname ServerClearStockObjects +63 stub -noname MarkSelection + +# Standard functions +@ stdcall CloseThemeData(ptr) +@ stdcall DrawThemeBackground(ptr ptr long long ptr ptr) +@ stdcall DrawThemeBackgroundEx(ptr ptr long long ptr ptr) +@ stdcall DrawThemeEdge(ptr ptr long long ptr long long ptr) +@ stdcall DrawThemeIcon(ptr ptr long long ptr ptr long) +@ stdcall DrawThemeParentBackground(ptr ptr ptr) +@ stdcall DrawThemeText(ptr ptr long long wstr long long long ptr) +@ stdcall EnableThemeDialogTexture(ptr long) +@ stdcall EnableTheming(long) +@ stdcall GetCurrentThemeName(wstr long wstr long wstr long) +@ stdcall GetThemeAppProperties() +@ stdcall GetThemeBackgroundContentRect(ptr ptr long long ptr ptr) +@ stdcall GetThemeBackgroundExtent(ptr ptr long long ptr ptr) +@ stdcall GetThemeBackgroundRegion(ptr ptr long long ptr ptr) +@ stdcall GetThemeBool(ptr long long long ptr) +@ stdcall GetThemeColor(ptr long long long ptr) +@ stdcall GetThemeDocumentationProperty(wstr wstr wstr long) +@ stdcall GetThemeEnumValue(ptr long long long ptr) +@ stdcall GetThemeFilename(ptr long long long wstr long) +@ stdcall GetThemeFont(ptr ptr long long long ptr) +@ stdcall GetThemeInt(ptr long long long ptr) +@ stdcall GetThemeIntList(ptr long long long ptr) +@ stdcall GetThemeMargins(ptr ptr long long long ptr ptr) +@ stdcall GetThemeMetric(ptr ptr long long long ptr) +@ stdcall GetThemePartSize(ptr ptr long long ptr long ptr) +@ stdcall GetThemePosition(ptr long long long ptr) +@ stdcall GetThemePropertyOrigin(ptr long long long ptr) +@ stdcall GetThemeRect(ptr long long long ptr) +@ stdcall GetThemeString(ptr long long long wstr long) +@ stdcall GetThemeSysBool(ptr long) +@ stdcall GetThemeSysColor(ptr long) +@ stdcall GetThemeSysColorBrush(ptr long) +@ stdcall GetThemeSysFont(ptr long ptr) +@ stdcall GetThemeSysInt(ptr long ptr) +@ stdcall GetThemeSysSize(ptr long) +@ stdcall GetThemeSysString(ptr long wstr long) +@ stdcall GetThemeTextExtent(ptr ptr long long wstr long long ptr ptr) +@ stdcall GetThemeTextMetrics(ptr ptr long long ptr) +@ stdcall GetWindowTheme(ptr) +@ stdcall HitTestThemeBackground(ptr long long long long ptr long long long ptr) +@ stdcall IsAppThemed() +@ stdcall IsThemeActive() +@ stdcall IsThemeBackgroundPartiallyTransparent(ptr long long) +@ stdcall IsThemeDialogTextureEnabled(ptr) +@ stdcall IsThemePartDefined(ptr long long) +@ stdcall OpenThemeData(ptr wstr) +@ stdcall SetThemeAppProperties(long) +@ stdcall SetWindowTheme(ptr wstr wstr) diff --git a/reactos/lib/uxtheme/uxtheme.xml b/reactos/lib/uxtheme/uxtheme.xml new file mode 100644 index 00000000000..46b4e7a4ca5 --- /dev/null +++ b/reactos/lib/uxtheme/uxtheme.xml @@ -0,0 +1,28 @@ + + + . + include/wine + + + 0x600 + 0x501 + 0x501 + wine + shlwapi + ntdll + advapi32 + kernel32 + gdi32 + user32 + msimg32 + draw.c + main.c + metric.c + msstyles.c + property.c + stylemap.c + system.c + uxini.c + version.rc + uxtheme.spec + diff --git a/reactos/lib/uxtheme/uxthemedll.h b/reactos/lib/uxtheme/uxthemedll.h new file mode 100644 index 00000000000..cfd80fb016b --- /dev/null +++ b/reactos/lib/uxtheme/uxthemedll.h @@ -0,0 +1,90 @@ +/* + * Internal uxtheme defines & declarations + * + * 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 + */ + +#ifndef __WINE_UXTHEMEDLL_H +#define __WINE_UXTHEMEDLL_H + +typedef HANDLE HTHEMEFILE; + +/********************************************************************** + * EnumThemeProc + * + * Callback function for EnumThemes. + * + * RETURNS + * TRUE to continue enumeration, FALSE to stop + * + * PARAMS + * lpReserved Always 0 + * pszThemeFileName Full path to theme msstyles file + * pszThemeName Display name for theme + * pszToolTip Tooltip name for theme + * lpReserved2 Always 0 + * lpData Value passed through lpData from EnumThemes + */ +typedef BOOL (CALLBACK *EnumThemeProc)(LPVOID lpReserved, LPCWSTR pszThemeFileName, + LPCWSTR pszThemeName, LPCWSTR pszToolTip, LPVOID lpReserved2, + LPVOID lpData); + +/********************************************************************** + * ParseThemeIniFileProc + * + * Callback function for ParseThemeIniFile. + * + * RETURNS + * TRUE to continue enumeration, FALSE to stop + * + * PARAMS + * dwType Entry type + * pszParam1 Use defined by entry type + * pszParam2 Use defined by entry type + * pszParam3 Use defined by entry type + * dwParam Use defined by entry type + * lpData Value passed through lpData from ParseThemeIniFile + * + * NOTES + * I don't know what the valid entry types are + */ +typedef BOOL (CALLBACK*ParseThemeIniFileProc)(DWORD dwType, LPWSTR pszParam1, + LPWSTR pszParam2, LPWSTR pszParam3, + DWORD dwParam, LPVOID lpData); + +/* Declarations for undocumented functions for use internally */ +DWORD WINAPI QueryThemeServices(void); +HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, + LPCWSTR pszSizeName, HTHEMEFILE *hThemeFile, + DWORD unknown); +HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile); +HRESULT WINAPI ApplyTheme(HTHEMEFILE hThemeFile, char *unknown, HWND hWnd); +HRESULT WINAPI GetThemeDefaults(LPCWSTR pszThemeFileName, LPWSTR pszColorName, + DWORD dwColorNameLen, LPWSTR pszSizeName, + DWORD dwSizeNameLen); +HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, EnumThemeProc callback, + LPVOID lpData); +HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, + DWORD dwColorNum, LPWSTR pszColorName); +HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, + DWORD dwSizeNum, LPWSTR pszSizeName); +HRESULT WINAPI ParseThemeIniFile(LPCWSTR pszIniFileName, LPWSTR pszUnknown, + ParseThemeIniFileProc callback, LPVOID lpData); + +extern void UXTHEME_InitSystem(HINSTANCE hInst); + +#endif diff --git a/reactos/lib/uxtheme/version.rc b/reactos/lib/uxtheme/version.rc new file mode 100644 index 00000000000..3e38d1ff01f --- /dev/null +++ b/reactos/lib/uxtheme/version.rc @@ -0,0 +1,21 @@ +/* + * 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 + */ + +#define WINE_FILENAME_STR "uxtheme.dll" + +#include diff --git a/reactos/w32api/include/schemadef.h b/reactos/w32api/include/schemadef.h new file mode 100644 index 00000000000..13012e439ec --- /dev/null +++ b/reactos/w32api/include/schemadef.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2003 Kevin Koltzau + * Copyright (C) 2004 Francois Gouget + * + * 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 + */ + +#ifndef SCHEMADEF_H +#define SCHEMADEF_H + +#define BEGIN_TM_SCHEMA(name) +#define END_TM_SCHEMA(name) + +#define BEGIN_TM_ENUM(name) enum name { +#define TM_ENUM(value, prefix, name) prefix##_##name = (value), +#define END_TM_ENUM() }; + +#define BEGIN_TM_PROPS() enum PropValues { \ + DummyProp = 49, +#define TM_PROP(value, prefix, name, type) prefix##_##name = (value), +#define END_TM_PROPS() }; + +#define BEGIN_TM_CLASS_PARTS(name) enum name##PARTS { \ + name##PartFiller0, +#define TM_PART(value, prefix, name) prefix##_##name = (value), +#define END_TM_CLASS_PARTS() }; + +#define BEGIN_TM_PART_STATES(name) enum name##STATES { \ + name##StateFiller0, +#define TM_STATE(value, prefix, name) prefix##_##name = (value), +#define END_TM_PART_STATES() }; + +#endif diff --git a/reactos/w32api/include/tmschema.h b/reactos/w32api/include/tmschema.h index 6ab03b431c8..dd9b6237b83 100644 --- a/reactos/w32api/include/tmschema.h +++ b/reactos/w32api/include/tmschema.h @@ -4,661 +4,1252 @@ #pragma GCC system_header #endif +#include + +BEGIN_TM_SCHEMA(ThemeMgrSchema) + + +/***** ENUMERATIONS *****/ + +/* BGTYPE Enum */ +BEGIN_TM_ENUM(BGTYPE) + TM_ENUM(0, BT, IMAGEFILE) + TM_ENUM(1, BT, BORDERFILL) + TM_ENUM(2, BT, NONE) +END_TM_ENUM() + +/* IMAGELAYOUT Enum */ +BEGIN_TM_ENUM(IMAGELAYOUT) + TM_ENUM(0, IL, VERTICAL) + TM_ENUM(1, IL, HORIZONTAL) +END_TM_ENUM() + +/* BORDERTYPE Enum */ +BEGIN_TM_ENUM(BORDERTYPE) + TM_ENUM(0, BT, RECT) + TM_ENUM(1, BT, ROUNDRECT) + TM_ENUM(2, BT, ELLIPSE) +END_TM_ENUM() + +/* FILLTYPE Enum */ +BEGIN_TM_ENUM(FILLTYPE) + TM_ENUM(0, FT, SOLID) + TM_ENUM(1, FT, VERTGRADIENT) + TM_ENUM(2, FT, HORZGRADIENT) + TM_ENUM(3, FT, RADIALGRADIENT) + TM_ENUM(4, FT, TILEIMAGE) +END_TM_ENUM() + +/* SIZINGTYPE Enum */ +BEGIN_TM_ENUM(SIZINGTYPE) + TM_ENUM(0, ST, TRUESIZE) + TM_ENUM(1, ST, STRETCH) + TM_ENUM(2, ST, TILE) +END_TM_ENUM() + +/* HALIGN Enum */ +BEGIN_TM_ENUM(HALIGN) + TM_ENUM(0, HA, LEFT) + TM_ENUM(1, HA, CENTER) + TM_ENUM(2, HA, RIGHT) +END_TM_ENUM() + +/* CONTENTALIGNMENT Enum */ +BEGIN_TM_ENUM(CONTENTALIGNMENT) + TM_ENUM(0, CA, LEFT) + TM_ENUM(1, CA, CENTER) + TM_ENUM(2, CA, RIGHT) +END_TM_ENUM() + +/* VALIGN Enum */ +BEGIN_TM_ENUM(VALIGN) + TM_ENUM(0, VA, TOP) + TM_ENUM(1, VA, CENTER) + TM_ENUM(2, VA, BOTTOM) +END_TM_ENUM() + +/* OFFSETTYPE Enum */ +BEGIN_TM_ENUM(OFFSETTYPE) + TM_ENUM(0, OT, TOPLEFT) + TM_ENUM(1, OT, TOPRIGHT) + TM_ENUM(2, OT, TOPMIDDLE) + TM_ENUM(3, OT, BOTTOMLEFT) + TM_ENUM(4, OT, BOTTOMRIGHT) + TM_ENUM(5, OT, BOTTOMMIDDLE) + TM_ENUM(6, OT, MIDDLELEFT) + TM_ENUM(7, OT, MIDDLERIGHT) + TM_ENUM(8, OT, LEFTOFCAPTION) + TM_ENUM(9, OT, RIGHTOFCAPTION) + TM_ENUM(10, OT, LEFTOFLASTBUTTON) + TM_ENUM(11, OT, RIGHTOFLASTBUTTON) + TM_ENUM(12, OT, ABOVELASTBUTTON) + TM_ENUM(13, OT, BELOWLASTBUTTON) +END_TM_ENUM() + +/* ICONEFFECT Enum */ +BEGIN_TM_ENUM(ICONEFFECT) + TM_ENUM(0, ICE, NONE) + TM_ENUM(1, ICE, GLOW) + TM_ENUM(2, ICE, SHADOW) + TM_ENUM(3, ICE, PULSE) + TM_ENUM(4, ICE, ALPHA) +END_TM_ENUM() + +/* TEXTSHADOWTYPE Enum */ +BEGIN_TM_ENUM(TEXTSHADOWTYPE) + TM_ENUM(0, TST, NONE) + TM_ENUM(1, TST, SINGLE) + TM_ENUM(2, TST, CONTINUOUS) +END_TM_ENUM() + +/* GLYPHTYPE Enum */ +BEGIN_TM_ENUM(GLYPHTYPE) + TM_ENUM(0, GT, NONE) + TM_ENUM(1, GT, IMAGEGLYPH) + TM_ENUM(2, GT, FONTGLYPH) +END_TM_ENUM() + +/* IMAGESELECTTYPE Enum */ +BEGIN_TM_ENUM(IMAGESELECTTYPE) + TM_ENUM(0, IST, NONE) + TM_ENUM(1, IST, SIZE) + TM_ENUM(2, IST, DPI) +END_TM_ENUM() + +/* TRUESIZESCALINGTYPE Enum */ +BEGIN_TM_ENUM(TRUESIZESCALINGTYPE) + TM_ENUM(0, TSST, NONE) + TM_ENUM(1, TSST, SIZE) + TM_ENUM(2, TSST, DPI) +END_TM_ENUM() + +/* GLYPHFONTSIZINGTYPE Enum */ +BEGIN_TM_ENUM(GLYPHFONTSIZINGTYPE) + TM_ENUM(0, GFST, NONE) + TM_ENUM(1, GFST, SIZE) + TM_ENUM(2, GFST, DPI) +END_TM_ENUM() + + +/***** PROPERTIES *****/ +BEGIN_TM_PROPS() + + /* Primitive types */ + TM_PROP(201, TMT, STRING, STRING) + TM_PROP(202, TMT, INT, INT) + TM_PROP(203, TMT, BOOL, BOOL) + TM_PROP(204, TMT, COLOR, COLOR) + TM_PROP(205, TMT, MARGINS, MARGINS) + TM_PROP(206, TMT, FILENAME, FILENAME) + TM_PROP(207, TMT, SIZE, SIZE) + TM_PROP(208, TMT, POSITION, POSITION) + TM_PROP(209, TMT, RECT, RECT) + TM_PROP(210, TMT, FONT, FONT) + TM_PROP(211, TMT, INTLIST, INTLIST) + /* we should have ENUM around here */ + + /* Misc properties */ + TM_PROP(401, TMT, COLORSCHEMES, STRING) + TM_PROP(402, TMT, SIZES, STRING) + TM_PROP(403, TMT, CHARSET, INT) + + /* Documentation properties */ + TM_PROP(601, TMT, DISPLAYNAME, STRING) + TM_PROP(602, TMT, TOOLTIP, STRING) + TM_PROP(603, TMT, COMPANY, STRING) + TM_PROP(604, TMT, AUTHOR, STRING) + TM_PROP(605, TMT, COPYRIGHT, STRING) + TM_PROP(606, TMT, URL, STRING) + TM_PROP(607, TMT, VERSION, STRING) + TM_PROP(608, TMT, DESCRIPTION, STRING) +# define TMT_FIRST_RCSTRING_NAME TMT_DISPLAYNAME +# define TMT_LAST_RCSTRING_NAME TMT_DESCRIPTION + + /* Font theme metric properties */ + TM_PROP(801, TMT, CAPTIONFONT, FONT) + TM_PROP(802, TMT, SMALLCAPTIONFONT, FONT) + TM_PROP(803, TMT, MENUFONT, FONT) + TM_PROP(804, TMT, STATUSFONT, FONT) + TM_PROP(805, TMT, MSGBOXFONT, FONT) + TM_PROP(806, TMT, ICONTITLEFONT, FONT) +# define TMT_FIRSTFONT TMT_CAPTIONFONT +# define TMT_LASTFONT TMT_ICONTITLEFONT + + /* Bool theme metric properties */ + TM_PROP(1001, TMT, FLATMENUS, BOOL) +# define TMT_FIRSTBOOL TMT_FLATMENUS +# define TMT_LASTBOOL TMT_FLATMENUS + + /* Size theme metric properties */ + TM_PROP(1201, TMT, SIZINGBORDERWIDTH, SIZE) + TM_PROP(1202, TMT, SCROLLBARWIDTH, SIZE) + TM_PROP(1203, TMT, SCROLLBARHEIGHT, SIZE) + TM_PROP(1204, TMT, CAPTIONBARWIDTH, SIZE) + TM_PROP(1205, TMT, CAPTIONBARHEIGHT, SIZE) + TM_PROP(1206, TMT, SMCAPTIONBARWIDTH, SIZE) + TM_PROP(1207, TMT, SMCAPTIONBARHEIGHT, SIZE) + TM_PROP(1208, TMT, MENUBARWIDTH, SIZE) + TM_PROP(1209, TMT, MENUBARHEIGHT, SIZE) +# define TMT_FIRSTSIZE TMT_SIZINGBORDERWIDTH +# define TMT_LASTSIZE TMT_MENUBARHEIGHT + + /* Int theme metric properties */ + TM_PROP(1301, TMT, MINCOLORDEPTH, INT) +# define TMT_FIRSTINT TMT_MINCOLORDEPTH +# define TMT_LASTINT TMT_MINCOLORDEPTH + + /* String theme metric properties */ + TM_PROP(1401, TMT, CSSNAME, STRING) + TM_PROP(1402, TMT, XMLNAME, STRING) +# define TMT_FIRSTSTRING TMT_CSSNAME +# define TMT_LASTSTRING TMT_XMLNAME + + /* Color theme metric properties */ + TM_PROP(1601, TMT, SCROLLBAR, COLOR) + TM_PROP(1602, TMT, BACKGROUND, COLOR) + TM_PROP(1603, TMT, ACTIVECAPTION, COLOR) + TM_PROP(1604, TMT, INACTIVECAPTION, COLOR) + TM_PROP(1605, TMT, MENU, COLOR) + TM_PROP(1606, TMT, WINDOW, COLOR) + TM_PROP(1607, TMT, WINDOWFRAME, COLOR) + TM_PROP(1608, TMT, MENUTEXT, COLOR) + TM_PROP(1609, TMT, WINDOWTEXT, COLOR) + TM_PROP(1610, TMT, CAPTIONTEXT, COLOR) + TM_PROP(1611, TMT, ACTIVEBORDER, COLOR) + TM_PROP(1612, TMT, INACTIVEBORDER, COLOR) + TM_PROP(1613, TMT, APPWORKSPACE, COLOR) + TM_PROP(1614, TMT, HIGHLIGHT, COLOR) + TM_PROP(1615, TMT, HIGHLIGHTTEXT, COLOR) + TM_PROP(1616, TMT, BTNFACE, COLOR) + TM_PROP(1617, TMT, BTNSHADOW, COLOR) + TM_PROP(1618, TMT, GRAYTEXT, COLOR) + TM_PROP(1619, TMT, BTNTEXT, COLOR) + TM_PROP(1620, TMT, INACTIVECAPTIONTEXT, COLOR) + TM_PROP(1621, TMT, BTNHIGHLIGHT, COLOR) + TM_PROP(1622, TMT, DKSHADOW3D, COLOR) + TM_PROP(1623, TMT, LIGHT3D, COLOR) + TM_PROP(1624, TMT, INFOTEXT, COLOR) + TM_PROP(1625, TMT, INFOBK, COLOR) + TM_PROP(1626, TMT, BUTTONALTERNATEFACE, COLOR) + TM_PROP(1627, TMT, HOTTRACKING, COLOR) + TM_PROP(1628, TMT, GRADIENTACTIVECAPTION, COLOR) + TM_PROP(1629, TMT, GRADIENTINACTIVECAPTION, COLOR) + TM_PROP(1630, TMT, MENUHILIGHT, COLOR) + TM_PROP(1631, TMT, MENUBAR, COLOR) +# define TMT_FIRSTCOLOR TMT_SCROLLBAR +# define TMT_LASTCOLOR TMT_MENUBAR + + /* hue substitutions */ + TM_PROP(1801, TMT, FROMHUE1, INT) + TM_PROP(1802, TMT, FROMHUE2, INT) + TM_PROP(1803, TMT, FROMHUE3, INT) + TM_PROP(1804, TMT, FROMHUE4, INT) + TM_PROP(1805, TMT, FROMHUE5, INT) + TM_PROP(1806, TMT, TOHUE1, INT) + TM_PROP(1807, TMT, TOHUE2, INT) + TM_PROP(1808, TMT, TOHUE3, INT) + TM_PROP(1809, TMT, TOHUE4, INT) + TM_PROP(1810, TMT, TOHUE5, INT) + + /* color substitutions */ + TM_PROP(2001, TMT, FROMCOLOR1, COLOR) + TM_PROP(2002, TMT, FROMCOLOR2, COLOR) + TM_PROP(2003, TMT, FROMCOLOR3, COLOR) + TM_PROP(2004, TMT, FROMCOLOR4, COLOR) + TM_PROP(2005, TMT, FROMCOLOR5, COLOR) + TM_PROP(2006, TMT, TOCOLOR1, COLOR) + TM_PROP(2007, TMT, TOCOLOR2, COLOR) + TM_PROP(2008, TMT, TOCOLOR3, COLOR) + TM_PROP(2009, TMT, TOCOLOR4, COLOR) + TM_PROP(2010, TMT, TOCOLOR5, COLOR) + + /* Bool rendering properties */ + TM_PROP(2201, TMT, TRANSPARENT, BOOL) + TM_PROP(2202, TMT, AUTOSIZE, BOOL) + TM_PROP(2203, TMT, BORDERONLY, BOOL) + TM_PROP(2204, TMT, COMPOSITED, BOOL) + TM_PROP(2205, TMT, BGFILL, BOOL) + TM_PROP(2206, TMT, GLYPHTRANSPARENT, BOOL) + TM_PROP(2207, TMT, GLYPHONLY, BOOL) + TM_PROP(2208, TMT, ALWAYSSHOWSIZINGBAR, BOOL) + TM_PROP(2209, TMT, MIRRORIMAGE, BOOL) + TM_PROP(2210, TMT, UNIFORMSIZING, BOOL) + TM_PROP(2211, TMT, INTEGRALSIZING, BOOL) + TM_PROP(2212, TMT, SOURCEGROW, BOOL) + TM_PROP(2213, TMT, SOURCESHRINK, BOOL) + + /* Int rendering properties */ + TM_PROP(2401, TMT, IMAGECOUNT, INT) + TM_PROP(2402, TMT, ALPHALEVEL, INT) + TM_PROP(2403, TMT, BORDERSIZE, INT) + TM_PROP(2404, TMT, ROUNDCORNERWIDTH, INT) + TM_PROP(2405, TMT, ROUNDCORNERHEIGHT, INT) + TM_PROP(2406, TMT, GRADIENTRATIO1, INT) + TM_PROP(2407, TMT, GRADIENTRATIO2, INT) + TM_PROP(2408, TMT, GRADIENTRATIO3, INT) + TM_PROP(2409, TMT, GRADIENTRATIO4, INT) + TM_PROP(2410, TMT, GRADIENTRATIO5, INT) + TM_PROP(2411, TMT, PROGRESSCHUNKSIZE, INT) + TM_PROP(2412, TMT, PROGRESSSPACESIZE, INT) + TM_PROP(2413, TMT, SATURATION, INT) + TM_PROP(2414, TMT, TEXTBORDERSIZE, INT) + TM_PROP(2415, TMT, ALPHATHRESHOLD, INT) + TM_PROP(2416, TMT, WIDTH, SIZE) + TM_PROP(2417, TMT, HEIGHT, SIZE) + TM_PROP(2418, TMT, GLYPHINDEX, INT) + TM_PROP(2419, TMT, TRUESIZESTRETCHMARK, INT) + TM_PROP(2420, TMT, MINDPI1, INT) + TM_PROP(2421, TMT, MINDPI2, INT) + TM_PROP(2422, TMT, MINDPI3, INT) + TM_PROP(2423, TMT, MINDPI4, INT) + TM_PROP(2424, TMT, MINDPI5, INT) + + /* Font rendering properties */ + TM_PROP(2601, TMT, GLYPHFONT, FONT) + + /* Filename rendering properties */ + TM_PROP(3001, TMT, IMAGEFILE, FILENAME) + TM_PROP(3002, TMT, IMAGEFILE1, FILENAME) + TM_PROP(3003, TMT, IMAGEFILE2, FILENAME) + TM_PROP(3004, TMT, IMAGEFILE3, FILENAME) + TM_PROP(3005, TMT, IMAGEFILE4, FILENAME) + TM_PROP(3006, TMT, IMAGEFILE5, FILENAME) + TM_PROP(3007, TMT, STOCKIMAGEFILE, FILENAME) + TM_PROP(3008, TMT, GLYPHIMAGEFILE, FILENAME) + + /* String rendering properties */ + TM_PROP(3201, TMT, TEXT, STRING) + + /* Position rendering properties */ + TM_PROP(3401, TMT, OFFSET, POSITION) + TM_PROP(3402, TMT, TEXTSHADOWOFFSET, POSITION) + TM_PROP(3403, TMT, MINSIZE, POSITION) + TM_PROP(3404, TMT, MINSIZE1, POSITION) + TM_PROP(3405, TMT, MINSIZE2, POSITION) + TM_PROP(3406, TMT, MINSIZE3, POSITION) + TM_PROP(3407, TMT, MINSIZE4, POSITION) + TM_PROP(3408, TMT, MINSIZE5, POSITION) + TM_PROP(3409, TMT, NORMALSIZE, POSITION) + + /* Margin rendering properties */ + TM_PROP(3601, TMT, SIZINGMARGINS, MARGINS) + TM_PROP(3602, TMT, CONTENTMARGINS, MARGINS) + TM_PROP(3603, TMT, CAPTIONMARGINS, MARGINS) + + /* Color rendering properties */ + TM_PROP(3801, TMT, BORDERCOLOR, COLOR) + TM_PROP(3802, TMT, FILLCOLOR, COLOR) + TM_PROP(3803, TMT, TEXTCOLOR, COLOR) + TM_PROP(3804, TMT, EDGELIGHTCOLOR, COLOR) + TM_PROP(3805, TMT, EDGEHIGHLIGHTCOLOR, COLOR) + TM_PROP(3806, TMT, EDGESHADOWCOLOR, COLOR) + TM_PROP(3807, TMT, EDGEDKSHADOWCOLOR, COLOR) + TM_PROP(3808, TMT, EDGEFILLCOLOR, COLOR) + TM_PROP(3809, TMT, TRANSPARENTCOLOR, COLOR) + TM_PROP(3810, TMT, GRADIENTCOLOR1, COLOR) + TM_PROP(3811, TMT, GRADIENTCOLOR2, COLOR) + TM_PROP(3812, TMT, GRADIENTCOLOR3, COLOR) + TM_PROP(3813, TMT, GRADIENTCOLOR4, COLOR) + TM_PROP(3814, TMT, GRADIENTCOLOR5, COLOR) + TM_PROP(3815, TMT, SHADOWCOLOR, COLOR) + TM_PROP(3816, TMT, GLOWCOLOR, COLOR) + TM_PROP(3817, TMT, TEXTBORDERCOLOR, COLOR) + TM_PROP(3818, TMT, TEXTSHADOWCOLOR, COLOR) + TM_PROP(3819, TMT, GLYPHTEXTCOLOR, COLOR) + TM_PROP(3820, TMT, GLYPHTRANSPARENTCOLOR, COLOR) + TM_PROP(3821, TMT, FILLCOLORHINT, COLOR) + TM_PROP(3822, TMT, BORDERCOLORHINT, COLOR) + TM_PROP(3823, TMT, ACCENTCOLORHINT, COLOR) + + /* Enum rendering properties */ + TM_PROP(4001, TMT, BGTYPE, ENUM) + TM_PROP(4002, TMT, BORDERTYPE, ENUM) + TM_PROP(4003, TMT, FILLTYPE, ENUM) + TM_PROP(4004, TMT, SIZINGTYPE, ENUM) + TM_PROP(4005, TMT, HALIGN, ENUM) + TM_PROP(4006, TMT, CONTENTALIGNMENT, ENUM) + TM_PROP(4007, TMT, VALIGN, ENUM) + TM_PROP(4008, TMT, OFFSETTYPE, ENUM) + TM_PROP(4009, TMT, ICONEFFECT, ENUM) + TM_PROP(4010, TMT, TEXTSHADOWTYPE, ENUM) + TM_PROP(4011, TMT, IMAGELAYOUT, ENUM) + TM_PROP(4012, TMT, GLYPHTYPE, ENUM) + TM_PROP(4013, TMT, IMAGESELECTTYPE, ENUM) + TM_PROP(4014, TMT, GLYPHFONTSIZINGTYPE, ENUM) + TM_PROP(4015, TMT, TRUESIZESCALINGTYPE, ENUM) + + /* custom properties */ + TM_PROP(5001, TMT, USERPICTURE, BOOL) + TM_PROP(5002, TMT, DEFAULTPANESIZE, RECT) + TM_PROP(5003, TMT, BLENDCOLOR, COLOR) + +END_TM_PROPS() + + +/***** PARTS & STATES *****/ + /* BUTTON parts */ -enum { - BP_PUSHBUTTON = 1, - BP_RADIOBUTTON = 2, - BP_CHECKBOX = 3, - BP_GROUPBOX = 4, - BP_USERBUTTON = 5 -}; -enum { - CBS_UNCHECKEDNORMAL = 1, - CBS_UNCHECKEDHOT = 2, - CBS_UNCHECKEDPRESSED = 3, - CBS_UNCHECKEDDISABLED = 4, - CBS_CHECKEDNORMAL = 5, - CBS_CHECKEDHOT = 6, - CBS_CHECKEDPRESSED = 7, - CBS_CHECKEDDISABLED = 8, - CBS_MIXEDNORMAL = 9, - CBS_MIXEDHOT = 10, - CBS_MIXEDPRESSED = 11, - CBS_MIXEDDISABLED = 12 -}; -enum { - GBS_NORMAL = 1, - GBS_DISABLED = 2 -}; -enum { - PBS_NORMAL = 1, - PBS_HOT = 2, - PBS_PRESSED = 3, - PBS_DISABLED = 4, - PBS_DEFAULTED = 5 -}; -enum { - RBS_UNCHECKEDNORMAL = 1, - RBS_UNCHECKEDHOT = 2, - RBS_UNCHECKEDPRESSED = 3, - RBS_UNCHECKEDDISABLED = 4, - RBS_CHECKEDNORMAL = 5, - RBS_CHECKEDHOT = 6, - RBS_CHECKEDPRESSED = 7, - RBS_CHECKEDDISABLED = 8 -}; +BEGIN_TM_CLASS_PARTS(BUTTON) + TM_PART(1, BP, PUSHBUTTON) + TM_PART(2, BP, RADIOBUTTON) + TM_PART(3, BP, CHECKBOX) + TM_PART(4, BP, GROUPBOX) + TM_PART(5, BP, USERBUTTON) +END_TM_CLASS_PARTS() + +/* BUTTON - PUSHBUTTON states */ +BEGIN_TM_PART_STATES(PUSHBUTTON) + TM_STATE(1, PBS, NORMAL) + TM_STATE(2, PBS, HOT) + TM_STATE(3, PBS, PRESSED) + TM_STATE(4, PBS, DISABLED) + TM_STATE(5, PBS, DEFAULTED) +END_TM_PART_STATES() + +/* BUTTON - RADIOBUTTON states */ +BEGIN_TM_PART_STATES(RADIOBUTTON) + TM_STATE(1, RBS, UNCHECKEDNORMAL) + TM_STATE(2, RBS, UNCHECKEDHOT) + TM_STATE(3, RBS, UNCHECKEDPRESSED) + TM_STATE(4, RBS, UNCHECKEDDISABLED) + TM_STATE(5, RBS, CHECKEDNORMAL) + TM_STATE(6, RBS, CHECKEDHOT) + TM_STATE(7, RBS, CHECKEDPRESSED) + TM_STATE(8, RBS, CHECKEDDISABLED) +END_TM_PART_STATES() + +/* BUTTON - CHECKBOX states */ +BEGIN_TM_PART_STATES(CHECKBOX) + TM_STATE(1, CBS, UNCHECKEDNORMAL) + TM_STATE(2, CBS, UNCHECKEDHOT) + TM_STATE(3, CBS, UNCHECKEDPRESSED) + TM_STATE(4, CBS, UNCHECKEDDISABLED) + TM_STATE(5, CBS, CHECKEDNORMAL) + TM_STATE(6, CBS, CHECKEDHOT) + TM_STATE(7, CBS, CHECKEDPRESSED) + TM_STATE(8, CBS, CHECKEDDISABLED) + TM_STATE(9, CBS, MIXEDNORMAL) + TM_STATE(10, CBS, MIXEDHOT) + TM_STATE(11, CBS, MIXEDPRESSED) + TM_STATE(12, CBS, MIXEDDISABLED) +END_TM_PART_STATES() + +/* BUTTON - GROUPBOX states */ +BEGIN_TM_PART_STATES(GROUPBOX) + TM_STATE(1, GBS, NORMAL) + TM_STATE(2, GBS, DISABLED) +END_TM_PART_STATES() + /* CLOCK parts */ -enum { - CLP_TIME = 1 -}; -enum { - CLS_NORMAL = 1 -}; +BEGIN_TM_CLASS_PARTS(CLOCK) + TM_PART(1, CLP, TIME) +END_TM_CLASS_PARTS() + +/* CLOCK states */ +BEGIN_TM_PART_STATES(CLOCK) + TM_STATE(1, CLS, NORMAL) +END_TM_PART_STATES() + /* COMBOBOX parts */ -enum { - CP_DROPDOWNBUTTON = 1 -}; -enum { - CBXS_NORMAL = 1, - CBXS_HOT = 2, - CBXS_PRESSED = 3, - CBXS_DISABLED = 4 -}; +BEGIN_TM_CLASS_PARTS(COMBOBOX) + TM_PART(1, CP, DROPDOWNBUTTON) +END_TM_CLASS_PARTS() + +/* COMBOBOX states */ +BEGIN_TM_PART_STATES(COMBOBOX) + TM_STATE(1, CBXS, NORMAL) + TM_STATE(2, CBXS, HOT) + TM_STATE(3, CBXS, PRESSED) + TM_STATE(4, CBXS, DISABLED) +END_TM_PART_STATES() + /* EDIT parts */ -enum { - EP_EDITTEXT = 1, - EP_CARET = 2 -}; -enum { - ETS_NORMAL = 1, - ETS_HOT = 2, - ETS_SELECTED = 3, - ETS_DISABLED = 4, - ETS_FOCUSED = 5, - ETS_READONLY = 6, - ETS_ASSIST = 7 -}; +BEGIN_TM_CLASS_PARTS(EDIT) + TM_PART(1, EP, EDITTEXT) + TM_PART(2, EP, CARET) +END_TM_CLASS_PARTS() + +/* EDIT - EDITTEXT states */ +BEGIN_TM_PART_STATES(EDITTEXT) + TM_STATE(1, ETS, NORMAL) + TM_STATE(2, ETS, HOT) + TM_STATE(3, ETS, SELECTED) + TM_STATE(4, ETS, DISABLED) + TM_STATE(5, ETS, FOCUSED) + TM_STATE(6, ETS, READONLY) + TM_STATE(7, ETS, ASSIST) +END_TM_PART_STATES() + /* EXPLORERBAR parts */ -enum { - EBP_HEADERBACKGROUND = 1, - EBP_HEADERCLOSE = 2, - EBP_HEADERPIN = 3, - EBP_IEBARMENU = 4, - EBP_NORMALGROUPBACKGROUND = 5, - EBP_NORMALGROUPCOLLAPSE = 6, - EBP_NORMALGROUPEXPAND = 7, - EBP_NORMALGROUPHEAD = 8, - EBP_SPECIALGROUPBACKGROUND = 9, - EBP_SPECIALGROUPCOLLAPSE = 10, - EBP_SPECIALGROUPEXPAND = 11, - EBP_SPECIALGROUPHEAD = 12 -}; -enum { - EBHC_NORMAL = 1, - EBHC_HOT = 2, - EBHC_PRESSED = 3 -}; -enum { - EBHP_NORMAL = 1, - EBHP_HOT = 2, - EBHP_PRESSED = 3, - EBHP_SELECTEDNORMAL = 4, - EBHP_SELECTEDHOT = 5, - EBHP_SELECTEDPRESSED = 6 -}; -enum { - EBM_NORMAL = 1, - EBM_HOT = 2, - EBM_PRESSED = 3 -}; -enum { - EBNGC_NORMAL = 1, - EBNGC_HOT = 2, - EBNGC_PRESSED = 3 -}; -enum { - EBNGE_NORMAL = 1, - EBNGE_HOT = 2, - EBNGE_PRESSED = 3 -}; -enum { - EBSGC_NORMAL = 1, - EBSGC_HOT = 2, - EBSGC_PRESSED = 3 -}; -enum { - EBSGE_NORMAL = 1, - EBSGE_HOT = 2, - EBSGE_PRESSED = 3 -}; +BEGIN_TM_CLASS_PARTS(EXPLORERBAR) + TM_PART(1, EBP, HEADERBACKGROUND) + TM_PART(2, EBP, HEADERCLOSE) + TM_PART(3, EBP, HEADERPIN) + TM_PART(4, EBP, IEBARMENU) + TM_PART(5, EBP, NORMALGROUPBACKGROUND) + TM_PART(6, EBP, NORMALGROUPCOLLAPSE) + TM_PART(7, EBP, NORMALGROUPEXPAND) + TM_PART(8, EBP, NORMALGROUPHEAD) + TM_PART(9, EBP, SPECIALGROUPBACKGROUND) + TM_PART(10, EBP, SPECIALGROUPCOLLAPSE) + TM_PART(11, EBP, SPECIALGROUPEXPAND) + TM_PART(12, EBP, SPECIALGROUPHEAD) +END_TM_CLASS_PARTS() + +/* EXPLORERBAR - HEADERCLOSE states */ +BEGIN_TM_PART_STATES(HEADERCLOSE) + TM_STATE(1, EBHC, NORMAL) + TM_STATE(2, EBHC, HOT) + TM_STATE(3, EBHC, PRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - HEADERPIN states */ +BEGIN_TM_PART_STATES(HEADERPIN) + TM_STATE(1, EBHP, NORMAL) + TM_STATE(2, EBHP, HOT) + TM_STATE(3, EBHP, PRESSED) + TM_STATE(4, EBHP, SELECTEDNORMAL) + TM_STATE(5, EBHP, SELECTEDHOT) + TM_STATE(6, EBHP, SELECTEDPRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - IEBARMENU states */ +BEGIN_TM_PART_STATES(IEBARMENU) + TM_STATE(1, EBM, NORMAL) + TM_STATE(2, EBM, HOT) + TM_STATE(3, EBM, PRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - NORMALGROUPCOLLAPSE states */ +BEGIN_TM_PART_STATES(NORMALGROUPCOLLAPSE) + TM_STATE(1, EBNGC, NORMAL) + TM_STATE(2, EBNGC, HOT) + TM_STATE(3, EBNGC, PRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - NORMALGROUPEXPAND states */ +BEGIN_TM_PART_STATES(NORMALGROUPEXPAND) + TM_STATE(1, EBNGE, NORMAL) + TM_STATE(2, EBNGE, HOT) + TM_STATE(3, EBNGE, PRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - SPECIALGROUPCOLLAPSE states */ +BEGIN_TM_PART_STATES(SPECIALGROUPCOLLAPSE) + TM_STATE(1, EBSGC, NORMAL) + TM_STATE(2, EBSGC, HOT) + TM_STATE(3, EBSGC, PRESSED) +END_TM_PART_STATES() + +/* EXPLORERBAR - SPECIALGROUPEXPAND states */ +BEGIN_TM_PART_STATES(SPECIALGROUPEXPAND) + TM_STATE(1, EBSGE, NORMAL) + TM_STATE(2, EBSGE, HOT) + TM_STATE(3, EBSGE, PRESSED) +END_TM_PART_STATES() + +/* GLOBALS parts */ +BEGIN_TM_CLASS_PARTS(GLOBALS) + TM_PART(1, GP, BORDER) + TM_PART(2, GP, LINEHORZ) + TM_PART(3, GP, LINEVERT) +END_TM_CLASS_PARTS() + +/* GLOBALS - BORDER states */ +BEGIN_TM_PART_STATES(BORDER) + TM_STATE(1, BSS, FLAT) + TM_STATE(2, BSS, RAISED) + TM_STATE(3, BSS, SUNKEN) +END_TM_PART_STATES() + +/* GLOBALS - LINEHORZ states */ +BEGIN_TM_PART_STATES(LINEHORZ) + TM_STATE(1, LHS, FLAT) + TM_STATE(2, LHS, RAISED) + TM_STATE(3, LHS, SUNKEN) +END_TM_PART_STATES() + +/* GLOBAL - LINEVERT states */ +BEGIN_TM_PART_STATES(LINEVERT) + TM_STATE(1, LVS, FLAT) + TM_STATE(2, LVS, RAISED) + TM_STATE(3, LVS, SUNKEN) +END_TM_PART_STATES() + /* HEADER parts */ -enum { - HP_HEADERITEM = 1, - HP_HEADERITEMLEFT = 2, - HP_HEADERITEMRIGHT = 3, - HP_HEADERSORTARROW = 4 -}; -enum { - HIS_NORMAL = 1, - HIS_HOT = 2, - HIS_PRESSED = 3 -}; -enum { - HILS_NORMAL = 1, - HILS_HOT = 2, - HILS_PRESSED = 3 -}; -enum { - HIRS_NORMAL = 1, - HIRS_HOT = 2, - HIRS_PRESSED = 3 -}; -enum { - HSAS_SORTEDUP = 1, - HSAS_SORTEDDOWN = 2 -}; +BEGIN_TM_CLASS_PARTS(HEADER) + TM_PART(1, HP, HEADERITEM) + TM_PART(2, HP, HEADERITEMLEFT) + TM_PART(3, HP, HEADERITEMRIGHT) + TM_PART(4, HP, HEADERSORTARROW) +END_TM_CLASS_PARTS() + +/* HEADER - HEADERITEM states */ +BEGIN_TM_PART_STATES(HEADERITEM) + TM_STATE(1, HIS, NORMAL) + TM_STATE(2, HIS, HOT) + TM_STATE(3, HIS, PRESSED) +END_TM_PART_STATES() + +/* HEADER - HEADERITEMLEFT states */ +BEGIN_TM_PART_STATES(HEADERITEMLEFT) + TM_STATE(1, HILS, NORMAL) + TM_STATE(2, HILS, HOT) + TM_STATE(3, HILS, PRESSED) +END_TM_PART_STATES() + +/* HEADER - HEADERITEMRIGHT states */ +BEGIN_TM_PART_STATES(HEADERITEMRIGHT) + TM_STATE(1, HIRS, NORMAL) + TM_STATE(2, HIRS, HOT) + TM_STATE(3, HIRS, PRESSED) +END_TM_PART_STATES() + +/* HEADER - HEADERSORTARROW states */ +BEGIN_TM_PART_STATES(HEADERSORTARROW) + TM_STATE(1, HSAS, SORTEDUP) + TM_STATE(2, HSAS, SORTEDDOWN) +END_TM_PART_STATES() + /* LISTVIEW parts */ -enum { - LVP_LISTITEM = 1, - LVP_LISTGROUP = 2, - LVP_LISTDETAIL = 3, - LVP_LISTSORTEDDETAIL = 4, - LVP_EMPTYTEXT = 5 -}; -enum { - LIS_NORMAL = 1, - LIS_HOT = 2, - LIS_SELECTED = 3, - LIS_DISABLED = 4, - LIS_SELECTEDNOTFOCUS = 5 -}; +BEGIN_TM_CLASS_PARTS(LISTVIEW) + TM_PART(1, LVP, LISTITEM) + TM_PART(2, LVP, LISTGROUP) + TM_PART(3, LVP, LISTDETAIL) + TM_PART(4, LVP, LISTSORTEDDETAIL) + TM_PART(5, LVP, EMPTYTEXT) +END_TM_CLASS_PARTS() + +/* LISTVIEW - LISTITEM states */ +BEGIN_TM_PART_STATES(LISTITEM) + TM_STATE(1, LIS, NORMAL) + TM_STATE(2, LIS, HOT) + TM_STATE(3, LIS, SELECTED) + TM_STATE(4, LIS, DISABLED) + TM_STATE(5, LIS, SELECTEDNOTFOCUS) +END_TM_PART_STATES() + /* MENU parts */ -enum { - MP_MENUITEM = 1, - MP_MENUDROPDOWN = 2, - MP_MENUBARITEM = 3, - MP_MENUBARDROPDOWN = 4, - MP_CHEVRON = 5, - MP_SEPARATOR = 6 -}; -enum { - MS_NORMAL = 1, - MS_SELECTED = 2, - MS_DEMOTED = 3 -}; +BEGIN_TM_CLASS_PARTS(MENU) + TM_PART(1, MP, MENUITEM) + TM_PART(2, MP, MENUDROPDOWN) + TM_PART(3, MP, MENUBARITEM) + TM_PART(4, MP, MENUBARDROPDOWN) + TM_PART(5, MP, CHEVRON) + TM_PART(6, MP, SEPARATOR) +END_TM_CLASS_PARTS() + +/* MENU - * states */ +BEGIN_TM_PART_STATES(MENU) + TM_STATE(1, MS, NORMAL) + TM_STATE(2, MS, SELECTED) + TM_STATE(3, MS, DEMOTED) +END_TM_PART_STATES() + /* MENUBAND parts */ -enum { - MDP_NEWAPPBUTTON = 1, - MDP_SEPERATOR = 2 -}; -enum { - MDS_NORMAL = 1, - MDS_HOT = 2, - MDS_PRESSED = 3, - MDS_DISABLED = 4, - MDS_CHECKED = 5, - MDS_HOTCHECKED = 6 -}; +BEGIN_TM_CLASS_PARTS(MENUBAND) + TM_PART(1, MDP, NEWAPPBUTTON) +/* MDP_SEPERATOR isn't a typo, as per Microsoft's headers */ + TM_PART(2, MDP, SEPERATOR) +END_TM_CLASS_PARTS() + +/* MENUBAND states */ +BEGIN_TM_PART_STATES(MENUBAND) + TM_STATE(1, MDS, NORMAL) + TM_STATE(2, MDS, HOT) + TM_STATE(3, MDS, PRESSED) + TM_STATE(4, MDS, DISABLED) + TM_STATE(5, MDS, CHECKED) + TM_STATE(6, MDS, HOTCHECKED) +END_TM_PART_STATES() + /* PAGE parts */ -enum { - PGRP_UP = 1, - PGRP_DOWN = 2, - PGRP_UPHORZ = 3, - PGRP_DOWNHORZ = 4 -}; -enum { - DNS_NORMAL = 1, - DNS_HOT = 2, - DNS_PRESSED = 3, - DNS_DISABLED = 4 -}; -enum { - DNHZS_NORMAL = 1, - DNHZS_HOT = 2, - DNHZS_PRESSED = 3, - DNHZS_DISABLED = 4 -}; -enum { - UPS_NORMAL = 1, - UPS_HOT = 2, - UPS_PRESSED = 3, - UPS_DISABLED = 4 -}; -enum { - UPHZS_NORMAL = 1, - UPHZS_HOT = 2, - UPHZS_PRESSED = 3, - UPHZS_DISABLED = 4 -}; +BEGIN_TM_CLASS_PARTS(PAGE) + TM_PART(1, PGRP, UP) + TM_PART(2, PGRP, DOWN) + TM_PART(3, PGRP, UPHORZ) + TM_PART(4, PGRP, DOWNHORZ) +END_TM_CLASS_PARTS() + +/* PAGE - UP states */ +BEGIN_TM_PART_STATES(UP) + TM_STATE(1, UPS, NORMAL) + TM_STATE(2, UPS, HOT) + TM_STATE(3, UPS, PRESSED) + TM_STATE(4, UPS, DISABLED) +END_TM_PART_STATES() + +/* PAGE - DOWN states */ +BEGIN_TM_PART_STATES(DOWN) + TM_STATE(1, DNS, NORMAL) + TM_STATE(2, DNS, HOT) + TM_STATE(3, DNS, PRESSED) + TM_STATE(4, DNS, DISABLED) +END_TM_PART_STATES() + +/* PAGE - UPHORZ states */ +BEGIN_TM_PART_STATES(UPHORZ) + TM_STATE(1, UPHZS, NORMAL) + TM_STATE(2, UPHZS, HOT) + TM_STATE(3, UPHZS, PRESSED) + TM_STATE(4, UPHZS, DISABLED) +END_TM_PART_STATES() + +/* PAGE - DOWNHORZ states */ +BEGIN_TM_PART_STATES(DOWNHORZ) + TM_STATE(1, DNHZS, NORMAL) + TM_STATE(2, DNHZS, HOT) + TM_STATE(3, DNHZS, PRESSED) + TM_STATE(4, DNHZS, DISABLED) +END_TM_PART_STATES() + /* PROGRESS parts */ -enum { - PP_BAR = 1, - PP_BARVERT = 2, - PP_CHUNK = 3, - PP_CHUNKVERT = 4 -}; +BEGIN_TM_CLASS_PARTS(PROGRESS) + TM_PART(1, PP, BAR) + TM_PART(2, PP, BARVERT) + TM_PART(3, PP, CHUNK) + TM_PART(4, PP, CHUNKVERT) +END_TM_CLASS_PARTS() + /* REBAR parts */ -enum { - RP_GRIPPER = 1, - RP_GRIPPERVERT = 2, - RP_BAND = 3, - RP_CHEVRON = 4, - RP_CHEVRONVERT = 5 -}; -enum { - CHEVS_NORMAL = 1, - CHEVS_HOT = 2, - CHEVS_PRESSED = 3 -}; +BEGIN_TM_CLASS_PARTS(REBAR) + TM_PART(1, RP, GRIPPER) + TM_PART(2, RP, GRIPPERVERT) + TM_PART(3, RP, BAND) + TM_PART(4, RP, CHEVRON) + TM_PART(5, RP, CHEVRONVERT) +END_TM_CLASS_PARTS() + +/* REBAR - CHEVRON states */ +BEGIN_TM_PART_STATES(CHEVRON) + TM_STATE(1, CHEVS, NORMAL) + TM_STATE(2, CHEVS, HOT) + TM_STATE(3, CHEVS, PRESSED) +END_TM_PART_STATES() + /* SCROLLBAR parts */ -enum { - SBP_ARROWBTN = 1, - SBP_THUMBBTNHORZ = 2, - SBP_THUMBBTNVERT = 3, - SBP_LOWERTRACKHORZ = 4, - SBP_UPPERTRACKHORZ = 5, - SBP_LOWERTRACKVERT = 6, - SBP_UPPERTRACKVERT = 7, - SBP_GRIPPERHORZ = 8, - SBP_GRIPPERVERT = 9, - SBP_SIZEBOX = 10 -}; -enum { - ABS_UPNORMAL = 1, - ABS_UPHOT = 2, - ABS_UPPRESSED = 3, - ABS_UPDISABLED = 4, - ABS_DOWNNORMAL = 5, - ABS_DOWNHOT = 6, - ABS_DOWNPRESSED = 7, - ABS_DOWNDISABLED = 8, - ABS_LEFTNORMAL = 9, - ABS_LEFTHOT = 10, - ABS_LEFTPRESSED = 11, - ABS_LEFTDISABLED = 12, - ABS_RIGHTNORMAL = 13, - ABS_RIGHTHOT = 14, - ABS_RIGHTPRESSED = 15, - ABS_RIGHTDISABLED = 16 -}; -enum { - SCRBS_NORMAL = 1, - SCRBS_HOT = 2, - SCRBS_PRESSED = 3, - SCRBS_DISABLED = 4 -}; -enum { - SZB_RIGHTALIGN = 1, - SZB_LEFTALIGN = 2 -}; +BEGIN_TM_CLASS_PARTS(SCROLLBAR) + TM_PART(1, SBP, ARROWBTN) + TM_PART(2, SBP, THUMBBTNHORZ) + TM_PART(3, SBP, THUMBBTNVERT) + TM_PART(4, SBP, LOWERTRACKHORZ) + TM_PART(5, SBP, UPPERTRACKHORZ) + TM_PART(6, SBP, LOWERTRACKVERT) + TM_PART(7, SBP, UPPERTRACKVERT) + TM_PART(8, SBP, GRIPPERHORZ) + TM_PART(9, SBP, GRIPPERVERT) + TM_PART(10, SBP, SIZEBOX) +END_TM_CLASS_PARTS() + +/* SCROLLBAR - ARROWBTN states */ +BEGIN_TM_PART_STATES(ARROWBTN) + TM_STATE(1, ABS, UPNORMAL) + TM_STATE(2, ABS, UPHOT) + TM_STATE(3, ABS, UPPRESSED) + TM_STATE(4, ABS, UPDISABLED) + TM_STATE(5, ABS, DOWNNORMAL) + TM_STATE(6, ABS, DOWNHOT) + TM_STATE(7, ABS, DOWNPRESSED) + TM_STATE(8, ABS, DOWNDISABLED) + TM_STATE(9, ABS, LEFTNORMAL) + TM_STATE(10, ABS, LEFTHOT) + TM_STATE(11, ABS, LEFTPRESSED) + TM_STATE(12, ABS, LEFTDISABLED) + TM_STATE(13, ABS, RIGHTNORMAL) + TM_STATE(14, ABS, RIGHTHOT) + TM_STATE(15, ABS, RIGHTPRESSED) + TM_STATE(16, ABS, RIGHTDISABLED) +END_TM_PART_STATES() + +/* SCROLLBAR - LOWER* / THUMB* / UPPER* states */ +BEGIN_TM_PART_STATES(SCROLLBAR) + TM_STATE(1, SCRBS, NORMAL) + TM_STATE(2, SCRBS, HOT) + TM_STATE(3, SCRBS, PRESSED) + TM_STATE(4, SCRBS, DISABLED) +END_TM_PART_STATES() + +/* SCROLLBAR - SIZEBOX states */ +BEGIN_TM_PART_STATES(SIZEBOX) + TM_STATE(1, SZB, RIGHTALIGN) + TM_STATE(2, SZB, LEFTALIGN) +END_TM_PART_STATES() + /* SPIN parts */ -enum { - SPNP_UP = 1, - SPNP_DOWN = 2, - SPNP_UPHORZ = 3, - SPNP_DOWNHORZ = 4 -}; +BEGIN_TM_CLASS_PARTS(SPIN) + TM_PART(1, SPNP, UP) + TM_PART(2, SPNP, DOWN) + TM_PART(3, SPNP, UPHORZ) + TM_PART(4, SPNP, DOWNHORZ) +END_TM_CLASS_PARTS() + +/* SPIN * states */ +/* See PAGE states */ + /* STARTPANEL parts */ -enum { - SPP_USERPANE = 1, - SPP_MOREPROGRAMS = 2, - SPP_MOREPROGRAMSARROW = 3, - SPP_PROGLIST = 4, - SPP_PROGLISTSEPARATOR = 5, - SPP_PLACESLIST = 6, - SPP_PLACESLISTSEPARATOR = 7, - SPP_LOGOFF = 8, - SPP_LOGOFFBUTTONS = 9, - SPP_USERPICTURE = 10, - SPP_PREVIEW = 11 -}; -enum { - SPLS_NORMAL = 1, - SPLS_HOT = 2, - SPLS_PRESSED = 3 -}; -enum { - SPS_NORMAL = 1, - SPS_HOT = 2, - SPS_PRESSED = 3 -}; +BEGIN_TM_CLASS_PARTS(STARTPANEL) + TM_PART(1, SPP, USERPANE) + TM_PART(2, SPP, MOREPROGRAMS) + TM_PART(3, SPP, MOREPROGRAMSARROW) + TM_PART(4, SPP, PROGLIST) + TM_PART(5, SPP, PROGLISTSEPARATOR) + TM_PART(6, SPP, PLACESLIST) + TM_PART(7, SPP, PLACESLISTSEPARATOR) + TM_PART(8, SPP, LOGOFF) + TM_PART(9, SPP, LOGOFFBUTTONS) + TM_PART(10, SPP, USERPICTURE) + TM_PART(11, SPP, PREVIEW) +END_TM_CLASS_PARTS() + +/* STARTPANEL - MOREPROGRAMSARROW states */ +BEGIN_TM_PART_STATES(MOREPROGRAMSARROW) + TM_STATE(1, SPS, NORMAL) + TM_STATE(2, SPS, HOT) + TM_STATE(3, SPS, PRESSED) +END_TM_PART_STATES() + +/* STARTPANEL - LOGOFFBUTTONS states */ +BEGIN_TM_PART_STATES(LOGOFFBUTTONS) + TM_STATE(1, SPLS, NORMAL) + TM_STATE(2, SPLS, HOT) + TM_STATE(3, SPLS, PRESSED) +END_TM_PART_STATES() + /* STATUS parts */ -enum { - SP_PANE = 1, - SP_GRIPPERPANE = 2, - SP_GRIPPER = 3 -}; +BEGIN_TM_CLASS_PARTS(STATUS) + TM_PART(1, SP, PANE) + TM_PART(2, SP, GRIPPERPANE) + TM_PART(3, SP, GRIPPER) +END_TM_CLASS_PARTS() + /* TAB parts */ -enum { - TABP_TABITEM = 1, - TABP_TABITEMLEFTEDGE = 2, - TABP_TABITEMRIGHTEDGE = 3, - TABP_TABITEMBOTHEDGE = 4, - TABP_TOPTABITEM = 5, - TABP_TOPTABITEMLEFTEDGE = 6, - TABP_TOPTABITEMRIGHTEDGE = 7, - TABP_TOPTABITEMBOTHEDGE = 8, - TABP_PANE = 9, - TABP_BODY = 10 -}; -enum { - TIS_NORMAL = 1, - TIS_HOT = 2, - TIS_SELECTED = 3, - TIS_DISABLED = 4, - TIS_FOCUSED = 5 -}; -enum { - TIBES_NORMAL = 1, - TIBES_HOT = 2, - TIBES_SELECTED = 3, - TIBES_DISABLED = 4, - TIBES_FOCUSED = 5 -}; -enum { - TILES_NORMAL = 1, - TILES_HOT = 2, - TILES_SELECTED = 3, - TILES_DISABLED = 4, - TILES_FOCUSED = 5 -}; -enum { - TIRES_NORMAL = 1, - TIRES_HOT = 2, - TIRES_SELECTED = 3, - TIRES_DISABLED = 4, - TIRES_FOCUSED = 5 -}; -enum { - TTIS_NORMAL = 1, - TTIS_HOT = 2, - TTIS_SELECTED = 3, - TTIS_DISABLED = 4, - TTIS_FOCUSED = 5 -}; -enum { - TTIBES_NORMAL = 1, - TTIBES_HOT = 2, - TTIBES_SELECTED = 3, - TTIBES_DISABLED = 4, - TTIBES_FOCUSED = 5 -}; -enum { - TTILES_NORMAL = 1, - TTILES_HOT = 2, - TTILES_SELECTED = 3, - TTILES_DISABLED = 4, - TTILES_FOCUSED = 5 -}; -enum { - TTIRES_NORMAL = 1, - TTIRES_HOT = 2, - TTIRES_SELECTED = 3, - TTIRES_DISABLED = 4, - TTIRES_FOCUSED = 5 -}; +BEGIN_TM_CLASS_PARTS(TAB) + TM_PART(1, TABP, TABITEM) + TM_PART(2, TABP, TABITEMLEFTEDGE) + TM_PART(3, TABP, TABITEMRIGHTEDGE) + TM_PART(4, TABP, TABITEMBOTHEDGE) + TM_PART(5, TABP, TOPTABITEM) + TM_PART(6, TABP, TOPTABITEMLEFTEDGE) + TM_PART(7, TABP, TOPTABITEMRIGHTEDGE) + TM_PART(8, TABP, TOPTABITEMBOTHEDGE) + TM_PART(9, TABP, PANE) + TM_PART(10, TABP, BODY) +END_TM_CLASS_PARTS() + +/* TAB - TABITEM states */ +BEGIN_TM_PART_STATES(TABITEM) + TM_STATE(1, TIS, NORMAL) + TM_STATE(2, TIS, HOT) + TM_STATE(3, TIS, SELECTED) + TM_STATE(4, TIS, DISABLED) + TM_STATE(5, TIS, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TABITEMLEFTEDGE states */ +BEGIN_TM_PART_STATES(TABITEMLEFTEDGE) + TM_STATE(1, TILES, NORMAL) + TM_STATE(2, TILES, HOT) + TM_STATE(3, TILES, SELECTED) + TM_STATE(4, TILES, DISABLED) + TM_STATE(5, TILES, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TABITEMRIGHTEDGE states */ +BEGIN_TM_PART_STATES(TABITEMRIGHTEDGE) + TM_STATE(1, TIRES, NORMAL) + TM_STATE(2, TIRES, HOT) + TM_STATE(3, TIRES, SELECTED) + TM_STATE(4, TIRES, DISABLED) + TM_STATE(5, TIRES, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TABITEMBOTHEDGES states */ +BEGIN_TM_PART_STATES(TABITEMBOTHEDGES) + TM_STATE(1, TIBES, NORMAL) + TM_STATE(2, TIBES, HOT) + TM_STATE(3, TIBES, SELECTED) + TM_STATE(4, TIBES, DISABLED) + TM_STATE(5, TIBES, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TOPTABITEM states */ +BEGIN_TM_PART_STATES(TOPTABITEM) + TM_STATE(1, TTIS, NORMAL) + TM_STATE(2, TTIS, HOT) + TM_STATE(3, TTIS, SELECTED) + TM_STATE(4, TTIS, DISABLED) + TM_STATE(5, TTIS, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TOPTABITEMLEFTEDGE states */ +BEGIN_TM_PART_STATES(TOPTABITEMLEFTEDGE) + TM_STATE(1, TTILES, NORMAL) + TM_STATE(2, TTILES, HOT) + TM_STATE(3, TTILES, SELECTED) + TM_STATE(4, TTILES, DISABLED) + TM_STATE(5, TTILES, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TOPTABITEMRIGHTEDGE states */ +BEGIN_TM_PART_STATES(TOPTABITEMRIGHTEDGE) + TM_STATE(1, TTIRES, NORMAL) + TM_STATE(2, TTIRES, HOT) + TM_STATE(3, TTIRES, SELECTED) + TM_STATE(4, TTIRES, DISABLED) + TM_STATE(5, TTIRES, FOCUSED) +END_TM_PART_STATES() + +/* TAB - TOPTABITEMBOTHEDGES states */ +BEGIN_TM_PART_STATES(TOPTABITEMBOTHEDGES) + TM_STATE(1, TTIBES, NORMAL) + TM_STATE(2, TTIBES, HOT) + TM_STATE(3, TTIBES, SELECTED) + TM_STATE(4, TTIBES, DISABLED) + TM_STATE(5, TTIBES, FOCUSED) +END_TM_PART_STATES() + /* TASKBAND parts */ -enum { - TDP_GROUPCOUNT = 1, - TDP_FLASHBUTTON = 2, - TDP_FLASHBUTTONGROUPMENU = 3 -}; +BEGIN_TM_CLASS_PARTS(TASKBAND) + TM_PART(1, TDP, GROUPCOUNT) + TM_PART(2, TDP, FLASHBUTTON) + TM_PART(3, TDP, FLASHBUTTONGROUPMENU) +END_TM_CLASS_PARTS() + /* TASKBAR parts */ -enum { - TBP_BACKGROUNDBOTTOM = 1, - TBP_BACKGROUNDRIGHT = 2, - TBP_BACKGROUNDTOP = 3, - TBP_BACKGROUNDLEFT = 4, - TBP_SIZINGBARBOTTOM = 5, - TBP_SIZINGBARRIGHT = 6, - TBP_SIZINGBARTOP = 7, - TBP_SIZINGBARLEFT = 8 -}; +BEGIN_TM_CLASS_PARTS(TASKBAR) + TM_PART(1, TBP, BACKGROUNDBOTTOM) + TM_PART(2, TBP, BACKGROUNDRIGHT) + TM_PART(3, TBP, BACKGROUNDTOP) + TM_PART(4, TBP, BACKGROUNDLEFT) + TM_PART(5, TBP, SIZINGBARBOTTOM) + TM_PART(6, TBP, SIZINGBARRIGHT) + TM_PART(7, TBP, SIZINGBARTOP) + TM_PART(8, TBP, SIZINGBARLEFT) +END_TM_CLASS_PARTS() + /* TOOLBAR parts */ -enum { - TP_BUTTON = 1, - TP_DROPDOWNBUTTON = 2, - TP_SPLITBUTTON = 3, - TP_SPLITBUTTONDROPDOWN = 4, - TP_SEPARATOR = 5, - TP_SEPARATORVERT = 6 -}; -enum { - TS_NORMAL = 1, - TS_HOT = 2, - TS_PRESSED = 3, - TS_DISABLED = 4, - TS_CHECKED = 5, - TS_HOTCHECKED = 6 -}; +BEGIN_TM_CLASS_PARTS(TOOLBAR) + TM_PART(1, TP, BUTTON) + TM_PART(2, TP, DROPDOWNBUTTON) + TM_PART(3, TP, SPLITBUTTON) + TM_PART(4, TP, SPLITBUTTONDROPDOWN) + TM_PART(5, TP, SEPARATOR) + TM_PART(6, TP, SEPARATORVERT) +END_TM_CLASS_PARTS() + +/* TOOLBAR - * states */ +BEGIN_TM_PART_STATES(TOOLBAR) + TM_STATE(1, TS, NORMAL) + TM_STATE(2, TS, HOT) + TM_STATE(3, TS, PRESSED) + TM_STATE(4, TS, DISABLED) + TM_STATE(5, TS, CHECKED) + TM_STATE(6, TS, HOTCHECKED) +END_TM_PART_STATES() + /* TOOLTIP parts */ -enum { - TTP_STANDARD = 1, - TTP_STANDARDTITLE = 2, - TTP_BALLOON = 3, - TTP_BALLOONTITLE = 4, - TTP_CLOSE = 5 -}; -enum { - TTBS_NORMAL = 1, - TTBS_LINK = 2 -}; -enum { - TTCS_NORMAL = 1, - TTCS_HOT = 2, - TTCS_PRESSED = 3 -}; -enum { - TTSS_NORMAL = 1, - TTSS_LINK = 2 -}; +BEGIN_TM_CLASS_PARTS(TOOLTIP) + TM_PART(1, TTP, STANDARD) + TM_PART(2, TTP, STANDARDTITLE) + TM_PART(3, TTP, BALLOON) + TM_PART(4, TTP, BALLOONTITLE) + TM_PART(5, TTP, CLOSE) +END_TM_CLASS_PARTS() + +/* TOOLTIP - STANDARD states */ +BEGIN_TM_PART_STATES(STANDARD) + TM_STATE(1, TTSS, NORMAL) + TM_STATE(2, TTSS, LINK) +END_TM_PART_STATES() + +/* TOOLTIP - STANDARDTITLE states */ +/* See TOOLTIP STANDARD */ + +/* TOOLTIP - BALLOON states */ +BEGIN_TM_PART_STATES(BALLOON) + TM_STATE(1, TTBS, NORMAL) + TM_STATE(2, TTBS, LINK) +END_TM_PART_STATES() + +/* TOOLTIP - BALLOONTITLE states */ +/* See TOOLTIP BALLOON */ + +/* TOOLTIP - CLOSE states */ +BEGIN_TM_PART_STATES(CLOSE) + TM_STATE(1, TTCS, NORMAL) + TM_STATE(2, TTCS, HOT) + TM_STATE(3, TTCS, PRESSED) +END_TM_PART_STATES() + /* TRACKBAR parts */ -enum { - TKP_TRACK = 1, - TKP_TRACKVERT = 2, - TKP_THUMB = 3, - TKP_THUMBBOTTOM = 4, - TKP_THUMBTOP = 5, - TKP_THUMBVERT = 6, - TKP_THUMBLEFT = 7, - TKP_THUMBRIGHT = 8, - TKP_TICS = 9, - TKP_TICSVERT = 10 -}; -enum { - TUS_NORMAL = 1, - TUS_HOT = 2, - TUS_PRESSED = 3, - TUS_FOCUSED = 4, - TUS_DISABLED = 5 -}; -enum { - TUBS_NORMAL = 1, - TUBS_HOT = 2, - TUBS_PRESSED = 3, - TUBS_FOCUSED = 4, - TUBS_DISABLED = 5 -}; -enum { - TUVLS_NORMAL = 1, - TUVLS_HOT = 2, - TUVLS_PRESSED = 3, - TUVLS_FOCUSED = 4, - TUVLS_DISABLED = 5 -}; -enum { - TUVRS_NORMAL = 1, - TUVRS_HOT = 2, - TUVRS_PRESSED = 3, - TUVRS_FOCUSED = 4, - TUVRS_DISABLED = 5 -}; -enum { - TUTS_NORMAL = 1, - TUTS_HOT = 2, - TUTS_PRESSED = 3, - TUTS_FOCUSED = 4, - TUTS_DISABLED = 5 -}; -enum { - TUVS_NORMAL = 1, - TUVS_HOT = 2, - TUVS_PRESSED = 3, - TUVS_FOCUSED = 4, - TUVS_DISABLED = 5 -}; -enum { - TSS_NORMAL = 1 -}; -enum { - TSVS_NORMAL = 1 -}; -enum { - TRS_NORMAL = 1 -}; -enum { - TRVS_NORMAL = 1 -}; +BEGIN_TM_CLASS_PARTS(TRACKBAR) + TM_PART(1, TKP, TRACK) + TM_PART(2, TKP, TRACKVERT) + TM_PART(3, TKP, THUMB) + TM_PART(4, TKP, THUMBBOTTOM) + TM_PART(5, TKP, THUMBTOP) + TM_PART(6, TKP, THUMBVERT) + TM_PART(7, TKP, THUMBLEFT) + TM_PART(8, TKP, THUMBRIGHT) + TM_PART(9, TKP, TICS) + TM_PART(10, TKP, TICSVERT) +END_TM_CLASS_PARTS() + +/* TRACKBAR states */ +BEGIN_TM_PART_STATES(TRACKBAR) + TM_STATE(1, TKS, NORMAL) +END_TM_PART_STATES() + +/* TRACKBAR - TRACK states */ +BEGIN_TM_PART_STATES(TRACK) + TM_STATE(1, TRS, NORMAL) +END_TM_PART_STATES() + +/* TRACKBAR - TRACKVERT states */ +BEGIN_TM_PART_STATES(TRACKVERT) + TM_STATE(1, TRVS, NORMAL) +END_TM_PART_STATES() + +/* TRACKBAR - THUMB states */ +BEGIN_TM_PART_STATES(THUMB) + TM_STATE(1, TUS, NORMAL) + TM_STATE(2, TUS, HOT) + TM_STATE(3, TUS, PRESSED) + TM_STATE(4, TUS, FOCUSED) + TM_STATE(5, TUS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - THUMBBOTTOM states */ +BEGIN_TM_PART_STATES(THUMBBOTTOM) + TM_STATE(1, TUBS, NORMAL) + TM_STATE(2, TUBS, HOT) + TM_STATE(3, TUBS, PRESSED) + TM_STATE(4, TUBS, FOCUSED) + TM_STATE(5, TUBS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - THUMBTOP states */ +BEGIN_TM_PART_STATES(THUMBTOP) + TM_STATE(1, TUTS, NORMAL) + TM_STATE(2, TUTS, HOT) + TM_STATE(3, TUTS, PRESSED) + TM_STATE(4, TUTS, FOCUSED) + TM_STATE(5, TUTS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - THUMBVERT states */ +BEGIN_TM_PART_STATES(THUMBVERT) + TM_STATE(1, TUVS, NORMAL) + TM_STATE(2, TUVS, HOT) + TM_STATE(3, TUVS, PRESSED) + TM_STATE(4, TUVS, FOCUSED) + TM_STATE(5, TUVS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - THUMBLEFT states */ +BEGIN_TM_PART_STATES(THUMBLEFT) + TM_STATE(1, TUVLS, NORMAL) + TM_STATE(2, TUVLS, HOT) + TM_STATE(3, TUVLS, PRESSED) + TM_STATE(4, TUVLS, FOCUSED) + TM_STATE(5, TUVLS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - THUMBRIGHT states */ +BEGIN_TM_PART_STATES(THUMBRIGHT) + TM_STATE(1, TUVRS, NORMAL) + TM_STATE(2, TUVRS, HOT) + TM_STATE(3, TUVRS, PRESSED) + TM_STATE(4, TUVRS, FOCUSED) + TM_STATE(5, TUVRS, DISABLED) +END_TM_PART_STATES() + +/* TRACKBAR - TICS states */ +BEGIN_TM_PART_STATES(TICS) + TM_STATE(1, TSS, NORMAL) +END_TM_PART_STATES() + +/* TRACKBAR - TICSVERT states */ +BEGIN_TM_PART_STATES(TICSVERT) + TM_STATE(1, TSVS, NORMAL) +END_TM_PART_STATES() + /* TRAYNOTIFY parts */ -enum { - TNP_BACKGROUND = 1, - TNP_ANIMBACKGROUND = 2 -}; +BEGIN_TM_CLASS_PARTS(TRAYNOTIFY) + TM_PART(1, TNP, BACKGROUND) + TM_PART(2, TNP, ANIMBACKGROUND) +END_TM_CLASS_PARTS() + /* TREEVIEW parts */ -enum { - TVP_TREEITEM = 1, - TVP_GLYPH = 2, - TVP_BRANCH = 3 -}; -enum { - GLPS_CLOSED = 1, - GLPS_OPENED = 2 -}; -enum { - TREIS_NORMAL = 1, - TREIS_HOT = 2, - TREIS_SELECTED = 3, - TREIS_DISABLED = 4, - TREIS_SELECTEDNOTFOCUS = 5 -}; +BEGIN_TM_CLASS_PARTS(TREEVIEW) + TM_PART(1, TVP, TREEITEM) + TM_PART(2, TVP, GLYPH) + TM_PART(3, TVP, BRANCH) +END_TM_CLASS_PARTS() + +/* TREEVIEW - TREEITEM states */ +BEGIN_TM_PART_STATES(TREEITEM) + TM_STATE(1, TREIS, NORMAL) + TM_STATE(2, TREIS, HOT) + TM_STATE(3, TREIS, SELECTED) + TM_STATE(4, TREIS, DISABLED) + TM_STATE(5, TREIS, SELECTEDNOTFOCUS) +END_TM_PART_STATES() + +/* TREEVIEW - GLYPH states */ +BEGIN_TM_PART_STATES(GLYPH) + TM_STATE(1, GLPS, CLOSED) + TM_STATE(2, GLPS, OPENED) +END_TM_PART_STATES() + /* WINDOW parts */ -enum { - WP_CAPTION = 1, - WP_SMALLCAPTION = 2, - WP_MINCAPTION = 3, - WP_SMALLMINCAPTION = 4, - WP_MAXCAPTION = 5, - WP_SMALLMAXCAPTION = 6, - WP_FRAMELEFT = 7, - WP_FRAMERIGHT = 8, - WP_FRAMEBOTTOM = 9, - WP_SMALLFRAMELEFT = 10, - WP_SMALLFRAMERIGHT = 11, - WP_SMALLFRAMEBOTTOM = 12, - WP_SYSBUTTON = 13, - WP_MDISYSBUTTON = 14, - WP_MINBUTTON = 15, - WP_MDIMINBUTTON = 16, - WP_MAXBUTTON = 17, - WP_CLOSEBUTTON = 18, - WP_SMALLCLOSEBUTTON = 19, - WP_MDICLOSEBUTTON = 20, - WP_RESTOREBUTTON = 21, - WP_MDIRESTOREBUTTON = 22, - WP_HELPBUTTON = 23, - WP_MDIHELPBUTTON = 24, - WP_HORZSCROLL = 25, - WP_HORZTHUMB = 26, - WP_VERTSCROLL = 27, - WP_VERTTHUMB = 28, - WP_DIALOG = 29, - WP_CAPTIONSIZINGTEMPLATE = 30, - WP_SMALLCAPTIONSIZINGTEMPLATE = 31, - WP_FRAMELEFTSIZINGTEMPLATE = 32, - WP_SMALLFRAMELEFTSIZINGTEMPLATE = 33, - WP_FRAMERIGHTSIZINGTEMPLATE = 34, - WP_SMALLFRAMERIGHTSIZINGTEMPLATE = 35, - WP_FRAMEBOTTOMSIZINGTEMPLATE = 36, - WP_SMALLFRAMEBOTTOMSIZINGTEMPLATE = 37 -}; -enum { - CS_ACTIVE = 1, - CS_INACTIVE = 2, - CS_DISABLED = 3 -}; -enum { - CBS_NORMAL = 1, - CBS_HOT = 2, - CBS_PUSHED = 3, - CBS_DISABLED = 4 -}; -enum { - FS_ACTIVE = 1, - FS_INACTIVE = 2 -}; -enum { - HBS_NORMAL = 1, - HBS_HOT = 2, - HBS_PUSHED = 3, - HBS_DISABLED = 4 -}; -enum { - HSS_NORMAL = 1, - HSS_HOT = 2, - HSS_PUSHED = 3, - HSS_DISABLED = 4 -}; -enum { - HTS_NORMAL = 1, - HTS_HOT = 2, - HTS_PUSHED = 3, - HTS_DISABLED = 4 -}; -enum { - MAXBS_NORMAL = 1, - MAXBS_HOT = 2, - MAXBS_PUSHED = 3, - MAXBS_DISABLED = 4 -}; -enum { - MXCS_ACTIVE = 1, - MXCS_INACTIVE = 2, - MXCS_DISABLED = 3 -}; -enum { - MINBS_NORMAL = 1, - MINBS_HOT = 2, - MINBS_PUSHED = 3, - MINBS_DISABLED = 4 -}; -enum { - RBS_NORMAL = 1, - RBS_HOT = 2, - RBS_PUSHED = 3, - RBS_DISABLED = 4 -}; -enum { - SBS_NORMAL = 1, - SBS_HOT = 2, - SBS_PUSHED = 3, - SBS_DISABLED = 4 -}; -enum { - MNCS_ACTIVE = 1, - MNCS_INACTIVE = 2, - MNCS_DISABLED = 3 -}; -enum { - VSS_NORMAL = 1, - VSS_HOT = 2, - VSS_PUSHED = 3, - VSS_DISABLED = 4 -}; -enum { - VTS_NORMAL = 1, - VTS_HOT = 2, - VTS_PUSHED = 3, - VTS_DISABLED = 4 -}; +BEGIN_TM_CLASS_PARTS(WINDOW) + TM_PART(1, WP, CAPTION) + TM_PART(2, WP, SMALLCAPTION) + TM_PART(3, WP, MINCAPTION) + TM_PART(4, WP, SMALLMINCAPTION) + TM_PART(5, WP, MAXCAPTION) + TM_PART(6, WP, SMALLMAXCAPTION) + TM_PART(7, WP, FRAMELEFT) + TM_PART(8, WP, FRAMERIGHT) + TM_PART(9, WP, FRAMEBOTTOM) + TM_PART(10, WP, SMALLFRAMELEFT) + TM_PART(11, WP, SMALLFRAMERIGHT) + TM_PART(12, WP, SMALLFRAMEBOTTOM) + TM_PART(13, WP, SYSBUTTON) + TM_PART(14, WP, MDISYSBUTTON) + TM_PART(15, WP, MINBUTTON) + TM_PART(16, WP, MDIMINBUTTON) + TM_PART(17, WP, MAXBUTTON) + TM_PART(18, WP, CLOSEBUTTON) + TM_PART(19, WP, SMALLCLOSEBUTTON) + TM_PART(20, WP, MDICLOSEBUTTON) + TM_PART(21, WP, RESTOREBUTTON) + TM_PART(22, WP, MDIRESTOREBUTTON) + TM_PART(23, WP, HELPBUTTON) + TM_PART(24, WP, MDIHELPBUTTON) + TM_PART(25, WP, HORZSCROLL) + TM_PART(26, WP, HORZTHUMB) + TM_PART(27, WP, VERTSCROLL) + TM_PART(28, WP, VERTTHUMB) + TM_PART(29, WP, DIALOG) + TM_PART(30, WP, CAPTIONSIZINGTEMPLATE) + TM_PART(31, WP, SMALLCAPTIONSIZINGTEMPLATE) + TM_PART(32, WP, FRAMELEFTSIZINGTEMPLATE) + TM_PART(33, WP, SMALLFRAMELEFTSIZINGTEMPLATE) + TM_PART(34, WP, FRAMERIGHTSIZINGTEMPLATE) + TM_PART(35, WP, SMALLFRAMERIGHTSIZINGTEMPLATE) + TM_PART(36, WP, FRAMEBOTTOMSIZINGTEMPLATE) + TM_PART(37, WP, SMALLFRAMEBOTTOMSIZINGTEMPLATE) +END_TM_CLASS_PARTS() + +/* WINDOW - CAPTION / SMALLCAPTION states */ +BEGIN_TM_PART_STATES(CAPTION) + TM_STATE(1, CS, ACTIVE) + TM_STATE(2, CS, INACTIVE) + TM_STATE(3, CS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - MINCAPTION / SMALLMINCAPTION states */ +BEGIN_TM_PART_STATES(MINCAPTION) + TM_STATE(1, MNCS, ACTIVE) + TM_STATE(2, MNCS, INACTIVE) + TM_STATE(3, MNCS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - MAXCAPTION / SMALLMAXCAPTION states */ +BEGIN_TM_PART_STATES(MAXCAPTION) + TM_STATE(1, MXCS, ACTIVE) + TM_STATE(2, MXCS, INACTIVE) + TM_STATE(3, MXCS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - FRAME* / SMALLFRAME* states */ +BEGIN_TM_PART_STATES(FRAME) + TM_STATE(1, FS, ACTIVE) + TM_STATE(2, FS, INACTIVE) +END_TM_PART_STATES() + +/* WINDOW - SYSBUTTON / MDISYSBUTTON states */ +BEGIN_TM_PART_STATES(SYSBUTTON) + TM_STATE(1, SBS, NORMAL) + TM_STATE(2, SBS, HOT) + TM_STATE(3, SBS, PUSHED) + TM_STATE(4, SBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - MINBUTTON / MDIMINBUTTON states */ +BEGIN_TM_PART_STATES(MINBUTTON) + TM_STATE(1, MINBS, NORMAL) + TM_STATE(2, MINBS, HOT) + TM_STATE(3, MINBS, PUSHED) + TM_STATE(4, MINBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - MAXBUTTON states */ +BEGIN_TM_PART_STATES(MAXBUTTON) + TM_STATE(1, MAXBS, NORMAL) + TM_STATE(2, MAXBS, HOT) + TM_STATE(3, MAXBS, PUSHED) + TM_STATE(4, MAXBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - CLOSEBUTTON / SMALLCLOSEBUTTON / MDICLOSEBUTTON states */ +BEGIN_TM_PART_STATES(CLOSEBUTTON) + TM_STATE(1, CBS, NORMAL) + TM_STATE(2, CBS, HOT) + TM_STATE(3, CBS, PUSHED) + TM_STATE(4, CBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - RESTOREBUTTON / MDIRESTOREBUTTON states */ +BEGIN_TM_PART_STATES(RESTOREBUTTON) + TM_STATE(1, RBS, NORMAL) + TM_STATE(2, RBS, HOT) + TM_STATE(3, RBS, PUSHED) + TM_STATE(4, RBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - HELPBUTTON / MDIHELPBUTTON states */ +BEGIN_TM_PART_STATES(HELPBUTTON) + TM_STATE(1, HBS, NORMAL) + TM_STATE(2, HBS, HOT) + TM_STATE(3, HBS, PUSHED) + TM_STATE(4, HBS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - HORZSCROLL states */ +BEGIN_TM_PART_STATES(HORZSCROLL) + TM_STATE(1, HSS, NORMAL) + TM_STATE(2, HSS, HOT) + TM_STATE(3, HSS, PUSHED) + TM_STATE(4, HSS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - HORZTHUMB states */ +BEGIN_TM_PART_STATES(HORZTHUMB) + TM_STATE(1, HTS, NORMAL) + TM_STATE(2, HTS, HOT) + TM_STATE(3, HTS, PUSHED) + TM_STATE(4, HTS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - VERTSCROLL states */ +BEGIN_TM_PART_STATES(VERTSCROLL) + TM_STATE(1, VSS, NORMAL) + TM_STATE(2, VSS, HOT) + TM_STATE(3, VSS, PUSHED) + TM_STATE(4, VSS, DISABLED) +END_TM_PART_STATES() + +/* WINDOW - VERTTHUMB states */ +BEGIN_TM_PART_STATES(VERTTHUMB) + TM_STATE(1, VTS, NORMAL) + TM_STATE(2, VTS, HOT) + TM_STATE(3, VTS, PUSHED) + TM_STATE(4, VTS, DISABLED) +END_TM_PART_STATES() + +END_TM_SCHEMA(ThemeMgrSchema) #endif diff --git a/reactos/w32api/include/uxtheme.h b/reactos/w32api/include/uxtheme.h index 9dc278a5421..7119d2a1a46 100644 --- a/reactos/w32api/include/uxtheme.h +++ b/reactos/w32api/include/uxtheme.h @@ -4,6 +4,8 @@ #pragma GCC system_header #endif +#include + #ifdef __cplusplus extern "C" { #endif @@ -45,7 +47,7 @@ typedef enum THEMESIZE { TS_MIN, TS_TRUE, TS_DRAW -} THEME_SIZE; +} THEMESIZE; typedef struct _DTBGOPTS { DWORD dwSize; DWORD dwFlags; @@ -83,12 +85,12 @@ HRESULT WINAPI GetThemeColor(HTHEME,int,int,int,COLORREF*); HRESULT WINAPI GetThemeDocumentationProperty(LPCWSTR,LPCWSTR,LPWSTR,int); HRESULT WINAPI GetThemeEnumValue(HTHEME,int,int,int,int*); HRESULT WINAPI GetThemeFilename(HTHEME,int,int,int,LPWSTR,int); -HRESULT WINAPI GetThemeFont(HTHEME,HDC,int,int,int,LOGFONT*); +HRESULT WINAPI GetThemeFont(HTHEME,HDC,int,int,int,LOGFONTW*); HRESULT WINAPI GetThemeInt(HTHEME,int,int,int,int*); HRESULT WINAPI GetThemeIntList(HTHEME,int,int,int,INTLIST*); HRESULT WINAPI GetThemeMargins(HTHEME,HDC,int,int,int,RECT*,MARGINS*); HRESULT WINAPI GetThemeMetric(HTHEME,HDC,int,int,int,int*); -HRESULT WINAPI GetThemePartSize(HTHEME,HDC,int,int,RECT*,THEME_SIZE,SIZE*); +HRESULT WINAPI GetThemePartSize(HTHEME,HDC,int,int,RECT*,THEMESIZE,SIZE*); HRESULT WINAPI GetThemePosition(HTHEME,int,int,int,POINT*); HRESULT WINAPI GetThemePropertyOrigin(HTHEME,int,int,int,PROPERTYORIGIN*); HRESULT WINAPI GetThemeRect(HTHEME,int,int,int,RECT*); @@ -96,12 +98,12 @@ HRESULT WINAPI GetThemeString(HTHEME,int,int,int,LPWSTR,int); BOOL WINAPI GetThemeSysBool(HTHEME,int); COLORREF WINAPI GetThemeSysColor(HTHEME,int); HBRUSH WINAPI GetThemeSysColorBrush(HTHEME,int); -HRESULT WINAPI GetThemeSysFont(HTHEME,int,LOGFONT*); +HRESULT WINAPI GetThemeSysFont(HTHEME,int,LOGFONTW*); HRESULT WINAPI GetThemeSysInt(HTHEME,int,int*); int WINAPI GetThemeSysSize(HTHEME,int); HRESULT WINAPI GetThemeSysString(HTHEME,int,LPWSTR,int); HRESULT WINAPI GetThemeTextExtent(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,const RECT*,RECT*); -HRESULT WINAPI GetThemeTextMetrics(HTHEME,HDC,int,int,TEXTMETRIC*); +HRESULT WINAPI GetThemeTextMetrics(HTHEME,HDC,int,int,TEXTMETRICW*); HTHEME WINAPI GetWindowTheme(HWND); HRESULT WINAPI HitTestThemeBackground(HTHEME,HDC,int,int,DWORD,const RECT*,HRGN,POINT,WORD*); BOOL WINAPI IsAppThemed(); diff --git a/reactos/w32api/include/winbase.h b/reactos/w32api/include/winbase.h index 309e532b222..48ea3066442 100644 --- a/reactos/w32api/include/winbase.h +++ b/reactos/w32api/include/winbase.h @@ -1039,7 +1039,7 @@ typedef void(CALLBACK *PTIMERAPCROUTINE)(PVOID,DWORD,DWORD); #if (_WIN32_WINNT >= 0x0500) typedef void(CALLBACK *WAITORTIMERCALLBACK)(PVOID,BOOLEAN); #endif -#define MAKEINTATOM(i) (LPTSTR)((DWORD)((WORD)(i))) +#define MAKEINTATOM(i) (LPTSTR)((ULONG_PTR)((WORD)(i))) /* Functions */ #ifndef UNDER_CE int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int); diff --git a/reactos/w32api/include/winuser.h b/reactos/w32api/include/winuser.h index 7e5ab9a8127..8593f695398 100644 --- a/reactos/w32api/include/winuser.h +++ b/reactos/w32api/include/winuser.h @@ -1159,7 +1159,9 @@ extern "C" { #define SPI_GETSCREENSAVEACTIVE 16 #define SPI_GETSCREENSAVETIMEOUT 14 #define SPI_GETSERIALKEYS 62 +#define SPI_GETSHOWIMEUI 110 #define SPI_GETSHOWSOUNDS 56 +#define SPI_GETSNAPTODEFBUTTON 95 #define SPI_GETSOUNDSENTRY 64 #define SPI_GETSTICKYKEYS 58 #define SPI_GETTOGGLEKEYS 52 @@ -1220,7 +1222,9 @@ extern "C" { #define SPI_SETSCREENSAVERRUNNING 97 #define SPI_SETSCREENSAVETIMEOUT 15 #define SPI_SETSERIALKEYS 63 +#define SPI_SETSHOWIMEUI 111 #define SPI_SETSHOWSOUNDS 57 +#define SPI_SETSNAPTODEFBUTTON 96 #define SPI_SETSOUNDSENTRY 65 #define SPI_SETSTICKYKEYS 59 #define SPI_SETTOGGLEKEYS 53 @@ -1232,8 +1236,12 @@ extern "C" { #define SPI_GETSCREENSAVERRUNNING 114 #define SPI_GETACTIVEWINDOWTRACKING 0x1000 #define SPI_GETACTIVEWNDTRKZORDER 0x100C +#define SPI_GETCARETWIDTH 0x2006 #define SPI_GETCOMBOBOXANIMATION 0x1004 #define SPI_GETCURSORSHADOW 0x101A +#define SPI_GETDROPSHADOW 0x1024 +#define SPI_GETFOREGROUNDFLASHCOUNT 0x2004 +#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 #define SPI_GETGRADIENTCAPTIONS 0x1008 #define SPI_GETHOTTRACKING 0x100E #define SPI_GETKEYBOARDCUES 0x100A @@ -1244,8 +1252,12 @@ extern "C" { #define SPI_GETSELECTIONFADE 0x1014 #define SPI_GETTOOLTIPANIMATION 0x1016 #define SPI_GETTOOLTIPFADE 0x1018 +#define SPI_SETCARETWIDTH 0x2007 #define SPI_SETCOMBOBOXANIMATION 0x1005 #define SPI_SETCURSORSHADOW 0x101B +#define SPI_SETDROPSHADOW 0x1025 +#define SPI_SETFOREGROUNDFLASHCOUNT 0x2005 +#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 #define SPI_SETGRADIENTCAPTIONS 0x1009 #define SPI_SETHOTTRACKING 0x100F #define SPI_SETKEYBOARDCUES 0x100B @@ -1263,8 +1275,18 @@ extern "C" { #define FE_FONTSMOOTHINGSTANDARD 1 #define FE_FONTSMOOTHINGCLEARTYPE 2 #define FE_FONTSMOOTHINGDOCKING 32768 +#define SPI_GETBLOCKSENDINPUTRESETS 0x1026 +#define SPI_SETBLOCKSENDINPUTRESETS 0x1027 +#define SPI_GETUIEFFECTS 0x103E +#define SPI_SETUIEFFECTS 0x103F #define SPI_GETMOUSECLICKLOCKTIME 8200 #define SPI_SETMOUSECLICKLOCKTIME 8201 +#define SPI_GETMOUSESONAR 0x101C +#define SPI_SETMOUSESONAR 0x101D +#define SPI_GETMOUSEVANISH 0x1020 +#define SPI_SETMOUSEVANISH 0x1021 +#define SPI_GETFLATMENU 0x1022 +#define SPI_SETFLATMENU 0x1023 #define SPI_GETFONTSMOOTHINGTYPE 8202 #define SPI_SETFONTSMOOTHINGTYPE 8203 #define SPI_GETFONTSMOOTHINGCONTRAST 8204 @@ -1488,6 +1510,10 @@ extern "C" { #define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam)) #define WHEEL_PAGESCROLL UINT_MAX #endif +#if (_WIN32_WINNT >= 0x0501) +#define WM_THEMECHANGED 794 +#endif + #define BM_CLICK 245 #define BM_GETCHECK 240 #define BM_GETIMAGE 246