*/
#include "desk.h"
-#include "theme.h"
static BOOL g_PresetLoaded = FALSE;
static INT g_TemplateCount = 0;
THEME_PRESET g_ThemeTemplates[MAX_TEMPLATES];
/* This is the list of names for the colors stored in the registry */
-const TCHAR g_RegColorNames[NUM_COLORS][MAX_COLORNAMELENGTH] =
+static const TCHAR *g_RegColorNames[NUM_COLORS] =
{TEXT("Scrollbar"), /* 00 = COLOR_SCROLLBAR */
TEXT("Background"), /* 01 = COLOR_DESKTOP */
TEXT("ActiveTitle"), /* 02 = COLOR_ACTIVECAPTION */
};
/* This is the list of used metrics and their numbers */
-const int g_SizeMetric[NUM_SIZES] =
+static const int g_SizeMetric[NUM_SIZES] =
{
SM_CXBORDER, /* 00: SIZE_BORDER_X */
SM_CYBORDER, /* 01: SIZE_BORDER_Y */
- SM_CYCAPTION, /* 02: SIZE_CAPTION_Y */
+ SM_CYSIZE, /* 02: SIZE_CAPTION_Y */
SM_CXICON, /* 03: SIZE_ICON_X */
SM_CYICON, /* 04: SIZE_ICON_Y */
SM_CXICONSPACING, /* 05: SIZE_ICON_SPC_X */
SM_CYMENU, /* 08: SIZE_MENU_Y */
SM_CXVSCROLL, /* 09: SIZE_SCROLL_X */
SM_CYHSCROLL, /* 10: SIZE_SCROLL_Y */
- SM_CYSMCAPTION, /* 11: SIZE_SMCAPTION_Y */
+ SM_CYSMSIZE, /* 11: SIZE_SMCAPTION_Y */
SM_CXEDGE, /* 12: SIZE_EDGE_X */
SM_CYEDGE, /* 13: SIZE_EDGE_Y */
SM_CYSIZEFRAME, /* 14: SIZE_FRAME_Y */
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
* Just keep them in sync for now:
*/
- theme->Effects.bTooltipAnimation = theme->Effects.bMenuAnimation;
- theme->Effects.bTooltipFade = theme->Effects.bMenuFade;
+ theme->Effects.bTooltipAnimation = theme->Effects.bMenuAnimation;
+ theme->Effects.bTooltipFade = theme->Effects.bMenuFade;
/* show content of windows during dragging */
SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &theme->Effects.bDragFullWindows, 0);
{
INT i;
TCHAR strSelectedStyle[4];
- TCHAR strSizeName[20] = {TEXT("Sizes\\0")};
+ TCHAR strSizeName[20] = TEXT("Sizes\\0");
TCHAR strValueName[10];
HKEY hkNewSchemes, hkScheme, hkSize;
DWORD dwType, dwLength;
+ UINT64 iSize;
BOOL Ret = FALSE;
if (!g_PresetLoaded)
{
wsprintf(strValueName, TEXT("Size #%d"), i);
dwLength = sizeof(UINT64);
- if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&theme->Size[i], &dwLength) != ERROR_SUCCESS ||
+ if (RegQueryValueEx(hkSize, strValueName, NULL, &dwType, (LPBYTE)&iSize, &dwLength) != ERROR_SUCCESS ||
dwType != REG_QWORD || dwLength != sizeof(UINT64))
{
/* Failed to read registry value, initialize with current setting for now */
theme->Size[i] = GetSystemMetrics(g_SizeMetric[i]);
}
+ else
+ theme->Size[i] = (INT)iSize;
}
RegCloseKey(hkScheme);
}
return Ret;
}
-static VOID
-_UpdateUserPref(UINT SpiGet, UINT SpiSet, BOOL *pbFlag)
-{
- SystemParametersInfo(SpiSet, 0, (PVOID)pbFlag, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
-}
-#define UPDATE_USERPREF(NAME,pbFlag) _UpdateUserPref(SPI_GET ## NAME, SPI_SET ## NAME, pbFlag)
-
VOID ApplyTheme(THEME* theme, INT ThemeId)
{
INT i, Result;
HKEY hKey;
- DWORD dwDisposition;
TCHAR clText[16];
NONCLIENTMETRICS NonClientMetrics;
+ ICONMETRICS IconMetrics;
/* Apply Colors from global variable */
SetSysColors(NUM_COLORS, g_ColorList, theme->crColor);
/* Save colors to registry */
- Result = RegOpenKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, KEY_ALL_ACCESS, &hKey);
- if (Result != ERROR_SUCCESS)
- {
- /* Could not open the key, try to create it */
- Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
- }
-
+ Result = RegCreateKeyEx(HKEY_CURRENT_USER, g_CPColors, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
if (Result == ERROR_SUCCESS)
{
for (i = 0; i < NUM_COLORS; i++)
RegCloseKey(hKey);
}
- /* Apply the fonts */
+ /* Apply non client metrics */
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
NonClientMetrics.lfCaptionFont = theme->lfFont[FONT_CAPTION];
NonClientMetrics.lfMenuFont = theme->lfFont[FONT_MENU];
NonClientMetrics.lfStatusFont = theme->lfFont[FONT_INFO];
NonClientMetrics.lfMessageFont = theme->lfFont[FONT_DIALOG];
- SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
- SystemParametersInfo(SPI_SETICONTITLELOGFONT, sizeof(LOGFONT), &theme->lfFont[FONT_ICON], 0);
-
- /* FIXME: Apply size metrics */
-
- /* Save fonts and size metrics to registry */
- Result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop\\WindowMetrics"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
- if (Result == ERROR_SUCCESS)
- {
- RegSetValueEx(hKey, TEXT("CaptionFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_CAPTION], sizeof(LOGFONT));
- RegSetValueEx(hKey, TEXT("SmCaptionFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_SMCAPTION], sizeof(LOGFONT));
- RegSetValueEx(hKey, TEXT("IconFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_ICON], sizeof(LOGFONT));
- RegSetValueEx(hKey, TEXT("MenuFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_MENU], sizeof(LOGFONT));
- RegSetValueEx(hKey, TEXT("StatusFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_INFO], sizeof(LOGFONT));
- RegSetValueEx(hKey, TEXT("MessageFont"), 0, REG_BINARY, (BYTE *)&theme->lfFont[FONT_DIALOG], sizeof(LOGFONT));
-
- /* Save size metrics to registry */
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_BORDER_X]);
- RegSetValueEx(hKey, TEXT("BorderWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_CAPTION_Y]);
- RegSetValueEx(hKey, TEXT("CaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_CAPTION_Y]);
- RegSetValueEx(hKey, TEXT("CaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SMCAPTION_Y]);
- RegSetValueEx(hKey, TEXT("SmCaptionWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SMCAPTION_Y]);
- RegSetValueEx(hKey, TEXT("SmCaptionHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_ICON_SPC_X]);
- RegSetValueEx(hKey, TEXT("IconSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_ICON_SPC_Y]);
- RegSetValueEx(hKey, TEXT("IconVerticalSpacing"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_MENU_SIZE_X]);
- RegSetValueEx(hKey, TEXT("MenuWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_MENU_Y]);
- RegSetValueEx(hKey, TEXT("MenuHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SCROLL_X]);
- RegSetValueEx(hKey, TEXT("ScrollWidth"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), -15 * theme->Size[SIZE_SCROLL_Y]);
- RegSetValueEx(hKey, TEXT("ScrollHeight"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
- wsprintf(clText, TEXT("%d"), theme->Size[SIZE_ICON_X]);
- RegSetValueEx(hKey, TEXT("Shell Icon Size"), 0, REG_SZ, (BYTE *)clText, sizeof(clText));
-
- RegCloseKey(hKey);
- }
+ NonClientMetrics.iBorderWidth = theme->Size[SIZE_BORDER_X];
+ NonClientMetrics.iScrollWidth = theme->Size[SIZE_SCROLL_X];
+ NonClientMetrics.iScrollHeight = theme->Size[SIZE_SCROLL_Y];
+ NonClientMetrics.iCaptionWidth = theme->Size[SIZE_CAPTION_Y];
+ NonClientMetrics.iCaptionHeight = theme->Size[SIZE_CAPTION_Y];
+ NonClientMetrics.iSmCaptionWidth = theme->Size[SIZE_SMCAPTION_Y];
+ NonClientMetrics.iSmCaptionHeight = theme->Size[SIZE_SMCAPTION_Y];
+ NonClientMetrics.iMenuWidth = theme->Size[SIZE_MENU_SIZE_X];
+ NonClientMetrics.iMenuHeight = theme->Size[SIZE_MENU_Y];
+ SystemParametersInfo(SPI_SETNONCLIENTMETRICS,
+ sizeof(NONCLIENTMETRICS),
+ &NonClientMetrics,
+ SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
+
+ /* Apply icon metrics */
+ IconMetrics.cbSize = sizeof(ICONMETRICS);
+ SystemParametersInfo(SPI_GETICONMETRICS, sizeof(ICONMETRICS), &IconMetrics, 0);
+ IconMetrics.iHorzSpacing = theme->Size[SIZE_ICON_SPC_X];
+ IconMetrics.iVertSpacing = theme->Size[SIZE_ICON_SPC_Y];
+ IconMetrics.lfFont = theme->lfFont[FONT_ICON];
+ SystemParametersInfo(SPI_SETICONMETRICS,
+ sizeof(ICONMETRICS),
+ &IconMetrics,
+ SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
/* Effects, save only when needed: */
/* FIXME: XP seems to use grayed checkboxes to reflect differences between menu and tooltips settings
theme->Effects.bTooltipFade = theme->Effects.bMenuFade;
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, theme->Effects.bDragFullWindows, (PVOID)&theme->Effects.bDragFullWindows, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, IntToPtr(theme->Effects.bKeyboardCues), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
- //UPDATE_USERPREF(ACTIVEWINDOWTRACKING, &theme->Effects.bActiveWindowTracking);
- //UPDATE_USERPREF(MENUANIMATION, &theme->Effects.bMenuAnimation);
- //UPDATE_USERPREF(COMBOBOXANIMATION, &theme->Effects.bComboBoxAnimation);
- //UPDATE_USERPREF(LISTBOXSMOOTHSCROLLING, &theme->Effects.bListBoxSmoothScrolling);
- //UPDATE_USERPREF(GRADIENTCAPTIONS, &theme->Effects.bGradientCaptions);
- //UPDATE_USERPREF(ACTIVEWNDTRKZORDER, &theme->Effects.bActiveWndTrkZorder);
- //UPDATE_USERPREF(HOTTRACKING, &theme->Effects.bHotTracking);
- UPDATE_USERPREF(MENUFADE, &theme->Effects.bMenuFade);
- //UPDATE_USERPREF(SELECTIONFADE, &theme->Effects.bSelectionFade);
- UPDATE_USERPREF(TOOLTIPANIMATION, &theme->Effects.bTooltipAnimation);
- UPDATE_USERPREF(TOOLTIPFADE, &theme->Effects.bTooltipFade);
- //UPDATE_USERPREF(CURSORSHADOW, &theme->Effects.bCursorShadow);
- //UPDATE_USERPREF(UIEFFECTS, &theme->Effects.bUiEffects);
+ //SystemParametersInfo(SPI_SETACTIVEWINDOWTRACKING, 0, (PVOID)&theme->Effects.bActiveWindowTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETMENUANIMATION, 0, (PVOID)&theme->Effects.bMenuAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETCOMBOBOXANIMATION, 0, (PVOID)&theme->Effects.bComboBoxAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, (PVOID)&theme->Effects.bListBoxSmoothScrolling, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETGRADIENTCAPTIONS, 0, (PVOID)&theme->Effects.bGradientCaptions, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETACTIVEWNDTRKZORDER, 0, (PVOID)&theme->Effects.bActiveWndTrkZorder, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETHOTTRACKING, 0, (PVOID)&theme->Effects.bHotTracking, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ SystemParametersInfo(SPI_SETMENUFADE, 0, (PVOID)&theme->Effects.bMenuFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETSELECTIONFADE, 0, (PVOID)&theme->Effects.bSelectionFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ SystemParametersInfo(SPI_SETTOOLTIPANIMATION, 0, (PVOID)&theme->Effects.bTooltipAnimation, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ SystemParametersInfo(SPI_SETTOOLTIPFADE, 0, (PVOID)&theme->Effects.bTooltipFade, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETCURSORSHADOW, 0, (PVOID)&theme->Effects.bCursorShadow, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
+ //SystemParametersInfo(SPI_SETUIEFFECTS, 0, (PVOID)&theme->Effects.bUiEffects, SPIF_UPDATEINIFILE|SPIF_SENDCHANGE);
/* Save ThemeId */
Result = RegOpenKeyEx(HKEY_CURRENT_USER, g_CPANewSchemes, 0, KEY_ALL_ACCESS, &hKey);