Bug 946990 - Remember whether Metro or desktop Firefox was last used [r=bbondy]

This commit is contained in:
Matt Brubeck 2013-12-06 13:09:31 -08:00
parent bd8dc92c27
commit fc75db49d3
3 changed files with 52 additions and 60 deletions

View File

@ -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()
{

View File

@ -13,6 +13,7 @@
#include <dxgi.h>
#include <d3d10misc.h>
#include <atlbase.h>
#include <shlobj.h>
//#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);

View File

@ -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;
}
/*