Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1097)

Unified Diff: chrome/browser/dock_info.cc

Issue 42041: Changes docking in the following ways:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/dock_info.h ('k') | chrome/browser/views/tabs/dragged_tab_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/dock_info.cc
===================================================================
--- chrome/browser/dock_info.cc (revision 11336)
+++ chrome/browser/dock_info.cc (working copy)
@@ -10,23 +10,18 @@
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/views/frame/browser_view.h"
+#include "chrome/browser/views/tabs/tab.h"
namespace {
// Distance in pixels between the hotspot and when the hint should be shown.
-const int kHotSpotDeltaX = 100;
-const int kHotSpotDeltaY = 80;
+const int kHotSpotDeltaX = 120;
+const int kHotSpotDeltaY = 120;
-// Distance in pixels between the hotspot and when the hint should be shown
-// and enabled.
-const int kEnableDeltaX = 50;
-const int kEnableDeltaY = 37;
+// Size of the popup window.
+const int kPopupWidth = 70;
+const int kPopupHeight = 70;
-// Distance used when maximizing. The maximize area is the whole top of the
-// monitor.
-const int kMaximizeHotSpotDeltaY = 100;
-const int kMaximizeEnableDeltaY = 50;
-
// Returns true if |screen_loc| is close to the hotspot at |x|, |y|. If the
// point is close enough to the hotspot true is returned and |in_enable_area|
// is set appropriately.
@@ -36,7 +31,7 @@
bool* in_enable_area) {
int delta_x = abs(x - screen_loc.x());
int delta_y = abs(y - screen_loc.y());
- *in_enable_area = (delta_x < kEnableDeltaX && delta_y < kEnableDeltaY);
+ *in_enable_area = (delta_x < kPopupWidth / 2 && delta_y < kPopupHeight / 2);
return *in_enable_area || (delta_x < kHotSpotDeltaX &&
delta_y < kHotSpotDeltaY);
}
@@ -52,8 +47,8 @@
int delta_x = abs(x - screen_loc.x());
int delta_y = abs(y - screen_loc.y());
- int enable_delta_x = kEnableDeltaX;
- int enable_delta_y = kEnableDeltaY;
+ int enable_delta_x = kPopupWidth / 2;
+ int enable_delta_y = kPopupHeight / 2;
int hot_spot_delta_x = kHotSpotDeltaX;
int hot_spot_delta_y = kHotSpotDeltaY;
@@ -65,7 +60,13 @@
break;
- case DockInfo::MAXIMIZE:
+ case DockInfo::MAXIMIZE: {
+ // Make the maximize height smaller than the tab height to avoid showing
+ // the dock indicator when close to maximized browser.
+ hot_spot_delta_y = Tab::GetMinimumUnselectedSize().height() - 1;
+ enable_delta_y = hot_spot_delta_y / 2;
+ break;
+ }
case DockInfo::BOTTOM_HALF:
enable_delta_y += enable_delta_y;
hot_spot_delta_y += hot_spot_delta_y;
@@ -81,31 +82,13 @@
if (type != DockInfo::MAXIMIZE)
return result;
- // Make the maximize area the whole top of the monitor.
+ // Make the hot spot/enable spot for maximized windows the whole top of the
+ // monitor.
int max_delta_y = abs(screen_loc.y() - y);
- *in_enable_area = (*in_enable_area || (max_delta_y < kMaximizeEnableDeltaY));
- return *in_enable_area || (max_delta_y < kMaximizeHotSpotDeltaY);
+ *in_enable_area = (*in_enable_area || (max_delta_y < enable_delta_y));
+ return *in_enable_area || (max_delta_y < hot_spot_delta_y);
}
-// Returns true if there is a maximized tabbed browser on the monitor
-// |monitor|.
-bool IsMaximizedTabbedBrowserOnMonitor(HMONITOR monitor) {
- for (BrowserList::const_iterator i = BrowserList::begin();
- i != BrowserList::end(); ++i) {
- Browser* browser = *i;
- if (browser->type() == Browser::TYPE_NORMAL) {
- HWND browser_hwnd =
- reinterpret_cast<HWND>(browser->window()->GetNativeHandle());
- if (IsZoomed(browser_hwnd) &&
- MonitorFromWindow(browser_hwnd, MONITOR_DEFAULTTONEAREST) ==
- monitor) {
- return true;
- }
- }
- }
- return false;
-}
-
// BaseWindowFinder -----------------------------------------------------------
// Base class used to locate a window. This is intended to be used with the
@@ -276,7 +259,7 @@
!TopMostFinder::IsTopMostWindowAtPoint(finder.result_.hwnd(),
finder.result_.hot_spot(),
ignore)) {
- return DockInfo();
+ finder.result_.set_type(DockInfo::NONE);
}
return finder.result_;
}
@@ -308,8 +291,15 @@
const std::set<HWND>& ignore)
: BaseWindowFinder(ignore),
screen_loc_(screen_loc) {
- EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc,
- reinterpret_cast<LPARAM>(this));
+ HMONITOR monitor = MonitorFromPoint(screen_loc.ToPOINT(),
+ MONITOR_DEFAULTTONULL);
+ MONITORINFO monitor_info = {0};
+ monitor_info.cbSize = sizeof(MONITORINFO);
+ if (monitor && GetMonitorInfo(monitor, &monitor_info)) {
+ result_.set_monitor_bounds(gfx::Rect(monitor_info.rcWork));
+ EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc,
+ reinterpret_cast<LPARAM>(this));
+ }
}
bool CheckPoint(HWND hwnd, int x, int y, DockInfo::Type type) {
@@ -319,7 +309,10 @@
result_.set_hwnd(hwnd);
result_.set_type(type);
result_.set_hot_spot(gfx::Point(x, y));
- return true;
+ // Only show the hotspot if the monitor contains the bounds of the popup
+ // window. Otherwise we end with a weird situation where the popup window
+ // isn't completely visible.
+ return result_.monitor_bounds().Contains(result_.GetPopupRect());
}
return false;
}
@@ -337,42 +330,42 @@
// DockInfo -------------------------------------------------------------------
+// static
DockInfo DockInfo::GetDockInfoAtPoint(const gfx::Point& screen_point,
const std::set<HWND>& ignore) {
// Try docking to a window first.
DockInfo info = DockToWindowFinder::GetDockInfoAtPoint(screen_point, ignore);
-
- HMONITOR monitor = MonitorFromPoint(screen_point.ToPOINT(),
- MONITOR_DEFAULTTONULL);
- MONITORINFO monitor_info = {0};
- monitor_info.cbSize = sizeof(MONITORINFO);
- if (!monitor || !GetMonitorInfo(monitor, &monitor_info)) {
- info.type_ = NONE;
- return info;
- }
- info.monitor_bounds_ = gfx::Rect(monitor_info.rcWork);
-
if (info.type() != DockInfo::NONE)
return info;
// No window relative positions. Try monitor relative positions.
- RECT& m_bounds = monitor_info.rcWork;
- int mid_x = (m_bounds.left + m_bounds.right) / 2;
- int mid_y = (m_bounds.top + m_bounds.bottom) / 2;
+ const gfx::Rect& m_bounds = info.monitor_bounds();
+ int mid_x = m_bounds.x() + m_bounds.width() / 2;
+ int mid_y = m_bounds.y() + m_bounds.height() / 2;
bool result =
- info.CheckMonitorPoint(monitor, screen_point, mid_x, m_bounds.top,
+ info.CheckMonitorPoint(screen_point, mid_x, m_bounds.y(),
DockInfo::MAXIMIZE) ||
- info.CheckMonitorPoint(monitor, screen_point, mid_x, m_bounds.bottom,
+ info.CheckMonitorPoint(screen_point, mid_x, m_bounds.bottom(),
DockInfo::BOTTOM_HALF) ||
- info.CheckMonitorPoint(monitor, screen_point, m_bounds.left, mid_y,
+ info.CheckMonitorPoint(screen_point, m_bounds.x(), mid_y,
DockInfo::LEFT_HALF) ||
- info.CheckMonitorPoint(monitor, screen_point, m_bounds.right, mid_y,
+ info.CheckMonitorPoint(screen_point, m_bounds.right(), mid_y,
DockInfo::RIGHT_HALF);
return info;
}
+// static
+int DockInfo::popup_width() {
+ return kPopupWidth;
+}
+
+// static
+int DockInfo::popup_height() {
+ return kPopupHeight;
+}
+
HWND DockInfo::GetLocalProcessWindowAtPoint(const gfx::Point& screen_point,
const std::set<HWND>& ignore) {
return
@@ -509,14 +502,43 @@
SWP_NOACTIVATE | SWP_NOOWNERZORDER);
}
-bool DockInfo::CheckMonitorPoint(HMONITOR monitor,
- const gfx::Point& screen_loc,
+gfx::Rect DockInfo::GetPopupRect() const {
+ int x = hot_spot_.x() - popup_width() / 2;
+ int y = hot_spot_.y() - popup_height() / 2;
+ switch (type_) {
+ case LEFT_OF_WINDOW:
+ case RIGHT_OF_WINDOW:
+ case TOP_OF_WINDOW:
+ case BOTTOM_OF_WINDOW: {
+ // Constrain the popup to the monitor's bounds.
+ gfx::Rect ideal_bounds(x, y, popup_width(), popup_height());
+ ideal_bounds = ideal_bounds.AdjustToFit(monitor_bounds_);
+ return ideal_bounds;
+ }
+ case DockInfo::MAXIMIZE:
+ y += popup_height() / 2;
+ break;
+ case DockInfo::LEFT_HALF:
+ x += popup_width() / 2;
+ break;
+ case DockInfo::RIGHT_HALF:
+ x -= popup_width() / 2;
+ break;
+ case DockInfo::BOTTOM_HALF:
+ y -= popup_height() / 2;
+ break;
+
+ default:
+ NOTREACHED();
+ }
+ return gfx::Rect(x, y, popup_width(), popup_height());
+}
+
+bool DockInfo::CheckMonitorPoint(const gfx::Point& screen_loc,
int x,
int y,
Type type) {
- if (IsCloseToMonitorPoint(screen_loc, x, y, type, &in_enable_area_) &&
- (type != MAXIMIZE ||
- !IsMaximizedTabbedBrowserOnMonitor(monitor))) {
+ if (IsCloseToMonitorPoint(screen_loc, x, y, type, &in_enable_area_)) {
hot_spot_.SetPoint(x, y);
type_ = type;
return true;
« no previous file with comments | « chrome/browser/dock_info.h ('k') | chrome/browser/views/tabs/dragged_tab_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698