Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Functions | Variables
fl_scrolling_manager.cc File Reference
#include "flutter/shell/platform/linux/fl_scrolling_manager.h"

Go to the source code of this file.

Classes

struct  _FlScrollingManager
 

Functions

 G_DEFINE_TYPE (FlScrollingManager, fl_scrolling_manager, G_TYPE_OBJECT)
 
static void fl_scrolling_manager_dispose (GObject *object)
 
static void fl_scrolling_manager_class_init (FlScrollingManagerClass *klass)
 
static void fl_scrolling_manager_init (FlScrollingManager *self)
 
FlScrollingManager * fl_scrolling_manager_new (FlScrollingViewDelegate *view_delegate)
 
void fl_scrolling_manager_set_last_mouse_position (FlScrollingManager *self, gdouble x, gdouble y)
 
void fl_scrolling_manager_handle_scroll_event (FlScrollingManager *self, GdkEventScroll *scroll_event, gint scale_factor)
 
void fl_scrolling_manager_handle_rotation_begin (FlScrollingManager *self)
 
void fl_scrolling_manager_handle_rotation_update (FlScrollingManager *self, gdouble rotation)
 
void fl_scrolling_manager_handle_rotation_end (FlScrollingManager *self)
 
void fl_scrolling_manager_handle_zoom_begin (FlScrollingManager *self)
 
void fl_scrolling_manager_handle_zoom_update (FlScrollingManager *self, gdouble scale)
 
void fl_scrolling_manager_handle_zoom_end (FlScrollingManager *self)
 

Variables

static constexpr int kMicrosecondsPerMillisecond = 1000
 

Function Documentation

◆ fl_scrolling_manager_class_init()

static void fl_scrolling_manager_class_init ( FlScrollingManagerClass *  klass)
static

Definition at line 41 of file fl_scrolling_manager.cc.

41 {
42 G_OBJECT_CLASS(klass)->dispose = fl_scrolling_manager_dispose;
43}
static void fl_scrolling_manager_dispose(GObject *object)

◆ fl_scrolling_manager_dispose()

static void fl_scrolling_manager_dispose ( GObject *  object)
static

Definition at line 29 of file fl_scrolling_manager.cc.

29 {
30 FlScrollingManager* self = FL_SCROLLING_MANAGER(object);
31
32 if (self->view_delegate != nullptr) {
33 g_object_remove_weak_pointer(
34 object, reinterpret_cast<gpointer*>(&self->view_delegate));
35 self->view_delegate = nullptr;
36 }
37
38 G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(object);
39}

◆ 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 150 of file fl_scrolling_manager.cc.

150 {
151 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
152
153 self->rotate_started = TRUE;
154 if (!self->zoom_started) {
155 self->scale = 1;
156 self->rotation = 0;
158 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
159 kPanZoomStart, 0, 0, 0, 0);
160 }
161}
@ kPanZoomStart
A pan/zoom started on this pointer.
Definition embedder.h:997
void fl_scrolling_view_delegate_send_pointer_pan_zoom_event(FlScrollingViewDelegate *self, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)

◆ 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 173 of file fl_scrolling_manager.cc.

173 {
174 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
175
176 self->rotate_started = FALSE;
177 if (!self->zoom_started) {
179 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
180 kPanZoomEnd, 0, 0, 0, 0);
181 }
182}
@ kPanZoomEnd
The pan/zoom ended.
Definition embedder.h:1001
return FALSE

◆ 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 163 of file fl_scrolling_manager.cc.

164 {
165 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
166
167 self->rotation = rotation;
169 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
170 kPanZoomUpdate, 0, 0, self->scale, self->rotation);
171}
@ kPanZoomUpdate
The pan/zoom updated.
Definition embedder.h:999

◆ 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 74 of file fl_scrolling_manager.cc.

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

◆ 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 184 of file fl_scrolling_manager.cc.

184 {
185 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
186
187 self->zoom_started = TRUE;
188 if (!self->rotate_started) {
189 self->scale = 1;
190 self->rotation = 0;
192 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
193 kPanZoomStart, 0, 0, 0, 0);
194 }
195}

◆ 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 207 of file fl_scrolling_manager.cc.

207 {
208 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
209
210 self->zoom_started = FALSE;
211 if (!self->rotate_started) {
213 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
214 kPanZoomEnd, 0, 0, 0, 0);
215 }
216}

◆ 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 197 of file fl_scrolling_manager.cc.

198 {
199 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
200
201 self->scale = scale;
203 self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
204 kPanZoomUpdate, 0, 0, self->scale, self->rotation);
205}
const Scalar scale

◆ fl_scrolling_manager_init()

static void fl_scrolling_manager_init ( FlScrollingManager *  self)
static

Definition at line 45 of file fl_scrolling_manager.cc.

45{}

◆ fl_scrolling_manager_new()

FlScrollingManager * fl_scrolling_manager_new ( FlScrollingViewDelegate *  view_delegate)

fl_scrolling_manager_new: @view_delegate: An interface that the manager requires to communicate with the platform. Usually implemented by FlView.

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_SCROLLING_VIEW_DELEGATE(view_delegate), nullptr);
50
51 FlScrollingManager* self = FL_SCROLLING_MANAGER(
52 g_object_new(fl_scrolling_manager_get_type(), nullptr));
53
54 self->view_delegate = view_delegate;
56 G_OBJECT(view_delegate),
57 reinterpret_cast<gpointer*>(&(self->view_delegate)));
58
59 self->pan_started = FALSE;
60 self->zoom_started = FALSE;
61 self->rotate_started = FALSE;
62
63 return self;
64}
g_object_add_weak_pointer(G_OBJECT(self), reinterpret_cast< gpointer * >(&self->engine))

◆ 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 66 of file fl_scrolling_manager.cc.

68 {
69 g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
70 self->last_x = x;
71 self->last_y = y;
72}
double y
double x

◆ G_DEFINE_TYPE()

G_DEFINE_TYPE ( FlScrollingManager  ,
fl_scrolling_manager  ,
G_TYPE_OBJECT   
)

Variable Documentation

◆ kMicrosecondsPerMillisecond

constexpr int kMicrosecondsPerMillisecond = 1000
staticconstexpr

Definition at line 7 of file fl_scrolling_manager.cc.