// Copyright (c) 2012 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/display/mouse_cursor_event_filter.h" #include #include "ash/display/cursor_window_controller.h" #include "ash/display/display_manager.h" #include "ash/display/mouse_warp_controller.h" #include "ash/shell.h" #include "ui/events/event.h" namespace ash { MouseCursorEventFilter::MouseCursorEventFilter() : mouse_warp_enabled_(true) { Shell::GetInstance()->window_tree_host_manager()->AddObserver(this); } MouseCursorEventFilter::~MouseCursorEventFilter() { Shell::GetInstance()->window_tree_host_manager()->RemoveObserver(this); } void MouseCursorEventFilter::ShowSharedEdgeIndicator(aura::Window* from) { mouse_warp_controller_ = Shell::GetInstance()->display_manager()->CreateMouseWarpController(from); } void MouseCursorEventFilter::HideSharedEdgeIndicator() { OnDisplayConfigurationChanged(); } void MouseCursorEventFilter::OnDisplaysInitialized() { OnDisplayConfigurationChanged(); } void MouseCursorEventFilter::OnDisplayConfigurationChanged() { mouse_warp_controller_ = Shell::GetInstance()->display_manager()->CreateMouseWarpController( nullptr); } void MouseCursorEventFilter::OnMouseEvent(ui::MouseEvent* event) { // Don't warp due to synthesized event. if (event->flags() & ui::EF_IS_SYNTHESIZED) return; // Handle both MOVED and DRAGGED events here because when the mouse pointer // enters the other root window while dragging, the underlying window system // (at least X11) stops generating a ui::ET_MOUSE_MOVED event. if (event->type() != ui::ET_MOUSE_MOVED && event->type() != ui::ET_MOUSE_DRAGGED) { return; } Shell::GetInstance() ->window_tree_host_manager() ->cursor_window_controller() ->UpdateLocation(); mouse_warp_controller_->SetEnabled(mouse_warp_enabled_); if (mouse_warp_controller_->WarpMouseCursor(event)) event->StopPropagation(); } } // namespace ash