ReactOS 0.4.17-dev-573-g8315b8c
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 /* 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}
467
468static THEME*
469CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
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}
503
504static PTHEME_STYLE
505CreateStyle(LPCWSTR pszName, LPCWSTR pszDisplayName)
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}
532
533static void
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}
550
551void
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}
569
570static PTHEME_STYLE
571FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
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}
586
587/*
588 * LoadSchemeSizes: Returns a list of sizes from the registry key of a scheme
589 */
590static PTHEME_STYLE
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}
645
646/*
647 * LoadClassicColorSchemes: Returns a list of classic theme colours from the registry key of a scheme
648 */
649static THEME_STYLE*
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}
708
710
711static THEME_STYLE*
712EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
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}
731
732PTHEME LoadTheme(IN LPCWSTR pszThemeFileName,IN LPCWSTR pszThemeName)
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}
748
751 IN LPCWSTR pszThemeFileName,
752 IN LPCWSTR pszThemeName,
753 IN LPCWSTR pszToolTip,
754 IN LPVOID lpReserved2,
755 IN OUT LPVOID lpData)
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}
768
769/*
770 * LoadThemes: Returns a list that contains tha classic theme and
771 * the visual styles of the system
772 */
773PTHEME
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}
810
811/*
812 * FindSelectedTheme: Finds the specified theme in the list of themes
813 * or loads it if it was not loaded already.
814 */
815BOOL
817 IN LPCWSTR pwszThemeFileName,
818 IN LPCWSTR pwszColorBuff,
819 IN LPCWSTR pwszSizeBuff,
820 OUT PTHEME_SELECTION pSelectedTheme)
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}
863
864/*
865 * GetActiveTheme: Gets the active theme and populates pSelectedTheme
866 * with entries from the list of loaded themes.
867 */
868BOOL
869GetActiveTheme(IN PTHEME pThemeList, OUT PTHEME_SELECTION pSelectedTheme)
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}
888
889/*
890 * GetActiveTheme: Gets the active classic theme and populates pSelectedTheme
891 * with entries from the list of loaded themes
892 */
893BOOL
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}
934
935BOOL
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}
961
962BOOL
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}
1013
1014BOOL
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}
1039
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}
1087
1088/* TODO: */
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}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#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:591
static void CleanupStyles(IN PTHEME_STYLE pStylesList)
Definition: theme.c:534
static PTHEME_STYLE FindStyle(IN PTHEME_STYLE pStylesList, IN PCWSTR StyleName)
Definition: theme.c:571
static const WCHAR g_CPMetrics[]
Definition: theme.c:20
PTHEME LoadTheme(IN LPCWSTR pszThemeFileName, IN LPCWSTR pszThemeName)
Definition: theme.c:732
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
void CleanupThemes(IN PTHEME pThemeList)
Definition: theme.c:552
static THEME_STYLE * EnumThemeStyles(IN LPCWSTR pszThemeFileName, IN ENUMTHEMESTYLE pfnEnumTheme)
Definition: theme.c:712
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:505
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:816
HRESULT(WINAPI * ENUMTHEMESTYLE)(LPCWSTR, LPWSTR, DWORD, PTHEMENAMES)
Definition: theme.c:709
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:869
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:1015
int SchemeGetMetric(IN COLOR_SCHEME *scheme, int id)
Definition: theme.c:83
BOOL ActivateThemeFile(LPCWSTR pwszFile)
Definition: theme.c:1040
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
static THEME * CreateTheme(LPCWSTR pszName, LPCWSTR pszDisplayName)
Definition: theme.c:469
PTHEME LoadThemes(VOID)
Definition: theme.c:774
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:1090
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:650
#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
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
_ACRTIMP wchar_t *__cdecl _wcsdup(const wchar_t *) __WINE_DEALLOC(free) __WINE_MALLOC
Definition: wcs.c:86
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
int WINAPI SHRegGetIntW(HKEY hkey, const WCHAR *value, int default_value)
Definition: main.c:2247
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2717
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:71
#define GetGValue(quad)
Definition: precomp.h:70
#define GetRValue(quad)
Definition: precomp.h:69
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
unsigned int UINT
Definition: sysinfo.c:13
#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 HTHEME(WINAPI *pOpenThemeDataEx)(HWND
#define REG_BINARY
Definition: nt_native.h:1499
#define DWORD
Definition: nt_native.h:44
#define NUM_COLORS
Definition: palettemodel.h:10
short WCHAR
Definition: pedump.c:58
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
@ SHGFP_TYPE_DEFAULT
Definition: shlobj.h:2168
#define CSIDL_RESOURCES
Definition: shlobj.h:2243
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:3267
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
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:3573
#define lstrlen
Definition: winbase.h:3597
DWORD COLORREF
Definition: windef.h:100
#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:1279
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegQueryValueEx
Definition: winreg.h:556
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:6009
#define wsprintf
Definition: winuser.h:6031
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define LoadString
Definition: winuser.h:5985
#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
unsigned char BYTE
Definition: xxhash.c:193