ReactOS 0.4.17-dev-573-g8315b8c
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 709 of file theme.c.

Function Documentation

◆ ActivateTheme()

BOOL ActivateTheme ( IN PTHEME_SELECTION  pSelectedTheme)

Definition at line 936 of file theme.c.

937{
938 HTHEMEFILE hThemeFile = 0;
939 HRESULT hret;
940
941 if (pSelectedTheme->ThemeActive)
942 {
943 hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName,
944 pSelectedTheme->Color->StyleName,
945 pSelectedTheme->Size->StyleName,
946 &hThemeFile,
947 0);
948
949 if (!SUCCEEDED(hret)) return FALSE;
950 }
951
952 hret = ApplyTheme(hThemeFile, 0, 0);
953
954 if (pSelectedTheme->ThemeActive)
955 {
956 CloseThemeFile(hThemeFile);
957 }
958
959 return SUCCEEDED(hret);
960}
#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 1040 of file theme.c.

1041{
1042 PTHEME pThemes;
1045 BOOL ret = FALSE;
1046
1047 pThemes = LoadThemes();
1048 if (!pThemes)
1049 return FALSE;
1050
1052
1053 if (pwszFile)
1054 {
1055 ret = FindOrAppendTheme(pThemes, pwszFile, NULL, NULL, &selection);
1056 if (!ret)
1057 goto cleanup;
1058
1060 if (!ret)
1061 goto cleanup;
1062 }
1063 else
1064 {
1065 ret = GetActiveClassicTheme(pThemes, &selection);
1066 if (!ret)
1067 goto cleanup;
1068
1070 if (!ret)
1071 goto cleanup;
1072 }
1073
1075 if (!ret)
1076 goto cleanup;
1077
1079
1080 ret = TRUE;
1081
1082cleanup:
1083 CleanupThemes(pThemes);
1084
1085 return ret;
1086}
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:552
BOOL FindOrAppendTheme(IN PTHEME pThemeList, IN LPCWSTR pwszThemeFileName, IN LPCWSTR pwszColorBuff, IN LPCWSTR pwszSizeBuff, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:816
BOOL LoadSchemeFromTheme(OUT PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:963
BOOL GetActiveClassicTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:894
BOOL ActivateTheme(IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:936
VOID ApplyScheme(IN COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:330
PTHEME LoadThemes(VOID)
Definition: theme.c:774
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 /* Save the icon size to registry */
366 if (Result == ERROR_SUCCESS)
367 {
368 wsprintf(clText, L"%d", scheme->iIconSize);
369
371 L"Shell Icon Size",
372 0,
373 REG_SZ,
374 (BYTE *)clText,
375 (lstrlen(clText) + 1) * sizeof(WCHAR));
377 }
378
379 /* Apply non client metrics */
380 SystemParametersInfoW(SPI_SETNONCLIENTMETRICS,
381 sizeof(NONCLIENTMETRICS),
382 &scheme->ncMetrics,
384
385 /* Apply icon metrics */
386 SystemParametersInfoW(SPI_SETICONMETRICS,
387 sizeof(ICONMETRICS),
388 &scheme->icMetrics,
390
391 /* Effects, save only when needed: */
392 /* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
393 * Just keep them in sync for now.
394 */
395
396#define SYS_CONFIG(__uiAction, __uiParam, __pvParam) \
397 SystemParametersInfoW(__uiAction, __uiParam, __pvParam, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
398
399 scheme->Effects.bTooltipAnimation = scheme->Effects.bMenuAnimation;
400 scheme->Effects.bTooltipFade = scheme->Effects.bMenuFade;
401
402 /* Use the following transition effect for menus and tooltips */
403 SYS_CONFIG(SPI_SETMENUANIMATION, 0, IntToPtr(scheme->Effects.bMenuAnimation));
404 SYS_CONFIG(SPI_SETMENUFADE, 0, IntToPtr(scheme->Effects.bMenuFade));
405
406 /* Use the following method to smooth edges of screen fonts */
407 SYS_CONFIG(SPI_SETFONTSMOOTHING, scheme->Effects.bFontSmoothing, 0);
408 SYS_CONFIG(SPI_SETFONTSMOOTHINGTYPE, 0, IntToPtr(scheme->Effects.uiFontSmoothingType));
409
410 /*
411 * Refresh and redraw all the windows, otherwise the font smoothing changes
412 * only appear after any future partial region invalidation.
413 * Not everyone listens for this WM_SETTINGCHANGE, including the shell and most third party programs.
414 */
416
417 /* Show shadows under windows */
418 SYS_CONFIG(SPI_SETDROPSHADOW, 0, IntToPtr(scheme->Effects.bDropShadow));
419
420 /* Show window contents while dragging */
421 SYS_CONFIG(SPI_SETDRAGFULLWINDOWS, scheme->Effects.bDragFullWindows, 0);
422
423 /* Hide underlined letters for keyboard navigation until I press the Alt key */
424 SYS_CONFIG(SPI_SETKEYBOARDCUES, 0, IntToPtr(scheme->Effects.bKeyboardCues));
425
426 SYS_CONFIG(SPI_SETFLATMENU, 0, IntToPtr(scheme->bFlatMenus));
427
428 // SYS_CONFIG(SPI_SETACTIVEWINDOWTRACKING, 0, IntToPtr(scheme->Effects.bActiveWindowTracking));
429 // SYS_CONFIG(SPI_SETCOMBOBOXANIMATION, 0, IntToPtr(scheme->Effects.bComboBoxAnimation));
430 // SYS_CONFIG(SPI_SETLISTBOXSMOOTHSCROLLING, 0, IntToPtr(scheme->Effects.bListBoxSmoothScrolling));
431 // SYS_CONFIG(SPI_SETGRADIENTCAPTIONS, 0, IntToPtr(scheme->Effects.bGradientCaptions));
432 // SYS_CONFIG(SPI_SETACTIVEWNDTRKZORDER, 0, IntToPtr(scheme->Effects.bActiveWndTrkZorder));
433 // SYS_CONFIG(SPI_SETHOTTRACKING, 0, IntToPtr(scheme->Effects.bHotTracking));
434 // SYS_CONFIG(SPI_SETSELECTIONFADE, 0, IntToPtr(scheme->Effects.bSelectionFade));
435 SYS_CONFIG(SPI_SETTOOLTIPANIMATION, 0, IntToPtr(scheme->Effects.bTooltipAnimation));
436 SYS_CONFIG(SPI_SETTOOLTIPFADE, 0, IntToPtr(scheme->Effects.bTooltipFade));
437 // SYS_CONFIG(SPI_SETCURSORSHADOW, 0, IntToPtr(scheme->Effects.bCursorShadow));
438 // SYS_CONFIG(SPI_SETUIEFFECTS, 0, IntToPtr(scheme->Effects.bUiEffects));
439
440#undef SYS_CONFIG
441
442 /* Save SchemeId in the registry */
443 if (pSelectedTheme->Theme != NULL && pSelectedTheme->ThemeActive == FALSE)
444 {
445 StyleName = pSelectedTheme->Color->StyleName;
449 REG_SZ,
450 StyleName,
451 (lstrlenW(StyleName) + 1) * sizeof(WCHAR));
452 }
453
454 if (pSelectedTheme->ThemeActive)
455 {
456 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"Current", REG_SZ, NULL, 0);
457 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"NewCurrent", REG_SZ, NULL, 0);
458 }
459 else if (pSelectedTheme->Color)
460 {
461 PCWSTR ClassicSchemeName = pSelectedTheme->Color->DisplayName;
462 DWORD cb = (lstrlenW(ClassicSchemeName) + 1) * sizeof(WCHAR);
463 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"Current", REG_SZ, ClassicSchemeName, cb); // 95+
464 SHSetValueW(HKEY_CURRENT_USER, L"Control Panel\\Appearance", L"NewCurrent", REG_SZ, ClassicSchemeName, cb); // XP+
465 }
466}
#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_CPMetrics[]
Definition: theme.c:20
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
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
#define GetBValue(quad)
Definition: precomp.h:71
#define GetGValue(quad)
Definition: precomp.h:70
#define GetRValue(quad)
Definition: precomp.h:69
#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
#define NUM_COLORS
Definition: palettemodel.h:10
short WCHAR
Definition: pedump.c:58
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
#define lstrlen
Definition: winbase.h:3597
#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:6031
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
unsigned char BYTE
Definition: xxhash.c:193

Referenced by ActivateThemeFile().

◆ CleanupStyles()

static void CleanupStyles ( IN PTHEME_STYLE  pStylesList)
static

Definition at line 534 of file theme.c.

535{
536 PTHEME_STYLE pStyle, pStyleOld;
537
538 pStyle = pStylesList;
539 while (pStyle)
540 {
541 if (pStyle->ChildStyle) CleanupStyles(pStyle->ChildStyle);
542 if (pStyle->DisplayName) free(pStyle->DisplayName);
543 if (pStyle->StyleName) free(pStyle->StyleName);
544
545 pStyleOld = pStyle;
546 pStyle = pStyle->NextStyle;
547 free(pStyleOld);
548 }
549}
#define free
Definition: debug_ros.c:5
static void CleanupStyles(IN PTHEME_STYLE pStylesList)
Definition: theme.c:534
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 552 of file theme.c.

553{
554 PTHEME pTheme, pThemeOld;
555
556 pTheme = pThemeList;
557 while (pTheme)
558 {
559 CleanupStyles(pTheme->ColoursList);
560 if (pTheme->SizesList) CleanupStyles(pTheme->SizesList);
561 if (pTheme->DisplayName) free(pTheme->DisplayName);
562 if (pTheme->ThemeFileName) free(pTheme->ThemeFileName);
563
564 pThemeOld = pTheme;
565 pTheme = pTheme->NextTheme;
566 free(pThemeOld);
567 }
568}
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 505 of file theme.c.

506{
507 PTHEME_STYLE pStyle;
508
509 pStyle = (PTHEME_STYLE) malloc(sizeof(THEME_STYLE));
510 if (pStyle == NULL) return NULL;
511
512 pStyle->StyleName = _wcsdup(pszName);
513 if (pStyle->StyleName == NULL)
514 {
515 free(pStyle);
516 return NULL;
517 }
518
519 pStyle->DisplayName = _wcsdup(pszDisplayName);
520 if (pStyle->DisplayName == NULL)
521 {
522 free(pStyle->StyleName);
523 free(pStyle);
524 return NULL;
525 }
526
527 pStyle->ChildStyle = NULL;
528 pStyle->NextStyle = NULL;
529
530 return pStyle;
531}
struct _THEME_STYLE * PTHEME_STYLE
#define malloc
Definition: debug_ros.c:4
_ACRTIMP wchar_t *__cdecl _wcsdup(const wchar_t *) __WINE_DEALLOC(free) __WINE_MALLOC
Definition: wcs.c:86

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

◆ CreateTheme()

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

Definition at line 469 of file theme.c.

470{
471 PTHEME pTheme;
472
473 pTheme = (PTHEME) malloc(sizeof(THEME));
474 if (pTheme == NULL) return NULL;
475
476 pTheme->DisplayName = _wcsdup(pszDisplayName);
477 if (pTheme->DisplayName == NULL)
478 {
479 free(pTheme);
480 return NULL;
481 }
482
483 pTheme->ColoursList = NULL;
484 pTheme->NextTheme = NULL;
485 pTheme->SizesList = NULL;
486
487 if (pszName == NULL)
488 {
489 pTheme->ThemeFileName = NULL;
490 return pTheme;
491 }
492
493 pTheme->ThemeFileName = _wcsdup(pszName);
494 if (pTheme->ThemeFileName == NULL)
495 {
496 free(pTheme->DisplayName);
497 free(pTheme);
498 return NULL;
499 }
500
501 return pTheme;
502}
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 1015 of file theme.c.

1016{
1017 HBRUSH hbrBack;
1018 HRESULT hres;
1019
1020 hbrBack = CreateSolidBrush(scheme->crColor[COLOR_DESKTOP]);
1021
1022 FillRect(hdcMem, prcWindow, hbrBack);
1023 DeleteObject(hbrBack);
1024
1025 InflateRect(prcWindow, -8, -8);
1026 prcWindow->bottom -= 12;
1027
1030 prcWindow,
1031 pSelectedTheme->Theme->ThemeFileName,
1032 pSelectedTheme->Color->StyleName,
1033 pSelectedTheme->Size->StyleName,
1034 &scheme->ncMetrics,
1035 scheme->crColor);
1036
1037 return SUCCEEDED(hres);
1038}
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 750 of file theme.c.

756{
757 PTHEME *List, pTheme;
758
759 List = (PTHEME*)lpData;
760 pTheme = LoadTheme(pszThemeFileName, pszThemeName);
761 if (pTheme == NULL) return FALSE;
762
763 pTheme->NextTheme = *List;
764 *List = pTheme;
765
766 return TRUE;
767}
PTHEME LoadTheme(IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName)
Definition: theme.c:732
_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 712 of file theme.c.

713{
714 DWORD index = 0;
716 THEME_STYLE *List = NULL, **ppPrevStyle, *pCurrentStyle;
717
718 ppPrevStyle = &List;
719
720 while (SUCCEEDED(pfnEnumTheme (pszThemeFileName, NULL, index++, &names)))
721 {
722 pCurrentStyle = CreateStyle(names.szName, names.szDisplayName);
723 if(pCurrentStyle == NULL) break;
724
725 *ppPrevStyle = pCurrentStyle;
726 ppPrevStyle = &pCurrentStyle->NextStyle;
727 }
728
729 return List;
730}
static PTHEME_STYLE CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:505
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 816 of file theme.c.

821{
822 PTHEME pTheme;
823 PTHEME pFoundTheme = NULL;
824
825 ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION));
826
827 for (pTheme = pThemeList; pTheme; pTheme = pTheme->NextTheme)
828 {
829 if (pTheme->ThemeFileName &&
830 _wcsicmp(pTheme->ThemeFileName, pwszThemeFileName) == 0)
831 {
832 pFoundTheme = pTheme;
833 break;
834 }
835
836 if (pTheme->NextTheme == NULL)
837 break;
838 }
839
840 if (!pFoundTheme)
841 {
842 pFoundTheme = LoadTheme(pwszThemeFileName, pwszThemeFileName);
843 if (!pFoundTheme)
844 return FALSE;
845
846 pTheme->NextTheme = pFoundTheme;
847 }
848
849 pSelectedTheme->ThemeActive = TRUE;
850 pSelectedTheme->Theme = pFoundTheme;
851 if (pwszColorBuff)
852 pSelectedTheme->Color = FindStyle(pFoundTheme->ColoursList, pwszColorBuff);
853 else
854 pSelectedTheme->Color = pFoundTheme->ColoursList;
855
856 if (pwszSizeBuff)
857 pSelectedTheme->Size = FindStyle(pFoundTheme->SizesList, pwszSizeBuff);
858 else
859 pSelectedTheme->Size = pFoundTheme->SizesList;
860
861 return TRUE;
862}
static PTHEME_STYLE FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
Definition: theme.c:571
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
#define ZeroMemory
Definition: minwinbase.h:31

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

◆ FindStyle()

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

Definition at line 571 of file theme.c.

572{
573 PTHEME_STYLE pStyle;
574
575 for (pStyle = pStylesList; pStyle; pStyle = pStyle->NextStyle)
576 {
577 if (_wcsicmp(pStyle->StyleName, StyleName) == 0)
578 {
579 return pStyle;
580 }
581 }
582
583 /* If we can't find the style requested, return the first one */
584 return pStylesList;
585}

Referenced by FindOrAppendTheme(), and GetActiveClassicTheme().

◆ GetActiveClassicTheme()

BOOL GetActiveClassicTheme ( IN PTHEME  pThemeList,
OUT PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 894 of file theme.c.

895{
896 INT Result;
897 WCHAR szSelectedClassicScheme[5], szSelectedClassicSize[5];
898 HKEY hkNewSchemes;
899 DWORD dwType, dwDisplayNameLength;
900 PTHEME_STYLE pCurrentStyle, pCurrentSize;
901
902 ZeroMemory(pSelectedTheme, sizeof(THEME_SELECTION));
903
904 /* Assume failure */
905 szSelectedClassicScheme[0] = 0;
906 szSelectedClassicSize[0] = 0;
907
909 if (Result != ERROR_SUCCESS) return FALSE;
910
911 dwType = REG_SZ;
912 dwDisplayNameLength = sizeof(szSelectedClassicScheme);
913 Result = RegQueryValueEx(hkNewSchemes, L"SelectedStyle", NULL, &dwType,
914 (LPBYTE)&szSelectedClassicScheme, &dwDisplayNameLength);
915 if (Result == ERROR_SUCCESS)
916 {
917 dwType = REG_SZ;
918 dwDisplayNameLength = sizeof(szSelectedClassicSize);
919 Result = SHGetValue(hkNewSchemes, szSelectedClassicScheme, L"SelectedSize",
920 &dwType, szSelectedClassicSize, &dwDisplayNameLength);
921 }
922
923 RegCloseKey(hkNewSchemes);
924
925 pCurrentStyle = FindStyle(pThemeList->ColoursList, szSelectedClassicScheme);
926 pCurrentSize = FindStyle(pCurrentStyle->ChildStyle, szSelectedClassicSize);
927
928 pSelectedTheme->Theme = pThemeList;
929 pSelectedTheme->Color = pCurrentStyle;
930 pSelectedTheme->Size = pCurrentSize;
931
932 return TRUE;
933}
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:556

Referenced by ActivateThemeFile().

◆ GetActiveTheme()

BOOL GetActiveTheme ( IN PTHEME  pThemeList,
OUT PTHEME_SELECTION  pSelectedTheme 
)

Definition at line 869 of file theme.c.

870{
871 WCHAR szThemeFileName[MAX_PATH];
872 WCHAR szColorBuff[MAX_PATH];
873 WCHAR szSizeBuff[MAX_PATH];
874 HRESULT hret;
875
876 /* Retrieve the name of the current theme */
877 hret = GetCurrentThemeName(szThemeFileName,
878 MAX_PATH,
879 szColorBuff,
880 MAX_PATH,
881 szSizeBuff,
882 MAX_PATH);
883 if (FAILED(hret))
884 return FALSE;
885
886 return FindOrAppendTheme(pThemeList, szThemeFileName, szColorBuff, szSizeBuff, pSelectedTheme);
887}
#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 650 of file theme.c.

651{
652 INT Result;
653 HKEY hkNewSchemes, hkScheme;
654 INT iStyle;
655 WCHAR wstrStyleName[5], wstrDisplayName[50];
656 THEME_STYLE *List = NULL, *pCurrentStyle;
657
659 if (Result != ERROR_SUCCESS) return NULL;
660
661 iStyle = 0;
662 while ((RegEnumKeyW(hkNewSchemes, iStyle, wstrStyleName, 5) == ERROR_SUCCESS))
663 {
664 iStyle++;
665
666 Result = RegOpenKeyW(hkNewSchemes, wstrStyleName, &hkScheme);
667 if (Result != ERROR_SUCCESS) continue;
668
669 Result = RegLoadMUIStringW(hkScheme,
670 L"DisplayName",
671 wstrDisplayName,
672 sizeof(wstrDisplayName),
673 NULL,
674 0,
675 NULL);
676 if (Result != ERROR_SUCCESS)
677 {
678 Result = RegLoadMUIStringW(hkScheme,
679 L"LegacyName",
680 wstrDisplayName,
681 sizeof(wstrDisplayName),
682 NULL,
683 0,
684 NULL);
685 }
686
687 if (Result == ERROR_SUCCESS)
688 pCurrentStyle = CreateStyle(wstrStyleName, wstrDisplayName);
689 else
690 pCurrentStyle = CreateStyle(wstrStyleName, wstrStyleName);
691
692 if (pCurrentStyle != NULL)
693 {
694 pCurrentStyle->NextStyle = List;
695 pCurrentStyle->ChildStyle = LoadSchemeSizes(hkScheme);
696 if(pCurrentStyle->ChildStyle == NULL)
697 CleanupStyles(pCurrentStyle);
698 else
699 List = pCurrentStyle;
700 }
701
702 RegCloseKey(hkScheme);
703 }
704
705 RegCloseKey(hkNewSchemes);
706 return List;
707}
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:591
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}
int WINAPI SHRegGetIntW(HKEY hkey, const WCHAR *value, int default_value)
Definition: main.c:2247
ULONG dwMajorVersion
Definition: rtltypes.h:238
OSVERSIONINFO osvi
Definition: ver.c:28
#define GetVersionEx
Definition: winbase.h:3573
DWORD COLORREF
Definition: windef.h:100
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}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#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 963 of file theme.c.

964{
965 HTHEMEFILE hThemeFile = 0;
966 HRESULT hret;
967 HTHEME hTheme;
968 int i;
969
970 hret = OpenThemeFile(pSelectedTheme->Theme->ThemeFileName,
971 pSelectedTheme->Color->StyleName,
972 pSelectedTheme->Size->StyleName,
973 &hThemeFile,
974 0);
975
976 if (!SUCCEEDED(hret)) return FALSE;
977
978 hTheme = OpenThemeDataFromFile(hThemeFile, hCPLWindow, L"WINDOW", 0);
979 if (hTheme == NULL) return FALSE;
980
981 /* Load colors */
982 for (i = 0; i < NUM_COLORS; i++)
983 {
984 scheme->crColor[i] = GetThemeSysColor(hTheme,i);
985 }
986
987 /* Load sizes */
988 /* I wonder why GetThemeSysInt doesn't work here */
989 scheme->ncMetrics.iBorderWidth = GetThemeSysSize(hTheme, SM_CXFRAME);
990 scheme->ncMetrics.iScrollWidth = GetThemeSysSize(hTheme, SM_CXVSCROLL);
991 scheme->ncMetrics.iScrollHeight = GetThemeSysSize(hTheme, SM_CYHSCROLL);
992 scheme->ncMetrics.iCaptionWidth = GetThemeSysSize(hTheme, SM_CXSIZE);
993 scheme->ncMetrics.iCaptionHeight = GetThemeSysSize(hTheme, SM_CYSIZE);
994 scheme->ncMetrics.iSmCaptionWidth = GetThemeSysSize(hTheme, SM_CXSMSIZE);
995 scheme->ncMetrics.iSmCaptionHeight = GetThemeSysSize(hTheme, SM_CYSMSIZE);
996 scheme->ncMetrics.iMenuWidth = GetThemeSysSize(hTheme, SM_CXMENUSIZE);
997 scheme->ncMetrics.iMenuHeight = GetThemeSysSize(hTheme, SM_CYMENUSIZE);
998
999 /* Load fonts */
1000 GetThemeSysFont(hTheme, TMT_CAPTIONFONT, &scheme->ncMetrics.lfCaptionFont);
1001 GetThemeSysFont(hTheme, TMT_SMALLCAPTIONFONT, &scheme->ncMetrics.lfSmCaptionFont);
1002 GetThemeSysFont(hTheme, TMT_MENUFONT, &scheme->ncMetrics.lfMenuFont );
1003 GetThemeSysFont(hTheme, TMT_STATUSFONT, &scheme->ncMetrics.lfStatusFont);
1004 GetThemeSysFont(hTheme, TMT_MSGBOXFONT, &scheme->ncMetrics.lfMessageFont);
1005 GetThemeSysFont(hTheme, TMT_ICONTITLEFONT, &scheme->icMetrics.lfFont);
1006
1007 scheme->bFlatMenus = GetThemeSysBool(hTheme, TMT_FLATMENUS);
1008
1009 CloseThemeData(hTheme);
1010
1011 return TRUE;
1012}
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 591 of file theme.c.

592{
593 HKEY hkSizes, hkSize;
594 INT Result;
595 INT iStyle;
596 WCHAR wstrSizeName[5], wstrDisplayName[50];
597 THEME_STYLE *List = NULL, *pCurrentStyle;
598
599 Result = RegOpenKeyW(hkScheme, L"Sizes", &hkSizes);
600 if (Result != ERROR_SUCCESS) return NULL;
601
602 iStyle = 0;
603 while ((RegEnumKeyW(hkSizes, iStyle, wstrSizeName, 5) == ERROR_SUCCESS))
604 {
605 iStyle++;
606
607 Result = RegOpenKeyW(hkSizes, wstrSizeName, &hkSize);
608 if (Result != ERROR_SUCCESS) continue;
609
610 Result = RegLoadMUIStringW(hkSize,
611 L"DisplayName",
612 wstrDisplayName,
613 sizeof(wstrDisplayName),
614 NULL,
615 0,
616 NULL);
617 if (Result != ERROR_SUCCESS)
618 {
619 Result = RegLoadMUIStringW(hkSize,
620 L"LegacyName",
621 wstrDisplayName,
622 sizeof(wstrDisplayName),
623 NULL,
624 0,
625 NULL);
626 }
627
628 if (Result == ERROR_SUCCESS)
629 pCurrentStyle = CreateStyle(wstrSizeName, wstrDisplayName);
630 else
631 pCurrentStyle = CreateStyle(wstrSizeName, wstrSizeName);
632
633 if (pCurrentStyle != NULL)
634 {
635 pCurrentStyle->NextStyle = List;
636 List = pCurrentStyle;
637 }
638
639 RegCloseKey(hkSize);
640 }
641
642 RegCloseKey(hkSizes);
643 return List;
644}

Referenced by LoadClassicColorSchemes().

◆ LoadTheme()

PTHEME LoadTheme ( IN LPCWSTR  pszThemeFileName,
IN LPCWSTR  pszThemeName 
)

Definition at line 732 of file theme.c.

733{
734 PTHEME pTheme = CreateTheme(pszThemeFileName, pszThemeName);
735 if (pTheme == NULL)
736 return NULL;
737
738 pTheme->SizesList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeSizes);
739 pTheme->ColoursList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeColors);
740 if(pTheme->SizesList == NULL || pTheme->ColoursList == NULL)
741 {
742 CleanupThemes(pTheme);
743 return NULL;
744 }
745
746 return pTheme;
747}
static THEME_STYLE * EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
Definition: theme.c:712
HRESULT(WINAPI * ENUMTHEMESTYLE)(LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)
Definition: theme.c:709
static THEME * CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:469
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 774 of file theme.c.

775{
776 HRESULT hret;
777 PTHEME pClassicTheme;
778 WCHAR strClassicTheme[40];
779 WCHAR szThemesPath[MAX_PATH], *pszClassicTheme;
780 int res;
781
782 /* Insert the classic theme */
783 res = LoadString(hApplet, IDS_CLASSIC_THEME, strClassicTheme, 40);
784 pszClassicTheme = (res > 0 ? strClassicTheme : L"Classic Theme");
785 pClassicTheme = CreateTheme(NULL, pszClassicTheme);
786 if (pClassicTheme == NULL) return NULL;
787 pClassicTheme->ColoursList = LoadClassicColorSchemes();
788
789 /* Get path to themes folder */
790 ZeroMemory(szThemesPath, sizeof(szThemesPath));
792 if (FAILED(hret)) return pClassicTheme;
793 lstrcatW (szThemesPath, L"\\Themes");
794
795 /* Enumerate themes */
796 hret = EnumThemes( szThemesPath, EnumThemeProc, &pClassicTheme->NextTheme);
797 if (FAILED(hret))
798 {
799 pClassicTheme->NextTheme = NULL;
800 if (pClassicTheme->ColoursList == NULL)
801 {
802 free(pClassicTheme->DisplayName);
803 free(pClassicTheme);
804 return NULL;
805 }
806 }
807
808 return pClassicTheme;
809}
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:750
static THEME_STYLE * LoadClassicColorSchemes(VOID)
Definition: theme.c:650
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2717
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:2168
#define CSIDL_RESOURCES
Definition: shlobj.h:2243
#define LoadString
Definition: winuser.h:5985

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 1090 of file theme.c.

1091{
1092 LPNMHDR lpnm;
1093
1094 switch (uMsg)
1095 {
1096 case WM_INITDIALOG:
1097 break;
1098
1099 case WM_COMMAND:
1100 break;
1101
1102 case WM_NOTIFY:
1103 lpnm = (LPNMHDR)lParam;
1104 switch (lpnm->code)
1105 {
1106 case PSN_APPLY:
1108 return TRUE;
1109 }
1110 break;
1111
1112 case WM_DESTROY:
1113 break;
1114 }
1115
1116 return FALSE;
1117}
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:3267
#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:6009
#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 ApplyScheme(), and 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().