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*
event,
70 gdouble scroll_delta_x = 0.0, scroll_delta_y = 0.0;
71 if (
event->direction == GDK_SCROLL_SMOOTH) {
72 scroll_delta_x =
event->delta_x;
73 scroll_delta_y =
event->delta_y;
74 }
else if (
event->direction == GDK_SCROLL_UP) {
76 }
else if (
event->direction == GDK_SCROLL_DOWN) {
78 }
else if (
event->direction == GDK_SCROLL_LEFT) {
80 }
else if (
event->direction == GDK_SCROLL_RIGHT) {
86 const int kScrollOffsetMultiplier = 53;
87 scroll_delta_x *= kScrollOffsetMultiplier * scale_factor;
88 scroll_delta_y *= kScrollOffsetMultiplier * scale_factor;
90 if (gdk_device_get_source(gdk_event_get_source_device(
91 reinterpret_cast<GdkEvent*
>(
event))) == GDK_SOURCE_TOUCHPAD) {
97 event->x * scale_factor,
event->y * scale_factor, kPanZoomEnd,
99 self->pan_started = FALSE;
101 if (!
self->pan_started) {
106 event->x * scale_factor,
event->y * scale_factor, kPanZoomStart, 0,
108 self->pan_started =
TRUE;
110 self->pan_x += scroll_delta_x;
111 self->pan_y += scroll_delta_y;
114 event->x * scale_factor,
event->y * scale_factor, kPanZoomUpdate,
118 self->last_x =
event->x * scale_factor;
119 self->last_y =
event->y * scale_factor;
122 FlutterPointerPhase::kMove
126 event->y * scale_factor, scroll_delta_x, scroll_delta_y, 0);
131 self->rotate_started =
true;
132 if (!
self->zoom_started) {
136 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
137 kPanZoomStart, 0, 0, 0, 0);
143 self->rotation = rotation;
145 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
146 kPanZoomUpdate, 0, 0,
self->scale,
self->rotation);
149 self->rotate_started =
false;
150 if (!
self->zoom_started) {
152 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
153 kPanZoomEnd, 0, 0, 0, 0);
158 self->zoom_started =
true;
159 if (!
self->rotate_started) {
163 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
164 kPanZoomStart, 0, 0, 0, 0);
171 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
172 kPanZoomUpdate, 0, 0,
self->scale,
self->rotation);
175 self->zoom_started =
false;
176 if (!
self->rotate_started) {
178 self->view_delegate, g_get_real_time(),
self->last_x,
self->last_y,
179 kPanZoomEnd, 0, 0, 0, 0);