1 // Copyright 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CC_INPUT_INPUT_HANDLER_H_ 6 #define CC_INPUT_INPUT_HANDLER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/time/time.h" 10 #include "cc/base/cc_export.h" 11 #include "cc/input/scrollbar.h" 12 13 namespace gfx { 14 class Point; 15 class PointF; 16 class Vector2d; 17 class Vector2dF; 18 } 19 20 namespace ui { struct LatencyInfo; } 21 22 namespace cc { 23 24 class LayerScrollOffsetDelegate; 25 26 struct DidOverscrollParams { 27 gfx::Vector2dF accumulated_overscroll; 28 gfx::Vector2dF latest_overscroll_delta; 29 gfx::Vector2dF current_fling_velocity; 30 }; 31 32 class CC_EXPORT InputHandlerClient { 33 public: 34 virtual ~InputHandlerClient() {} 35 36 virtual void WillShutdown() = 0; 37 virtual void Animate(base::TimeTicks time) = 0; 38 virtual void MainThreadHasStoppedFlinging() = 0; 39 40 // Called when scroll deltas reaching the root scrolling layer go unused. 41 // The accumulated overscroll is scoped by the most recent call to 42 // InputHandler::ScrollBegin. 43 virtual void DidOverscroll(const DidOverscrollParams& params) = 0; 44 45 protected: 46 InputHandlerClient() {} 47 48 private: 49 DISALLOW_COPY_AND_ASSIGN(InputHandlerClient); 50 }; 51 52 // The InputHandler is a way for the embedders to interact with the impl thread 53 // side of the compositor implementation. There is one InputHandler per 54 // LayerTreeHost. To use the input handler, implement the InputHanderClient 55 // interface and bind it to the handler on the compositor thread. 56 class CC_EXPORT InputHandler { 57 public: 58 enum ScrollStatus { ScrollOnMainThread, ScrollStarted, ScrollIgnored }; 59 enum ScrollInputType { Gesture, Wheel, NonBubblingGesture }; 60 61 // Binds a client to this handler to receive notifications. Only one client 62 // can be bound to an InputHandler. The client must live at least until the 63 // handler calls WillShutdown() on the client. 64 virtual void BindToClient(InputHandlerClient* client) = 0; 65 66 // Selects a layer to be scrolled at a given point in viewport (logical 67 // pixel) coordinates. Returns ScrollStarted if the layer at the coordinates 68 // can be scrolled, ScrollOnMainThread if the scroll event should instead be 69 // delegated to the main thread, or ScrollIgnored if there is nothing to be 70 // scrolled at the given coordinates. 71 virtual ScrollStatus ScrollBegin(gfx::Point viewport_point, 72 ScrollInputType type) = 0; 73 74 // Scroll the selected layer starting at the given position. If the scroll 75 // type given to ScrollBegin was a gesture, then the scroll point and delta 76 // should be in viewport (logical pixel) coordinates. Otherwise they are in 77 // scrolling layer's (logical pixel) space. If there is no room to move the 78 // layer in the requested direction, its first ancestor layer that can be 79 // scrolled will be moved instead. If no layer can be moved in the requested 80 // direction at all, then false is returned. If any layer is moved, then 81 // true is returned. 82 // If the scroll delta hits the root layer, and the layer can no longer move, 83 // the root overscroll accumulated within this ScrollBegin() scope is reported 84 // to the client. 85 // Should only be called if ScrollBegin() returned ScrollStarted. 86 virtual bool ScrollBy(gfx::Point viewport_point, 87 gfx::Vector2dF scroll_delta) = 0; 88 89 virtual bool ScrollVerticallyByPage( 90 gfx::Point viewport_point, 91 ScrollDirection direction) = 0; 92 93 // Returns ScrollStarted if a layer was being actively being scrolled, 94 // ScrollIgnored if not. 95 virtual ScrollStatus FlingScrollBegin() = 0; 96 97 virtual void NotifyCurrentFlingVelocity(gfx::Vector2dF velocity) = 0; 98 99 // Stop scrolling the selected layer. Should only be called if ScrollBegin() 100 // returned ScrollStarted. 101 virtual void ScrollEnd() = 0; 102 103 virtual void SetRootLayerScrollOffsetDelegate( 104 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) = 0; 105 106 // Called when the value returned by 107 // LayerScrollOffsetDelegate.GetTotalScrollOffset has changed for reasons 108 // other than a SetTotalScrollOffset call. 109 // NOTE: This should only called after a valid delegate was set via a call to 110 // SetRootLayerScrollOffsetDelegate. 111 virtual void OnRootLayerDelegatedScrollOffsetChanged() = 0; 112 113 virtual void PinchGestureBegin() = 0; 114 virtual void PinchGestureUpdate(float magnify_delta, gfx::Point anchor) = 0; 115 virtual void PinchGestureEnd() = 0; 116 117 virtual void StartPageScaleAnimation(gfx::Vector2d target_offset, 118 bool anchor_point, 119 float page_scale, 120 base::TimeTicks start_time, 121 base::TimeDelta duration) = 0; 122 123 // Request another callback to InputHandlerClient::Animate(). 124 virtual void ScheduleAnimation() = 0; 125 126 virtual bool HaveTouchEventHandlersAt(gfx::Point viewport_point) = 0; 127 128 virtual void SetLatencyInfoForInputEvent( 129 const ui::LatencyInfo& latency_info) = 0; 130 131 protected: 132 InputHandler() {} 133 virtual ~InputHandler() {} 134 135 private: 136 DISALLOW_COPY_AND_ASSIGN(InputHandler); 137 }; 138 139 } // namespace cc 140 141 #endif // CC_INPUT_INPUT_HANDLER_H_ 142