6 #include "flutter/shell/platform/embedder/embedder.h"
34 FlScrollingManager*
self = FL_SCROLLING_MANAGER(
object);
36 g_weak_ref_clear(&self->engine);
38 G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(
object);
49 g_return_val_if_fail(FL_IS_ENGINE(engine),
nullptr);
51 FlScrollingManager*
self = FL_SCROLLING_MANAGER(
52 g_object_new(fl_scrolling_manager_get_type(),
nullptr));
54 g_weak_ref_init(&self->engine, engine);
56 self->pan_started = FALSE;
57 self->zoom_started = FALSE;
58 self->rotate_started = FALSE;
66 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
72 GdkEventScroll* scroll_event,
74 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
76 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
77 if (engine ==
nullptr) {
81 GdkEvent*
event =
reinterpret_cast<GdkEvent*
>(scroll_event);
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) {
92 }
else if (event_direction == GDK_SCROLL_DOWN) {
95 }
else if (event_direction == GDK_SCROLL_LEFT) {
98 }
else if (event_direction == GDK_SCROLL_RIGHT) {
103 gdk_event_get_scroll_deltas(event, &scroll_delta_x, &scroll_delta_y);
108 const int kScrollOffsetMultiplier = 53;
109 scroll_delta_x *= kScrollOffsetMultiplier * scale_factor;
110 scroll_delta_y *= kScrollOffsetMultiplier * scale_factor;
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)) {
120 event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
121 self->pan_x, self->pan_y, 0, 0);
122 self->pan_started = FALSE;
124 if (!self->pan_started) {
129 event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
131 self->pan_started =
TRUE;
133 self->pan_x += scroll_delta_x;
134 self->pan_y += scroll_delta_y;
137 event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
138 self->pan_x, self->pan_y, 1, 0);
141 self->last_x = event_x * scale_factor;
142 self->last_y = event_y * scale_factor;
144 engine, self->view_id,
145 FlutterPointerPhase::kMove
149 event_y * scale_factor, kFlutterPointerDeviceKindMouse, scroll_delta_x,
155 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
157 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
158 if (engine ==
nullptr) {
162 self->rotate_started =
TRUE;
163 if (!self->zoom_started) {
167 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
168 kPanZoomStart, 0, 0, 0, 0);
174 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
176 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
177 if (engine ==
nullptr) {
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);
188 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
190 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
191 if (engine ==
nullptr) {
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);
204 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
206 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
207 if (engine ==
nullptr) {
211 self->zoom_started =
TRUE;
212 if (!self->rotate_started) {
216 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
217 kPanZoomStart, 0, 0, 0, 0);
223 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
225 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
226 if (engine ==
nullptr) {
232 engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
233 kPanZoomUpdate, 0, 0, self->scale, self->rotation);
237 g_return_if_fail(FL_IS_SCROLLING_MANAGER(
self));
239 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
240 if (engine ==
nullptr) {
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);
g_autoptr(FlEngine) engine
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)
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)
G_BEGIN_DECLS FlutterViewId view_id