Index: ui/base/win/hwnd_util.cc |
diff --git a/ui/base/win/hwnd_util.cc b/ui/base/win/hwnd_util.cc |
deleted file mode 100644 |
index 0a8dfb26cc9f6e79d49e68cc1c025fa3cfa648f1..0000000000000000000000000000000000000000 |
--- a/ui/base/win/hwnd_util.cc |
+++ /dev/null |
@@ -1,214 +0,0 @@ |
-// Copyright (c) 2012 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 "ui/base/win/hwnd_util.h" |
- |
-#include "base/i18n/rtl.h" |
-#include "base/strings/string_util.h" |
-#include "base/win/metro.h" |
-#include "base/win/win_util.h" |
-#include "ui/gfx/point.h" |
-#include "ui/gfx/rect.h" |
-#include "ui/gfx/size.h" |
- |
-namespace ui { |
- |
-namespace { |
- |
-// Adjust the window to fit. |
-void AdjustWindowToFit(HWND hwnd, const RECT& bounds, bool fit_to_monitor) { |
- if (fit_to_monitor) { |
- // Get the monitor. |
- HMONITOR hmon = MonitorFromRect(&bounds, MONITOR_DEFAULTTONEAREST); |
- if (hmon) { |
- MONITORINFO mi; |
- mi.cbSize = sizeof(mi); |
- base::win::GetMonitorInfoWrapper(hmon, &mi); |
- gfx::Rect window_rect(bounds); |
- gfx::Rect monitor_rect(mi.rcWork); |
- gfx::Rect new_window_rect = window_rect; |
- new_window_rect.AdjustToFit(monitor_rect); |
- if (new_window_rect != 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; |
- } |
- // Else fall through. |
- } else { |
- NOTREACHED() << "Unable to find default monitor"; |
- // Fall through. |
- } |
- } // Else fall through. |
- |
- // The window is not being fit to monitor, or the window fits on the monitor |
- // as is, or we have no monitor info; reset the bounds. |
- ::SetWindowPos(hwnd, 0, bounds.left, bounds.top, |
- bounds.right - bounds.left, bounds.bottom - bounds.top, |
- SWP_NOACTIVATE | SWP_NOZORDER); |
-} |
- |
-} // 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) { |
- DWORD process_id = 0; |
- DWORD thread_id = GetWindowThreadProcessId(hwnd, &process_id); |
- // A window outside the current process needs to be ignored. |
- if (process_id != ::GetCurrentProcessId()) |
- return NULL; |
- 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) { |
- 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); |
- } |
- |
- if (::IsRectEmpty(¢er_bounds)) { |
- // No parent or no parent rect. Center over the monitor the window is on. |
- HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONEAREST); |
- if (monitor) { |
- MONITORINFO mi = {0}; |
- mi.cbSize = sizeof(mi); |
- base::win::GetMonitorInfoWrapper(monitor, &mi); |
- center_bounds = mi.rcWork; |
- } else { |
- NOTREACHED() << "Unable to get default monitor"; |
- } |
- } |
- |
- window_bounds.left = center_bounds.left; |
- if (pref.width() < (center_bounds.right - center_bounds.left)) { |
- window_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; |
- if (pref.height() < (center_bounds.bottom - center_bounds.top)) { |
- window_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(); |
- } |
- |
- AdjustWindowToFit(window, window_bounds, !parent); |
-} |
- |
-void CheckWindowCreated(HWND hwnd) { |
- if (!hwnd) |
- LOG_GETLASTERROR(FATAL); |
-} |
- |
-void ShowSystemMenu(HWND window) { |
- RECT rect; |
- GetWindowRect(window, &rect); |
- gfx::Point point = gfx::Point(rect.left, rect.top); |
- static const int kSystemMenuOffset = 10; |
- point.Offset(kSystemMenuOffset, kSystemMenuOffset); |
- ShowSystemMenuAtPoint(window, point); |
-} |
- |
-void ShowSystemMenuAtPoint(HWND window, const gfx::Point& point) { |
- // In the Metro process, we never want to show the system menu. |
- if (base::win::IsMetroProcess()) |
- return; |
- UINT flags = TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD; |
- if (base::i18n::IsRTL()) |
- flags |= TPM_RIGHTALIGN; |
- HMENU menu = GetSystemMenu(window, FALSE); |
- const int command = |
- TrackPopupMenu(menu, flags, point.x(), point.y(), 0, window, NULL); |
- if (command) |
- SendMessage(window, WM_SYSCOMMAND, command, 0); |
-} |
- |
-extern "C" { |
- typedef HWND (*RootWindow)(); |
-} |
- |
-HWND GetWindowToParentTo(bool get_real_hwnd) { |
- HMODULE metro = base::win::GetMetroModule(); |
- if (!metro) |
- return get_real_hwnd ? ::GetDesktopWindow() : HWND_DESKTOP; |
- // In windows 8 metro-mode the root window is not the desktop. |
- RootWindow root_window = |
- reinterpret_cast<RootWindow>(::GetProcAddress(metro, "GetRootWindow")); |
- return root_window(); |
-} |
- |
-} // namespace ui |