Flutter Linux Embedder
fl_scrolling_manager.cc File Reference
#include "flutter/shell/platform/linux/fl_scrolling_manager.h"
#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/linux/fl_engine_private.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 (FlEngine *engine, FlutterViewId view_id)
 
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 }

References fl_scrolling_manager_dispose().

◆ fl_scrolling_manager_dispose()

static void fl_scrolling_manager_dispose ( GObject *  object)
static

Definition at line 33 of file fl_scrolling_manager.cc.

33  {
34  FlScrollingManager* self = FL_SCROLLING_MANAGER(object);
35 
36  g_weak_ref_clear(&self->engine);
37 
38  G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(object);
39 }

Referenced by fl_scrolling_manager_class_init().

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

153  {
154  g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
155 
156  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
157  if (engine == nullptr) {
158  return;
159  }
160 
161  self->rotate_started = TRUE;
162  if (!self->zoom_started) {
163  self->scale = 1;
164  self->rotation = 0;
166  engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
167  kPanZoomStart, 0, 0, 0, 0);
168  }
169 }

References fl_engine_send_pointer_pan_zoom_event(), and TRUE.

Referenced by gesture_rotation_begin_cb(), 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 186 of file fl_scrolling_manager.cc.

186  {
187  g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
188 
189  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
190  if (engine == nullptr) {
191  return;
192  }
193 
194  self->rotate_started = FALSE;
195  if (!self->zoom_started) {
197  engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
198  kPanZoomEnd, 0, 0, 0, 0);
199  }
200 }

References fl_engine_send_pointer_pan_zoom_event().

Referenced by gesture_rotation_end_cb(), 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 171 of file fl_scrolling_manager.cc.

172  {
173  g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
174 
175  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
176  if (engine == nullptr) {
177  return;
178  }
179 
180  self->rotation = rotation;
182  engine, self->view_id, g_get_real_time(), self->last_x, self->last_y,
183  kPanZoomUpdate, 0, 0, self->scale, self->rotation);
184 }

References fl_engine_send_pointer_pan_zoom_event().

Referenced by gesture_rotation_update_cb(), 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  if (gdk_device_get_source(gdk_event_get_source_device(event)) ==
113  GDK_SOURCE_TOUCHPAD) {
114  scroll_delta_x *= -1;
115  scroll_delta_y *= -1;
116  if (gdk_event_is_scroll_stop_event(event)) {
118  engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
119  event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
120  self->pan_x, self->pan_y, 0, 0);
121  self->pan_started = FALSE;
122  } else {
123  if (!self->pan_started) {
124  self->pan_x = 0;
125  self->pan_y = 0;
127  engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
128  event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
129  0, 0);
130  self->pan_started = TRUE;
131  }
132  self->pan_x += scroll_delta_x;
133  self->pan_y += scroll_delta_y;
135  engine, self->view_id, event_time * kMicrosecondsPerMillisecond,
136  event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
137  self->pan_x, self->pan_y, 1, 0);
138  }
139  } else {
140  self->last_x = event_x * scale_factor;
141  self->last_y = event_y * scale_factor;
143  engine, self->view_id,
144  FlutterPointerPhase::kMove /* arbitrary value, phase will be ignored as
145  this is a discrete scroll event */
146  ,
147  event_time * kMicrosecondsPerMillisecond, event_x * scale_factor,
148  event_y * scale_factor, kFlutterPointerDeviceKindMouse, scroll_delta_x,
149  scroll_delta_y, 0);
150  }
151 }

References fl_engine_send_mouse_pointer_event(), fl_engine_send_pointer_pan_zoom_event(), kMicrosecondsPerMillisecond, and TRUE.

Referenced by scroll_event_cb(), 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 202 of file fl_scrolling_manager.cc.

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

References fl_engine_send_pointer_pan_zoom_event(), and TRUE.

Referenced by gesture_zoom_begin_cb(), 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 235 of file fl_scrolling_manager.cc.

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

References fl_engine_send_pointer_pan_zoom_event().

Referenced by gesture_zoom_end_cb(), 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 220 of file fl_scrolling_manager.cc.

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

References fl_engine_send_pointer_pan_zoom_event().

Referenced by gesture_zoom_update_cb(), and TEST().

◆ 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 ( 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 }

Referenced by init_scrolling(), 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 }

Referenced by set_scrolling_position().

◆ G_DEFINE_TYPE()

G_DEFINE_TYPE ( FlScrollingManager  ,
fl_scrolling_manager  ,
G_TYPE_OBJECT   
)

Variable Documentation

◆ kMicrosecondsPerMillisecond

constexpr int kMicrosecondsPerMillisecond = 1000
staticconstexpr

Definition at line 9 of file fl_scrolling_manager.cc.

Referenced by fl_scrolling_manager_handle_scroll_event().

fl_scrolling_manager_dispose
static void fl_scrolling_manager_dispose(GObject *object)
Definition: fl_scrolling_manager.cc:33
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
kMicrosecondsPerMillisecond
static constexpr int kMicrosecondsPerMillisecond
Definition: fl_scrolling_manager.cc:9
fl_engine_send_pointer_pan_zoom_event
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)
Definition: fl_engine.cc:1082
fl_engine_send_mouse_pointer_event
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)
Definition: fl_engine.cc:918