123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- // Copyright 2015 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.
- #ifndef COMPONENTS_EXO_POINTER_H_
- #define COMPONENTS_EXO_POINTER_H_
- #include <memory>
- #include "base/memory/weak_ptr.h"
- #include "base/unguessable_token.h"
- #include "components/exo/surface_observer.h"
- #include "components/exo/surface_tree_host.h"
- #include "components/exo/wm_helper.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- #include "third_party/skia/include/core/SkBitmap.h"
- #include "ui/aura/client/cursor_client_observer.h"
- #include "ui/aura/client/drag_drop_client_observer.h"
- #include "ui/aura/client/focus_change_observer.h"
- #include "ui/base/cursor/cursor.h"
- #include "ui/base/cursor/mojom/cursor_type.mojom-forward.h"
- #include "ui/events/event_handler.h"
- #include "ui/events/types/event_type.h"
- #include "ui/gfx/geometry/point.h"
- #include "ui/gfx/geometry/point_f.h"
- #include "ui/gfx/native_widget_types.h"
- namespace viz {
- class CopyOutputResult;
- }
- namespace ui {
- class LocatedEvent;
- class MouseEvent;
- } // namespace ui
- namespace exo {
- class PointerConstraintDelegate;
- class PointerDelegate;
- class PointerGesturePinchDelegate;
- class PointerStylusDelegate;
- class RelativePointerDelegate;
- class Seat;
- class Surface;
- class SurfaceTreeHost;
- // This class implements a client pointer that represents one or more input
- // devices, such as mice, which control the pointer location and pointer focus.
- class Pointer : public SurfaceTreeHost,
- public SurfaceObserver,
- public ui::EventHandler,
- public aura::client::DragDropClientObserver,
- public aura::client::CursorClientObserver,
- public aura::client::FocusChangeObserver {
- public:
- Pointer(PointerDelegate* delegate, Seat* seat);
- Pointer(const Pointer&) = delete;
- Pointer& operator=(const Pointer&) = delete;
- ~Pointer() override;
- PointerDelegate* delegate() const { return delegate_; }
- // Set the pointer surface, i.e., the surface that contains the pointer image
- // (cursor). The |hotspot| argument defines the position of the pointer
- // surface relative to the pointer location. Its top-left corner is always at
- // (x, y) - (hotspot.x, hotspot.y), where (x, y) are the coordinates of the
- // pointer location, in surface local coordinates.
- void SetCursor(Surface* surface, const gfx::Point& hotspot);
- // Set the pointer cursor type. This is similar to SetCursor, but this method
- // accepts ui::mojom::CursorType instead of the surface for the pointer image.
- void SetCursorType(ui::mojom::CursorType cursor_type);
- // Set delegate for pinch events.
- void SetGesturePinchDelegate(PointerGesturePinchDelegate* delegate);
- // Overridden from SurfaceDelegate:
- void OnSurfaceCommit() override;
- // Overridden from SurfaceObserver:
- void OnSurfaceDestroying(Surface* surface) override;
- // Overridden from ui::EventHandler:
- void OnMouseEvent(ui::MouseEvent* event) override;
- void OnScrollEvent(ui::ScrollEvent* event) override;
- void OnGestureEvent(ui::GestureEvent* event) override;
- // aura::client::DragDropClientObserver:
- void OnDragStarted() override;
- void OnDragCompleted(const ui::DropTargetEvent& event) override;
- // Overridden from aura::client::CursorClientObserver:
- void OnCursorSizeChanged(ui::CursorSize cursor_size) override;
- void OnCursorDisplayChanged(const display::Display& display) override;
- // Overridden from aura::client::FocusChangeObserver;
- void OnWindowFocused(aura::Window* gained_focus,
- aura::Window* lost_focus) override;
- // Relative motion registration.
- void RegisterRelativePointerDelegate(RelativePointerDelegate* delegate);
- void UnregisterRelativePointerDelegate(RelativePointerDelegate* delegate);
- // Enable the pointer constraint on the given surface. Returns true if the
- // lock was granted, false otherwise.
- //
- // The delegate must call OnPointerConstraintDelegateDestroying() upon/before
- // being destroyed, regardless of the return value of ConstrainPointer(),
- // unless PointerConstraintDelegate::OnDefunct() is called first.
- //
- // TODO(crbug.com/957455): For legacy reasons, locking the pointer will also
- // hide the cursor.
- bool ConstrainPointer(PointerConstraintDelegate* delegate);
- // Notifies that |delegate| is being destroyed.
- void OnPointerConstraintDelegateDestroying(
- PointerConstraintDelegate* delegate);
- // Disable the pointer constraint, notify the delegate, and do not permit
- // the constraint to be re-established until the user acts on the surface
- // (by clicking on it).
- //
- // Designed to be called by client code, on behalf of a user action to break
- // the constraint.
- //
- // Returns true if an active pointer constraint was disabled.
- bool UnconstrainPointerByUserAction();
- // Set the stylus delegate for handling stylus events.
- void SetStylusDelegate(PointerStylusDelegate* delegate);
- bool HasStylusDelegate() const;
- private:
- // Remove |delegate| from |constraints_|.
- void RemoveConstraintDelegate(PointerConstraintDelegate* delegate);
- // Disable the pointer constraint and notify the delegate.
- void UnconstrainPointer();
- // Try to reactivate a pointer constraint previously requested for the given
- // surface, if any.
- void MaybeReactivatePointerConstraint(Surface* surface);
- // Capture the pointer for the given surface. Returns true iff the capture
- // succeeded.
- bool EnablePointerCapture(Surface* capture_surface);
- // Remove the currently active pointer capture (if there is one).
- void DisablePointerCapture();
- // Returns the effective target for |event| and the event's location converted
- // to the target's coordinates.
- Surface* GetEffectiveTargetForEvent(const ui::LocatedEvent* event,
- gfx::PointF* location_in_target) const;
- // Change pointer focus to |surface|.
- void SetFocus(Surface* surface,
- const gfx::PointF& location,
- int button_flags);
- // Updates the root_surface in |SurfaceTreeHost| from which the cursor
- // is captured.
- void UpdatePointerSurface(Surface* surface);
- // Asynchronously update the cursor by capturing a snapshot of
- // |SurfaceTreeHost::root_surface()|.
- void CaptureCursor(const gfx::Point& hotspot);
- // Called when cursor snapshot has been captured.
- void OnCursorCaptured(const gfx::Point& hotspot,
- std::unique_ptr<viz::CopyOutputResult> result);
- // Update |cursor_| to |cursor_bitmap_| transformed for the current display.
- void UpdateCursor();
- // Convert the given |location_in_target| to coordinates in the root window.
- gfx::PointF GetLocationInRoot(Surface* target,
- gfx::PointF location_in_target);
- // Called to check if cursor should be moved to the center of the window when
- // sending relative movements.
- bool ShouldMoveToCenter();
- // Moves the cursor to center of the active display.
- void MoveCursorToCenterOfActiveDisplay();
- // Process the delta for relative pointer motion. Returns true if relative
- // motion was sent to the delegate, false otherwise. If |ordinal_motion| is
- // supplied, it will be used for determining physical motion, otherwise
- // physical motion will be the relative delta.
- bool HandleRelativePointerMotion(
- base::TimeTicks time_stamp,
- gfx::PointF location_in_target,
- const absl::optional<gfx::Vector2dF>& ordinal_motion);
- // Whether this Pointer should observe the given |surface|.
- bool ShouldObserveSurface(Surface* surface);
- // Stop observing |surface| if it's no longer relevant.
- void MaybeRemoveSurfaceObserver(Surface* surface);
- // The delegate instance that all events are dispatched to.
- PointerDelegate* const delegate_;
- Seat* const seat_;
- // The delegate instance that all pinch related events are dispatched to.
- PointerGesturePinchDelegate* pinch_delegate_ = nullptr;
- // The delegate instance that relative movement events are dispatched to.
- RelativePointerDelegate* relative_pointer_delegate_ = nullptr;
- // Delegate that owns the currently granted pointer lock, if any.
- PointerConstraintDelegate* pointer_constraint_delegate_ = nullptr;
- // All delegates currently requesting a pointer locks, whether granted or
- // not. Only one such request may exist per surface; others will be denied.
- base::flat_map<Surface*, PointerConstraintDelegate*> constraints_;
- // The delegate instance that stylus/pen events are dispatched to.
- PointerStylusDelegate* stylus_delegate_ = nullptr;
- // The current focus surface for the pointer.
- Surface* focus_surface_ = nullptr;
- // The location of the pointer in the current focus surface.
- gfx::PointF location_;
- // The location of the pointer when pointer capture is first enabled.
- absl::optional<gfx::Point> location_when_pointer_capture_enabled_;
- // If this is not nullptr, a synthetic move was sent and this points to the
- // location of a generated move that was sent which should not be forwarded.
- absl::optional<gfx::Point> location_synthetic_move_;
- // The window with pointer capture. Pointer capture is enabled if and only if
- // this is not null.
- aura::Window* capture_window_ = nullptr;
- // True if this pointer is permitted to be captured.
- //
- // Set false when a user action (except focus loss) breaks pointer capture.
- // Set true when the user clicks in any Exo window.
- bool capture_permitted_ = true;
- // The position of the pointer surface relative to the pointer location.
- gfx::Point hotspot_;
- // Latest cursor snapshot.
- SkBitmap cursor_bitmap_;
- // The current cursor.
- ui::Cursor cursor_;
- // Hotspot to use with latest cursor snapshot.
- gfx::Point cursor_hotspot_;
- // Scale at which cursor snapshot is captured.
- float capture_scale_;
- // Source used for cursor capture copy output requests.
- const base::UnguessableToken cursor_capture_source_id_;
- // Last received event type.
- ui::EventType last_event_type_ = ui::ET_UNKNOWN;
- // Last reported stylus values.
- ui::EventPointerType last_pointer_type_ = ui::EventPointerType::kUnknown;
- float last_force_ = std::numeric_limits<float>::quiet_NaN();
- gfx::Vector2dF last_tilt_;
- // Weak pointer factory used for cursor capture callbacks.
- base::WeakPtrFactory<Pointer> cursor_capture_weak_ptr_factory_{this};
- };
- } // namespace exo
- #endif // COMPONENTS_EXO_POINTER_H_
|