Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_scrolling_manager.h File Reference

Go to the source code of this file.

Functions

G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (FlScrollingManager, fl_scrolling_manager, FL, SCROLLING_MANAGER, GObject)
 
FlScrollingManager * fl_scrolling_manager_new (FlEngine *engine, FlutterViewId view_id)
 
void fl_scrolling_manager_set_last_mouse_position (FlScrollingManager *manager, gdouble x, gdouble y)
 
void fl_scrolling_manager_handle_scroll_event (FlScrollingManager *manager, GdkEventScroll *event, gint scale_factor)
 
void fl_scrolling_manager_handle_rotation_begin (FlScrollingManager *manager)
 
void fl_scrolling_manager_handle_rotation_update (FlScrollingManager *manager, gdouble rotation)
 
void fl_scrolling_manager_handle_rotation_end (FlScrollingManager *manager)
 
void fl_scrolling_manager_handle_zoom_begin (FlScrollingManager *manager)
 
void fl_scrolling_manager_handle_zoom_update (FlScrollingManager *manager, gdouble scale)
 
void fl_scrolling_manager_handle_zoom_end (FlScrollingManager *manager)
 

Function Documentation

◆ fl_scrolling_manager_handle_rotation_begin()

void fl_scrolling_manager_handle_rotation_begin ( FlScrollingManager *  manager)

fl_scrolling_manager_handle_rotation_begin: @manager: an #FlScrollingManager.

Inform the scrolling manager that a rotation gesture has begun.

Definition at line 154 of file fl_scrolling_manager.cc.

154 {
155 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
156
157 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
158 if (engine == nullptr) {
159 return;
160 }
161
162 self->rotate_started = TRUE;
163 if (!self->zoom_started) {
164 self->scale = 1;
165 self->rotation = 0;
167 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
168 kPanZoomStart, 0, 0, 0, 0);
169 }
170}
@ kPanZoomStart
A pan/zoom started on this pointer.
Definition embedder.h:1301
FlutterEngine engine
Definition main.cc:84
g_autoptr(FlEngine) engine
return TRUE
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomStart, self, and TRUE.

Referenced by gesture_rotation_begin_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_rotation_end()

void fl_scrolling_manager_handle_rotation_end ( FlScrollingManager *  manager)

fl_scrolling_manager_handle_rotation_end: @manager: an #FlScrollingManager.

Inform the scrolling manager that a rotation gesture has ended.

Definition at line 187 of file fl_scrolling_manager.cc.

187 {
188 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
189
190 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
191 if (engine == nullptr) {
192 return;
193 }
194
195 self->rotate_started = FALSE;
196 if (!self->zoom_started) {
198 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
199 kPanZoomEnd, 0, 0, 0, 0);
200 }
201}
@ kPanZoomEnd
The pan/zoom ended.
Definition embedder.h:1305

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomEnd, and self.

Referenced by gesture_rotation_end_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_rotation_update()

void fl_scrolling_manager_handle_rotation_update ( FlScrollingManager *  manager,
gdouble  rotation 
)

fl_scrolling_manager_handle_rotation_update: @manager: an #FlScrollingManager. @rotation: the rotation angle, in radians.

Inform the scrolling manager that a rotation gesture has updated.

Definition at line 172 of file fl_scrolling_manager.cc.

173 {
174 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
175
176 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
177 if (engine == nullptr) {
178 return;
179 }
180
181 self->rotation = rotation;
183 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
184 kPanZoomUpdate, 0, 0, self->scale, self->rotation);
185}
@ kPanZoomUpdate
The pan/zoom updated.
Definition embedder.h:1303

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomUpdate, and self.

Referenced by gesture_rotation_update_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_scroll_event()

void fl_scrolling_manager_handle_scroll_event ( FlScrollingManager *  manager,
GdkEventScroll *  event,
gint  scale_factor 
)

fl_scrolling_manager_handle_scroll_event: @manager: an #FlScrollingManager. @event: the scroll event. @scale_factor: the GTK scaling factor of the window.

Inform the scrolling manager of a scroll event.

Definition at line 71 of file fl_scrolling_manager.cc.

73 {
74 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
75
76 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
77 if (engine == nullptr) {
78 return;
79 }
80
81 GdkEvent* event = reinterpret_cast<GdkEvent*>(scroll_event);
82
83 guint event_time = gdk_event_get_time(event);
84 gdouble event_x = 0.0, event_y = 0.0;
85 gdk_event_get_coords(event, &event_x, &event_y);
86 gdouble scroll_delta_x = 0.0, scroll_delta_y = 0.0;
87 GdkScrollDirection event_direction = GDK_SCROLL_SMOOTH;
88 if (gdk_event_get_scroll_direction(event, &event_direction)) {
89 if (event_direction == GDK_SCROLL_UP) {
90 scroll_delta_x = 0;
91 scroll_delta_y = -1;
92 } else if (event_direction == GDK_SCROLL_DOWN) {
93 scroll_delta_x = 0;
94 scroll_delta_y = 1;
95 } else if (event_direction == GDK_SCROLL_LEFT) {
96 scroll_delta_x = -1;
97 scroll_delta_y = 0;
98 } else if (event_direction == GDK_SCROLL_RIGHT) {
99 scroll_delta_x = 1;
100 scroll_delta_y = 0;
101 }
102 } else {
103 gdk_event_get_scroll_deltas(event, &scroll_delta_x, &scroll_delta_y);
104 }
105
106 // The multiplier is taken from the Chromium source
107 // (ui/events/x/events_x_utils.cc).
108 const int kScrollOffsetMultiplier = 53;
109 scroll_delta_x *= kScrollOffsetMultiplier * scale_factor;
110 scroll_delta_y *= kScrollOffsetMultiplier * scale_factor;
111
112 GdkDevice* device = gdk_event_get_source_device(event);
113 if (device != nullptr &&
114 gdk_device_get_source(device) == GDK_SOURCE_TOUCHPAD) {
115 scroll_delta_x *= -1;
116 scroll_delta_y *= -1;
117 if (gdk_event_is_scroll_stop_event(event)) {
119 engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
120 event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
121 self->pan_x, self->pan_y, 0, 0);
122 self->pan_started = FALSE;
123 } else {
124 if (!self->pan_started) {
125 self->pan_x = 0;
126 self->pan_y = 0;
128 engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
129 event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
130 0, 0);
131 self->pan_started = TRUE;
132 }
133 self->pan_x += scroll_delta_x;
134 self->pan_y += scroll_delta_y;
136 engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
137 event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
138 self->pan_x, self->pan_y, 1, 0);
139 }
140 } else {
141 self->last_x = event_x * scale_factor;
142 self->last_y = event_y * scale_factor;
144 engine, self->view_id,
145 FlutterPointerPhase::kMove /* arbitrary value, phase will be ignored as
146 this is a discrete scroll event */
147 ,
148 event_time * kMicrosecondsPerMillisecond, event_x * scale_factor,
149 event_y * scale_factor, kFlutterPointerDeviceKindMouse, scroll_delta_x,
150 scroll_delta_y, 0);
151 }
152}
@ kMove
Definition embedder.h:1287
@ kFlutterPointerDeviceKindMouse
Definition embedder.h:1310
VkDevice device
Definition main.cc:69
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons)
static constexpr int kMicrosecondsPerMillisecond

References device, engine, fl_engine_send_mouse_pointer_event(), fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kFlutterPointerDeviceKindMouse, kMicrosecondsPerMillisecond, kMove, kPanZoomEnd, kPanZoomStart, kPanZoomUpdate, self, and TRUE.

Referenced by scroll_event_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_zoom_begin()

void fl_scrolling_manager_handle_zoom_begin ( FlScrollingManager *  manager)

fl_scrolling_manager_handle_zoom_begin: @manager: an #FlScrollingManager.

Inform the scrolling manager that a zoom gesture has begun.

Definition at line 203 of file fl_scrolling_manager.cc.

203 {
204 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
205
206 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
207 if (engine == nullptr) {
208 return;
209 }
210
211 self->zoom_started = TRUE;
212 if (!self->rotate_started) {
213 self->scale = 1;
214 self->rotation = 0;
216 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
217 kPanZoomStart, 0, 0, 0, 0);
218 }
219}

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomStart, self, and TRUE.

Referenced by gesture_zoom_begin_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_zoom_end()

void fl_scrolling_manager_handle_zoom_end ( FlScrollingManager *  manager)

fl_scrolling_manager_handle_zoom_end: @manager: an #FlScrollingManager.

Inform the scrolling manager that a zoom gesture has ended.

Definition at line 236 of file fl_scrolling_manager.cc.

236 {
237 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
238
239 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
240 if (engine == nullptr) {
241 return;
242 }
243
244 self->zoom_started = FALSE;
245 if (!self->rotate_started) {
247 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
248 kPanZoomEnd, 0, 0, 0, 0);
249 }
250}

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomEnd, and self.

Referenced by gesture_zoom_end_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_handle_zoom_update()

void fl_scrolling_manager_handle_zoom_update ( FlScrollingManager *  manager,
gdouble  scale 
)

fl_scrolling_manager_handle_zoom_update: @manager: an #FlScrollingManager. @scale: the zoom scale.

Inform the scrolling manager that a zoom gesture has updated.

Definition at line 221 of file fl_scrolling_manager.cc.

222 {
223 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
224
225 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
226 if (engine == nullptr) {
227 return;
228 }
229
230 self->scale = scale;
232 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
233 kPanZoomUpdate, 0, 0, self->scale, self->rotation);
234}

References engine, fl_engine_send_pointer_pan_zoom_event(), g_autoptr(), kPanZoomUpdate, and self.

Referenced by gesture_zoom_update_cb(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_new()

FlScrollingManager * fl_scrolling_manager_new ( FlEngine *  engine,
FlutterViewId  view_id 
)

fl_scrolling_manager_new: @engine: an #FlEngine. @view_id: the view being managed.

Create a new #FlScrollingManager.

Returns: a new #FlScrollingManager.

Definition at line 47 of file fl_scrolling_manager.cc.

48 {
49 g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
50
51 FlScrollingManager* self = FL_SCROLLING_MANAGER(
52 g_object_new(fl_scrolling_manager_get_type(), nullptr));
53
54 g_weak_ref_init(&self->engine, engine);
55 self->view_id = view_id;
56 self->pan_started = FALSE;
57 self->zoom_started = FALSE;
58 self->rotate_started = FALSE;
59
60 return self;
61}
G_BEGIN_DECLS FlutterViewId view_id

References engine, self, and view_id.

Referenced by init_scrolling(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_scrolling_manager_set_last_mouse_position()

void fl_scrolling_manager_set_last_mouse_position ( FlScrollingManager *  manager,
gdouble  x,
gdouble  y 
)

fl_scrolling_manager_set_last_mouse_position: @manager: an #FlScrollingManager. @x: the mouse x-position, in window coordinates. @y: the mouse y-position, in window coordinates.

Inform the scrolling manager of the mouse position. This position will be used when sending scroll pointer events.

Definition at line 63 of file fl_scrolling_manager.cc.

65 {
66 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
67 self->last_x = x;
68 self->last_y = y;
69}
int32_t x
double y

References self, x, and y.

Referenced by set_scrolling_position().

◆ G_DECLARE_FINAL_TYPE()

G_BEGIN_DECLS G_DECLARE_FINAL_TYPE ( FlScrollingManager  ,
fl_scrolling_manager  ,
FL  ,
SCROLLING_MANAGER  ,
GObject   
)