Module: wine Branch: master Commit: 998baf9f0fe4723b0171f03626687ef1e541a344 URL: http://source.winehq.org/git/wine.git/?a=commit;h=998baf9f0fe4723b0171f03626...
Author: Nigel Liang ncliang@gmail.com Date: Wed Aug 22 19:48:11 2007 -0700
winecfg: Suport color schemes from .theme format themes.
---
programs/winecfg/theme.c | 147 ++++++++++++++++++++++++++++++++++------------ 1 files changed, 110 insertions(+), 37 deletions(-)
diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c index 5797c96..ca67914 100644 --- a/programs/winecfg/theme.c +++ b/programs/winecfg/theme.c @@ -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];