Index: app/win/hwnd_util.cc |
=================================================================== |
--- app/win/hwnd_util.cc (revision 71828) |
+++ app/win/hwnd_util.cc (working copy) |
@@ -1,183 +0,0 @@ |
-// Copyright (c) 2010 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. |
- |
-#include "app/win/hwnd_util.h" |
- |
-#include <dwmapi.h> |
- |
-#include "base/string_util.h" |
-#include "base/win/windows_version.h" |
-#include "gfx/rect.h" |
-#include "gfx/size.h" |
- |
-#pragma comment(lib, "dwmapi.lib") |
- |
-namespace app { |
-namespace win { |
- |
-namespace { |
- |
-// Adjust the window to fit, returning true if the window was resized or moved. |
-bool AdjustWindowToFit(HWND hwnd, const RECT& bounds) { |
- // Get the monitor. |
- HMONITOR hmon = MonitorFromRect(&bounds, MONITOR_DEFAULTTONEAREST); |
- if (!hmon) { |
- NOTREACHED() << "Unable to find default monitor"; |
- // No monitor available. |
- return false; |
- } |
- |
- MONITORINFO mi; |
- mi.cbSize = sizeof(mi); |
- GetMonitorInfo(hmon, &mi); |
- gfx::Rect window_rect(bounds); |
- gfx::Rect monitor_rect(mi.rcWork); |
- gfx::Rect new_window_rect = window_rect.AdjustToFit(monitor_rect); |
- if (!new_window_rect.Equals(window_rect)) { |
- // Window doesn't fit on monitor, move and possibly resize. |
- SetWindowPos(hwnd, 0, new_window_rect.x(), new_window_rect.y(), |
- new_window_rect.width(), new_window_rect.height(), |
- SWP_NOACTIVATE | SWP_NOZORDER); |
- return true; |
- } else { |
- return false; |
- } |
-} |
- |
-} // namespace |
- |
-string16 GetClassName(HWND window) { |
- // GetClassNameW will return a truncated result (properly null terminated) if |
- // the given buffer is not large enough. So, it is not possible to determine |
- // that we got the entire class name if the result is exactly equal to the |
- // size of the buffer minus one. |
- DWORD buffer_size = MAX_PATH; |
- while (true) { |
- std::wstring output; |
- DWORD size_ret = |
- GetClassNameW(window, WriteInto(&output, buffer_size), buffer_size); |
- if (size_ret == 0) |
- break; |
- if (size_ret < (buffer_size - 1)) { |
- output.resize(size_ret); |
- return output; |
- } |
- buffer_size *= 2; |
- } |
- return std::wstring(); // error |
-} |
- |
-#pragma warning(push) |
-#pragma warning(disable:4312 4244) |
- |
-WNDPROC SetWindowProc(HWND hwnd, WNDPROC proc) { |
- // The reason we don't return the SetwindowLongPtr() value is that it returns |
- // the orignal window procedure and not the current one. I don't know if it is |
- // a bug or an intended feature. |
- WNDPROC oldwindow_proc = |
- reinterpret_cast<WNDPROC>(GetWindowLongPtr(hwnd, GWLP_WNDPROC)); |
- SetWindowLongPtr(hwnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(proc)); |
- return oldwindow_proc; |
-} |
- |
-void* SetWindowUserData(HWND hwnd, void* user_data) { |
- return |
- reinterpret_cast<void*>(SetWindowLongPtr(hwnd, GWLP_USERDATA, |
- reinterpret_cast<LONG_PTR>(user_data))); |
-} |
- |
-void* GetWindowUserData(HWND hwnd) { |
- return reinterpret_cast<void*>(GetWindowLongPtr(hwnd, GWLP_USERDATA)); |
-} |
- |
-#pragma warning(pop) |
- |
-bool DoesWindowBelongToActiveWindow(HWND window) { |
- DCHECK(window); |
- HWND top_window = ::GetAncestor(window, GA_ROOT); |
- if (!top_window) |
- return false; |
- |
- HWND active_top_window = ::GetAncestor(::GetForegroundWindow(), GA_ROOT); |
- return (top_window == active_top_window); |
-} |
- |
-void CenterAndSizeWindow(HWND parent, |
- HWND window, |
- const gfx::Size& pref, |
- bool pref_is_client) { |
- DCHECK(window && pref.width() > 0 && pref.height() > 0); |
- |
- // Calculate the ideal bounds. |
- RECT window_bounds; |
- RECT center_bounds = {0}; |
- if (parent) { |
- // If there is a parent, center over the parents bounds. |
- ::GetWindowRect(parent, ¢er_bounds); |
- } else { |
- // No parent. Center over the monitor the window is on. |
- HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONEAREST); |
- if (monitor) { |
- MONITORINFO mi = {0}; |
- mi.cbSize = sizeof(mi); |
- GetMonitorInfo(monitor, &mi); |
- center_bounds = mi.rcWork; |
- } else { |
- NOTREACHED() << "Unable to get default monitor"; |
- } |
- } |
- window_bounds.left = center_bounds.left + |
- (center_bounds.right - center_bounds.left - pref.width()) / 2; |
- window_bounds.right = window_bounds.left + pref.width(); |
- window_bounds.top = center_bounds.top + |
- (center_bounds.bottom - center_bounds.top - pref.height()) / 2; |
- window_bounds.bottom = window_bounds.top + pref.height(); |
- |
- // If we're centering a child window, we are positioning in client |
- // coordinates, and as such we need to offset the target rectangle by the |
- // position of the parent window. |
- if (::GetWindowLong(window, GWL_STYLE) & WS_CHILD) { |
- DCHECK(parent && ::GetParent(window) == parent); |
- POINT topleft = { window_bounds.left, window_bounds.top }; |
- ::MapWindowPoints(HWND_DESKTOP, parent, &topleft, 1); |
- window_bounds.left = topleft.x; |
- window_bounds.top = topleft.y; |
- window_bounds.right = window_bounds.left + pref.width(); |
- window_bounds.bottom = window_bounds.top + pref.height(); |
- } |
- |
- // Get the WINDOWINFO for window. We need the style to calculate the size |
- // for the window. |
- WINDOWINFO win_info = {0}; |
- win_info.cbSize = sizeof(WINDOWINFO); |
- GetWindowInfo(window, &win_info); |
- |
- // Calculate the window size needed for the content size. |
- |
- if (!pref_is_client || |
- AdjustWindowRectEx(&window_bounds, win_info.dwStyle, FALSE, |
- win_info.dwExStyle)) { |
- if (!AdjustWindowToFit(window, window_bounds)) { |
- // The window fits, reset the bounds. |
- SetWindowPos(window, 0, window_bounds.left, window_bounds.top, |
- window_bounds.right - window_bounds.left, |
- window_bounds.bottom - window_bounds.top, |
- SWP_NOACTIVATE | SWP_NOZORDER); |
- } // else case, AdjustWindowToFit set the bounds for us. |
- } else { |
- NOTREACHED() << "Unable to adjust window to fit"; |
- } |
-} |
- |
-bool ShouldUseVistaFrame() { |
- if (base::win::GetVersion() < base::win::VERSION_VISTA) |
- return false; |
- // If composition is not enabled, we behave like on XP. |
- BOOL f; |
- DwmIsCompositionEnabled(&f); |
- return !!f; |
-} |
- |
-} // namespace win |
-} // namespace app |