chromium/ash/display/mouse_cursor_event_filter.cc

// Copyright 2012 The Chromium Authors
// 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 <cmath>

#include "ash/display/cursor_window_controller.h"
#include "ash/display/display_util.h"
#include "ash/display/mouse_warp_controller.h"
#include "ash/display/window_tree_host_manager.h"
#include "ash/shell.h"
#include "ui/events/event.h"

namespace ash {

MouseCursorEventFilter::MouseCursorEventFilter() : mouse_warp_enabled_(true) {
  Shell::Get()->display_manager()->AddDisplayManagerObserver(this);
}

MouseCursorEventFilter::~MouseCursorEventFilter() {
  Shell::Get()->display_manager()->RemoveDisplayManagerObserver(this);
}

void MouseCursorEventFilter::ShowSharedEdgeIndicator(aura::Window* from) {
  mouse_warp_controller_ =
      CreateMouseWarpController(Shell::Get()->display_manager(), from);
}

void MouseCursorEventFilter::HideSharedEdgeIndicator() {
  OnDidApplyDisplayChanges();
}

void MouseCursorEventFilter::OnDisplaysInitialized() {
  OnDidApplyDisplayChanges();
}

void MouseCursorEventFilter::OnDidApplyDisplayChanges() {
  mouse_warp_controller_ =
      CreateMouseWarpController(Shell::Get()->display_manager(), 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::EventType::kMouseMoved event.
  if (event->type() != ui::EventType::kMouseMoved &&
      event->type() != ui::EventType::kMouseDragged) {
    return;
  }

  bool mouse_warp_enabled =
      mouse_warp_enabled_ &&
      (event->flags() & ui::EF_NOT_SUITABLE_FOR_MOUSE_WARPING) == 0;

  Shell::Get()
      ->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