From fc75db49d370249537354138f16d82b94b5aa996 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Fri, 6 Dec 2013 13:09:31 -0800 Subject: [PATCH] Bug 946990 - Remember whether Metro or desktop Firefox was last used [r=bbondy] --- .../shell/commandexecutehandler/CEHHelper.cpp | 18 ++++ .../shell/commandexecutehandler/CEHHelper.h | 3 + .../CommandExecuteHandler.cpp | 91 +++++++------------ 3 files changed, 52 insertions(+), 60 deletions(-) diff --git a/browser/metro/shell/commandexecutehandler/CEHHelper.cpp b/browser/metro/shell/commandexecutehandler/CEHHelper.cpp index 163ca084af9..be7f0ac2377 100644 --- a/browser/metro/shell/commandexecutehandler/CEHHelper.cpp +++ b/browser/metro/shell/commandexecutehandler/CEHHelper.cpp @@ -12,6 +12,7 @@ HANDLE sCon; LPCWSTR metroDX10Available = L"MetroD3DAvailable"; +LPCWSTR metroLastAHE = L"MetroLastAHE"; typedef HRESULT (WINAPI*D3D10CreateDevice1Func) (IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, @@ -107,6 +108,23 @@ IsProcessRunning(const wchar_t *processName, bool bCheckIfMetro) return exists; } + +AHE_TYPE +GetLastAHE() +{ + DWORD ahe; + if (GetDWORDRegKey(metroLastAHE, ahe)) { + return (AHE_TYPE) ahe; + } + return AHE_DESKTOP; +} + +bool +SetLastAHE(AHE_TYPE ahe) +{ + return SetDWORDRegKey(metroLastAHE, (DWORD) ahe); +} + bool IsDX10Available() { diff --git a/browser/metro/shell/commandexecutehandler/CEHHelper.h b/browser/metro/shell/commandexecutehandler/CEHHelper.h index e30f1c5c210..3bd7bf8fef2 100644 --- a/browser/metro/shell/commandexecutehandler/CEHHelper.h +++ b/browser/metro/shell/commandexecutehandler/CEHHelper.h @@ -13,6 +13,7 @@ #include #include #include +#include //#define SHOW_CONSOLE 1 extern HANDLE sCon; @@ -24,6 +25,8 @@ void Log(const wchar_t *fmt, ...); void SetupConsole(); #endif +AHE_TYPE GetLastAHE(); +bool SetLastAHE(AHE_TYPE ahe); bool IsDX10Available(); bool GetDWORDRegKey(LPCWSTR name, DWORD &value); bool SetDWORDRegKey(LPCWSTR name, DWORD value); diff --git a/browser/metro/shell/commandexecutehandler/CommandExecuteHandler.cpp b/browser/metro/shell/commandexecutehandler/CommandExecuteHandler.cpp index 910a0b124b2..d79ac85daff 100644 --- a/browser/metro/shell/commandexecutehandler/CommandExecuteHandler.cpp +++ b/browser/metro/shell/commandexecutehandler/CommandExecuteHandler.cpp @@ -262,79 +262,50 @@ public: IFACEMETHODIMP GetValue(AHE_TYPE *aLaunchType) { Log(L"IExecuteCommandApplicationHostEnvironment::GetValue()"); - *aLaunchType = AHE_DESKTOP; - mIsDesktopRequest = true; + *aLaunchType = GetLaunchType(); + mIsDesktopRequest = (*aLaunchType == AHE_DESKTOP); + SetLastAHE(*aLaunchType); + return S_OK; + } + + /** + * Choose the appropriate launch type based on the user's previously chosen + * host environment, along with system constraints. + */ + AHE_TYPE GetLaunchType() { + AHE_TYPE ahe = GetLastAHE(); + Log(L"Previous AHE: %d", ahe); if (!mIsRestartMetroRequest && IsProcessRunning(kFirefoxExe, false)) { - return S_OK; + Log(L"Returning AHE_DESKTOP because desktop is already running"); + return AHE_DESKTOP; } else if (!mIsRestartDesktopRequest && IsProcessRunning(kMetroFirefoxExe, true)) { - *aLaunchType = AHE_IMMERSIVE; - mIsDesktopRequest = false; - return S_OK; - } - - if (!mUnkSite) { - Log(L"No mUnkSite."); - return S_OK; + Log(L"Returning AHE_IMMERSIVE because Metro is already running"); + return AHE_IMMERSIVE; } if (mIsRestartDesktopRequest) { Log(L"Restarting in desktop host environment."); - return S_OK; + return AHE_DESKTOP; } - HRESULT hr; - IServiceProvider* pSvcProvider = nullptr; - hr = mUnkSite->QueryInterface(IID_IServiceProvider, (void**)&pSvcProvider); - if (!pSvcProvider) { - Log(L"Couldn't get IServiceProvider service from explorer. (%X)", hr); - return S_OK; + if (mIsRestartMetroRequest) { + Log(L"Restarting in metro host environment."); + ahe = AHE_IMMERSIVE; } - IExecuteCommandHost* pHost = nullptr; - // If we can't get this it's a conventional desktop launch - hr = pSvcProvider->QueryService(SID_ExecuteCommandHost, - IID_IExecuteCommandHost, (void**)&pHost); - if (!pHost) { - Log(L"Couldn't get IExecuteCommandHost service from explorer. (%X)", hr); - SafeRelease(&pSvcProvider); - return S_OK; - } - SafeRelease(&pSvcProvider); + if (ahe == AHE_IMMERSIVE) { + if (!IsDefaultBrowser()) { + Log(L"returning AHE_DESKTOP because we are not the default browser"); + return AHE_DESKTOP; + } - EC_HOST_UI_MODE mode; - if (FAILED(pHost->GetUIMode(&mode))) { - Log(L"GetUIMode failed."); - SafeRelease(&pHost); - return S_OK; + if (!IsDX10Available()) { + Log(L"returning AHE_DESKTOP because DX10 is not available"); + return AHE_DESKTOP; + } } - - // 0 - launched from desktop - // 1 - ? - // 2 - launched from tile interface - Log(L"GetUIMode: %d", mode); - - if (!IsDefaultBrowser()) { - mode = ECHUIM_DESKTOP; - } - - if (mode == ECHUIM_DESKTOP) { - Log(L"returning AHE_DESKTOP"); - SafeRelease(&pHost); - return S_OK; - } - SafeRelease(&pHost); - - if (!IsDX10Available()) { - Log(L"returning AHE_DESKTOP because DX10 is not available"); - *aLaunchType = AHE_DESKTOP; - mIsDesktopRequest = true; - } else { - Log(L"returning AHE_IMMERSIVE"); - *aLaunchType = AHE_IMMERSIVE; - mIsDesktopRequest = false; - } - return S_OK; + return ahe; } /*