From c9ddcc41a406c38177e08ade711bde6304b40fac Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Wed, 24 Jul 2024 04:57:12 +1200 Subject: [PATCH] Set the view ID for FlView (flutter/engine#54043) Follow up to https://github.com/flutter/engine/pull/54018. --- .../flutter/shell/platform/linux/fl_engine.cc | 18 +++------ .../shell/platform/linux/fl_engine_private.h | 22 +++++++++- .../shell/platform/linux/fl_engine_test.cc | 9 +++-- .../flutter/shell/platform/linux/fl_view.cc | 40 ++++++++++++------- 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/engine/src/flutter/shell/platform/linux/fl_engine.cc b/engine/src/flutter/shell/platform/linux/fl_engine.cc index 2bf4b32143..6ad726625b 100644 --- a/engine/src/flutter/shell/platform/linux/fl_engine.cc +++ b/engine/src/flutter/shell/platform/linux/fl_engine.cc @@ -838,6 +838,7 @@ GBytes* fl_engine_send_platform_message_finish(FlEngine* self, } void fl_engine_send_window_metrics_event(FlEngine* self, + FlutterViewId view_id, size_t width, size_t height, double pixel_ratio) { @@ -852,14 +853,12 @@ void fl_engine_send_window_metrics_event(FlEngine* self, event.width = width; event.height = height; event.pixel_ratio = pixel_ratio; - // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder - // supports multiple views. - // https://github.com/flutter/flutter/issues/138178 - event.view_id = flutter::kFlutterImplicitViewId; + event.view_id = view_id; self->embedder_api.SendWindowMetricsEvent(self->engine, &event); } void fl_engine_send_mouse_pointer_event(FlEngine* self, + FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, @@ -888,14 +887,12 @@ void fl_engine_send_mouse_pointer_event(FlEngine* self, fl_event.device_kind = device_kind; fl_event.buttons = buttons; fl_event.device = kMousePointerDeviceId; - // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder - // supports multiple views. - // https://github.com/flutter/flutter/issues/138178 - fl_event.view_id = flutter::kFlutterImplicitViewId; + fl_event.view_id = view_id; self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1); } void fl_engine_send_pointer_pan_zoom_event(FlEngine* self, + FlutterViewId view_id, size_t timestamp, double x, double y, @@ -922,10 +919,7 @@ void fl_engine_send_pointer_pan_zoom_event(FlEngine* self, fl_event.rotation = rotation; fl_event.device = kPointerPanZoomDeviceId; fl_event.device_kind = kFlutterPointerDeviceKindTrackpad; - // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder - // supports multiple views. - // https://github.com/flutter/flutter/issues/138178 - fl_event.view_id = flutter::kFlutterImplicitViewId; + fl_event.view_id = view_id; self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1); } diff --git a/engine/src/flutter/shell/platform/linux/fl_engine_private.h b/engine/src/flutter/shell/platform/linux/fl_engine_private.h index 6aaf0c70f6..855485a507 100644 --- a/engine/src/flutter/shell/platform/linux/fl_engine_private.h +++ b/engine/src/flutter/shell/platform/linux/fl_engine_private.h @@ -226,6 +226,7 @@ void fl_engine_set_on_pre_engine_restart_handler( /** * fl_engine_send_window_metrics_event: * @engine: an #FlEngine. + * @view_id: the view that the event occured on. * @width: width of the window in pixels. * @height: height of the window in pixels. * @pixel_ratio: scale factor for window. @@ -233,6 +234,7 @@ void fl_engine_set_on_pre_engine_restart_handler( * Sends a window metrics event to the engine. */ void fl_engine_send_window_metrics_event(FlEngine* engine, + FlutterViewId view_id, size_t width, size_t height, double pixel_ratio); @@ -240,6 +242,7 @@ void fl_engine_send_window_metrics_event(FlEngine* engine, /** * fl_engine_send_mouse_pointer_event: * @engine: an #FlEngine. + * @view_id: the view that the event occured on. * @phase: mouse phase. * @timestamp: time when event occurred in microseconds. * @x: x location of mouse cursor. @@ -252,6 +255,7 @@ void fl_engine_send_window_metrics_event(FlEngine* engine, * Sends a mouse pointer event to the engine. */ void fl_engine_send_mouse_pointer_event(FlEngine* engine, + FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, @@ -261,7 +265,23 @@ void fl_engine_send_mouse_pointer_event(FlEngine* engine, double scroll_delta_y, int64_t buttons); -void fl_engine_send_pointer_pan_zoom_event(FlEngine* self, +/** + * fl_engine_send_pointer_pan_zoom_event: + * @engine: an #FlEngine. + * @view_id: the view that the event occured on. + * @timestamp: time when event occurred in microseconds. + * @x: x location of mouse cursor. + * @y: y location of mouse cursor. + * @phase: mouse phase. + * @pan_x: x offset of the pan/zoom in pixels. + * @pan_y: y offset of the pan/zoom in pixels. + * @scale: scale of the pan/zoom. + * @rotation: rotation of the pan/zoom in radians. + * + * Sends a pan/zoom pointer event to the engine. + */ +void fl_engine_send_pointer_pan_zoom_event(FlEngine* engine, + FlutterViewId view_id, size_t timestamp, double x, double y, diff --git a/engine/src/flutter/shell/platform/linux/fl_engine_test.cc b/engine/src/flutter/shell/platform/linux/fl_engine_test.cc index 4c3a2f1f56..4f3fa079e0 100644 --- a/engine/src/flutter/shell/platform/linux/fl_engine_test.cc +++ b/engine/src/flutter/shell/platform/linux/fl_engine_test.cc @@ -25,6 +25,7 @@ TEST(FlEngineTest, WindowMetrics) { SendWindowMetricsEvent, ([&called](auto engine, const FlutterWindowMetricsEvent* event) { called = true; + EXPECT_EQ(event->view_id, 1); EXPECT_EQ(event->width, static_cast(3840)); EXPECT_EQ(event->height, static_cast(2160)); EXPECT_EQ(event->pixel_ratio, 2.0); @@ -35,7 +36,7 @@ TEST(FlEngineTest, WindowMetrics) { g_autoptr(GError) error = nullptr; EXPECT_TRUE(fl_engine_start(engine, &error)); EXPECT_EQ(error, nullptr); - fl_engine_send_window_metrics_event(engine, 3840, 2160, 2.0); + fl_engine_send_window_metrics_event(engine, 1, 3840, 2160, 2.0); EXPECT_TRUE(called); } @@ -52,6 +53,7 @@ TEST(FlEngineTest, MousePointer) { size_t events_count) { called = true; EXPECT_EQ(events_count, static_cast(1)); + EXPECT_EQ(events[0].view_id, 1); EXPECT_EQ(events[0].phase, kDown); EXPECT_EQ(events[0].timestamp, static_cast(1234567890)); EXPECT_EQ(events[0].x, 800); @@ -69,7 +71,7 @@ TEST(FlEngineTest, MousePointer) { g_autoptr(GError) error = nullptr; EXPECT_TRUE(fl_engine_start(engine, &error)); EXPECT_EQ(error, nullptr); - fl_engine_send_mouse_pointer_event(engine, kDown, 1234567890, 800, 600, + fl_engine_send_mouse_pointer_event(engine, 1, kDown, 1234567890, 800, 600, kFlutterPointerDeviceKindMouse, 1.2, -3.4, kFlutterPointerButtonMouseSecondary); @@ -88,6 +90,7 @@ TEST(FlEngineTest, PointerPanZoom) { size_t events_count) { called = true; EXPECT_EQ(events_count, static_cast(1)); + EXPECT_EQ(events[0].view_id, 1); EXPECT_EQ(events[0].phase, kPanZoomUpdate); EXPECT_EQ(events[0].timestamp, static_cast(1234567890)); EXPECT_EQ(events[0].x, 800); @@ -107,7 +110,7 @@ TEST(FlEngineTest, PointerPanZoom) { g_autoptr(GError) error = nullptr; EXPECT_TRUE(fl_engine_start(engine, &error)); EXPECT_EQ(error, nullptr); - fl_engine_send_pointer_pan_zoom_event(engine, 1234567890, 800, 600, + fl_engine_send_pointer_pan_zoom_event(engine, 1, 1234567890, 800, 600, kPanZoomUpdate, 1.5, 2.5, 3.5, 4.5); EXPECT_TRUE(called); diff --git a/engine/src/flutter/shell/platform/linux/fl_view.cc b/engine/src/flutter/shell/platform/linux/fl_view.cc index 3cea57586e..003eb385b8 100644 --- a/engine/src/flutter/shell/platform/linux/fl_view.cc +++ b/engine/src/flutter/shell/platform/linux/fl_view.cc @@ -11,6 +11,7 @@ #include +#include "flutter/common/constants.h" #include "flutter/shell/platform/linux/fl_accessible_node.h" #include "flutter/shell/platform/linux/fl_backing_store_provider.h" #include "flutter/shell/platform/linux/fl_engine_private.h" @@ -39,6 +40,9 @@ struct _FlView { // Project being run. FlDartProject* project; + // ID for this view. + FlutterViewId view_id; + // Rendering output. FlRendererGdk* renderer; @@ -207,9 +211,10 @@ static gboolean send_pointer_button_event(FlView* self, GdkEvent* event) { fl_keyboard_handler_sync_modifier_if_needed(self->keyboard_handler, event_state, event_time); fl_engine_send_mouse_pointer_event( - self->engine, phase, event_time * kMicrosecondsPerMillisecond, - event_x * scale_factor, event_y * scale_factor, - get_device_kind((GdkEvent*)event), 0, 0, self->button_state); + self->engine, self->view_id, phase, + event_time * kMicrosecondsPerMillisecond, event_x * scale_factor, + event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0, + self->button_state); return TRUE; } @@ -224,7 +229,7 @@ static void check_pointer_inside(FlView* self, GdkEvent* event) { gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self)); fl_engine_send_mouse_pointer_event( - self->engine, kAdd, + self->engine, self->view_id, kAdd, gdk_event_get_time(event) * kMicrosecondsPerMillisecond, x * scale_factor, y * scale_factor, get_device_kind(event), 0, 0, self->button_state); @@ -238,7 +243,7 @@ static void handle_geometry_changed(FlView* self) { gtk_widget_get_allocation(GTK_WIDGET(self), &allocation); gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self)); fl_engine_send_window_metrics_event( - self->engine, allocation.width * scale_factor, + self->engine, self->view_id, allocation.width * scale_factor, allocation.height * scale_factor, scale_factor); // Make sure the view has been realized and its size has been allocated before @@ -354,9 +359,9 @@ static void fl_view_scrolling_delegate_iface_init( double scroll_delta_y, int64_t buttons) { FlView* self = FL_VIEW(view_delegate); if (self->engine != nullptr) { - fl_engine_send_mouse_pointer_event(self->engine, phase, timestamp, x, - y, device_kind, scroll_delta_x, - scroll_delta_y, buttons); + fl_engine_send_mouse_pointer_event( + self->engine, self->view_id, phase, timestamp, x, y, device_kind, + scroll_delta_x, scroll_delta_y, buttons); } }; iface->send_pointer_pan_zoom_event = @@ -365,9 +370,9 @@ static void fl_view_scrolling_delegate_iface_init( double scale, double rotation) { FlView* self = FL_VIEW(view_delegate); if (self->engine != nullptr) { - fl_engine_send_pointer_pan_zoom_event(self->engine, timestamp, x, y, - phase, pan_x, pan_y, scale, - rotation); + fl_engine_send_pointer_pan_zoom_event(self->engine, self->view_id, + timestamp, x, y, phase, pan_x, + pan_y, scale, rotation); }; }; } @@ -441,7 +446,7 @@ static gboolean motion_notify_event_cb(FlView* self, fl_keyboard_handler_sync_modifier_if_needed(self->keyboard_handler, event_state, event_time); fl_engine_send_mouse_pointer_event( - self->engine, self->button_state != 0 ? kMove : kHover, + self->engine, self->view_id, self->button_state != 0 ? kMove : kHover, event_time * kMicrosecondsPerMillisecond, event_x * scale_factor, event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0, self->button_state); @@ -486,9 +491,10 @@ static gboolean leave_notify_event_cb(FlView* self, if (self->pointer_inside && self->button_state == 0) { gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self)); fl_engine_send_mouse_pointer_event( - self->engine, kRemove, event_time * kMicrosecondsPerMillisecond, - event_x * scale_factor, event_y * scale_factor, - get_device_kind((GdkEvent*)event), 0, 0, self->button_state); + self->engine, self->view_id, kRemove, + event_time * kMicrosecondsPerMillisecond, event_x * scale_factor, + event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0, + self->button_state); self->pointer_inside = FALSE; } @@ -755,6 +761,10 @@ static void fl_view_class_init(FlViewClass* klass) { static void fl_view_init(FlView* self) { gtk_widget_set_can_focus(GTK_WIDGET(self), TRUE); + // When we support multiple views this will become variable. + // https://github.com/flutter/flutter/issues/138178 + self->view_id = flutter::kFlutterImplicitViewId; + self->event_box = gtk_event_box_new(); gtk_widget_set_hexpand(self->event_box, TRUE); gtk_widget_set_vexpand(self->event_box, TRUE);