Windows: Set browser window size to 0x0 when minimized to reduce resource usage (issue #1369).

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1820 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2014-09-04 23:12:28 +00:00
parent df2242aff2
commit 6308a7e03b
2 changed files with 35 additions and 25 deletions

View File

@ -589,13 +589,15 @@ LRESULT CALLBACK CefBrowserHostImpl::WndProc(HWND hwnd, UINT message,
return 0; return 0;
case WM_SIZE: case WM_SIZE:
// Minimizing resizes the window to 0x0 which causes our layout to go all if (browser && browser->window_widget_) {
// screwy, so we just ignore it. // Pass window resize events to the HWND for the DesktopNativeWidgetAura
if (wParam != SIZE_MINIMIZED && browser && browser->window_widget_) { // root window. Passing size 0x0 (wParam == SIZE_MINIMIZED, for example)
// Resize the Widget window to the full size of the browser window. // will cause the widget to be hidden which reduces resource usage.
RECT rc; RECT rc;
GetClientRect(hwnd, &rc); GetClientRect(hwnd, &rc);
browser->window_widget_->SetSize(gfx::Size(rc.right, rc.bottom)); SetWindowPos(HWNDForWidget(browser->window_widget_), NULL,
rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
SWP_NOZORDER);
} }
return 0; return 0;

View File

@ -596,43 +596,51 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
} }
return 0; return 0;
case WM_SIZE: case WM_SIZE: {
if (!g_handler.get()) if (!g_handler.get())
break; break;
// Mark the off-screen browser as hidden when the frame window is // For off-screen browsers when the frame window is minimized set the
// minimized to reduce resource usage. // browser as hidden to reduce resource usage.
if (AppIsOffScreenRenderingEnabled()) { const bool offscreen = AppIsOffScreenRenderingEnabled();
if (offscreen) {
CefRefPtr<OSRWindow> osr_window = CefRefPtr<OSRWindow> osr_window =
static_cast<OSRWindow*>(g_handler->GetOSRHandler().get()); static_cast<OSRWindow*>(g_handler->GetOSRHandler().get());
if (osr_window) if (osr_window)
osr_window->WasHidden(wParam == SIZE_MINIMIZED); osr_window->WasHidden(wParam == SIZE_MINIMIZED);
} }
// Don't resize the window if minimizing because the resulting size of 0x0 if (g_handler->GetBrowser()) {
// causes the layout to go all screwy.
if (wParam != SIZE_MINIMIZED && g_handler->GetBrowser()) {
// Retrieve the window handle (parent window with off-screen rendering). // Retrieve the window handle (parent window with off-screen rendering).
CefWindowHandle hwnd = CefWindowHandle hwnd =
g_handler->GetBrowser()->GetHost()->GetWindowHandle(); g_handler->GetBrowser()->GetHost()->GetWindowHandle();
if (hwnd) { if (hwnd) {
// Resize the window and address bar to match the new frame size. if (wParam == SIZE_MINIMIZED) {
RECT rect; // For windowed browsers when the frame window is minimized set the
GetClientRect(hWnd, &rect); // browser window size to 0x0 to reduce resource usage.
rect.top += URLBAR_HEIGHT; if (!offscreen) {
SetWindowPos(hwnd, NULL,
0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
}
} else {
// Resize the window and address bar to match the new frame size.
RECT rect;
GetClientRect(hWnd, &rect);
rect.top += URLBAR_HEIGHT;
int urloffset = rect.left + BUTTON_WIDTH * 4; int urloffset = rect.left + BUTTON_WIDTH * 4;
HDWP hdwp = BeginDeferWindowPos(1); HDWP hdwp = BeginDeferWindowPos(1);
hdwp = DeferWindowPos(hdwp, editWnd, NULL, urloffset, hdwp = DeferWindowPos(hdwp, editWnd, NULL, urloffset,
0, rect.right - urloffset, URLBAR_HEIGHT, SWP_NOZORDER); 0, rect.right - urloffset, URLBAR_HEIGHT, SWP_NOZORDER);
hdwp = DeferWindowPos(hdwp, hwnd, NULL, hdwp = DeferWindowPos(hdwp, hwnd, NULL,
rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rect.left, rect.top, rect.right - rect.left,
SWP_NOZORDER); rect.bottom - rect.top, SWP_NOZORDER);
EndDeferWindowPos(hdwp); EndDeferWindowPos(hdwp);
}
} }
} }
break; } break;
case WM_ERASEBKGND: case WM_ERASEBKGND:
if (g_handler.get() && g_handler->GetBrowser()) { if (g_handler.get() && g_handler->GetBrowser()) {