ReactOS 0.4.16-dev-1946-g52006dd
theme.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Display Control Panel
4 * FILE: dll/cpl/desk/theme.c
5 * PURPOSE: Handling themes and visual effects
6 *
7 * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
8 * Ismael Ferreras Morezuelas (swyterzone+reactos@gmail.com)
9 */
10
11#include "desk.h"
12
13#include <shlwapi.h>
14#include <uxtheme.h>
15#include <uxundoc.h>
16#include <vssym32.h>
17
18static const WCHAR g_CPColors[] = L"Control Panel\\Colors";
19static const WCHAR g_CPANewSchemes[] = L"Control Panel\\Appearance\\New Schemes";
20static const WCHAR g_CPMetrics[] = L"Control Panel\\Desktop\\WindowMetrics";
21static const WCHAR g_SelectedStyle[] = L"SelectedStyle";
22
23/******************************************************************************/
24
25/* This is the list of names for the colors stored in the registry */
27 L"Scrollbar", /* 00 = COLOR_SCROLLBAR */
28 L"Background", /* 01 = COLOR_DESKTOP */
29 L"ActiveTitle", /* 02 = COLOR_ACTIVECAPTION */
30 L"InactiveTitle", /* 03 = COLOR_INACTIVECAPTION */
31 L"Menu", /* 04 = COLOR_MENU */
32 L"Window", /* 05 = COLOR_WINDOW */
33 L"WindowFrame", /* 06 = COLOR_WINDOWFRAME */
34 L"MenuText", /* 07 = COLOR_MENUTEXT */
35 L"WindowText", /* 08 = COLOR_WINDOWTEXT */
36 L"TitleText", /* 09 = COLOR_CAPTIONTEXT */
37 L"ActiveBorder", /* 10 = COLOR_ACTIVEBORDER */
38 L"InactiveBorder", /* 11 = COLOR_INACTIVEBORDER */
39 L"AppWorkSpace", /* 12 = COLOR_APPWORKSPACE */
40 L"Hilight", /* 13 = COLOR_HIGHLIGHT */
41 L"HilightText", /* 14 = COLOR_HIGHLIGHTTEXT */
42 L"ButtonFace", /* 15 = COLOR_BTNFACE */
43 L"ButtonShadow", /* 16 = COLOR_BTNSHADOW */
44 L"GrayText", /* 17 = COLOR_GRAYTEXT */
45 L"ButtonText", /* 18 = COLOR_BTNTEXT */
46 L"InactiveTitleText", /* 19 = COLOR_INACTIVECAPTIONTEXT */
47 L"ButtonHilight", /* 20 = COLOR_BTNHIGHLIGHT */
48 L"ButtonDkShadow", /* 21 = COLOR_3DDKSHADOW */
49 L"ButtonLight", /* 22 = COLOR_3DLIGHT */
50 L"InfoText", /* 23 = COLOR_INFOTEXT */
51 L"InfoWindow", /* 24 = COLOR_INFOBK */
52 L"ButtonAlternateFace", /* 25 = COLOR_ALTERNATEBTNFACE */
53 L"HotTrackingColor", /* 26 = COLOR_HOTLIGHT */
54 L"GradientActiveTitle", /* 27 = COLOR_GRADIENTACTIVECAPTION */
55 L"GradientInactiveTitle", /* 28 = COLOR_GRADIENTINACTIVECAPTION */
56 L"MenuHilight", /* 29 = COLOR_MENUHILIGHT */
57 L"MenuBar", /* 30 = COLOR_MENUBAR */
58};
59
60/******************************************************************************/
61
62VOID
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}
81
82int
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}
102
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}
117
118/*
119 * LoadCurrentScheme: Populates the passed scheme based on the current system settings
120 */
121BOOL
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}
238
239/*
240 * LoadSchemeFromReg: Populates the passed scheme with values retrieved from registry
241 */
242BOOL
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}
325
326/*
327 * ApplyScheme: Applies the selected scheme and stores its id in the registry if needed
328 */
329VOID
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}
455
456static THEME*
457CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
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}
491
492static PTHEME_STYLE
493CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName)
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}
520
521static void
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}
538
539void
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}
557
558static PTHEME_STYLE
559FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
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}
574
575/*
576 * LoadSchemeSizes: Returns a list of sizes from the registry key of a scheme
577 */
578static PTHEME_STYLE
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}
633
634/*
635 * LoadClassicColorSchemes: Returns a list of classic theme colours from the registry key of a scheme
636 */
637static THEME_STYLE*
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}
696
698
699static THEME_STYLE*
700EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
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}
719
720PTHEME LoadTheme(IN LPCWSTR pszThemeFileName,IN LPCWSTR pszThemeName)
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}
736
739 IN LPCWSTR pszThemeFileName,
740 IN LPCWSTR pszThemeName,
741 IN LPCWSTR pszToolTip,
742 IN LPVOID lpReserved2,
743 IN OUT LPVOID lpData)
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}
756
757/*
758 * LoadThemes: Returns a list that contains tha classic theme and
759 * the visual styles of the system
760 */
761PTHEME
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}
798
799/*
800 * FindSelectedTheme: Finds the specified theme in the list of themes
801 * or loads it if it was not loaded already.
802 */
803BOOL
805 IN LPCWSTR pwszThemeFileName,
806 IN LPCWSTR pwszColorBuff,
807 IN LPCWSTR pwszSizeBuff,
808 OUT PTHEME_SELECTION pSelectedTheme)
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}
851
852/*
853 * GetActiveTheme: Gets the active theme and populates pSelectedTheme
854 * with entries from the list of loaded themes.
855 */
856BOOL
857GetActiveTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
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}
876
877/*
878 * GetActiveTheme: Gets the active classic theme and populates pSelectedTheme
879 * with entries from the list of loaded themes
880 */
881BOOL
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}
922
923BOOL
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}
949
950BOOL
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}
1001
1002BOOL
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}
1027
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}
1075
1076/* TODO: */
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}
unsigned long long UINT64
#define SIZE_MENU_WIDTH
Definition: appearance.h:11
#define SIZE_CAPTION_WIDTH
Definition: appearance.h:7
struct _THEME_STYLE * PTHEME_STYLE
#define FONT_MESSAGE
Definition: appearance.h:22
#define NUM_FONTS
Definition: appearance.h:26
#define FONT_CAPTION
Definition: appearance.h:18
#define SIZE_ICON_SPACE_X
Definition: appearance.h:14
#define FONT_SMCAPTION
Definition: appearance.h:19
#define FONT_STATUS
Definition: appearance.h:21
#define SIZE_SCROLL_HEIGHT
Definition: appearance.h:6
#define NUM_SIZES
Definition: appearance.h:27
#define SIZE_SM_CAPTION_WIDTH
Definition: appearance.h:9
struct _THEME * PTHEME
#define SIZE_ICON_SPACE_Y
Definition: appearance.h:15
#define SIZE_SCROLL_WIDTH
Definition: appearance.h:5
#define FONT_ICON
Definition: appearance.h:23
#define SIZE_MENU_HEIGHT
Definition: appearance.h:12
#define SIZE_BORDER_WIDTH
Definition: appearance.h:4
#define SIZE_ICON
Definition: appearance.h:16
#define FONT_MENU
Definition: appearance.h:20
#define SIZE_CAPTION_HEIGHT
Definition: appearance.h:8
#define SIZE_SM_CAPTION_HEIGHT
Definition: appearance.h:10
#define IntToPtr(i)
Definition: basetsd.h:83
#define RegCloseKey(hKey)
Definition: registry.h:49
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
int selection
Definition: ctm.c:92
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
HWND hCPLWindow
Definition: desk.c:38
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
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
HINSTANCE hApplet
Definition: access.c:17
#define IDS_CLASSIC_THEME
Definition: resource.h:111
static PTHEME_STYLE LoadSchemeSizes(IN HKEY hkScheme)
Definition: theme.c:579
static void CleanupStyles(IN PTHEME_STYLE pStylesList)
Definition: theme.c:522
static PTHEME_STYLE FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
Definition: theme.c:559
static const WCHAR g_CPMetrics[]
Definition: theme.c:20
PTHEME LoadTheme(IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName)
Definition: theme.c:720
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
void CleanupThemes(IN PTHEME pThemeList)
Definition: theme.c:540
static THEME_STYLE * EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
Definition: theme.c:700
VOID SchemeSetMetric(IN COLOR_SCHEME *scheme, int id, int value)
Definition: theme.c:63
static PTHEME_STYLE CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:493
static const WCHAR g_CPColors[]
Definition: theme.c:18
BOOL FindOrAppendTheme(IN PTHEME pThemeList, IN LPCWSTR pwszThemeFileName, IN LPCWSTR pwszColorBuff, IN LPCWSTR pwszSizeBuff, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:804
HRESULT(WINAPI * ENUMTHEMESTYLE)(LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)
Definition: theme.c:697
static const WCHAR * g_RegColorNames[NUM_COLORS]
Definition: theme.c:26
PLOGFONTW SchemeGetFont(IN COLOR_SCHEME *scheme, int id)
Definition: theme.c:104
BOOL GetActiveTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:857
static const WCHAR g_SelectedStyle[]
Definition: theme.c:21
BOOL DrawThemePreview(IN HDC hdcMem, IN PCOLOR_SCHEME scheme, IN PTHEME_SELECTION pSelectedTheme, IN PRECT prcWindow)
Definition: theme.c:1003
int SchemeGetMetric(IN COLOR_SCHEME *scheme, int id)
Definition: theme.c:83
BOOL ActivateThemeFile(LPCWSTR pwszFile)
Definition: theme.c:1028
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
static THEME * CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:457
PTHEME LoadThemes(VOID)
Definition: theme.c:762
BOOL LoadSchemeFromReg(OUT COLOR_SCHEME *scheme, IN PTHEME_SELECTION pSelectedTheme)
Definition: theme.c:243
INT_PTR CALLBACK ThemesPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: theme.c:1078
BOOL LoadCurrentScheme(OUT COLOR_SCHEME *scheme)
Definition: theme.c:122
static const WCHAR g_CPANewSchemes[]
Definition: theme.c:19
static THEME_STYLE * LoadClassicColorSchemes(VOID)
Definition: theme.c:638
#define SYS_CONFIG(__uiAction, __uiParam, __pvParam)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
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 RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1201
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrlenW
Definition: compat.h:750
static DWORD DWORD * dwLength
Definition: fusion.c:86
static void cleanup(void)
Definition: main.c:1335
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2716
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
int WINAPI SHRegGetIntW(HKEY hKey, LPCWSTR lpszValue, int iDefault)
Definition: reg.c:2374
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
HRESULT WINAPI DrawNCPreview(HDC hDC, DWORD DNCP_Flag, LPRECT prcPreview, LPCWSTR pszThemeFileName, LPCWSTR pszColorName, LPCWSTR pszSizeName, PNONCLIENTMETRICSW pncMetrics, COLORREF *lpaRgbValues)
Definition: nonclient.c:1215
HTHEME WINAPI OpenThemeDataFromFile(HTHEMEFILE hThemeFile, HWND hwnd, LPCWSTR pszClassList, DWORD flags)
Definition: system.c:882
HRESULT WINAPI GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars)
Definition: system.c:980
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 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
HRESULT WINAPI EnumThemes(LPCWSTR pszThemePath, ENUMTHEMEPROC callback, LPVOID lpData)
Definition: system.c:1344
HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile)
Definition: system.c:1213
HRESULT WINAPI CloseThemeData(HTHEME hTheme)
Definition: system.c:1036
#define GetBValue(quad)
Definition: precomp.h:75
#define GetGValue(quad)
Definition: precomp.h:74
#define GetRValue(quad)
Definition: precomp.h:73
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
pKey DeleteObject()
GLuint res
Definition: glext.h:9613
GLuint GLuint * names
Definition: glext.h:11545
GLuint index
Definition: glext.h:6031
GLuint64EXT * result
Definition: glext.h:11304
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 SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define TEXT(s)
Definition: k32.h:28
#define REG_SZ
Definition: layer.c:22
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
static HDC
Definition: imagelist.c:88
HRESULT hres
Definition: protocol.c:465
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static HTHEME(WINAPI *pOpenThemeDataEx)(HWND
unsigned int UINT
Definition: ndis.h:50
#define REG_BINARY
Definition: nt_native.h:1499
#define DWORD
Definition: nt_native.h:44
#define NUM_COLORS
Definition: palettemodel.h:10
long LONG
Definition: pedump.c:60
#define PSN_APPLY
Definition: prsht.h:117
#define SHGetValue
Definition: shlwapi.h:836
#define WM_NOTIFY
Definition: richedit.h:61
DWORD scheme
#define REG_QWORD
Definition: sdbapi.c:616
#define REG_DWORD
Definition: sdbapi.c:615
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
@ SHGFP_TYPE_DEFAULT
Definition: shlobj.h:2156
#define CSIDL_RESOURCES
Definition: shlobj.h:2231
ULONG dwMajorVersion
Definition: rtltypes.h:238
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
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
UINT code
Definition: winuser.h:3261
Definition: windef.h:99
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
#define OUT
Definition: typedefs.h:40
Definition: pdh_main.c:96
#define DNCP_DRAW_ALL
Definition: uxundoc.h:130
struct tagTHEMENAMES * PTHEMENAMES
OSVERSIONINFO osvi
Definition: ver.c:28
#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
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
HDC hdcMem
Definition: welcome.c:104
#define GetVersionEx
Definition: winbase.h:3601
#define lstrlen
Definition: winbase.h:3625
DWORD COLORREF
Definition: windef.h:94
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
LOGFONTA LOGFONT
Definition: wingdi.h:4861
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO _In_opt_ LPVOID lpReserved
Definition: winnls.h:1268
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegQueryValueEx
Definition: winreg.h:531
DWORD WINAPI GetSysColor(_In_ int)
#define SM_CYSIZE
Definition: winuser.h:1003
BOOL WINAPI SetSysColors(_In_ int cElements, _In_reads_(cElements) CONST INT *lpaElements, _In_reads_(cElements) CONST COLORREF *lpaRgbValues)
#define SM_CXVSCROLL
Definition: winuser.h:972
#define HWND_BROADCAST
Definition: winuser.h:1215
#define SM_CXFRAME
Definition: winuser.h:1005
#define WM_COMMAND
Definition: winuser.h:1768
#define WM_INITDIALOG
Definition: winuser.h:1767
#define SM_CXSIZE
Definition: winuser.h:1002
#define SM_CYHSCROLL
Definition: winuser.h:973
#define SPIF_SENDCHANGE
Definition: winuser.h:1600
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
#define SPIF_UPDATEINIFILE
Definition: winuser.h:1599
#define SM_CXSMSIZE
Definition: winuser.h:1026
#define COLOR_DESKTOP
Definition: winuser.h:925
struct tagNMHDR * LPNMHDR
#define SendMessage
Definition: winuser.h:5954
#define wsprintf
Definition: winuser.h:5976
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define LoadString
Definition: winuser.h:5930
#define SM_CXMENUSIZE
Definition: winuser.h:1028
#define SM_CYSMSIZE
Definition: winuser.h:1027
#define WM_DESTROY
Definition: winuser.h:1637
#define SM_CYMENUSIZE
Definition: winuser.h:1029
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
_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
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193