Commit 690a479e authored by David Bienvenu's avatar David Bienvenu Committed by Commit Bot

Restore browser windows to correct desktop on Win10 (reland)

This is a reland of crrev.com/c/1559168, with a fix for the issue restoring
windows after minimize (crbug.com/952142).

Bug: 873414,952142
Change-Id: I421c1334396c9525dc121d2e98864b7bf1b691a0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1570246Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Commit-Queue: David Bienvenu <davidbienvenu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652670}
parent f46c5476
......@@ -11,6 +11,7 @@
#include "base/macros.h"
#include "base/process/process_handle.h"
#include "base/strings/utf_string_conversions.h"
#include "base/win/windows_version.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/themes/theme_service.h"
......@@ -41,8 +42,7 @@ BrowserDesktopWindowTreeHostWin::BrowserDesktopWindowTreeHostWin(
browser_view_(browser_view),
browser_frame_(browser_frame) {}
BrowserDesktopWindowTreeHostWin::~BrowserDesktopWindowTreeHostWin() {
}
BrowserDesktopWindowTreeHostWin::~BrowserDesktopWindowTreeHostWin() {}
views::NativeMenuWin* BrowserDesktopWindowTreeHostWin::GetSystemMenu() {
if (!system_menu_.get()) {
......@@ -74,6 +74,52 @@ bool BrowserDesktopWindowTreeHostWin::UsesNativeSystemMenu() const {
////////////////////////////////////////////////////////////////////////////////
// BrowserDesktopWindowTreeHostWin, views::DesktopWindowTreeHostWin overrides:
void BrowserDesktopWindowTreeHostWin::Init(
const views::Widget::InitParams& params) {
DesktopWindowTreeHostWin::Init(params);
if (base::win::GetVersion() < base::win::VERSION_WIN10)
return; // VirtualDesktopManager isn't support pre Win-10.
CHECK(SUCCEEDED(::CoCreateInstance(__uuidof(VirtualDesktopManager), nullptr,
CLSCTX_ALL,
IID_PPV_ARGS(&virtual_desktop_manager_))));
if (!params.workspace.empty()) {
GUID guid = GUID_NULL;
HRESULT hr =
CLSIDFromString(base::UTF8ToUTF16(params.workspace).c_str(), &guid);
if (SUCCEEDED(hr)) {
// There are valid reasons MoveWindowToDesktop can fail, e.g.,
// the desktop was deleted. If it fails, the window will open on the
// current desktop.
virtual_desktop_manager_->MoveWindowToDesktop(GetHWND(), guid);
}
}
// This will force the window to re-open in this desktop on restart.
// We always want to do this even if |params.workspace| is empty, to handle
// the case of new windows.
OnHostWorkspaceChanged();
}
std::string BrowserDesktopWindowTreeHostWin::GetWorkspace() const {
std::string workspace_id;
if (virtual_desktop_manager_) {
GUID workspace_guid;
HRESULT hr = virtual_desktop_manager_->GetWindowDesktopId(GetHWND(),
&workspace_guid);
if (SUCCEEDED(hr)) {
LPOLESTR workspace_widestr;
StringFromCLSID(workspace_guid, &workspace_widestr);
workspace_id = base::WideToUTF8(workspace_widestr);
workspace_ = workspace_id;
CoTaskMemFree(workspace_widestr);
} else {
return workspace_.value_or("");
}
}
return workspace_id;
}
int BrowserDesktopWindowTreeHostWin::GetInitialShowState() const {
STARTUPINFO si = {0};
si.cb = sizeof(si);
......@@ -195,6 +241,13 @@ void BrowserDesktopWindowTreeHostWin::PostHandleMSG(UINT message,
WPARAM w_param,
LPARAM l_param) {
switch (message) {
case WM_SETFOCUS: {
// GetWorkspace sets |workspace_|, so stash prev value.
std::string prev_workspace = workspace_.value_or("");
if (prev_workspace != GetWorkspace())
OnHostWorkspaceChanged();
break;
}
case WM_CREATE:
minimize_button_metrics_.Init(GetHWND());
break;
......@@ -300,6 +353,5 @@ BrowserDesktopWindowTreeHost*
BrowserFrame* browser_frame) {
return new BrowserDesktopWindowTreeHostWin(native_widget_delegate,
desktop_native_widget_aura,
browser_view,
browser_frame);
browser_view, browser_frame);
}
......@@ -5,6 +5,9 @@
#ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_WINDOW_TREE_HOST_WIN_H_
#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_WINDOW_TREE_HOST_WIN_H_
#include <shobjidl.h>
#include <wrl/client.h>
#include "base/macros.h"
#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h"
#include "chrome/browser/ui/views/frame/minimize_button_metrics_win.h"
......@@ -38,6 +41,8 @@ class BrowserDesktopWindowTreeHostWin : public BrowserDesktopWindowTreeHost,
bool UsesNativeSystemMenu() const override;
// Overridden from DesktopWindowTreeHostWin:
void Init(const views::Widget::InitParams& params) override;
std::string GetWorkspace() const override;
int GetInitialShowState() const override;
bool GetClientAreaInsets(gfx::Insets* insets,
HMONITOR monitor) const override;
......@@ -68,6 +73,16 @@ class BrowserDesktopWindowTreeHostWin : public BrowserDesktopWindowTreeHost,
// The wrapped system menu itself.
std::unique_ptr<views::NativeMenuWin> system_menu_;
// On Windows10, this is the virtual desktop the browser window was on,
// last we checked. This is used to tell if the window has moved to a
// different desktop, and notify listeners. It will only be set if
// we created |virtual_desktop_manager_|.
mutable base::Optional<std::string> workspace_;
// Only set on Windows10. Set by GetOrCreateVirtualDesktopManager().
mutable Microsoft::WRL::ComPtr<IVirtualDesktopManager>
virtual_desktop_manager_;
DISALLOW_COPY_AND_ASSIGN(BrowserDesktopWindowTreeHostWin);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment