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

Unified Diff: chrome/browser/ui/panels/panel_manager.cc

Issue 8341098: Mac: Added a delay before panels go to minimized state from title-only state. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: disabled win test Created 9 years, 2 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/ui/panels/panel_manager.h ('k') | chrome/common/chrome_notification_types.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/panels/panel_manager.cc
diff --git a/chrome/browser/ui/panels/panel_manager.cc b/chrome/browser/ui/panels/panel_manager.cc
index 5bb2bc8d0dc8b9280c3408159ef4e5e4dda75585..d2795eeb08e3b292d279505f780453399610c59d 100644
--- a/chrome/browser/ui/panels/panel_manager.cc
+++ b/chrome/browser/ui/panels/panel_manager.cc
@@ -32,14 +32,21 @@ const double kPanelMaxHeightFactor = 0.5;
// After the time expires, we bring up/down the titlebars as planned.
const int kMaxMillisecondsWaitForBottomBarVisibilityChange = 1000;
+// See usage below.
+#if defined(OS_MACOSX)
+const int kMillisecondsBeforeCollapsingFromTitleOnlyState = 3000;
+#else
+const int kMillisecondsBeforeCollapsingFromTitleOnlyState = 0;
+#endif
+
// Single instance of PanelManager.
-scoped_refptr<PanelManager> panel_manager_instance;
+scoped_ptr<PanelManager> panel_manager_instance;
} // namespace
// static
PanelManager* PanelManager::GetInstance() {
if (!panel_manager_instance.get())
- panel_manager_instance = new PanelManager();
+ panel_manager_instance.reset(new PanelManager());
return panel_manager_instance.get();
}
@@ -49,7 +56,8 @@ PanelManager::PanelManager()
dragging_panel_index_(kInvalidPanelIndex),
dragging_panel_original_x_(0),
delayed_titlebar_action_(NO_ACTION),
- ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
+ remove_delays_for_testing_(false),
+ titlebar_action_task_(NULL),
auto_sizing_enabled_(true),
mouse_watching_disabled_(false) {
panel_mouse_watcher_.reset(PanelMouseWatcher::Create(this));
@@ -61,6 +69,10 @@ PanelManager::~PanelManager() {
DCHECK(panels_.empty());
DCHECK(panels_pending_to_remove_.empty());
DCHECK_EQ(0, minimized_panel_count_);
+ if (titlebar_action_task_) {
+ titlebar_action_task_->Cancel();
+ titlebar_action_task_ = NULL;
+ }
}
void PanelManager::OnDisplayChanged() {
@@ -392,6 +404,8 @@ bool PanelManager::ShouldBringUpTitlebars(int mouse_x, int mouse_y) const {
}
void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
+ int task_delay_milliseconds = 0;
+
// If the auto-hiding bottom bar exists, delay the action until the bottom
// bar is fully visible or hidden. We do not want both bottom bar and panel
// titlebar to move at the same time but with different speeds.
@@ -400,33 +414,64 @@ void PanelManager::BringUpOrDownTitlebars(bool bring_up) {
GetVisibility(AutoHidingDesktopBar::ALIGN_BOTTOM);
if (visibility != (bring_up ? AutoHidingDesktopBar::VISIBLE
: AutoHidingDesktopBar::HIDDEN)) {
- // OnAutoHidingDesktopBarVisibilityChanged will handle this.
- delayed_titlebar_action_ = bring_up ? BRING_UP : BRING_DOWN;
-
// Occasionally some system, like Windows, might not bring up or down the
// bottom bar when the mouse enters or leaves the bottom screen area.
// Thus, we schedule a delayed task to do the work if we do not receive
// the bottom bar visibility change notification within a certain period
// of time.
- MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- method_factory_.NewRunnableMethod(
- &PanelManager::DelayedBringUpOrDownTitlebarsCheck),
- kMaxMillisecondsWaitForBottomBarVisibilityChange);
-
- return;
+ task_delay_milliseconds =
+ kMaxMillisecondsWaitForBottomBarVisibilityChange;
}
}
- DoBringUpOrDownTitlebars(bring_up);
+ // On some OSes, the interaction with native Taskbars/Docks may be improved
+ // if the panels do not go back to minimized state too fast. For example,
+ // it makes it possible to hit the titlebar on OSX if Dock has Magnifying
+ // enabled - the panels stay up for a while after Dock magnification effect
+ // stops covering the panels.
+ // TODO(dimich): when there is implementation which has both delays to be
+ // different from zero, figure out what shoudl be the combined delay.
+ if (!bring_up &&
+ task_delay_milliseconds < kMillisecondsBeforeCollapsingFromTitleOnlyState)
+ task_delay_milliseconds = kMillisecondsBeforeCollapsingFromTitleOnlyState;
+
+ // OnAutoHidingDesktopBarVisibilityChanged will handle this.
+ delayed_titlebar_action_ = bring_up ? BRING_UP : BRING_DOWN;
+ if (remove_delays_for_testing_)
+ task_delay_milliseconds = 0;
+
+ // If user moves the mouse in and out of mouse tracking area, we might have
+ // previously posted but not yet dispatched task in the queue. New action
+ // shoudl always 'reset' the delays so cancel the old task and post a new one.
+ if (titlebar_action_task_)
+ titlebar_action_task_->Cancel();
+
+ titlebar_action_task_ = NewRunnableMethod(
+ this, &PanelManager::DelayedBringUpOrDownTitlebarsCheck);
+
+ MessageLoop::current()->PostDelayedTask(FROM_HERE,
+ titlebar_action_task_,
+ task_delay_milliseconds);
}
void PanelManager::DelayedBringUpOrDownTitlebarsCheck() {
+ titlebar_action_task_ = NULL;
+
+ // Task was already processed or cancelled - bail out.
if (delayed_titlebar_action_ == NO_ACTION)
return;
- DoBringUpOrDownTitlebars(delayed_titlebar_action_ == BRING_UP);
+ bool need_to_bring_up_titlebars = (delayed_titlebar_action_ == BRING_UP);
+
delayed_titlebar_action_ = NO_ACTION;
+
+ // Check if the action is still needed based on the latest mouse position. The
+ // user could move the mouse into the tracking area and then quickly move it
+ // out of the area. In case of this, cancel the action.
+ if (are_titlebars_up_ != need_to_bring_up_titlebars)
+ return;
+
+ DoBringUpOrDownTitlebars(need_to_bring_up_titlebars);
}
void PanelManager::DoBringUpOrDownTitlebars(bool bring_up) {
« no previous file with comments | « chrome/browser/ui/panels/panel_manager.h ('k') | chrome/common/chrome_notification_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698