winecfg: Suport color schemes from .theme format themes.

oldstable
Nigel Liang 2007-08-22 19:48:11 -07:00 committed by Alexandre Julliard
parent 3a7c16992b
commit 998baf9f0f
1 changed files with 110 additions and 37 deletions

View File

@ -496,9 +496,111 @@ static void apply_theme(HWND dialog)
theme_dirty = FALSE;
}
static struct
{
int sm_idx, color_idx;
const char *color_reg;
int size;
COLORREF color;
LOGFONTW lf;
} metrics[] =
{
{-1, COLOR_BTNFACE, "ButtonFace" }, /* IDC_SYSPARAMS_BUTTON */
{-1, COLOR_BTNTEXT, "ButtonText" }, /* IDC_SYSPARAMS_BUTTON_TEXT */
{-1, COLOR_BACKGROUND, "Background" }, /* IDC_SYSPARAMS_DESKTOP */
{SM_CXMENUSIZE, COLOR_MENU, "Menu" }, /* IDC_SYSPARAMS_MENU */
{-1, COLOR_MENUTEXT, "MenuText" }, /* IDC_SYSPARAMS_MENU_TEXT */
{SM_CXVSCROLL, COLOR_SCROLLBAR, "Scrollbar" }, /* IDC_SYSPARAMS_SCROLLBAR */
{-1, COLOR_HIGHLIGHT, "Hilight" }, /* IDC_SYSPARAMS_SELECTION */
{-1, COLOR_HIGHLIGHTTEXT, "HilightText" }, /* IDC_SYSPARAMS_SELECTION_TEXT */
{-1, COLOR_INFOBK, "InfoWindow" }, /* IDC_SYSPARAMS_TOOLTIP */
{-1, COLOR_INFOTEXT, "InfoText" }, /* IDC_SYSPARAMS_TOOLTIP_TEXT */
{-1, COLOR_WINDOW, "Window" }, /* IDC_SYSPARAMS_WINDOW */
{-1, COLOR_WINDOWTEXT, "WindowText" }, /* IDC_SYSPARAMS_WINDOW_TEXT */
{SM_CXSIZE, COLOR_ACTIVECAPTION, "ActiveTitle" }, /* IDC_SYSPARAMS_ACTIVE_TITLE */
{-1, COLOR_CAPTIONTEXT, "TitleText" }, /* IDC_SYSPARAMS_ACTIVE_TITLE_TEXT */
{-1, COLOR_INACTIVECAPTION, "InactiveTitle" }, /* IDC_SYSPARAMS_INACTIVE_TITLE */
{-1, COLOR_INACTIVECAPTIONTEXT,"InactiveTitleText" }, /* IDC_SYSPARAMS_INACTIVE_TITLE_TEXT */
{-1, -1, "MsgBoxText" }, /* IDC_SYSPARAMS_MSGBOX_TEXT */
};
static void save_sys_color(int idx, COLORREF clr)
{
char buffer[13];
sprintf(buffer, "%d %d %d", GetRValue (clr), GetGValue (clr), GetBValue (clr));
set_reg_key(HKEY_CURRENT_USER, "Control Panel\\Colors", metrics[idx].color_reg, buffer);
}
static void set_color_from_theme(WCHAR *keyName, COLORREF color)
{
char *keyNameA = NULL;
int keyNameSize=0, i=0;
keyNameSize = WideCharToMultiByte(CP_ACP, 0, keyName, -1, keyNameA, 0, NULL, NULL);
keyNameA = HeapAlloc(GetProcessHeap(), 0, keyNameSize);
WideCharToMultiByte(CP_ACP, 0, keyName, -1, keyNameA, -1, NULL, NULL);
for (i=0; i<sizeof(metrics)/sizeof(metrics[0]); i++)
{
if (strcmp(metrics[i].color_reg, keyNameA)==0)
{
metrics[i].color = color;
save_sys_color(i, color);
break;
}
}
HeapFree(GetProcessHeap(), 0, keyNameA);
}
static void do_parse_theme(WCHAR *file)
{
static const WCHAR colorSect[] = {
'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\',
'C','o','l','o','r','s',0};
WCHAR keyName[MAX_PATH], keyNameValue[MAX_PATH];
WCHAR *keyNamePtr = NULL;
char *keyNameValueA = NULL;
int keyNameValueSize = 0;
int red = 0, green = 0, blue = 0;
COLORREF color;
WINE_TRACE("%s\n", wine_dbgstr_w(file));
GetPrivateProfileStringW(colorSect, NULL, NULL, keyName,
MAX_PATH*sizeof(WCHAR), file);
keyNamePtr = keyName;
while (*keyNamePtr!=0) {
GetPrivateProfileStringW(colorSect, keyNamePtr, NULL, keyNameValue,
MAX_PATH*sizeof(WCHAR), file);
keyNameValueSize = WideCharToMultiByte(CP_ACP, 0, keyNameValue, -1,
keyNameValueA, 0, NULL, NULL);
keyNameValueA = HeapAlloc(GetProcessHeap(), 0, keyNameValueSize);
WideCharToMultiByte(CP_ACP, 0, keyNameValue, -1, keyNameValueA, -1, NULL, NULL);
WINE_TRACE("parsing key: %s with value: %s\n",
wine_dbgstr_w(keyNamePtr), wine_dbgstr_w(keyNameValue));
sscanf(keyNameValueA, "%d %d %d", &red, &green, &blue);
color = RGB((BYTE)red, (BYTE)blue, (BYTE)green);
HeapFree(GetProcessHeap(), 0, keyNameValueA);
set_color_from_theme(keyNamePtr, color);
keyNamePtr+=lstrlenW(keyNamePtr);
keyNamePtr++;
}
}
static void on_theme_install(HWND dialog)
{
static const WCHAR filterMask[] = {0,'*','.','m','s','s','t','y','l','e','s',0,0};
static const WCHAR filterMask[] = {0,'*','.','m','s','s','t','y','l','e','s',';',
'*','.','t','h','e','m','e',0,0};
static const WCHAR themeExt[] = {'.','T','h','e','m','e',0};
const int filterMaskLen = sizeof(filterMask)/sizeof(filterMask[0]);
OPENFILENAMEW ofn;
WCHAR filetitle[MAX_PATH];
@ -546,6 +648,13 @@ static void on_theme_install(HWND dialog)
if (FAILED (SHGetFolderPathW (NULL, CSIDL_RESOURCES|CSIDL_FLAG_CREATE, NULL,
SHGFP_TYPE_CURRENT, themeFilePath))) return;
if (lstrcmpiW(PathFindExtensionW(filetitle), themeExt)==0)
{
do_parse_theme(file);
SendMessage(GetParent(dialog), PSM_CHANGED, 0, 0);
return;
}
PathRemoveExtensionW (filetitle);
/* Construct path into which the theme file goes */
@ -829,42 +938,6 @@ static void apply_shell_folder_changes(void) {
}
}
static struct
{
int sm_idx, color_idx;
const char *color_reg;
int size;
COLORREF color;
LOGFONTW lf;
} metrics[] =
{
{-1, COLOR_BTNFACE, "ButtonFace" }, /* IDC_SYSPARAMS_BUTTON */
{-1, COLOR_BTNTEXT, "ButtonText" }, /* IDC_SYSPARAMS_BUTTON_TEXT */
{-1, COLOR_BACKGROUND, "Background" }, /* IDC_SYSPARAMS_DESKTOP */
{SM_CXMENUSIZE, COLOR_MENU, "Menu" }, /* IDC_SYSPARAMS_MENU */
{-1, COLOR_MENUTEXT, "MenuText" }, /* IDC_SYSPARAMS_MENU_TEXT */
{SM_CXVSCROLL, COLOR_SCROLLBAR, "Scrollbar" }, /* IDC_SYSPARAMS_SCROLLBAR */
{-1, COLOR_HIGHLIGHT, "Hilight" }, /* IDC_SYSPARAMS_SELECTION */
{-1, COLOR_HIGHLIGHTTEXT, "HilightText" }, /* IDC_SYSPARAMS_SELECTION_TEXT */
{-1, COLOR_INFOBK, "InfoWindow" }, /* IDC_SYSPARAMS_TOOLTIP */
{-1, COLOR_INFOTEXT, "InfoText" }, /* IDC_SYSPARAMS_TOOLTIP_TEXT */
{-1, COLOR_WINDOW, "Window" }, /* IDC_SYSPARAMS_WINDOW */
{-1, COLOR_WINDOWTEXT, "WindowText" }, /* IDC_SYSPARAMS_WINDOW_TEXT */
{SM_CXSIZE, COLOR_ACTIVECAPTION, "ActiveTitle" }, /* IDC_SYSPARAMS_ACTIVE_TITLE */
{-1, COLOR_CAPTIONTEXT, "TitleText" }, /* IDC_SYSPARAMS_ACTIVE_TITLE_TEXT */
{-1, COLOR_INACTIVECAPTION, "InactiveTitle" }, /* IDC_SYSPARAMS_INACTIVE_TITLE */
{-1, COLOR_INACTIVECAPTIONTEXT,"InactiveTitleText" }, /* IDC_SYSPARAMS_INACTIVE_TITLE_TEXT */
{-1, -1, "MsgBoxText" } /* IDC_SYSPARAMS_MSGBOX_TEXT */
};
static void save_sys_color(int idx, COLORREF clr)
{
char buffer[13];
sprintf(buffer, "%d %d %d", GetRValue (clr), GetGValue (clr), GetBValue (clr));
set_reg_key(HKEY_CURRENT_USER, "Control Panel\\Colors", metrics[idx].color_reg, buffer);
}
static void read_sysparams(HWND hDlg)
{
WCHAR buffer[256];