| Index: ash/shelf/shelf_layout_manager.cc
|
| diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
|
| index 895a31528497d9b50422a1b13337acd0b5c6968a..977ec773d967a6d7c4e41f073179babaeec6b7f1 100644
|
| --- a/ash/shelf/shelf_layout_manager.cc
|
| +++ b/ash/shelf/shelf_layout_manager.cc
|
| @@ -864,6 +864,22 @@ gfx::Rect ShelfLayoutManager::GetAutoHideShowShelfRegionInScreen() const {
|
| return show_shelf_region_in_screen;
|
| }
|
|
|
| +bool ShelfLayoutManager::HasVisibleWindow() const {
|
| + WmWindow* root =
|
| + WmWindow::Get(shelf_widget_->GetNativeWindow())->GetRootWindow();
|
| + const std::vector<WmWindow*> windows =
|
| + Shell::Get()->mru_window_tracker()->BuildWindowListIgnoreModal();
|
| + // Process the window list and check if there are any visible windows.
|
| + // Ignore app list windows that may be animating to hide after dismissal.
|
| + for (auto* window : windows) {
|
| + if (window->IsVisible() && !IsAppListWindow(window) &&
|
| + root->Contains(window)) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| ShelfAutoHideState ShelfLayoutManager::CalculateAutoHideState(
|
| ShelfVisibilityState visibility_state) const {
|
| if (visibility_state != SHELF_AUTO_HIDE || !wm_shelf_->IsShelfInitialized())
|
| @@ -887,25 +903,8 @@ ShelfAutoHideState ShelfLayoutManager::CalculateAutoHideState(
|
| shelf_widget_->status_area_widget()->IsActive()))
|
| return SHELF_AUTO_HIDE_SHOWN;
|
|
|
| - const int64_t shelf_display_id =
|
| - WmWindow::Get(shelf_widget_->GetNativeWindow())
|
| - ->GetDisplayNearestWindow()
|
| - .id();
|
| - const std::vector<WmWindow*> windows =
|
| - Shell::Get()->mru_window_tracker()->BuildWindowListIgnoreModal();
|
| - // Process the window list and check if there are any visible windows.
|
| - // Ignore app list windows that may be animating to hide after dismissal.
|
| - bool visible_window = false;
|
| - for (size_t i = 0; i < windows.size(); ++i) {
|
| - if (windows[i] && windows[i]->IsVisible() && !IsAppListWindow(windows[i]) &&
|
| - !windows[i]->GetWindowState()->IsMinimized() &&
|
| - windows[i]->GetDisplayNearestWindow().id() == shelf_display_id) {
|
| - visible_window = true;
|
| - break;
|
| - }
|
| - }
|
| // If there are no visible windows do not hide the shelf.
|
| - if (!visible_window)
|
| + if (!HasVisibleWindow())
|
| return SHELF_AUTO_HIDE_SHOWN;
|
|
|
| if (gesture_drag_status_ == GESTURE_DRAG_COMPLETE_IN_PROGRESS)
|
| @@ -1128,12 +1127,15 @@ void ShelfLayoutManager::CompleteGestureDrag(const ui::GestureEvent& gesture) {
|
| // When in fullscreen and the shelf is forced to be auto hidden, the auto hide
|
| // behavior affects neither the visibility state nor the auto hide state. Set
|
| // |gesture_drag_status_| to GESTURE_DRAG_COMPLETE_IN_PROGRESS to set the auto
|
| - // hide state to |gesture_drag_auto_hide_state_|.
|
| + // hide state to |gesture_drag_auto_hide_state_|. Only change the auto-hide
|
| + // behavior if there is at least one window visible.
|
| gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS;
|
| - if (wm_shelf_->auto_hide_behavior() != new_auto_hide_behavior)
|
| + if (wm_shelf_->auto_hide_behavior() != new_auto_hide_behavior &&
|
| + HasVisibleWindow()) {
|
| wm_shelf_->SetAutoHideBehavior(new_auto_hide_behavior);
|
| - else
|
| + } else {
|
| UpdateVisibilityState();
|
| + }
|
| gesture_drag_status_ = GESTURE_DRAG_NONE;
|
| }
|
|
|
|
|