diff --git a/reactos/dll/cpl/desk/appearance.c b/reactos/dll/cpl/desk/appearance.c index 40dfc3ea13d..ed2acaac7ea 100644 --- a/reactos/dll/cpl/desk/appearance.c +++ b/reactos/dll/cpl/desk/appearance.c @@ -117,8 +117,48 @@ AppearancePage_OnInit(HWND hwndDlg) 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 diff --git a/reactos/dll/cpl/desk/appearance.h b/reactos/dll/cpl/desk/appearance.h index 2a454a86de2..c261624146b 100644 --- a/reactos/dll/cpl/desk/appearance.h +++ b/reactos/dll/cpl/desk/appearance.h @@ -135,6 +135,7 @@ typedef struct tagGLOBALS 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); diff --git a/reactos/dll/cpl/desk/desk.c b/reactos/dll/cpl/desk/desk.c index 0506bf9d4d9..57a4b778ab7 100644 --- a/reactos/dll/cpl/desk/desk.c +++ b/reactos/dll/cpl/desk/desk.c @@ -8,7 +8,7 @@ */ #include "desk.h" - +#include #include #include @@ -109,12 +109,13 @@ static const struct 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 @@ DisplayApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam) TCHAR Caption[1024]; LONG ret; UINT i; + LPWSTR *argv = NULL; + LPCWSTR pwszSelectedTab = NULL; + LPCWSTR pwszFile = NULL; + LPCWSTR pwszAction = NULL; - UNREFERENCED_PARAMETER(lParam); 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; iSizesList = 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,18 +732,9 @@ EnumThemeProc(IN LPVOID lpReserved, 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;