ReactOS 0.4.16-dev-1946-g52006dd
theme.c File Reference
#include "desk.h"
#include <shlwapi.h>
#include <uxtheme.h>
#include <uxundoc.h>
#include <vssym32.h>
Include dependency graph for theme.c:

Go to the source code of this file.

Macros

#define SYS_CONFIG(__uiAction, __uiParam, __pvParam)    SystemParametersInfoW(__uiAction, __uiParam, __pvParam, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
 

Typedefs

typedef HRESULT(WINAPIENUMTHEMESTYLE) (LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)
 

Functions

VOID SchemeSetMetric (IN COLOR_SCHEME *scheme, int id, int value)
 
int SchemeGetMetric (IN COLOR_SCHEME *scheme, int id)
 
PLOGFONTW SchemeGetFont (IN COLOR_SCHEME *scheme, int id)
 
BOOL LoadCurrentScheme (OUT COLOR_SCHEME *scheme)
 
BOOL LoadSchemeFromReg (OUT COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
 
VOID ApplyScheme (IN COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
 
static THEMECreateTheme (LPCWSTR pszName, LPCWSTR pszDisplayName)
 
static PTHEME_STYLE CreateStyle (LPCWSTR pszName, LPCWSTR pszDisplayName)
 
static void CleanupStyles (IN PTHEME_STYLE pStylesList)
 
void CleanupThemes (IN PTHEME pThemeList)
 
static PTHEME_STYLE FindStyle (IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
 
static PTHEME_STYLE LoadSchemeSizes (IN HKEY hkScheme)
 
static THEME_STYLELoadClassicColorSchemes (VOID)
 
static THEME_STYLEEnumThemeStyles (IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
 
PTHEME LoadTheme (IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName)
 
BOOL CALLBACK EnumThemeProc (IN LPVOID lpReserved, IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName, IN LPCWSTR pszToolTip, IN LPVOID lpReserved2, IN OUT LPVOID lpData)
 
PTHEME LoadThemes (VOID)
 
BOOL FindOrAppendTheme (IN PTHEME pThemeList, IN LPCWSTR pwszThemeFileName, IN LPCWSTR pwszColorBuff, IN LPCWSTR pwszSizeBuff, OUT PTHEME_SELECTION pSelectedTheme)
 
BOOL GetActiveTheme (IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
 
BOOL GetActiveClassicTheme (IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
 
BOOL ActivateTheme (IN PTHEME_SELECTION pSelectedTheme)
 
BOOL LoadSchemeFromTheme (OUT PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme)
 
BOOL DrawThemePreview (IN HDC hdcMem, IN PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme, IN PRECT prcWindow)
 
BOOL ActivateThemeFile (LPCWSTR pwszFile)
 
INT_PTR CALLBACK ThemesPageProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 

Variables

static const WCHAR g_CPColors [] = L"Control Panel\\Colors"
 
static const WCHAR g_CPANewSchemes [] = L"Control Panel\\Appearance\\New Schemes"
 
static const WCHAR g_CPMetrics [] = L"Control Panel\\Desktop\\WindowMetrics"
 
static const WCHAR g_SelectedStyle [] = L"SelectedStyle"
 
static const WCHARg_RegColorNames [NUM_COLORS]
 

Macro Definition Documentation

◆ SYS_CONFIG

#define SYS_CONFIG (   __uiAction,
  __uiParam,
  __pvParam 
)     SystemParametersInfoW(__uiAction, __uiParam, __pvParam, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)

Typedef Documentation

◆ ENUMTHEMESTYLE

typedef HRESULT(WINAPI * ENUMTHEMESTYLE) (LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)

Definition at line 697 of file theme.c.

Function Documentation

◆ ActivateTheme()

BOOL ActivateTheme ( IN PTHEME_SELECTION  pSelectedTheme)

Definition at line 924 of file theme.c.

925{
926 HTHEMEFILE hThemeFile = 0;
927 HRESULT hret;
928
929 if (pSelectedTheme->ThemeActive)
930 {
931 hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName,
932 pSelectedTheme->Color->StyleName,
933 pSelectedTheme->Size->StyleName,
934 &hThemeFile,
935 0);
936
937 if (!SUCCEEDED(hret)) return FALSE;
938 }
939
940 hret = ApplyTheme(hThemeFile, 0, 0);
941
942 if (pSelectedTheme->ThemeActive)
943 {
944 CloseThemeFile(hThemeFile);
945 }
946
947 return SUCCEEDED(hret);
948}
#define FALSE
Definition: types.h:117
HRESULT WINAPI ApplyTheme(HTHEMEFILE hThemeFile, char *unknown, HWND hWnd)
Definition: system.c:1237
HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, LPCWSTR pszSizeName, HTHEMEFILE *hThemeFile, DWORD unknown)
Definition: system.c:1187
HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile)
Definition: system.c:1213
#define SUCCEEDED(hr)
Definition: intsafe.h:50

Referenced by ActivateThemeFile().

◆ ActivateThemeFile()

BOOL ActivateThemeFile ( LPCWSTR  pwszFile)

Definition at line 1028 of file theme.c.

1029{
1030 PTHEME pThemes;
1033 BOOL ret = FALSE;
1034
1035 pThemes = LoadThemes();
1036 if (!pThemes)
1037 return FALSE;
1038
1040
1041 if (pwszFile)
1042 {
1043 ret = FindOrAppendTheme(pThemes, pwszFile, NULL, NULL, &selection);
1044 if (!ret)
1045 goto cleanup;
1046
1048 if (!ret)
1049 goto cleanup;
1050 }
1051 else
1052 {
1053 ret = GetActiveClassicTheme(pThemes, &selection);
1054 if (!ret)
1055 goto cleanup;
1056
1058 if (!ret)
1059 goto cleanup;
1060 }
1061
1063 if (!ret)
1064 goto cleanup;
1065
1067
1068 ret = TRUE;
1069
1070cleanup:
1071 CleanupThemes(pThemes);
1072
1073 return ret;
1074}
int selection
Definition: ctm.c:92
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
void CleanupThemes(IN PTHEME pThemeList)
Definition: theme.c:540
BOOL FindOrAppendTheme(IN PTHEME pThemeList, IN LPCWSTR pwszThemeFileName, IN LPCWSTR pwszColorBuff, IN LPCWSTR pwszSizeBuff, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:804
BOOL LoadSchemeFromTheme(OUT PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:951
BOOL GetActiveClassicTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:882
BOOL ActivateTheme(IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:924
VOID ApplyScheme(IN COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:330
PTHEME LoadThemes(VOID)
Definition: theme.c:762
BOOL LoadSchemeFromReg(OUT COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:243
BOOL LoadCurrentScheme(OUT COLOR_SCHEME *scheme)
Definition: theme.c:122
static void cleanup(void)
Definition: main.c:1335
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
DWORD scheme

Referenced by DisplayApplet().

◆ ApplyScheme()

VOID ApplyScheme ( IN COLOR_SCHEME scheme,
IN PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 330 of file theme.c.

331{
332 INT i, Result;
333 HKEY hKey;
334 WCHAR clText[16], *StyleName;
335 INT ColorList[NUM_COLORS];
336
337 /* Apply system colors */
338 for (i = 0; i < NUM_COLORS; i++)
339 ColorList[i] = i;
340 SetSysColors(NUM_COLORS, ColorList, scheme->crColor);
341
342 /* Save colors to registry */
344 if (Result == ERROR_SUCCESS)
345 {
346 for (i = 0; i < NUM_COLORS; i++)
347 {
348 wsprintf(clText,
349 L"%d %d %d",
350 GetRValue(scheme->crColor[i]),
351 GetGValue(scheme->crColor[i]),
352 GetBValue(scheme->crColor[i]));
353
356 0,
357 REG_SZ,
358 (BYTE *)clText,
359 (lstrlen(clText) + 1) * sizeof(WCHAR));
360 }
362 }
363
364 /* Apply non client metrics */
365 SystemParametersInfoW(SPI_SETNONCLIENTMETRICS,
366 sizeof(NONCLIENTMETRICS),
367 &scheme->ncMetrics,
369
370 /* Apply icon metrics */
371 SystemParametersInfoW(SPI_SETICONMETRICS,
372 sizeof(ICONMETRICS),
373 &scheme->icMetrics,
375
376 /* Effects, save only when needed: */
377 /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
378 * Just keep them in sync for now.
379 */
380
381#define SYS_CONFIG(__uiAction, __uiParam, __pvParam) \
382 SystemParametersInfoW(__uiAction, __uiParam, __pvParam, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
383
384 scheme->Effects.bTooltipAnimation = scheme->Effects.bMenuAnimation;
385 scheme->Effects.bTooltipFade = scheme->Effects.bMenuFade;
386
387 /* Use the following transition effect for menus and tooltips */
388 SYS_CONFIG(SPI_SETMENUANIMATION, 0, IntToPtr(scheme->Effects.bMenuAnimation));
389 SYS_CONFIG(SPI_SETMENUFADE, 0, IntToPtr(scheme->Effects.bMenuFade));
390
391 /* Use the following method to smooth edges of screen fonts */
392 SYS_CONFIG(SPI_SETFONTSMOOTHING, scheme->Effects.bFontSmoothing, 0);
393 SYS_CONFIG(SPI_SETFONTSMOOTHINGTYPE, 0, IntToPtr(scheme->Effects.uiFontSmoothingType));
394
395 /*
396 * Refresh and redraw all the windows, otherwise the font smoothing changes
397 * only appear after any future partial region invalidation.
398 * Not everyone listens for this WM_SETTINGCHANGE, including the shell and most third party programs.
399 */
401
402 /* Use large icons */
403 //SYS_CONFIG(SPI_GETDRAGFULLWINDOWS, (PVOID) g->SchemeAdv.Effects.bMenuFade);
404
405 /* Show shadows under windows */
406 SYS_CONFIG(SPI_SETDROPSHADOW, 0, IntToPtr(scheme->Effects.bDropShadow));
407
408 /* Show window contents while dragging */
409 SYS_CONFIG(SPI_SETDRAGFULLWINDOWS, scheme->Effects.bDragFullWindows, 0);
410
411 /* Hide underlined letters for keyboard navigation until I press the Alt key */
412 SYS_CONFIG(SPI_SETKEYBOARDCUES, 0, IntToPtr(scheme->Effects.bKeyboardCues));
413
414 SYS_CONFIG(SPI_SETFLATMENU, 0, IntToPtr(scheme->bFlatMenus));
415
416 // SYS_CONFIG(SPI_SETACTIVEWINDOWTRACKING, 0, IntToPtr(scheme->Effects.bActiveWindowTracking));
417 // SYS_CONFIG(SPI_SETCOMBOBOXANIMATION, 0, IntToPtr(scheme->Effects.bComboBoxAnimation));
418 // SYS_CONFIG(SPI_SETLISTBOXSMOOTHSCROLLING, 0, IntToPtr(scheme->Effects.bListBoxSmoothScrolling));
419 // SYS_CONFIG(SPI_SETGRADIENTCAPTIONS, 0, IntToPtr(scheme->Effects.bGradientCaptions));
420 // SYS_CONFIG(SPI_SETACTIVEWNDTRKZORDER, 0, IntToPtr(scheme->Effects.bActiveWndTrkZorder));
421 // SYS_CONFIG(SPI_SETHOTTRACKING, 0, IntToPtr(scheme->Effects.bHotTracking));
422 // SYS_CONFIG(SPI_SETSELECTIONFADE, 0, IntToPtr(scheme->Effects.bSelectionFade));
423 SYS_CONFIG(SPI_SETTOOLTIPANIMATION, 0, IntToPtr(scheme->Effects.bTooltipAnimation));
424 SYS_CONFIG(SPI_SETTOOLTIPFADE, 0, IntToPtr(scheme->Effects.bTooltipFade));
425 // SYS_CONFIG(SPI_SETCURSORSHADOW, 0, IntToPtr(scheme->Effects.bCursorShadow));
426 // SYS_CONFIG(SPI_SETUIEFFECTS, 0, IntToPtr(scheme->Effects.bUiEffects));
427
428#undef SYS_CONFIG
429
430 /* Save SchemeId in the registry */
431 if (pSelectedTheme->Theme != NULL && pSelectedTheme->ThemeActive == FALSE)
432 {
433 StyleName = pSelectedTheme->Color->StyleName;
437 REG_SZ,
438 StyleName,
439 (lstrlenW(StyleName) + 1) * sizeof(WCHAR));
440 }
441
442 if (pSelectedTheme->ThemeActive)
443 {
444 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"Current", REG_SZ, NULL, 0);
445 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"NewCurrent", REG_SZ, NULL, 0);
446 }
447 else if (pSelectedTheme->Color)
448 {
449 PCWSTR ClassicSchemeName = pSelectedTheme->Color->DisplayName;
450 DWORD cb = (lstrlenW(ClassicSchemeName) + 1) * sizeof(WCHAR);
451 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"Current", REG_SZ, ClassicSchemeName, cb); // 95+
452 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"NewCurrent", REG_SZ, ClassicSchemeName, cb); // XP+
453 }
454}
#define IntToPtr(i)
Definition: basetsd.h:83
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
static const WCHAR g_CPColors[]
Definition: theme.c:18
static const WCHAR * g_RegColorNames[NUM_COLORS]
Definition: theme.c:26
static const WCHAR g_SelectedStyle[]
Definition: theme.c:21
static const WCHAR g_CPANewSchemes[]
Definition: theme.c:19
#define SYS_CONFIG(__uiAction, __uiParam, __pvParam)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1201
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
#define GetBValue(quad)
Definition: precomp.h:75
#define GetGValue(quad)
Definition: precomp.h:74
#define GetRValue(quad)
Definition: precomp.h:73
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define REG_SZ
Definition: layer.c:22
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define NUM_COLORS
Definition: palettemodel.h:10
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
#define lstrlen
Definition: winbase.h:3625
#define HKEY_CURRENT_USER
Definition: winreg.h:11
BOOL WINAPI SetSysColors(_In_ int cElements, _In_reads_(cElements) CONST INT *lpaElements, _In_reads_(cElements) CONST COLORREF *lpaRgbValues)
#define SPIF_SENDCHANGE
Definition: winuser.h:1600
#define SPIF_UPDATEINIFILE
Definition: winuser.h:1599
#define wsprintf
Definition: winuser.h:5976
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ActivateThemeFile().

◆ CleanupStyles()

static void CleanupStyles ( IN PTHEME_STYLE  pStylesList)
static

Definition at line 522 of file theme.c.

523{
524 PTHEME_STYLE pStyle, pStyleOld;
525
526 pStyle = pStylesList;
527 while (pStyle)
528 {
529 if (pStyle->ChildStyle) CleanupStyles(pStyle->ChildStyle);
530 if (pStyle->DisplayName) free(pStyle->DisplayName);
531 if (pStyle->StyleName) free(pStyle->StyleName);
532
533 pStyleOld = pStyle;
534 pStyle = pStyle->NextStyle;
535 free(pStyleOld);
536 }
537}
#define free
Definition: debug_ros.c:5
static void CleanupStyles(IN PTHEME_STYLE pStylesList)
Definition: theme.c:522
struct _THEME_STYLE * ChildStyle
Definition: appearance.h:82
PWSTR StyleName
Definition: appearance.h:83
struct _THEME_STYLE * NextStyle
Definition: appearance.h:81
PWSTR DisplayName
Definition: appearance.h:84

Referenced by CleanupStyles(), CleanupThemes(), and LoadClassicColorSchemes().

◆ CleanupThemes()

void CleanupThemes ( IN PTHEME  pThemeList)

Definition at line 540 of file theme.c.

541{
542 PTHEME pTheme, pThemeOld;
543
544 pTheme = pThemeList;
545 while (pTheme)
546 {
547 CleanupStyles(pTheme->ColoursList);
548 if (pTheme->SizesList) CleanupStyles(pTheme->SizesList);
549 if (pTheme->DisplayName) free(pTheme->DisplayName);
550 if (pTheme->ThemeFileName) free(pTheme->ThemeFileName);
551
552 pThemeOld = pTheme;
553 pTheme = pTheme->NextTheme;
554 free(pThemeOld);
555 }
556}
THEME_STYLE * SizesList
Definition: appearance.h:93
THEME_STYLE * ColoursList
Definition: appearance.h:92
PWSTR ThemeFileName
Definition: appearance.h:90
struct _THEME * NextTheme
Definition: appearance.h:89
PWSTR DisplayName
Definition: appearance.h:91

Referenced by ActivateThemeFile(), and LoadTheme().

◆ CreateStyle()

static PTHEME_STYLE CreateStyle ( LPCWSTR  pszName,
LPCWSTR  pszDisplayName 
)
static

Definition at line 493 of file theme.c.

494{
495 PTHEME_STYLE pStyle;
496
497 pStyle = (PTHEME_STYLE) malloc(sizeof(THEME_STYLE));
498 if (pStyle == NULL) return NULL;
499
500 pStyle->StyleName = _wcsdup(pszName);
501 if (pStyle->StyleName == NULL)
502 {
503 free(pStyle);
504 return NULL;
505 }
506
507 pStyle->DisplayName = _wcsdup(pszDisplayName);
508 if (pStyle->DisplayName == NULL)
509 {
510 free(pStyle->StyleName);
511 free(pStyle);
512 return NULL;
513 }
514
515 pStyle->ChildStyle = NULL;
516 pStyle->NextStyle = NULL;
517
518 return pStyle;
519}
struct _THEME_STYLE * PTHEME_STYLE
#define malloc
Definition: debug_ros.c:4
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)

Referenced by EnumThemeStyles(), LoadClassicColorSchemes(), and LoadSchemeSizes().

◆ CreateTheme()

static THEME * CreateTheme ( LPCWSTR  pszName,
LPCWSTR  pszDisplayName 
)
static

Definition at line 457 of file theme.c.

458{
459 PTHEME pTheme;
460
461 pTheme = (PTHEME) malloc(sizeof(THEME));
462 if (pTheme == NULL) return NULL;
463
464 pTheme->DisplayName = _wcsdup(pszDisplayName);
465 if (pTheme->DisplayName == NULL)
466 {
467 free(pTheme);
468 return NULL;
469 }
470
471 pTheme->ColoursList = NULL;
472 pTheme->NextTheme = NULL;
473 pTheme->SizesList = NULL;
474
475 if (pszName == NULL)
476 {
477 pTheme->ThemeFileName = NULL;
478 return pTheme;
479 }
480
481 pTheme->ThemeFileName = _wcsdup(pszName);
482 if (pTheme->ThemeFileName == NULL)
483 {
484 free(pTheme->DisplayName);
485 free(pTheme);
486 return NULL;
487 }
488
489 return pTheme;
490}
struct _THEME * PTHEME

Referenced by LoadTheme(), and LoadThemes().

◆ DrawThemePreview()

BOOL DrawThemePreview ( IN HDC  hdcMem,
IN PCOLOR_SCHEME  scheme,
IN PTHEME_SELECTION  pSelectedTheme,
IN PRECT  prcWindow 
)

Definition at line 1003 of file theme.c.

1004{
1005 HBRUSH hbrBack;
1006 HRESULT hres;
1007
1008 hbrBack = CreateSolidBrush(scheme->crColor[COLOR_DESKTOP]);
1009
1010 FillRect(hdcMem, prcWindow, hbrBack);
1011 DeleteObject(hbrBack);
1012
1013 InflateRect(prcWindow, -8, -8);
1014 prcWindow->bottom -= 12;
1015
1018 prcWindow,
1019 pSelectedTheme->Theme->ThemeFileName,
1020 pSelectedTheme->Color->StyleName,
1021 pSelectedTheme->Size->StyleName,
1022 &scheme->ncMetrics,
1023 scheme->crColor);
1024
1025 return SUCCEEDED(hres);
1026}
HRESULT WINAPI DrawNCPreview(HDC hDC, DWORD DNCP_Flag, LPRECT prcPreview, LPCWSTR pszThemeFileName, LPCWSTR pszColorName, LPCWSTR pszSizeName, PNONCLIENTMETRICSW pncMetrics, COLORREF *lpaRgbValues)
Definition: nonclient.c:1215
pKey DeleteObject()
HRESULT hres
Definition: protocol.c:465
#define DNCP_DRAW_ALL
Definition: uxundoc.h:130
HDC hdcMem
Definition: welcome.c:104
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define COLOR_DESKTOP
Definition: winuser.h:925
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)

◆ EnumThemeProc()

BOOL CALLBACK EnumThemeProc ( IN LPVOID  lpReserved,
IN LPCWSTR  pszThemeFileName,
IN LPCWSTR  pszThemeName,
IN LPCWSTR  pszToolTip,
IN LPVOID  lpReserved2,
IN OUT LPVOID  lpData 
)

Definition at line 738 of file theme.c.

744{
745 PTHEME *List, pTheme;
746
747 List = (PTHEME*)lpData;
748 pTheme = LoadTheme(pszThemeFileName, pszThemeName);
749 if (pTheme == NULL) return FALSE;
750
751 pTheme->NextTheme = *List;
752 *List = pTheme;
753
754 return TRUE;
755}
PTHEME LoadTheme(IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName)
Definition: theme.c:720
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550

Referenced by LoadThemes().

◆ EnumThemeStyles()

static THEME_STYLE * EnumThemeStyles ( IN LPCWSTR  pszThemeFileName,
IN ENUMTHEMESTYLE  pfnEnumTheme 
)
static

Definition at line 700 of file theme.c.

701{
702 DWORD index = 0;
704 THEME_STYLE *List = NULL, **ppPrevStyle, *pCurrentStyle;
705
706 ppPrevStyle = &List;
707
708 while (SUCCEEDED(pfnEnumTheme (pszThemeFileName, NULL, index++, &names)))
709 {
710 pCurrentStyle = CreateStyle(names.szName, names.szDisplayName);
711 if(pCurrentStyle == NULL) break;
712
713 *ppPrevStyle = pCurrentStyle;
714 ppPrevStyle = &pCurrentStyle->NextStyle;
715 }
716
717 return List;
718}
static PTHEME_STYLE CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:493
GLuint GLuint * names
Definition: glext.h:11545
GLuint index
Definition: glext.h:6031

Referenced by LoadTheme().

◆ FindOrAppendTheme()

BOOL FindOrAppendTheme ( IN PTHEME  pThemeList,
IN LPCWSTR  pwszThemeFileName,
IN LPCWSTR  pwszColorBuff,
IN LPCWSTR  pwszSizeBuff,
OUT PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 804 of file theme.c.

809{
810 PTHEME pTheme;
811 PTHEME pFoundTheme = NULL;
812
813 ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION));
814
815 for (pTheme = pThemeList; pTheme; pTheme = pTheme->NextTheme)
816 {
817 if (pTheme->ThemeFileName &&
818 _wcsicmp(pTheme->ThemeFileName, pwszThemeFileName) == 0)
819 {
820 pFoundTheme = pTheme;
821 break;
822 }
823
824 if (pTheme->NextTheme == NULL)
825 break;
826 }
827
828 if (!pFoundTheme)
829 {
830 pFoundTheme = LoadTheme(pwszThemeFileName, pwszThemeFileName);
831 if (!pFoundTheme)
832 return FALSE;
833
834 pTheme->NextTheme = pFoundTheme;
835 }
836
837 pSelectedTheme->ThemeActive = TRUE;
838 pSelectedTheme->Theme = pFoundTheme;
839 if (pwszColorBuff)
840 pSelectedTheme->Color = FindStyle(pFoundTheme->ColoursList, pwszColorBuff);
841 else
842 pSelectedTheme->Color = pFoundTheme->ColoursList;
843
844 if (pwszSizeBuff)
845 pSelectedTheme->Size = FindStyle(pFoundTheme->SizesList, pwszSizeBuff);
846 else
847 pSelectedTheme->Size = pFoundTheme->SizesList;
848
849 return TRUE;
850}
static PTHEME_STYLE FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
Definition: theme.c:559
#define ZeroMemory
Definition: minwinbase.h:31
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)

Referenced by ActivateThemeFile(), AppearancePage_OnInit(), and GetActiveTheme().

◆ FindStyle()

static PTHEME_STYLE FindStyle ( IN PTHEME_STYLE  pStylesList,
IN PCWSTR  StyleName 
)
static

Definition at line 559 of file theme.c.

560{
561 PTHEME_STYLE pStyle;
562
563 for (pStyle = pStylesList; pStyle; pStyle = pStyle->NextStyle)
564 {
565 if (_wcsicmp(pStyle->StyleName, StyleName) == 0)
566 {
567 return pStyle;
568 }
569 }
570
571 /* If we can't find the style requested, return the first one */
572 return pStylesList;
573}

Referenced by FindOrAppendTheme(), and GetActiveClassicTheme().

◆ GetActiveClassicTheme()

BOOL GetActiveClassicTheme ( IN PTHEME  pThemeList,
OUT PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 882 of file theme.c.

883{
884 INT Result;
885 WCHAR szSelectedClassicScheme[5], szSelectedClassicSize[5];
886 HKEY hkNewSchemes;
887 DWORD dwType, dwDisplayNameLength;
888 PTHEME_STYLE pCurrentStyle, pCurrentSize;
889
890 ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION));
891
892 /* Assume failure */
893 szSelectedClassicScheme[0] = 0;
894 szSelectedClassicSize[0] = 0;
895
897 if (Result != ERROR_SUCCESS) return FALSE;
898
899 dwType = REG_SZ;
900 dwDisplayNameLength = sizeof(szSelectedClassicScheme);
901 Result = RegQueryValueEx(hkNewSchemes, L"SelectedStyle", NULL, &dwType,
902 (LPBYTE)&szSelectedClassicScheme, &dwDisplayNameLength);
903 if (Result == ERROR_SUCCESS)
904 {
905 dwType = REG_SZ;
906 dwDisplayNameLength = sizeof(szSelectedClassicSize);
907 Result = SHGetValue(hkNewSchemes, szSelectedClassicScheme, L"SelectedSize",
908 &dwType, szSelectedClassicSize, &dwDisplayNameLength);
909 }
910
911 RegCloseKey(hkNewSchemes);
912
913 pCurrentStyle = FindStyle(pThemeList->ColoursList, szSelectedClassicScheme);
914 pCurrentSize = FindStyle(pCurrentStyle->ChildStyle, szSelectedClassicSize);
915
916 pSelectedTheme->Theme = pThemeList;
917 pSelectedTheme->Color = pCurrentStyle;
918 pSelectedTheme->Size = pCurrentSize;
919
920 return TRUE;
921}
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
#define SHGetValue
Definition: shlwapi.h:836
unsigned char * LPBYTE
Definition: typedefs.h:53
#define RegQueryValueEx
Definition: winreg.h:531

Referenced by ActivateThemeFile().

◆ GetActiveTheme()

BOOL GetActiveTheme ( IN PTHEME  pThemeList,
OUT PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 857 of file theme.c.

858{
859 WCHAR szThemeFileName[MAX_PATH];
860 WCHAR szColorBuff[MAX_PATH];
861 WCHAR szSizeBuff[MAX_PATH];
862 HRESULT hret;
863
864 /* Retrieve the name of the current theme */
865 hret = GetCurrentThemeName(szThemeFileName,
866 MAX_PATH,
867 szColorBuff,
868 MAX_PATH,
869 szSizeBuff,
870 MAX_PATH);
871 if (FAILED(hret))
872 return FALSE;
873
874 return FindOrAppendTheme(pThemeList, szThemeFileName, szColorBuff, szSizeBuff, pSelectedTheme);
875}
#define MAX_PATH
Definition: compat.h:34
HRESULT WINAPI GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars)
Definition: system.c:980
#define FAILED(hr)
Definition: intsafe.h:51

◆ LoadClassicColorSchemes()

static THEME_STYLE * LoadClassicColorSchemes ( VOID  )
static

Definition at line 638 of file theme.c.

639{
640 INT Result;
641 HKEY hkNewSchemes, hkScheme;
642 INT iStyle;
643 WCHAR wstrStyleName[5], wstrDisplayName[50];
644 THEME_STYLE *List = NULL, *pCurrentStyle;
645
647 if (Result != ERROR_SUCCESS) return NULL;
648
649 iStyle = 0;
650 while ((RegEnumKeyW(hkNewSchemes, iStyle, wstrStyleName, 5) == ERROR_SUCCESS))
651 {
652 iStyle++;
653
654 Result = RegOpenKeyW(hkNewSchemes, wstrStyleName, &hkScheme);
655 if (Result != ERROR_SUCCESS) continue;
656
657 Result = RegLoadMUIStringW(hkScheme,
658 L"DisplayName",
659 wstrDisplayName,
660 sizeof(wstrDisplayName),
661 NULL,
662 0,
663 NULL);
664 if (Result != ERROR_SUCCESS)
665 {
666 Result = RegLoadMUIStringW(hkScheme,
667 L"LegacyName",
668 wstrDisplayName,
669 sizeof(wstrDisplayName),
670 NULL,
671 0,
672 NULL);
673 }
674
675 if (Result == ERROR_SUCCESS)
676 pCurrentStyle = CreateStyle(wstrStyleName, wstrDisplayName);
677 else
678 pCurrentStyle = CreateStyle(wstrStyleName, wstrStyleName);
679
680 if (pCurrentStyle != NULL)
681 {
682 pCurrentStyle->NextStyle = List;
683 pCurrentStyle->ChildStyle = LoadSchemeSizes(hkScheme);
684 if(pCurrentStyle->ChildStyle == NULL)
685 CleanupStyles(pCurrentStyle);
686 else
687 List = pCurrentStyle;
688 }
689
690 RegCloseKey(hkScheme);
691 }
692
693 RegCloseKey(hkNewSchemes);
694 return List;
695}
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
static PTHEME_STYLE LoadSchemeSizes(IN HKEY hkScheme)
Definition: theme.c:579
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393

Referenced by LoadThemes().

◆ LoadCurrentScheme()

BOOL LoadCurrentScheme ( OUT COLOR_SCHEME scheme)

Definition at line 122 of file theme.c.

123{
124 INT i, Result;
125 HKEY hKey;
126 BOOL ret;
127#if (WINVER >= 0x0600)
129#endif
130
131 /* Load colors */
132 for (i = 0; i < NUM_COLORS; i++)
133 {
134 scheme->crColor[i] = (COLORREF)GetSysColor(i);
135 }
136
137 /* Load non client metrics */
138 scheme->ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
139
140#if (WINVER >= 0x0600)
141 /* Size of NONCLIENTMETRICSA/W depends on current version of the OS.
142 * see:
143 * https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-nonclientmetricsa
144 */
145 if (GetVersionEx(&osvi))
146 {
147 /* Windows XP and earlier */
148 if (osvi.dwMajorVersion <= 5)
149 scheme->ncMetrics.cbSize -= sizeof(scheme->ncMetrics.iPaddedBorderWidth);
150 }
151#endif
152
153 ret = SystemParametersInfoW(SPI_GETNONCLIENTMETRICS,
154 sizeof(NONCLIENTMETRICSW),
155 &scheme->ncMetrics,
156 0);
157 if (!ret) return FALSE;
158
159 /* Load icon metrics */
160 scheme->icMetrics.cbSize = sizeof(ICONMETRICSW);
161 ret = SystemParametersInfoW(SPI_GETICONMETRICS,
162 sizeof(ICONMETRICSW),
163 &scheme->icMetrics,
164 0);
165 if (!ret) return FALSE;
166
167 /* Load flat menu style */
168 ret = SystemParametersInfoW(SPI_GETFLATMENU,
169 0,
170 &scheme->bFlatMenus,
171 0);
172 if (!ret) return FALSE;
173
174 /* Effects */
175 /* Use the following transition effect for menus and tooltips */
176 ret = SystemParametersInfoW(SPI_GETMENUANIMATION,
177 0,
178 &scheme->Effects.bMenuAnimation,
179 0);
180 if (!ret) return FALSE;
181
182 ret = SystemParametersInfoW(SPI_GETMENUFADE,
183 0,
184 &scheme->Effects.bMenuFade,
185 0);
186 if (!ret) return FALSE;
187
188 /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
189 * Just keep them in sync for now:
190 */
191 scheme->Effects.bTooltipAnimation = scheme->Effects.bMenuAnimation;
192 scheme->Effects.bTooltipFade = scheme->Effects.bMenuFade;
193
194 /* Use the following transition effect for menus and tooltips */
195 ret = SystemParametersInfoW(SPI_GETFONTSMOOTHING,
196 0,
197 &scheme->Effects.bFontSmoothing,
198 0);
199 if (!ret) return FALSE;
200
201 ret = SystemParametersInfoW(SPI_GETFONTSMOOTHINGTYPE,
202 0,
203 &scheme->Effects.uiFontSmoothingType,
204 0);
205 if (!ret) return FALSE;
206
207 /* Show shadows under windows */
208 ret = SystemParametersInfoW(SPI_GETDROPSHADOW,
209 0,
210 &scheme->Effects.bDropShadow,
211 0);
212 if (!ret) return FALSE;
213
214 /* Show content of windows during dragging */
215 ret = SystemParametersInfoW(SPI_GETDRAGFULLWINDOWS,
216 0,
217 &scheme->Effects.bDragFullWindows,
218 0);
219 if (!ret) return FALSE;
220
221 /* Hide underlined letters for keyboard navigation until the Alt key is pressed */
222 ret = SystemParametersInfoW(SPI_GETKEYBOARDCUES,
223 0,
224 &scheme->Effects.bKeyboardCues,
225 0);
226 if (!ret) return FALSE;
227
228 /* Read the icon size from registry */
230 if(Result == ERROR_SUCCESS)
231 {
232 scheme->iIconSize = SHRegGetIntW(hKey, L"Shell Icon Size", 32);
234 }
235
236 return TRUE;
237}
static const WCHAR g_CPMetrics[]
Definition: theme.c:20
int WINAPI SHRegGetIntW(HKEY hKey, LPCWSTR lpszValue, int iDefault)
Definition: reg.c:2374
ULONG dwMajorVersion
Definition: rtltypes.h:238
OSVERSIONINFO osvi
Definition: ver.c:28
#define GetVersionEx
Definition: winbase.h:3601
DWORD COLORREF
Definition: windef.h:94
DWORD WINAPI GetSysColor(_In_ int)

Referenced by ActivateThemeFile().

◆ LoadSchemeFromReg()

BOOL LoadSchemeFromReg ( OUT COLOR_SCHEME scheme,
IN PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 243 of file theme.c.

244{
245 INT i;
246 WCHAR strValueName[10], strSchemeKey[MAX_PATH];
247 HKEY hkScheme = NULL;
248 DWORD dwType, dwLength;
249 UINT64 iSize;
250 BOOL Ret = TRUE;
251 LONG result;
252
253 wsprintf(strSchemeKey, L"%s\\%s\\Sizes\\%s",
255 pSelectedTheme->Color->StyleName,
256 pSelectedTheme->Size->StyleName);
257
258 result = RegOpenKeyW(HKEY_CURRENT_USER, strSchemeKey, &hkScheme);
259 if (result != ERROR_SUCCESS) return FALSE;
260
261 scheme->bFlatMenus = SHRegGetIntW(hkScheme, L"FlatMenus", 0);
262
263 for (i = 0; i < NUM_COLORS; i++)
264 {
265 wsprintf(strValueName, L"Color #%d", i);
266 dwLength = sizeof(COLORREF);
267 result = RegQueryValueExW(hkScheme,
268 strValueName,
269 NULL,
270 &dwType,
271 (LPBYTE)&scheme->crColor[i],
272 &dwLength);
273 if (result != ERROR_SUCCESS || dwType != REG_DWORD)
274 {
275 /* Failed to read registry value, initialize with current setting for now */
276 scheme->crColor[i] = GetSysColor(i);
277 }
278 }
279
280 for (i = 0; i < NUM_FONTS; i++)
281 {
282 PLOGFONTW lpfFont = SchemeGetFont(scheme, i);
283
284 wsprintf(strValueName, L"Font #%d", i);
285 dwLength = sizeof(LOGFONT);
286 result = RegQueryValueExW(hkScheme,
287 strValueName,
288 NULL,
289 &dwType,
290 (LPBYTE)lpfFont,
291 &dwLength);
292 if (result != ERROR_SUCCESS || dwType != REG_BINARY ||
293 dwLength != sizeof(LOGFONT))
294 {
295 /* Failed to read registry value */
296 Ret = FALSE;
297 }
298 }
299
300 for (i = 0; i < NUM_SIZES; i++)
301 {
302 wsprintf(strValueName, L"Size #%d", i);
303 dwLength = sizeof(UINT64);
304 result = RegQueryValueExW(hkScheme,
305 strValueName,
306 NULL,
307 &dwType,
308 (LPBYTE)&iSize,
309 &dwLength);
310 if (result != ERROR_SUCCESS || dwType != REG_QWORD ||
311 dwLength != sizeof(UINT64))
312 {
313 /* Failed to read registry value, initialize with current setting for now */
314 }
315 else
316 {
317 SchemeSetMetric(scheme, i, (int)iSize);
318 }
319 }
320
321 RegCloseKey(hkScheme);
322
323 return Ret;
324}
unsigned long long UINT64
#define NUM_FONTS
Definition: appearance.h:26
#define NUM_SIZES
Definition: appearance.h:27
VOID SchemeSetMetric(IN COLOR_SCHEME *scheme, int id, int value)
Definition: theme.c:63
PLOGFONTW SchemeGetFont(IN COLOR_SCHEME *scheme, int id)
Definition: theme.c:104
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
static DWORD DWORD * dwLength
Definition: fusion.c:86
GLuint64EXT * result
Definition: glext.h:11304
#define REG_BINARY
Definition: nt_native.h:1499
long LONG
Definition: pedump.c:60
#define REG_QWORD
Definition: sdbapi.c:616
#define REG_DWORD
Definition: sdbapi.c:615
LOGFONTA LOGFONT
Definition: wingdi.h:4861

Referenced by ActivateThemeFile().

◆ LoadSchemeFromTheme()

BOOL LoadSchemeFromTheme ( OUT PCOLOR_SCHEME  scheme,
IN PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 951 of file theme.c.

952{
953 HTHEMEFILE hThemeFile = 0;
954 HRESULT hret;
955 HTHEME hTheme;
956 int i;
957
958 hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName,
959 pSelectedTheme->Color->StyleName,
960 pSelectedTheme->Size->StyleName,
961 &hThemeFile,
962 0);
963
964 if (!SUCCEEDED(hret)) return FALSE;
965
966 hTheme = OpenThemeDataFromFile(hThemeFile, hCPLWindow, L"WINDOW", 0);
967 if (hTheme == NULL) return FALSE;
968
969 /* Load colors */
970 for (i = 0; i < NUM_COLORS; i++)
971 {
972 scheme->crColor[i] = GetThemeSysColor(hTheme,i);
973 }
974
975 /* Load sizes */
976 /* I wonder why GetThemeSysInt doesn't work here */
977 scheme->ncMetrics.iBorderWidth = GetThemeSysSize(hTheme, SM_CXFRAME);
978 scheme->ncMetrics.iScrollWidth = GetThemeSysSize(hTheme, SM_CXVSCROLL);
979 scheme->ncMetrics.iScrollHeight = GetThemeSysSize(hTheme, SM_CYHSCROLL);
980 scheme->ncMetrics.iCaptionWidth = GetThemeSysSize(hTheme, SM_CXSIZE);
981 scheme->ncMetrics.iCaptionHeight = GetThemeSysSize(hTheme, SM_CYSIZE);
982 scheme->ncMetrics.iSmCaptionWidth = GetThemeSysSize(hTheme, SM_CXSMSIZE);
983 scheme->ncMetrics.iSmCaptionHeight = GetThemeSysSize(hTheme, SM_CYSMSIZE);
984 scheme->ncMetrics.iMenuWidth = GetThemeSysSize(hTheme, SM_CXMENUSIZE);
985 scheme->ncMetrics.iMenuHeight = GetThemeSysSize(hTheme, SM_CYMENUSIZE);
986
987 /* Load fonts */
988 GetThemeSysFont(hTheme, TMT_CAPTIONFONT, &scheme->ncMetrics.lfCaptionFont);
989 GetThemeSysFont(hTheme, TMT_SMALLCAPTIONFONT, &scheme->ncMetrics.lfSmCaptionFont);
990 GetThemeSysFont(hTheme, TMT_MENUFONT, &scheme->ncMetrics.lfMenuFont );
991 GetThemeSysFont(hTheme, TMT_STATUSFONT, &scheme->ncMetrics.lfStatusFont);
992 GetThemeSysFont(hTheme, TMT_MSGBOXFONT, &scheme->ncMetrics.lfMessageFont);
993 GetThemeSysFont(hTheme, TMT_ICONTITLEFONT, &scheme->icMetrics.lfFont);
994
995 scheme->bFlatMenus = GetThemeSysBool(hTheme, TMT_FLATMENUS);
996
997 CloseThemeData(hTheme);
998
999 return TRUE;
1000}
HWND hCPLWindow
Definition: desk.c:38
COLORREF WINAPI GetThemeSysColor(HTHEME hTheme, int iColorID)
Definition: metric.c:58
HRESULT WINAPI GetThemeSysFont(HTHEME hTheme, int iFontID, LOGFONTW *plf)
Definition: metric.c:91
int WINAPI GetThemeSysSize(HTHEME hTheme, int iSizeID)
Definition: metric.c:154
BOOL WINAPI GetThemeSysBool(HTHEME hTheme, int iBoolID)
Definition: metric.c:26
HTHEME WINAPI OpenThemeDataFromFile(HTHEMEFILE hThemeFile, HWND hwnd, LPCWSTR pszClassList, DWORD flags)
Definition: system.c:882
HRESULT WINAPI CloseThemeData(HTHEME hTheme)
Definition: system.c:1036
static HTHEME(WINAPI *pOpenThemeDataEx)(HWND
#define TMT_SMALLCAPTIONFONT
Definition: vssym32.h:165
#define TMT_FLATMENUS
Definition: vssym32.h:175
#define TMT_CAPTIONFONT
Definition: vssym32.h:164
#define TMT_MENUFONT
Definition: vssym32.h:166
#define TMT_MSGBOXFONT
Definition: vssym32.h:168
#define TMT_ICONTITLEFONT
Definition: vssym32.h:169
#define TMT_STATUSFONT
Definition: vssym32.h:167
#define SM_CYSIZE
Definition: winuser.h:1003
#define SM_CXVSCROLL
Definition: winuser.h:972
#define SM_CXFRAME
Definition: winuser.h:1005
#define SM_CXSIZE
Definition: winuser.h:1002
#define SM_CYHSCROLL
Definition: winuser.h:973
#define SM_CXSMSIZE
Definition: winuser.h:1026
#define SM_CXMENUSIZE
Definition: winuser.h:1028
#define SM_CYSMSIZE
Definition: winuser.h:1027
#define SM_CYMENUSIZE
Definition: winuser.h:1029

Referenced by ActivateThemeFile().

◆ LoadSchemeSizes()

static PTHEME_STYLE LoadSchemeSizes ( IN HKEY  hkScheme)
static

Definition at line 579 of file theme.c.

580{
581 HKEY hkSizes, hkSize;
582 INT Result;
583 INT iStyle;
584 WCHAR wstrSizeName[5], wstrDisplayName[50];
585 THEME_STYLE *List = NULL, *pCurrentStyle;
586
587 Result = RegOpenKeyW(hkScheme, L"Sizes", &hkSizes);
588 if (Result != ERROR_SUCCESS) return NULL;
589
590 iStyle = 0;
591 while ((RegEnumKeyW(hkSizes, iStyle, wstrSizeName, 5) == ERROR_SUCCESS))
592 {
593 iStyle++;
594
595 Result = RegOpenKeyW(hkSizes, wstrSizeName, &hkSize);
596 if (Result != ERROR_SUCCESS) continue;
597
598 Result = RegLoadMUIStringW(hkSize,
599 L"DisplayName",
600 wstrDisplayName,
601 sizeof(wstrDisplayName),
602 NULL,
603 0,
604 NULL);
605 if (Result != ERROR_SUCCESS)
606 {
607 Result = RegLoadMUIStringW(hkSize,
608 L"LegacyName",
609 wstrDisplayName,
610 sizeof(wstrDisplayName),
611 NULL,
612 0,
613 NULL);
614 }
615
616 if (Result == ERROR_SUCCESS)
617 pCurrentStyle = CreateStyle(wstrSizeName, wstrDisplayName);
618 else
619 pCurrentStyle = CreateStyle(wstrSizeName, wstrSizeName);
620
621 if (pCurrentStyle != NULL)
622 {
623 pCurrentStyle->NextStyle = List;
624 List = pCurrentStyle;
625 }
626
627 RegCloseKey(hkSize);
628 }
629
630 RegCloseKey(hkSizes);
631 return List;
632}

Referenced by LoadClassicColorSchemes().

◆ LoadTheme()

PTHEME LoadTheme ( IN LPCWSTR  pszThemeFileName,
IN LPCWSTR  pszThemeName 
)

Definition at line 720 of file theme.c.

721{
722 PTHEME pTheme = CreateTheme(pszThemeFileName, pszThemeName);
723 if (pTheme == NULL)
724 return NULL;
725
726 pTheme->SizesList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeSizes);
727 pTheme->ColoursList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeColors);
728 if(pTheme->SizesList == NULL || pTheme->ColoursList == NULL)
729 {
730 CleanupThemes(pTheme);
731 return NULL;
732 }
733
734 return pTheme;
735}
static THEME_STYLE * EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
Definition: theme.c:700
HRESULT(WINAPI * ENUMTHEMESTYLE)(LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)
Definition: theme.c:697
static THEME * CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:457
HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, DWORD dwColorNum, PTHEMENAMES pszColorNames)
Definition: system.c:1433
HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, DWORD dwSizeNum, PTHEMENAMES pszSizeNames)
Definition: system.c:1496

Referenced by EnumThemeProc(), and FindOrAppendTheme().

◆ LoadThemes()

PTHEME LoadThemes ( VOID  )

Definition at line 762 of file theme.c.

763{
764 HRESULT hret;
765 PTHEME pClassicTheme;
766 WCHAR strClassicTheme[40];
767 WCHAR szThemesPath[MAX_PATH], *pszClassicTheme;
768 int res;
769
770 /* Insert the classic theme */
771 res = LoadString(hApplet, IDS_CLASSIC_THEME, strClassicTheme, 40);
772 pszClassicTheme = (res > 0 ? strClassicTheme : L"Classic Theme");
773 pClassicTheme = CreateTheme(NULL, pszClassicTheme);
774 if (pClassicTheme == NULL) return NULL;
775 pClassicTheme->ColoursList = LoadClassicColorSchemes();
776
777 /* Get path to themes folder */
778 ZeroMemory(szThemesPath, sizeof(szThemesPath));
780 if (FAILED(hret)) return pClassicTheme;
781 lstrcatW (szThemesPath, L"\\Themes");
782
783 /* Enumerate themes */
784 hret = EnumThemes( szThemesPath, EnumThemeProc, &pClassicTheme->NextTheme);
785 if (FAILED(hret))
786 {
787 pClassicTheme->NextTheme = NULL;
788 if (pClassicTheme->ColoursList == NULL)
789 {
790 free(pClassicTheme->DisplayName);
791 free(pClassicTheme);
792 return NULL;
793 }
794 }
795
796 return pClassicTheme;
797}
HINSTANCE hApplet
Definition: access.c:17
#define IDS_CLASSIC_THEME
Definition: resource.h:111
BOOL CALLBACK EnumThemeProc(IN LPVOID lpReserved, IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName, IN LPCWSTR pszToolTip, IN LPVOID lpReserved2, IN OUT LPVOID lpData)
Definition: theme.c:738
static THEME_STYLE * LoadClassicColorSchemes(VOID)
Definition: theme.c:638
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2716
HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, ENUMTHEMEPROC callback, LPVOID lpData)
Definition: system.c:1344
GLuint res
Definition: glext.h:9613
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
@ SHGFP_TYPE_DEFAULT
Definition: shlobj.h:2156
#define CSIDL_RESOURCES
Definition: shlobj.h:2231
#define LoadString
Definition: winuser.h:5930

Referenced by ActivateThemeFile(), and AppearancePage_OnInit().

◆ SchemeGetFont()

PLOGFONTW SchemeGetFont ( IN COLOR_SCHEME scheme,
int  id 
)

Definition at line 104 of file theme.c.

105{
106 switch (id)
107 {
108 case FONT_CAPTION: return &scheme->ncMetrics.lfCaptionFont;
109 case FONT_SMCAPTION: return &scheme->ncMetrics.lfSmCaptionFont;
110 case FONT_MENU: return &scheme->ncMetrics.lfMenuFont;
111 case FONT_STATUS: return &scheme->ncMetrics.lfStatusFont;
112 case FONT_MESSAGE: return &scheme->ncMetrics.lfMessageFont;
113 case FONT_ICON: return &scheme->icMetrics.lfFont;
114 }
115 return NULL;
116}
#define FONT_MESSAGE
Definition: appearance.h:22
#define FONT_CAPTION
Definition: appearance.h:18
#define FONT_SMCAPTION
Definition: appearance.h:19
#define FONT_STATUS
Definition: appearance.h:21
#define FONT_ICON
Definition: appearance.h:23
#define FONT_MENU
Definition: appearance.h:20

Referenced by LoadSchemeFromReg().

◆ SchemeGetMetric()

int SchemeGetMetric ( IN COLOR_SCHEME scheme,
int  id 
)

Definition at line 83 of file theme.c.

84{
85 switch (id)
86 {
87 case SIZE_BORDER_WIDTH: return scheme->ncMetrics.iBorderWidth;
88 case SIZE_SCROLL_WIDTH: return scheme->ncMetrics.iScrollWidth;
89 case SIZE_SCROLL_HEIGHT: return scheme->ncMetrics.iScrollHeight;
90 case SIZE_CAPTION_WIDTH: return scheme->ncMetrics.iCaptionWidth;
91 case SIZE_CAPTION_HEIGHT: return scheme->ncMetrics.iCaptionHeight;
92 case SIZE_SM_CAPTION_WIDTH: return scheme->ncMetrics.iSmCaptionWidth;
93 case SIZE_SM_CAPTION_HEIGHT: return scheme->ncMetrics.iSmCaptionHeight;
94 case SIZE_MENU_WIDTH: return scheme->ncMetrics.iMenuWidth;
95 case SIZE_MENU_HEIGHT: return scheme->ncMetrics.iMenuHeight;
96 case SIZE_ICON: return scheme->iIconSize;
97 case SIZE_ICON_SPACE_X: return scheme->icMetrics.iHorzSpacing;
98 case SIZE_ICON_SPACE_Y: return scheme->icMetrics.iVertSpacing;
99 }
100 return 0;
101}
#define SIZE_MENU_WIDTH
Definition: appearance.h:11
#define SIZE_CAPTION_WIDTH
Definition: appearance.h:7
#define SIZE_ICON_SPACE_X
Definition: appearance.h:14
#define SIZE_SCROLL_HEIGHT
Definition: appearance.h:6
#define SIZE_SM_CAPTION_WIDTH
Definition: appearance.h:9
#define SIZE_ICON_SPACE_Y
Definition: appearance.h:15
#define SIZE_SCROLL_WIDTH
Definition: appearance.h:5
#define SIZE_MENU_HEIGHT
Definition: appearance.h:12
#define SIZE_BORDER_WIDTH
Definition: appearance.h:4
#define SIZE_ICON
Definition: appearance.h:16
#define SIZE_CAPTION_HEIGHT
Definition: appearance.h:8
#define SIZE_SM_CAPTION_HEIGHT
Definition: appearance.h:10

◆ SchemeSetMetric()

VOID SchemeSetMetric ( IN COLOR_SCHEME scheme,
int  id,
int  value 
)

Definition at line 63 of file theme.c.

64{
65 switch (id)
66 {
67 case SIZE_BORDER_WIDTH: scheme->ncMetrics.iBorderWidth = value; break;
68 case SIZE_SCROLL_WIDTH: scheme->ncMetrics.iScrollWidth = value; break;
69 case SIZE_SCROLL_HEIGHT: scheme->ncMetrics.iScrollHeight = value; break;
70 case SIZE_CAPTION_WIDTH: scheme->ncMetrics.iCaptionWidth = value; break;
71 case SIZE_CAPTION_HEIGHT: scheme->ncMetrics.iCaptionHeight = value; break;
72 case SIZE_SM_CAPTION_WIDTH: scheme->ncMetrics.iSmCaptionWidth = value; break;
73 case SIZE_SM_CAPTION_HEIGHT: scheme->ncMetrics.iSmCaptionHeight = value; break;
74 case SIZE_MENU_WIDTH: scheme->ncMetrics.iMenuWidth = value; break;
75 case SIZE_MENU_HEIGHT: scheme->ncMetrics.iMenuHeight = value; break;
76 case SIZE_ICON: scheme->iIconSize = value; break;
77 case SIZE_ICON_SPACE_X: scheme->icMetrics.iHorzSpacing = value; break;
78 case SIZE_ICON_SPACE_Y: scheme->icMetrics.iVertSpacing = value; break;
79 }
80}
Definition: pdh_main.c:96

Referenced by LoadSchemeFromReg().

◆ ThemesPageProc()

INT_PTR CALLBACK ThemesPageProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1078 of file theme.c.

1079{
1080 LPNMHDR lpnm;
1081
1082 switch (uMsg)
1083 {
1084 case WM_INITDIALOG:
1085 break;
1086
1087 case WM_COMMAND:
1088 break;
1089
1090 case WM_NOTIFY:
1091 lpnm = (LPNMHDR)lParam;
1092 switch (lpnm->code)
1093 {
1094 case PSN_APPLY:
1096 return TRUE;
1097 }
1098 break;
1099
1100 case WM_DESTROY:
1101 break;
1102 }
1103
1104 return FALSE;
1105}
LPARAM lParam
Definition: combotst.c:139
#define TEXT(s)
Definition: k32.h:28
LONG_PTR LPARAM
Definition: minwindef.h:175
#define PSN_APPLY
Definition: prsht.h:117
#define WM_NOTIFY
Definition: richedit.h:61
UINT code
Definition: winuser.h:3261
#define HWND_BROADCAST
Definition: winuser.h:1215
#define WM_COMMAND
Definition: winuser.h:1768
#define WM_INITDIALOG
Definition: winuser.h:1767
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
struct tagNMHDR * LPNMHDR
#define SendMessage
Definition: winuser.h:5954
#define WM_DESTROY
Definition: winuser.h:1637

Variable Documentation

◆ g_CPANewSchemes

const WCHAR g_CPANewSchemes[] = L"Control Panel\\Appearance\\New Schemes"
static

◆ g_CPColors

const WCHAR g_CPColors[] = L"Control Panel\\Colors"
static

Definition at line 18 of file theme.c.

Referenced by ApplyScheme().

◆ g_CPMetrics

const WCHAR g_CPMetrics[] = L"Control Panel\\Desktop\\WindowMetrics"
static

Definition at line 20 of file theme.c.

Referenced by LoadCurrentScheme().

◆ g_RegColorNames

const WCHAR* g_RegColorNames[NUM_COLORS]
static

Definition at line 26 of file theme.c.

Referenced by ApplyScheme().

◆ g_SelectedStyle

const WCHAR g_SelectedStyle[] = L"SelectedStyle"
static

Definition at line 21 of file theme.c.

Referenced by ApplyScheme().