Chromium Code Reviews| Index: content/browser/renderer_host/render_message_filter_win.cc |
| =================================================================== |
| --- content/browser/renderer_host/render_message_filter_win.cc (revision 98485) |
| +++ content/browser/renderer_host/render_message_filter_win.cc (working copy) |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -8,33 +8,51 @@ |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/win/WebScreenInfoFactory.h" |
| -using WebKit::WebScreenInfo; |
| -using WebKit::WebScreenInfoFactory; |
| +namespace { |
| -// We get null window_ids passed into the two functions below; please see |
| -// http://crbug.com/9060 for more details. |
| +// Returns the "visible window rect" for |window|, defined roughly as "what the |
| +// user thinks of as the window". See comments below regarding the difference |
| +// between this and the true window rect when the window is maximized. |
| +gfx::Rect GetVisibleWindowRect(HWND window) { |
| + // We get null |window_id|s passed into the two functions below; see bug 9060. |
| + // Probably this should be removed and we should prevent this case. |
| + if (!IsWindow(window)) |
| + return gfx::Rect(); |
| + RECT window_rect = {0}; |
| + GetWindowRect(window, &window_rect); |
| + gfx::Rect rect(window_rect); |
| + |
| + // Maximized windows are outdented from the work area by the frame thickness |
| + // even though this "frame" is not painted. This confuses code (and people) |
| + // that think of a maximized window as corresponding exactly to the work area. |
| + // Correct for this by subtracting the frame thickness back off. |
| + if (IsZoomed(window)) { |
| + rect.Inset(GetSystemMetrics(SM_CXSIZEFRAME), |
| + GetSystemMetrics(SM_CYSIZEFRAME)); |
|
Ben Goodger (Google)
2011/08/30 20:06:24
Are all Windows apps typically larger than the wor
Peter Kasting
2011/08/30 20:08:53
As far as I know, yes. I double-checked with Word
|
| + } |
| + return rect; |
| +} |
| + |
| +}; |
| + |
| + |
| // TODO(shess): Provide a mapping from reply_msg->routing_id() to HWND |
| // so that we can eliminate the NativeViewId parameter. |
| void RenderMessageFilter::OnGetWindowRect(gfx::NativeViewId window_id, |
| gfx::Rect* rect) { |
| - HWND window = gfx::NativeViewFromId(window_id); |
| - RECT window_rect = {0}; |
| - GetWindowRect(window, &window_rect); |
| - *rect = window_rect; |
| + *rect = GetVisibleWindowRect(gfx::NativeViewFromId(window_id)); |
| } |
| void RenderMessageFilter::OnGetRootWindowRect(gfx::NativeViewId window_id, |
| gfx::Rect* rect) { |
| - HWND window = gfx::NativeViewFromId(window_id); |
| - RECT window_rect = {0}; |
| - HWND root_window = ::GetAncestor(window, GA_ROOT); |
| - GetWindowRect(root_window, &window_rect); |
| - *rect = window_rect; |
| + *rect = GetVisibleWindowRect(GetAncestor(gfx::NativeViewFromId(window_id), |
| + GA_ROOT)); |
| } |
| void RenderMessageFilter::OnGetScreenInfo(gfx::NativeViewId view, |
| WebKit::WebScreenInfo* results) { |
| - *results = WebScreenInfoFactory::screenInfo(gfx::NativeViewFromId(view)); |
| + *results = |
| + WebKit::WebScreenInfoFactory::screenInfo(gfx::NativeViewFromId(view)); |
| } |