Chromium Code Reviews| 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..ef350aa23d2bb0d805c3b43af383b0631f6f6e3d 100644 |
| --- a/chrome/browser/ui/panels/panel_manager.cc |
| +++ b/chrome/browser/ui/panels/panel_manager.cc |
| @@ -32,11 +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) |
|
jianli
2011/10/28 01:04:11
Extra empty space.
Dmitry Titov
2011/10/28 20:58:23
Done.
|
| +const int kMillisecondsBeforeCollapsingFromTitleonlyState = 3000; |
| +#else |
| +const int kMillisecondsBeforeCollapsingFromTitleonlyState = 0; |
| +#endif |
| + |
| // Single instance of PanelManager. |
| scoped_refptr<PanelManager> panel_manager_instance; |
| } // namespace |
| // static |
| +int PanelManager::sLastTaskIndex = 0; |
| + |
| +// static |
| PanelManager* PanelManager::GetInstance() { |
| if (!panel_manager_instance.get()) |
| panel_manager_instance = new PanelManager(); |
| @@ -411,22 +421,54 @@ void PanelManager::BringUpOrDownTitlebars(bool bring_up) { |
| MessageLoop::current()->PostDelayedTask( |
| FROM_HERE, |
| method_factory_.NewRunnableMethod( |
| - &PanelManager::DelayedBringUpOrDownTitlebarsCheck), |
| + &PanelManager::DelayedBringUpOrDownTitlebarsCheck, |
| + ++sLastTaskIndex), |
|
jianli
2011/10/28 01:04:11
Where do we reset sLastTaskIndex? What if increasi
Dmitry Titov
2011/10/28 20:58:23
If we post a task every time user moves the mouse
|
| kMaxMillisecondsWaitForBottomBarVisibilityChange); |
| return; |
| } |
| } |
| + // On some OSes, the interaction with native Taskbars/Docks may be improved |
| + // if the panels are not go back to minimized state too fast. For example, |
|
jianli
2011/10/28 01:04:11
are not => do not
Dmitry Titov
2011/10/28 20:58:23
Done.
|
| + // 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. |
| + if (!bring_up) { |
| + delayed_titlebar_action_ = BRING_DOWN; |
| + MessageLoop::current()->PostDelayedTask( |
|
jianli
2011/10/28 01:04:11
This seems to be similar to the above PostDelayed
Dmitry Titov
2011/10/28 20:58:23
Done.
|
| + FROM_HERE, |
| + method_factory_.NewRunnableMethod( |
| + &PanelManager::DelayedBringUpOrDownTitlebarsCheck, |
| + ++sLastTaskIndex), |
| + kMillisecondsBeforeCollapsingFromTitleonlyState); |
| + return; |
| + } |
| + |
| + |
| DoBringUpOrDownTitlebars(bring_up); |
| } |
| -void PanelManager::DelayedBringUpOrDownTitlebarsCheck() { |
| +void PanelManager::DelayedBringUpOrDownTitlebarsCheck(int taskIndex) { |
|
jianli
2011/10/28 01:04:11
taskIndex => task_index
Dmitry Titov
2011/10/28 20:58:23
Done.
|
| + // task was already processed or cancelled - bail out. |
|
jianli
2011/10/28 01:04:11
task needs to be capitalized.
Dmitry Titov
2011/10/28 20:58:23
Done.
|
| if (delayed_titlebar_action_ == NO_ACTION) |
| return; |
| - DoBringUpOrDownTitlebars(delayed_titlebar_action_ == BRING_UP); |
| + // In case we posted multiple tasks because user was moving mouse back and |
| + // forth, ignore all but the last one. |
| + if (taskIndex < sLastTaskIndex) |
| + return; |
| + DCHECK(taskIndex == sLastTaskIndex); |
| + |
| + // We are going to process the task one way or another after this point. |
| delayed_titlebar_action_ = NO_ACTION; |
| + |
| + // Check if the action is still needed based on mouse position. In case the |
| + // mouse moved and does not call for the titlebars change, cancel. |
| + if (are_titlebars_up_ != (delayed_titlebar_action_ == BRING_UP)) |
| + return; |
| + |
| + DoBringUpOrDownTitlebars(delayed_titlebar_action_ == BRING_UP); |
| } |
| void PanelManager::DoBringUpOrDownTitlebars(bool bring_up) { |