Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions shell/platform/linux/fl_engine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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);
}

Expand Down
22 changes: 21 additions & 1 deletion shell/platform/linux/fl_engine_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,20 +226,23 @@ 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.
*
* 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);

/**
* 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.
Expand All @@ -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,
Expand All @@ -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,
Expand Down
9 changes: 6 additions & 3 deletions shell/platform/linux/fl_engine_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
Expand All @@ -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);
Expand All @@ -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);

Expand All @@ -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);
Expand All @@ -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);
Expand Down
40 changes: 25 additions & 15 deletions shell/platform/linux/fl_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -39,6 +40,9 @@ struct _FlView {
// Project being run.
FlDartProject* project;

// ID for this view.
FlutterViewId view_id;

// Rendering output.
FlRendererGdk* renderer;

Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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 =
Expand All @@ -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);
};
};
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down