27 G_DEFINE_TYPE(FlScrollingManager, fl_scrolling_manager, G_TYPE_OBJECT);
38 G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(
object);
42 FlScrollingViewDelegate* view_delegate) {
43 g_return_val_if_fail(FL_IS_SCROLLING_VIEW_DELEGATE(view_delegate),
nullptr);
45 FlScrollingManager*
self = FL_SCROLLING_MANAGER(
46 g_object_new(fl_scrolling_manager_get_type(),
nullptr));
48 self->view_delegate = view_delegate;
50 G_OBJECT(view_delegate),
51 reinterpret_cast<gpointer*
>(&(
self->view_delegate)));
53 self->pan_started =
false;
54 self->zoom_started =
false;
55 self->rotate_started =
false;
68 GdkEventScroll* scroll_event,
70 GdkEvent*
event =
reinterpret_cast<GdkEvent*
>(scroll_event);
72 guint event_time = gdk_event_get_time(
event);
73 gdouble event_x = 0.0, event_y = 0.0;
74 gdk_event_get_coords(
event, &event_x, &event_y);
75 gdouble scroll_delta_x = 0.0, scroll_delta_y = 0.0;
76 GdkScrollDirection event_direction = GDK_SCROLL_SMOOTH;
77 if (gdk_event_get_scroll_direction(
event, &event_direction)) {
78 if (event_direction == GDK_SCROLL_UP) {
81 }
else if (event_direction == GDK_SCROLL_DOWN) {
84 }
else if (event_direction == GDK_SCROLL_LEFT) {
87 }
else if (event_direction == GDK_SCROLL_RIGHT) {
92 gdk_event_get_scroll_deltas(
event, &scroll_delta_x, &scroll_delta_y);
97 const int kScrollOffsetMultiplier = 53;
98 scroll_delta_x *= kScrollOffsetMultiplier * scale_factor;
99 scroll_delta_y *= kScrollOffsetMultiplier * scale_factor;
101 if (gdk_device_get_source(gdk_event_get_source_device(
event)) ==
102 GDK_SOURCE_TOUCHPAD) {
103 scroll_delta_x *= -1;
104 scroll_delta_y *= -1;
105 if (gdk_event_is_scroll_stop_event(
event)) {
108 event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
110 self->pan_started = FALSE;
112 if (!
self->pan_started) {
117 event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
119 self->pan_started =
TRUE;
121 self->pan_x += scroll_delta_x;
122 self->pan_y += scroll_delta_y;
125 event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
129 self->last_x = event_x * scale_factor;
130 self->last_y = event_y * scale_factor;
133 FlutterPointerPhase::kMove
137 event_y * scale_factor, scroll_delta_x, scroll_delta_y, 0);
142 self->rotate_started =
true;
143 if (!
self->zoom_started) {
147 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
148 kPanZoomStart, 0, 0, 0, 0);
154 self->rotation = rotation;
156 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
157 kPanZoomUpdate, 0, 0,
self->scale,
self->rotation);
160 self->rotate_started =
false;
161 if (!
self->zoom_started) {
163 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
164 kPanZoomEnd, 0, 0, 0, 0);
169 self->zoom_started =
true;
170 if (!
self->rotate_started) {
174 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
175 kPanZoomStart, 0, 0, 0, 0);
182 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
183 kPanZoomUpdate, 0, 0,
self->scale,
self->rotation);
186 self->zoom_started =
false;
187 if (!
self->rotate_started) {
189 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
190 kPanZoomEnd, 0, 0, 0, 0);