Author: gadamopoulos Date: Mon May 8 18:45:35 2017 New Revision: 74506
URL: http://svn.reactos.org/svn/reactos?rev=74506&view=rev Log: [DESK.CPL] -Implement opening msstyles files.
Modified: trunk/reactos/dll/cpl/desk/appearance.c trunk/reactos/dll/cpl/desk/appearance.h trunk/reactos/dll/cpl/desk/desk.c trunk/reactos/dll/cpl/desk/desk.h trunk/reactos/dll/cpl/desk/theme.c
Modified: trunk/reactos/dll/cpl/desk/appearance.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/appearance.c?r... ============================================================================== --- trunk/reactos/dll/cpl/desk/appearance.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/appearance.c [iso-8859-1] Mon May 8 18:45:35 2017 @@ -117,8 +117,48 @@ g->pThemes = LoadThemes(); if (g->pThemes) { - if (!GetActiveTheme(g->pThemes, &g->ActiveTheme)) - g->ActiveTheme.ThemeActive = FALSE; + PTHEME pLoadedTheme = NULL; + + if (g_GlobalData.pwszAction && + g_GlobalData.pwszFile && + wcscmp(g_GlobalData.pwszAction, L"OpenMSTheme") == 0) + { + /* Check if the theme specified was already loaded */ + for (pTheme = g->pThemes; pTheme; pTheme = pTheme->NextTheme) + { + if (pTheme->ThemeFileName && wcsicmp(pTheme->ThemeFileName, g_GlobalData.pwszFile) == 0) + { + pLoadedTheme = pTheme; + break; + } + + if (!pTheme->NextTheme) + break; + } + + if (!pLoadedTheme) + { + /* Load it now and insert it in the list */ + pLoadedTheme = LoadTheme(g_GlobalData.pwszFile, g_GlobalData.pwszFile); + if (pLoadedTheme) + pTheme->NextTheme = pLoadedTheme; + } + } + + if (pLoadedTheme) + { + g->ActiveTheme.ThemeActive = TRUE; + g->ActiveTheme.Theme = pLoadedTheme; + g->ActiveTheme.Color = pLoadedTheme->ColoursList; + g->ActiveTheme.Size = pLoadedTheme->SizesList; + } + else + { + if (!GetActiveTheme(g->pThemes, &g->ActiveTheme)) + { + g->ActiveTheme.ThemeActive = FALSE; + } + }
/* * Keep a copy of the selected classic theme in order to select this
Modified: trunk/reactos/dll/cpl/desk/appearance.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/appearance.h?r... ============================================================================== --- trunk/reactos/dll/cpl/desk/appearance.h [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/appearance.h [iso-8859-1] Mon May 8 18:45:35 2017 @@ -135,6 +135,7 @@ VOID SchemeSetMetric(COLOR_SCHEME *scheme, int id, int value); int SchemeGetMetric(COLOR_SCHEME *scheme, int id); PLOGFONTW SchemeGetFont(COLOR_SCHEME *scheme, int id); +PTHEME LoadTheme(IN LPCWSTR pszThemeFileName,IN LPCWSTR pszThemeName); PTHEME LoadThemes(VOID); BOOL GetActiveTheme(PTHEME pThemeList, PTHEME_SELECTION pSelectedTheme); BOOL GetActiveClassicTheme(PTHEME pThemeList, PTHEME_SELECTION pSelectedTheme);
Modified: trunk/reactos/dll/cpl/desk/desk.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/desk.c?rev=745... ============================================================================== --- trunk/reactos/dll/cpl/desk/desk.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/desk.c [iso-8859-1] Mon May 8 18:45:35 2017 @@ -8,7 +8,7 @@ */
#include "desk.h" - +#include <Shellapi.h> #include <cplext.h> #include <debug.h>
@@ -109,12 +109,13 @@ WORD idDlg; DLGPROC DlgProc; LPFNPSPCALLBACK Callback; + LPWSTR Name; } PropPages[] = { - { IDD_BACKGROUND, BackgroundPageProc, NULL }, - { IDD_SCREENSAVER, ScreenSaverPageProc, NULL }, - { IDD_APPEARANCE, AppearancePageProc, NULL }, - { IDD_SETTINGS, SettingsPageProc, SettingsPageCallbackProc }, + { IDD_BACKGROUND, BackgroundPageProc, NULL, L"Desktop" }, + { IDD_SCREENSAVER, ScreenSaverPageProc, NULL, L"Screen Saver" }, + { IDD_APPEARANCE, AppearancePageProc, NULL, L"Appearance" }, + { IDD_SETTINGS, SettingsPageProc, SettingsPageCallbackProc, L"Settings" }, };
/* Display Applet */ @@ -127,12 +128,51 @@ TCHAR Caption[1024]; LONG ret; UINT i; - - UNREFERENCED_PARAMETER(lParam); + LPWSTR *argv = NULL; + LPCWSTR pwszSelectedTab = NULL; + LPCWSTR pwszFile = NULL; + LPCWSTR pwszAction = NULL; + UNREFERENCED_PARAMETER(wParam); - UNREFERENCED_PARAMETER(uMsg); - UNREFERENCED_PARAMETER(hwnd); - + + hCPLWindow = hwnd; + + if (uMsg == CPL_STARTWPARMSW && lParam) + { + int argc; + int i; + LPCWSTR pszCommandLine = (LPCWSTR)lParam; + + argv = CommandLineToArgvW(pszCommandLine, &argc); + + if (argv && argc) + { + for (i = 0; i<argc; i++) + { + if (argv[i][0] == L'@') + pwszSelectedTab = &argv[i][1]; + else if (wcsncmp(argv[i], L"/Action:", 8) == 0) + pwszAction = &argv[i][8]; + else if (wcsncmp(argv[i], L"/file:", 6) == 0) + pwszFile = &argv[i][6]; + } + } + + /* HACK: shell32 doesn't give the correct params to CPL_STARTWPARMSW so we need to ... improvise */ + if (wcsncmp(pszCommandLine, L"/file:", 6) == 0) + { + LPCWSTR pwszType = wcsrchr(pszCommandLine, L'.'); + if (pwszType && wcsicmp(pwszType, L".msstyles") == 0) + { + pwszFile = &pszCommandLine[6]; + pwszSelectedTab = L"Appearance"; + pwszAction = L"OpenMSTheme"; + } + } + } + + g_GlobalData.pwszFile = pwszFile; + g_GlobalData.pwszAction = pwszAction; g_GlobalData.desktop_color = GetSysColor(COLOR_DESKTOP);
LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR)); @@ -153,6 +193,9 @@
for (i = 0; i != sizeof(PropPages) / sizeof(PropPages[0]); i++) { + if (pwszSelectedTab && wcsicmp(pwszSelectedTab, PropPages[i].Name) == 0) + psh.nStartPage = i; + /* Override the background page if requested by a shell extension */ if (PropPages[i].idDlg == IDD_BACKGROUND && hpsxa != NULL && SHReplaceFromPropSheetExtArray(hpsxa, CPLPAGE_DISPLAY_BACKGROUND, PropSheetAddPage, (LPARAM)&psh) != 0) @@ -173,7 +216,10 @@ if (hpsxa != NULL) SHDestroyPropSheetExtArray(hpsxa);
- return ret; + if (argv) + LocalFree(argv); + + return TRUE; }
@@ -202,9 +248,10 @@ break;
case CPL_DBLCLK: - hCPLWindow = hwndCPl; Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); break; + case CPL_STARTWPARMSW: + return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2); }
return FALSE;
Modified: trunk/reactos/dll/cpl/desk/desk.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/desk.h?rev=745... ============================================================================== --- trunk/reactos/dll/cpl/desk/desk.h [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/desk.h [iso-8859-1] Mon May 8 18:45:35 2017 @@ -104,6 +104,8 @@ typedef struct _GLOBAL_DATA { COLORREF desktop_color; + LPCWSTR pwszFile; + LPCWSTR pwszAction; } GLOBAL_DATA, *PGLOBAL_DATA;
extern GLOBAL_DATA g_GlobalData;
Modified: trunk/reactos/dll/cpl/desk/theme.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/desk/theme.c?rev=74... ============================================================================== --- trunk/reactos/dll/cpl/desk/theme.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/desk/theme.c [iso-8859-1] Mon May 8 18:45:35 2017 @@ -704,6 +704,23 @@ return List; }
+PTHEME LoadTheme(IN LPCWSTR pszThemeFileName,IN LPCWSTR pszThemeName) +{ + PTHEME pTheme = CreateTheme(pszThemeFileName, pszThemeName); + if (pTheme == NULL) + return NULL; + + pTheme->SizesList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeSizes); + pTheme->ColoursList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeColors); + if(pTheme->SizesList == NULL || pTheme->ColoursList == NULL) + { + CleanupThemes(pTheme); + return NULL; + } + + return pTheme; +} + BOOL CALLBACK EnumThemeProc(IN LPVOID lpReserved, IN LPCWSTR pszThemeFileName, @@ -715,17 +732,8 @@ PTHEME *List, pTheme;
List = (PTHEME*)lpData; - - pTheme = CreateTheme(pszThemeFileName, pszThemeName); + pTheme = LoadTheme(pszThemeFileName, pszThemeName); if (pTheme == NULL) return FALSE; - - pTheme->SizesList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeSizes); - pTheme->ColoursList = EnumThemeStyles( pszThemeFileName, (ENUMTHEMESTYLE)EnumThemeColors); - if(pTheme->SizesList == NULL || pTheme->ColoursList == NULL) - { - CleanupThemes(pTheme); - return FALSE; - }
pTheme->NextTheme = *List; *List = pTheme;