Set the view ID for FlView (flutter/engine#54043)
Follow up to https://github.com/flutter/engine/pull/54018.
This commit is contained in:
parent
f4e4700369
commit
c9ddcc41a4
@ -838,6 +838,7 @@ GBytes* fl_engine_send_platform_message_finish(FlEngine* self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void fl_engine_send_window_metrics_event(FlEngine* self,
|
void fl_engine_send_window_metrics_event(FlEngine* self,
|
||||||
|
FlutterViewId view_id,
|
||||||
size_t width,
|
size_t width,
|
||||||
size_t height,
|
size_t height,
|
||||||
double pixel_ratio) {
|
double pixel_ratio) {
|
||||||
@ -852,14 +853,12 @@ void fl_engine_send_window_metrics_event(FlEngine* self,
|
|||||||
event.width = width;
|
event.width = width;
|
||||||
event.height = height;
|
event.height = height;
|
||||||
event.pixel_ratio = pixel_ratio;
|
event.pixel_ratio = pixel_ratio;
|
||||||
// TODO(dkwingsmt): Assign the correct view ID once the Linux embedder
|
event.view_id = view_id;
|
||||||
// supports multiple views.
|
|
||||||
// https://github.com/flutter/flutter/issues/138178
|
|
||||||
event.view_id = flutter::kFlutterImplicitViewId;
|
|
||||||
self->embedder_api.SendWindowMetricsEvent(self->engine, &event);
|
self->embedder_api.SendWindowMetricsEvent(self->engine, &event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fl_engine_send_mouse_pointer_event(FlEngine* self,
|
void fl_engine_send_mouse_pointer_event(FlEngine* self,
|
||||||
|
FlutterViewId view_id,
|
||||||
FlutterPointerPhase phase,
|
FlutterPointerPhase phase,
|
||||||
size_t timestamp,
|
size_t timestamp,
|
||||||
double x,
|
double x,
|
||||||
@ -888,14 +887,12 @@ void fl_engine_send_mouse_pointer_event(FlEngine* self,
|
|||||||
fl_event.device_kind = device_kind;
|
fl_event.device_kind = device_kind;
|
||||||
fl_event.buttons = buttons;
|
fl_event.buttons = buttons;
|
||||||
fl_event.device = kMousePointerDeviceId;
|
fl_event.device = kMousePointerDeviceId;
|
||||||
// TODO(dkwingsmt): Assign the correct view ID once the Linux embedder
|
fl_event.view_id = view_id;
|
||||||
// supports multiple views.
|
|
||||||
// https://github.com/flutter/flutter/issues/138178
|
|
||||||
fl_event.view_id = flutter::kFlutterImplicitViewId;
|
|
||||||
self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1);
|
self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fl_engine_send_pointer_pan_zoom_event(FlEngine* self,
|
void fl_engine_send_pointer_pan_zoom_event(FlEngine* self,
|
||||||
|
FlutterViewId view_id,
|
||||||
size_t timestamp,
|
size_t timestamp,
|
||||||
double x,
|
double x,
|
||||||
double y,
|
double y,
|
||||||
@ -922,10 +919,7 @@ void fl_engine_send_pointer_pan_zoom_event(FlEngine* self,
|
|||||||
fl_event.rotation = rotation;
|
fl_event.rotation = rotation;
|
||||||
fl_event.device = kPointerPanZoomDeviceId;
|
fl_event.device = kPointerPanZoomDeviceId;
|
||||||
fl_event.device_kind = kFlutterPointerDeviceKindTrackpad;
|
fl_event.device_kind = kFlutterPointerDeviceKindTrackpad;
|
||||||
// TODO(dkwingsmt): Assign the correct view ID once the Linux embedder
|
fl_event.view_id = view_id;
|
||||||
// supports multiple views.
|
|
||||||
// https://github.com/flutter/flutter/issues/138178
|
|
||||||
fl_event.view_id = flutter::kFlutterImplicitViewId;
|
|
||||||
self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1);
|
self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,6 +226,7 @@ void fl_engine_set_on_pre_engine_restart_handler(
|
|||||||
/**
|
/**
|
||||||
* fl_engine_send_window_metrics_event:
|
* fl_engine_send_window_metrics_event:
|
||||||
* @engine: an #FlEngine.
|
* @engine: an #FlEngine.
|
||||||
|
* @view_id: the view that the event occured on.
|
||||||
* @width: width of the window in pixels.
|
* @width: width of the window in pixels.
|
||||||
* @height: height of the window in pixels.
|
* @height: height of the window in pixels.
|
||||||
* @pixel_ratio: scale factor for window.
|
* @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.
|
* Sends a window metrics event to the engine.
|
||||||
*/
|
*/
|
||||||
void fl_engine_send_window_metrics_event(FlEngine* engine,
|
void fl_engine_send_window_metrics_event(FlEngine* engine,
|
||||||
|
FlutterViewId view_id,
|
||||||
size_t width,
|
size_t width,
|
||||||
size_t height,
|
size_t height,
|
||||||
double pixel_ratio);
|
double pixel_ratio);
|
||||||
@ -240,6 +242,7 @@ void fl_engine_send_window_metrics_event(FlEngine* engine,
|
|||||||
/**
|
/**
|
||||||
* fl_engine_send_mouse_pointer_event:
|
* fl_engine_send_mouse_pointer_event:
|
||||||
* @engine: an #FlEngine.
|
* @engine: an #FlEngine.
|
||||||
|
* @view_id: the view that the event occured on.
|
||||||
* @phase: mouse phase.
|
* @phase: mouse phase.
|
||||||
* @timestamp: time when event occurred in microseconds.
|
* @timestamp: time when event occurred in microseconds.
|
||||||
* @x: x location of mouse cursor.
|
* @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.
|
* Sends a mouse pointer event to the engine.
|
||||||
*/
|
*/
|
||||||
void fl_engine_send_mouse_pointer_event(FlEngine* engine,
|
void fl_engine_send_mouse_pointer_event(FlEngine* engine,
|
||||||
|
FlutterViewId view_id,
|
||||||
FlutterPointerPhase phase,
|
FlutterPointerPhase phase,
|
||||||
size_t timestamp,
|
size_t timestamp,
|
||||||
double x,
|
double x,
|
||||||
@ -261,7 +265,23 @@ void fl_engine_send_mouse_pointer_event(FlEngine* engine,
|
|||||||
double scroll_delta_y,
|
double scroll_delta_y,
|
||||||
int64_t buttons);
|
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,
|
size_t timestamp,
|
||||||
double x,
|
double x,
|
||||||
double y,
|
double y,
|
||||||
|
@ -25,6 +25,7 @@ TEST(FlEngineTest, WindowMetrics) {
|
|||||||
SendWindowMetricsEvent,
|
SendWindowMetricsEvent,
|
||||||
([&called](auto engine, const FlutterWindowMetricsEvent* event) {
|
([&called](auto engine, const FlutterWindowMetricsEvent* event) {
|
||||||
called = true;
|
called = true;
|
||||||
|
EXPECT_EQ(event->view_id, 1);
|
||||||
EXPECT_EQ(event->width, static_cast<size_t>(3840));
|
EXPECT_EQ(event->width, static_cast<size_t>(3840));
|
||||||
EXPECT_EQ(event->height, static_cast<size_t>(2160));
|
EXPECT_EQ(event->height, static_cast<size_t>(2160));
|
||||||
EXPECT_EQ(event->pixel_ratio, 2.0);
|
EXPECT_EQ(event->pixel_ratio, 2.0);
|
||||||
@ -35,7 +36,7 @@ TEST(FlEngineTest, WindowMetrics) {
|
|||||||
g_autoptr(GError) error = nullptr;
|
g_autoptr(GError) error = nullptr;
|
||||||
EXPECT_TRUE(fl_engine_start(engine, &error));
|
EXPECT_TRUE(fl_engine_start(engine, &error));
|
||||||
EXPECT_EQ(error, nullptr);
|
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);
|
EXPECT_TRUE(called);
|
||||||
}
|
}
|
||||||
@ -52,6 +53,7 @@ TEST(FlEngineTest, MousePointer) {
|
|||||||
size_t events_count) {
|
size_t events_count) {
|
||||||
called = true;
|
called = true;
|
||||||
EXPECT_EQ(events_count, static_cast<size_t>(1));
|
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].phase, kDown);
|
||||||
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
|
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
|
||||||
EXPECT_EQ(events[0].x, 800);
|
EXPECT_EQ(events[0].x, 800);
|
||||||
@ -69,7 +71,7 @@ TEST(FlEngineTest, MousePointer) {
|
|||||||
g_autoptr(GError) error = nullptr;
|
g_autoptr(GError) error = nullptr;
|
||||||
EXPECT_TRUE(fl_engine_start(engine, &error));
|
EXPECT_TRUE(fl_engine_start(engine, &error));
|
||||||
EXPECT_EQ(error, nullptr);
|
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,
|
kFlutterPointerDeviceKindMouse, 1.2, -3.4,
|
||||||
kFlutterPointerButtonMouseSecondary);
|
kFlutterPointerButtonMouseSecondary);
|
||||||
|
|
||||||
@ -88,6 +90,7 @@ TEST(FlEngineTest, PointerPanZoom) {
|
|||||||
size_t events_count) {
|
size_t events_count) {
|
||||||
called = true;
|
called = true;
|
||||||
EXPECT_EQ(events_count, static_cast<size_t>(1));
|
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].phase, kPanZoomUpdate);
|
||||||
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
|
EXPECT_EQ(events[0].timestamp, static_cast<size_t>(1234567890));
|
||||||
EXPECT_EQ(events[0].x, 800);
|
EXPECT_EQ(events[0].x, 800);
|
||||||
@ -107,7 +110,7 @@ TEST(FlEngineTest, PointerPanZoom) {
|
|||||||
g_autoptr(GError) error = nullptr;
|
g_autoptr(GError) error = nullptr;
|
||||||
EXPECT_TRUE(fl_engine_start(engine, &error));
|
EXPECT_TRUE(fl_engine_start(engine, &error));
|
||||||
EXPECT_EQ(error, nullptr);
|
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);
|
kPanZoomUpdate, 1.5, 2.5, 3.5, 4.5);
|
||||||
|
|
||||||
EXPECT_TRUE(called);
|
EXPECT_TRUE(called);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#include "flutter/common/constants.h"
|
||||||
#include "flutter/shell/platform/linux/fl_accessible_node.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_backing_store_provider.h"
|
||||||
#include "flutter/shell/platform/linux/fl_engine_private.h"
|
#include "flutter/shell/platform/linux/fl_engine_private.h"
|
||||||
@ -39,6 +40,9 @@ struct _FlView {
|
|||||||
// Project being run.
|
// Project being run.
|
||||||
FlDartProject* project;
|
FlDartProject* project;
|
||||||
|
|
||||||
|
// ID for this view.
|
||||||
|
FlutterViewId view_id;
|
||||||
|
|
||||||
// Rendering output.
|
// Rendering output.
|
||||||
FlRendererGdk* renderer;
|
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,
|
fl_keyboard_handler_sync_modifier_if_needed(self->keyboard_handler,
|
||||||
event_state, event_time);
|
event_state, event_time);
|
||||||
fl_engine_send_mouse_pointer_event(
|
fl_engine_send_mouse_pointer_event(
|
||||||
self->engine, phase, event_time * kMicrosecondsPerMillisecond,
|
self->engine, self->view_id, phase,
|
||||||
event_x * scale_factor, event_y * scale_factor,
|
event_time * kMicrosecondsPerMillisecond, event_x * scale_factor,
|
||||||
get_device_kind((GdkEvent*)event), 0, 0, self->button_state);
|
event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0,
|
||||||
|
self->button_state);
|
||||||
|
|
||||||
return TRUE;
|
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));
|
gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self));
|
||||||
|
|
||||||
fl_engine_send_mouse_pointer_event(
|
fl_engine_send_mouse_pointer_event(
|
||||||
self->engine, kAdd,
|
self->engine, self->view_id, kAdd,
|
||||||
gdk_event_get_time(event) * kMicrosecondsPerMillisecond,
|
gdk_event_get_time(event) * kMicrosecondsPerMillisecond,
|
||||||
x * scale_factor, y * scale_factor, get_device_kind(event), 0, 0,
|
x * scale_factor, y * scale_factor, get_device_kind(event), 0, 0,
|
||||||
self->button_state);
|
self->button_state);
|
||||||
@ -238,7 +243,7 @@ static void handle_geometry_changed(FlView* self) {
|
|||||||
gtk_widget_get_allocation(GTK_WIDGET(self), &allocation);
|
gtk_widget_get_allocation(GTK_WIDGET(self), &allocation);
|
||||||
gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self));
|
gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self));
|
||||||
fl_engine_send_window_metrics_event(
|
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);
|
allocation.height * scale_factor, scale_factor);
|
||||||
|
|
||||||
// Make sure the view has been realized and its size has been allocated before
|
// 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) {
|
double scroll_delta_y, int64_t buttons) {
|
||||||
FlView* self = FL_VIEW(view_delegate);
|
FlView* self = FL_VIEW(view_delegate);
|
||||||
if (self->engine != nullptr) {
|
if (self->engine != nullptr) {
|
||||||
fl_engine_send_mouse_pointer_event(self->engine, phase, timestamp, x,
|
fl_engine_send_mouse_pointer_event(
|
||||||
y, device_kind, scroll_delta_x,
|
self->engine, self->view_id, phase, timestamp, x, y, device_kind,
|
||||||
scroll_delta_y, buttons);
|
scroll_delta_x, scroll_delta_y, buttons);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
iface->send_pointer_pan_zoom_event =
|
iface->send_pointer_pan_zoom_event =
|
||||||
@ -365,9 +370,9 @@ static void fl_view_scrolling_delegate_iface_init(
|
|||||||
double scale, double rotation) {
|
double scale, double rotation) {
|
||||||
FlView* self = FL_VIEW(view_delegate);
|
FlView* self = FL_VIEW(view_delegate);
|
||||||
if (self->engine != nullptr) {
|
if (self->engine != nullptr) {
|
||||||
fl_engine_send_pointer_pan_zoom_event(self->engine, timestamp, x, y,
|
fl_engine_send_pointer_pan_zoom_event(self->engine, self->view_id,
|
||||||
phase, pan_x, pan_y, scale,
|
timestamp, x, y, phase, pan_x,
|
||||||
rotation);
|
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,
|
fl_keyboard_handler_sync_modifier_if_needed(self->keyboard_handler,
|
||||||
event_state, event_time);
|
event_state, event_time);
|
||||||
fl_engine_send_mouse_pointer_event(
|
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_time * kMicrosecondsPerMillisecond, event_x * scale_factor,
|
||||||
event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0,
|
event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0,
|
||||||
self->button_state);
|
self->button_state);
|
||||||
@ -486,9 +491,10 @@ static gboolean leave_notify_event_cb(FlView* self,
|
|||||||
if (self->pointer_inside && self->button_state == 0) {
|
if (self->pointer_inside && self->button_state == 0) {
|
||||||
gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self));
|
gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(self));
|
||||||
fl_engine_send_mouse_pointer_event(
|
fl_engine_send_mouse_pointer_event(
|
||||||
self->engine, kRemove, event_time * kMicrosecondsPerMillisecond,
|
self->engine, self->view_id, kRemove,
|
||||||
event_x * scale_factor, event_y * scale_factor,
|
event_time * kMicrosecondsPerMillisecond, event_x * scale_factor,
|
||||||
get_device_kind((GdkEvent*)event), 0, 0, self->button_state);
|
event_y * scale_factor, get_device_kind((GdkEvent*)event), 0, 0,
|
||||||
|
self->button_state);
|
||||||
self->pointer_inside = FALSE;
|
self->pointer_inside = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -755,6 +761,10 @@ static void fl_view_class_init(FlViewClass* klass) {
|
|||||||
static void fl_view_init(FlView* self) {
|
static void fl_view_init(FlView* self) {
|
||||||
gtk_widget_set_can_focus(GTK_WIDGET(self), TRUE);
|
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();
|
self->event_box = gtk_event_box_new();
|
||||||
gtk_widget_set_hexpand(self->event_box, TRUE);
|
gtk_widget_set_hexpand(self->event_box, TRUE);
|
||||||
gtk_widget_set_vexpand(self->event_box, TRUE);
|
gtk_widget_set_vexpand(self->event_box, TRUE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user