Set the view ID for FlView (flutter/engine#54043)

Follow up to https://github.com/flutter/engine/pull/54018.
This commit is contained in:
Robert Ancell 2024-07-24 04:57:12 +12:00 committed by GitHub
parent f4e4700369
commit c9ddcc41a4
4 changed files with 58 additions and 31 deletions

View File

@ -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);
}

View File

@ -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,

View File

@ -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<size_t>(3840));
EXPECT_EQ(event->height, static_cast<size_t>(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<size_t>(1));
EXPECT_EQ(events[0].view_id, 1);
EXPECT_EQ(events[0].phase, kDown);
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(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<size_t>(1));
EXPECT_EQ(events[0].view_id, 1);
EXPECT_EQ(events[0].phase, kPanZoomUpdate);
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(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);

View File

@ -11,6 +11,7 @@
#include <cstring>
#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);