Index: ash/wm/immersive_fullscreen_controller.cc |
diff --git a/ash/wm/immersive_fullscreen_controller.cc b/ash/wm/immersive_fullscreen_controller.cc |
deleted file mode 100644 |
index 231f19969af84d8a087b52d3d78f4dfd89b81085..0000000000000000000000000000000000000000 |
--- a/ash/wm/immersive_fullscreen_controller.cc |
+++ /dev/null |
@@ -1,655 +0,0 @@ |
-// Copyright 2013 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 "ash/wm/immersive_fullscreen_controller.h" |
- |
-#include <set> |
- |
-#include "ash/common/ash_constants.h" |
-#include "ash/common/wm/immersive/wm_immersive_fullscreen_controller_delegate.h" |
-#include "ash/shared/immersive_context.h" |
-#include "ash/shared/immersive_focus_watcher.h" |
-#include "ash/shared/immersive_gesture_handler.h" |
-#include "ash/wm/immersive_handler_factory.h" |
-#include "base/metrics/histogram.h" |
-#include "ui/display/display.h" |
-#include "ui/display/screen.h" |
-#include "ui/events/base_event_utils.h" |
-#include "ui/gfx/animation/slide_animation.h" |
-#include "ui/gfx/geometry/point.h" |
-#include "ui/gfx/geometry/rect.h" |
-#include "ui/views/bubble/bubble_dialog_delegate.h" |
-#include "ui/views/view.h" |
-#include "ui/views/widget/widget.h" |
- |
-namespace ash { |
- |
-namespace { |
- |
-// Duration for the reveal show/hide slide animation. The slower duration is |
-// used for the initial slide out to give the user more change to see what |
-// happened. |
-const int kRevealSlowAnimationDurationMs = 400; |
-const int kRevealFastAnimationDurationMs = 200; |
- |
-// The delay in milliseconds between the mouse stopping at the top edge of the |
-// screen and the top-of-window views revealing. |
-const int kMouseRevealDelayMs = 200; |
- |
-// The maximum amount of pixels that the cursor can move for the cursor to be |
-// considered "stopped". This allows the user to reveal the top-of-window views |
-// without holding the cursor completely still. |
-const int kMouseRevealXThresholdPixels = 3; |
- |
-// Used to multiply x value of an update in check to determine if gesture is |
-// vertical. This is used to make sure that gesture is close to vertical instead |
-// of just more vertical then horizontal. |
-const int kSwipeVerticalThresholdMultiplier = 3; |
- |
-// The height in pixels of the region above the top edge of the display which |
-// hosts the immersive fullscreen window in which mouse events are ignored |
-// (cannot reveal or unreveal the top-of-window views). |
-// See ShouldIgnoreMouseEventAtLocation() for more details. |
-const int kHeightOfDeadRegionAboveTopContainer = 10; |
- |
-} // namespace |
- |
-// The height in pixels of the region below the top edge of the display in which |
-// the mouse can trigger revealing the top-of-window views. |
-// The height must be greater than 1px because the top pixel is used to trigger |
-// moving the cursor between displays if the user has a vertical display layout |
-// (primary display above/below secondary display). |
-const int ImmersiveFullscreenController::kMouseRevealBoundsHeight = 3; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-ImmersiveFullscreenController::ImmersiveFullscreenController() |
- : delegate_(NULL), |
- top_container_(NULL), |
- widget_(NULL), |
- observers_enabled_(false), |
- enabled_(false), |
- reveal_state_(CLOSED), |
- revealed_lock_count_(0), |
- mouse_x_when_hit_top_in_screen_(-1), |
- gesture_begun_(false), |
- animation_(new gfx::SlideAnimation(this)), |
- animations_disabled_for_test_(false), |
- weak_ptr_factory_(this) {} |
- |
-ImmersiveFullscreenController::~ImmersiveFullscreenController() { |
- EnableWindowObservers(false); |
-} |
- |
-void ImmersiveFullscreenController::Init( |
- WmImmersiveFullscreenControllerDelegate* delegate, |
- views::Widget* widget, |
- views::View* top_container) { |
- delegate_ = delegate; |
- top_container_ = top_container; |
- widget_ = widget; |
- ImmersiveContext::Get()->InstallResizeHandleWindowTargeter(this); |
-} |
- |
-void ImmersiveFullscreenController::SetEnabled(WindowType window_type, |
- bool enabled) { |
- if (enabled_ == enabled) |
- return; |
- enabled_ = enabled; |
- |
- EnableWindowObservers(enabled_); |
- |
- ImmersiveContext::Get()->OnEnteringOrExitingImmersive(this, enabled); |
- |
- if (enabled_) { |
- // Animate enabling immersive mode by sliding out the top-of-window views. |
- // No animation occurs if a lock is holding the top-of-window views open. |
- |
- // Do a reveal to set the initial state for the animation. (And any |
- // required state in case the animation cannot run because of a lock holding |
- // the top-of-window views open.) |
- MaybeStartReveal(ANIMATE_NO); |
- |
- // Reset the located event so that it does not affect whether the |
- // top-of-window views are hidden. |
- located_event_revealed_lock_.reset(); |
- |
- // Try doing the animation. |
- MaybeEndReveal(ANIMATE_SLOW); |
- |
- if (reveal_state_ == REVEALED) { |
- // Reveal was unsuccessful. Reacquire the revealed locks if appropriate. |
- UpdateLocatedEventRevealedLock(); |
- if (immersive_focus_watcher_) |
- immersive_focus_watcher_->UpdateFocusRevealedLock(); |
- } |
- } else { |
- // Stop cursor-at-top tracking. |
- top_edge_hover_timer_.Stop(); |
- reveal_state_ = CLOSED; |
- |
- delegate_->OnImmersiveFullscreenExited(); |
- } |
- |
- if (enabled_) { |
- UMA_HISTOGRAM_ENUMERATION("Ash.ImmersiveFullscreen.WindowType", window_type, |
- WINDOW_TYPE_COUNT); |
- } |
-} |
- |
-bool ImmersiveFullscreenController::IsEnabled() const { |
- return enabled_; |
-} |
- |
-bool ImmersiveFullscreenController::IsRevealed() const { |
- return enabled_ && reveal_state_ != CLOSED; |
-} |
- |
-ImmersiveRevealedLock* ImmersiveFullscreenController::GetRevealedLock( |
- AnimateReveal animate_reveal) { |
- return new ImmersiveRevealedLock(weak_ptr_factory_.GetWeakPtr(), |
- animate_reveal); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-void ImmersiveFullscreenController::OnMouseEvent( |
- const ui::MouseEvent& event, |
- const gfx::Point& location_in_screen, |
- views::Widget* target) { |
- if (!enabled_) |
- return; |
- |
- if (event.type() != ui::ET_MOUSE_MOVED && |
- event.type() != ui::ET_MOUSE_PRESSED && |
- event.type() != ui::ET_MOUSE_RELEASED && |
- event.type() != ui::ET_MOUSE_CAPTURE_CHANGED) { |
- return; |
- } |
- |
- // Mouse hover can initiate revealing the top-of-window views while |widget_| |
- // is inactive. |
- |
- if (reveal_state_ == SLIDING_OPEN || reveal_state_ == REVEALED) { |
- top_edge_hover_timer_.Stop(); |
- UpdateLocatedEventRevealedLock(&event, location_in_screen); |
- } else if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED) { |
- // Trigger a reveal if the cursor pauses at the top of the screen for a |
- // while. |
- UpdateTopEdgeHoverTimer(event, location_in_screen, target); |
- } |
-} |
- |
-void ImmersiveFullscreenController::OnTouchEvent( |
- const ui::TouchEvent& event, |
- const gfx::Point& location_in_screen) { |
- if (!enabled_ || event.type() != ui::ET_TOUCH_PRESSED) |
- return; |
- |
- // Touch should not initiate revealing the top-of-window views while |widget_| |
- // is inactive. |
- if (!widget_->IsActive()) |
- return; |
- |
- UpdateLocatedEventRevealedLock(&event, location_in_screen); |
-} |
- |
-void ImmersiveFullscreenController::OnGestureEvent( |
- ui::GestureEvent* event, |
- const gfx::Point& location_in_screen) { |
- if (!enabled_) |
- return; |
- |
- // Touch gestures should not initiate revealing the top-of-window views while |
- // |widget_| is inactive. |
- if (!widget_->IsActive()) |
- return; |
- |
- switch (event->type()) { |
- case ui::ET_GESTURE_SCROLL_BEGIN: |
- if (ShouldHandleGestureEvent(location_in_screen)) { |
- gesture_begun_ = true; |
- // Do not consume the event. Otherwise, we end up consuming all |
- // ui::ET_GESTURE_SCROLL_BEGIN events in the top-of-window views |
- // when the top-of-window views are revealed. |
- } |
- break; |
- case ui::ET_GESTURE_SCROLL_UPDATE: |
- if (gesture_begun_) { |
- if (UpdateRevealedLocksForSwipe(GetSwipeType(*event))) |
- event->SetHandled(); |
- gesture_begun_ = false; |
- } |
- break; |
- case ui::ET_GESTURE_SCROLL_END: |
- case ui::ET_SCROLL_FLING_START: |
- gesture_begun_ = false; |
- break; |
- default: |
- break; |
- } |
-} |
- |
-void ImmersiveFullscreenController::OnPointerEventObserved( |
- const ui::PointerEvent& event, |
- const gfx::Point& location_in_screen, |
- views::Widget* target) { |
- if (event.IsMousePointerEvent()) { |
- const ui::MouseEvent mouse_event(event); |
- OnMouseEvent(mouse_event, location_in_screen, target); |
- } else { |
- DCHECK(event.IsTouchPointerEvent()); |
- const ui::TouchEvent touch_event(event); |
- OnTouchEvent(touch_event, location_in_screen); |
- } |
-} |
- |
-void ImmersiveFullscreenController::OnMouseCaptureChanged() { |
- const ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), |
- gfx::Point(), ui::EventTimeForNow(), 0, 0); |
- OnMouseEvent(event, display::Screen::GetScreen()->GetCursorScreenPoint(), |
- nullptr); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// views::WidgetObserver overrides: |
- |
-void ImmersiveFullscreenController::OnWidgetDestroying(views::Widget* widget) { |
- EnableWindowObservers(false); |
- widget_window_ = nullptr; |
- |
- // Set |enabled_| to false such that any calls to MaybeStartReveal() and |
- // MaybeEndReveal() have no effect. |
- enabled_ = false; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// gfx::AnimationDelegate overrides: |
- |
-void ImmersiveFullscreenController::AnimationEnded( |
- const gfx::Animation* animation) { |
- if (reveal_state_ == SLIDING_OPEN) { |
- OnSlideOpenAnimationCompleted(); |
- } else if (reveal_state_ == SLIDING_CLOSED) { |
- OnSlideClosedAnimationCompleted(); |
- } |
-} |
- |
-void ImmersiveFullscreenController::AnimationProgressed( |
- const gfx::Animation* animation) { |
- delegate_->SetVisibleFraction(animation->GetCurrentValue()); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// ImmersiveRevealedLock::Delegate overrides: |
- |
-void ImmersiveFullscreenController::LockRevealedState( |
- AnimateReveal animate_reveal) { |
- ++revealed_lock_count_; |
- Animate animate = |
- (animate_reveal == ANIMATE_REVEAL_YES) ? ANIMATE_FAST : ANIMATE_NO; |
- MaybeStartReveal(animate); |
-} |
- |
-void ImmersiveFullscreenController::UnlockRevealedState() { |
- --revealed_lock_count_; |
- DCHECK_GE(revealed_lock_count_, 0); |
- if (revealed_lock_count_ == 0) { |
- // Always animate ending the reveal fast. |
- MaybeEndReveal(ANIMATE_FAST); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// private: |
- |
-void ImmersiveFullscreenController::EnableWindowObservers(bool enable) { |
- if (observers_enabled_ == enable) |
- return; |
- observers_enabled_ = enable; |
- |
- if (enable) { |
- immersive_focus_watcher_ = |
- ImmersiveHandlerFactory::Get()->CreateFocusWatcher(this); |
- immersive_gesture_handler_ = |
- ImmersiveHandlerFactory::Get()->CreateGestureHandler(this); |
- widget_->AddObserver(this); |
- const bool wants_moves = true; |
- ImmersiveContext::Get()->AddPointerWatcher(this, wants_moves); |
- } else { |
- ImmersiveContext::Get()->RemovePointerWatcher(this); |
- widget_->RemoveObserver(this); |
- immersive_gesture_handler_.reset(); |
- immersive_focus_watcher_.reset(); |
- |
- animation_->Stop(); |
- } |
-} |
- |
-void ImmersiveFullscreenController::UpdateTopEdgeHoverTimer( |
- const ui::MouseEvent& event, |
- const gfx::Point& location_in_screen, |
- views::Widget* target) { |
- DCHECK(enabled_); |
- DCHECK(reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED); |
- |
- // Check whether |widget_| is the event target instead of checking for |
- // activation. This allows the timer to be started when |widget_| is inactive |
- // but prevents starting the timer if the mouse is over a portion of the top |
- // edge obscured by an unrelated widget. |
- if (!top_edge_hover_timer_.IsRunning() && target != widget_) { |
- return; |
- } |
- |
- // Mouse hover should not initiate revealing the top-of-window views while a |
- // window has mouse capture. |
- if (ImmersiveContext::Get()->DoesAnyWindowHaveCapture()) |
- return; |
- |
- if (ShouldIgnoreMouseEventAtLocation(location_in_screen)) |
- return; |
- |
- // Stop the timer if the cursor left the top edge or is on a different |
- // display. |
- gfx::Rect hit_bounds_in_screen = GetDisplayBoundsInScreen(); |
- hit_bounds_in_screen.set_height(kMouseRevealBoundsHeight); |
- if (!hit_bounds_in_screen.Contains(location_in_screen)) { |
- top_edge_hover_timer_.Stop(); |
- return; |
- } |
- |
- // The cursor is now at the top of the screen. Consider the cursor "not |
- // moving" even if it moves a little bit because users don't have perfect |
- // pointing precision. (The y position is not tested because |
- // |hit_bounds_in_screen| is short.) |
- if (top_edge_hover_timer_.IsRunning() && |
- abs(location_in_screen.x() - mouse_x_when_hit_top_in_screen_) <= |
- kMouseRevealXThresholdPixels) |
- return; |
- |
- // Start the reveal if the cursor doesn't move for some amount of time. |
- mouse_x_when_hit_top_in_screen_ = location_in_screen.x(); |
- top_edge_hover_timer_.Stop(); |
- // Timer is stopped when |this| is destroyed, hence Unretained() is safe. |
- top_edge_hover_timer_.Start( |
- FROM_HERE, base::TimeDelta::FromMilliseconds(kMouseRevealDelayMs), |
- base::Bind( |
- &ImmersiveFullscreenController::AcquireLocatedEventRevealedLock, |
- base::Unretained(this))); |
-} |
- |
-void ImmersiveFullscreenController::UpdateLocatedEventRevealedLock( |
- const ui::LocatedEvent* event, |
- const gfx::Point& location_in_screen) { |
- if (!enabled_) |
- return; |
- DCHECK(!event || event->IsMouseEvent() || event->IsTouchEvent()); |
- |
- // Neither the mouse nor touch can initiate a reveal when the top-of-window |
- // views are sliding closed or are closed with the following exceptions: |
- // - Hovering at y = 0 which is handled in OnMouseEvent(). |
- // - Doing a SWIPE_OPEN edge gesture which is handled in OnGestureEvent(). |
- if (reveal_state_ == CLOSED || reveal_state_ == SLIDING_CLOSED) |
- return; |
- |
- // For the sake of simplicity, ignore |widget_|'s activation in computing |
- // whether the top-of-window views should stay revealed. Ideally, the |
- // top-of-window views would stay revealed only when the mouse cursor is |
- // hovered above a non-obscured portion of the top-of-window views. The |
- // top-of-window views may be partially obscured when |widget_| is inactive. |
- |
- // Ignore all events while a window has capture. This keeps the top-of-window |
- // views revealed during a drag. |
- if (ImmersiveContext::Get()->DoesAnyWindowHaveCapture()) |
- return; |
- |
- if ((!event || event->IsMouseEvent()) && |
- ShouldIgnoreMouseEventAtLocation(location_in_screen)) { |
- return; |
- } |
- |
- // The visible bounds of |top_container_| should be contained in |
- // |hit_bounds_in_screen|. |
- std::vector<gfx::Rect> hit_bounds_in_screen = |
- delegate_->GetVisibleBoundsInScreen(); |
- bool keep_revealed = false; |
- for (size_t i = 0; i < hit_bounds_in_screen.size(); ++i) { |
- // Allow the cursor to move slightly off the top-of-window views before |
- // sliding closed. In the case of ImmersiveModeControllerAsh, this helps |
- // when the user is attempting to click on the bookmark bar and overshoots |
- // slightly. |
- if (event && event->type() == ui::ET_MOUSE_MOVED) { |
- const int kBoundsOffsetY = 8; |
- hit_bounds_in_screen[i].Inset(0, 0, 0, -kBoundsOffsetY); |
- } |
- |
- if (hit_bounds_in_screen[i].Contains(location_in_screen)) { |
- keep_revealed = true; |
- break; |
- } |
- } |
- |
- if (keep_revealed) |
- AcquireLocatedEventRevealedLock(); |
- else |
- located_event_revealed_lock_.reset(); |
-} |
- |
-void ImmersiveFullscreenController::UpdateLocatedEventRevealedLock() { |
- if (!ImmersiveContext::Get()->IsMouseEventsEnabled()) { |
- // If mouse events are disabled, the user's last interaction was probably |
- // via touch. Do no do further processing in this case as there is no easy |
- // way of retrieving the position of the user's last touch. |
- return; |
- } |
- UpdateLocatedEventRevealedLock( |
- nullptr, display::Screen::GetScreen()->GetCursorScreenPoint()); |
-} |
- |
-void ImmersiveFullscreenController::AcquireLocatedEventRevealedLock() { |
- // CAUTION: Acquiring the lock results in a reentrant call to |
- // AcquireLocatedEventRevealedLock() when |
- // |ImmersiveFullscreenController::animations_disabled_for_test_| is true. |
- if (!located_event_revealed_lock_.get()) |
- located_event_revealed_lock_.reset(GetRevealedLock(ANIMATE_REVEAL_YES)); |
-} |
- |
-bool ImmersiveFullscreenController::UpdateRevealedLocksForSwipe( |
- SwipeType swipe_type) { |
- if (!enabled_ || swipe_type == SWIPE_NONE) |
- return false; |
- |
- // Swipes while |widget_| is inactive should have been filtered out in |
- // OnGestureEvent(). |
- DCHECK(widget_->IsActive()); |
- |
- if (reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED) { |
- if (swipe_type == SWIPE_OPEN && !located_event_revealed_lock_.get()) { |
- located_event_revealed_lock_.reset(GetRevealedLock(ANIMATE_REVEAL_YES)); |
- return true; |
- } |
- } else { |
- if (swipe_type == SWIPE_CLOSE) { |
- // Attempt to end the reveal. If other code is holding onto a lock, the |
- // attempt will be unsuccessful. |
- located_event_revealed_lock_.reset(); |
- if (immersive_focus_watcher_) |
- immersive_focus_watcher_->ReleaseLock(); |
- |
- if (reveal_state_ == SLIDING_CLOSED || reveal_state_ == CLOSED) { |
- widget_->GetFocusManager()->ClearFocus(); |
- return true; |
- } |
- |
- // Ending the reveal was unsuccessful. Reaquire the locks if appropriate. |
- UpdateLocatedEventRevealedLock(); |
- if (immersive_focus_watcher_) |
- immersive_focus_watcher_->UpdateFocusRevealedLock(); |
- } |
- } |
- return false; |
-} |
- |
-int ImmersiveFullscreenController::GetAnimationDuration(Animate animate) const { |
- switch (animate) { |
- case ANIMATE_NO: |
- return 0; |
- case ANIMATE_SLOW: |
- return kRevealSlowAnimationDurationMs; |
- case ANIMATE_FAST: |
- return kRevealFastAnimationDurationMs; |
- } |
- NOTREACHED(); |
- return 0; |
-} |
- |
-void ImmersiveFullscreenController::MaybeStartReveal(Animate animate) { |
- if (!enabled_) |
- return; |
- |
- if (animations_disabled_for_test_) |
- animate = ANIMATE_NO; |
- |
- // Callers with ANIMATE_NO expect this function to synchronously reveal the |
- // top-of-window views. |
- if (reveal_state_ == REVEALED || |
- (reveal_state_ == SLIDING_OPEN && animate != ANIMATE_NO)) { |
- return; |
- } |
- |
- RevealState previous_reveal_state = reveal_state_; |
- reveal_state_ = SLIDING_OPEN; |
- if (previous_reveal_state == CLOSED) { |
- delegate_->OnImmersiveRevealStarted(); |
- |
- // Do not do any more processing if OnImmersiveRevealStarted() changed |
- // |reveal_state_|. |
- if (reveal_state_ != SLIDING_OPEN) |
- return; |
- } |
- // Slide in the reveal view. |
- if (animate == ANIMATE_NO) { |
- animation_->Reset(1); |
- OnSlideOpenAnimationCompleted(); |
- } else { |
- animation_->SetSlideDuration(GetAnimationDuration(animate)); |
- animation_->Show(); |
- } |
-} |
- |
-void ImmersiveFullscreenController::OnSlideOpenAnimationCompleted() { |
- DCHECK_EQ(SLIDING_OPEN, reveal_state_); |
- reveal_state_ = REVEALED; |
- delegate_->SetVisibleFraction(1); |
- |
- // The user may not have moved the mouse since the reveal was initiated. |
- // Update the revealed lock to reflect the mouse's current state. |
- UpdateLocatedEventRevealedLock(); |
-} |
- |
-void ImmersiveFullscreenController::MaybeEndReveal(Animate animate) { |
- if (!enabled_ || revealed_lock_count_ != 0) |
- return; |
- |
- if (animations_disabled_for_test_) |
- animate = ANIMATE_NO; |
- |
- // Callers with ANIMATE_NO expect this function to synchronously close the |
- // top-of-window views. |
- if (reveal_state_ == CLOSED || |
- (reveal_state_ == SLIDING_CLOSED && animate != ANIMATE_NO)) { |
- return; |
- } |
- |
- reveal_state_ = SLIDING_CLOSED; |
- int duration_ms = GetAnimationDuration(animate); |
- if (duration_ms > 0) { |
- animation_->SetSlideDuration(duration_ms); |
- animation_->Hide(); |
- } else { |
- animation_->Reset(0); |
- OnSlideClosedAnimationCompleted(); |
- } |
-} |
- |
-void ImmersiveFullscreenController::OnSlideClosedAnimationCompleted() { |
- DCHECK_EQ(SLIDING_CLOSED, reveal_state_); |
- reveal_state_ = CLOSED; |
- delegate_->OnImmersiveRevealEnded(); |
-} |
- |
-ImmersiveFullscreenController::SwipeType |
-ImmersiveFullscreenController::GetSwipeType( |
- const ui::GestureEvent& event) const { |
- if (event.type() != ui::ET_GESTURE_SCROLL_UPDATE) |
- return SWIPE_NONE; |
- // Make sure that it is a clear vertical gesture. |
- if (std::abs(event.details().scroll_y()) <= |
- kSwipeVerticalThresholdMultiplier * std::abs(event.details().scroll_x())) |
- return SWIPE_NONE; |
- if (event.details().scroll_y() < 0) |
- return SWIPE_CLOSE; |
- if (event.details().scroll_y() > 0) |
- return SWIPE_OPEN; |
- return SWIPE_NONE; |
-} |
- |
-bool ImmersiveFullscreenController::ShouldIgnoreMouseEventAtLocation( |
- const gfx::Point& location) const { |
- // Ignore mouse events in the region immediately above the top edge of the |
- // display. This is to handle the case of a user with a vertical display |
- // layout (primary display above/below secondary display) and the immersive |
- // fullscreen window on the bottom display. It is really hard to trigger a |
- // reveal in this case because: |
- // - It is hard to stop the cursor in the top |kMouseRevealBoundsHeight| |
- // pixels of the bottom display. |
- // - The cursor is warped to the top display if the cursor gets to the top |
- // edge of the bottom display. |
- // Mouse events are ignored in the bottom few pixels of the top display |
- // (Mouse events in this region cannot start or end a reveal). This allows a |
- // user to overshoot the top of the bottom display and still reveal the |
- // top-of-window views. |
- gfx::Rect dead_region = GetDisplayBoundsInScreen(); |
- dead_region.set_y(dead_region.y() - kHeightOfDeadRegionAboveTopContainer); |
- dead_region.set_height(kHeightOfDeadRegionAboveTopContainer); |
- return dead_region.Contains(location); |
-} |
- |
-bool ImmersiveFullscreenController::ShouldHandleGestureEvent( |
- const gfx::Point& location) const { |
- DCHECK(widget_->IsActive()); |
- if (reveal_state_ == REVEALED) { |
- std::vector<gfx::Rect> hit_bounds_in_screen( |
- delegate_->GetVisibleBoundsInScreen()); |
- for (size_t i = 0; i < hit_bounds_in_screen.size(); ++i) { |
- if (hit_bounds_in_screen[i].Contains(location)) |
- return true; |
- } |
- return false; |
- } |
- |
- // When the top-of-window views are not fully revealed, handle gestures which |
- // start in the top few pixels of the screen. |
- gfx::Rect hit_bounds_in_screen(GetDisplayBoundsInScreen()); |
- hit_bounds_in_screen.set_height(kImmersiveFullscreenTopEdgeInset); |
- if (hit_bounds_in_screen.Contains(location)) |
- return true; |
- |
- // There may be a bezel sensor off screen logically above |
- // |hit_bounds_in_screen|. The check for the event not contained by the |
- // closest screen ensures that the event is from a valid bezel (as opposed to |
- // another screen in an extended desktop). |
- gfx::Rect screen_bounds = |
- display::Screen::GetScreen()->GetDisplayNearestPoint(location).bounds(); |
- return (!screen_bounds.Contains(location) && |
- location.y() < hit_bounds_in_screen.y() && |
- location.x() >= hit_bounds_in_screen.x() && |
- location.x() < hit_bounds_in_screen.right()); |
-} |
- |
-gfx::Rect ImmersiveFullscreenController::GetDisplayBoundsInScreen() const { |
- return ImmersiveContext::Get()->GetDisplayBoundsInScreen(widget_); |
-} |
- |
-} // namespace ash |