1616#include " flutter/shell/platform/linux/fl_keyboard_handler.h"
1717#include " flutter/shell/platform/linux/fl_keyboard_manager.h"
1818#include " flutter/shell/platform/linux/fl_keyboard_view_delegate.h"
19- #include " flutter/shell/platform/linux/fl_mouse_cursor_handler.h"
2019#include " flutter/shell/platform/linux/fl_plugin_registrar_private.h"
2120#include " flutter/shell/platform/linux/fl_pointer_manager.h"
2221#include " flutter/shell/platform/linux/fl_renderer_gdk.h"
@@ -68,11 +67,13 @@ struct _FlView {
6867 // Flutter system channel handlers.
6968 FlKeyboardHandler* keyboard_handler;
7069 FlTextInputHandler* text_input_handler;
71- FlMouseCursorHandler* mouse_cursor_handler;
7270
7371 // Accessible tree from Flutter, exposed as an AtkPlug.
7472 FlViewAccessible* view_accessible;
7573
74+ // Signal subscripton for cursor changes.
75+ guint cursor_changed_cb_id;
76+
7677 GCancellable* cancellable;
7778};
7879
@@ -184,6 +185,28 @@ static gboolean get_mouse_button(GdkEvent* event, int64_t* button) {
184185 }
185186}
186187
188+ // Called when the mouse cursor changes.
189+ static void cursor_changed_cb (FlView* self) {
190+ FlMouseCursorHandler* handler =
191+ fl_engine_get_mouse_cursor_handler (self->engine );
192+ const gchar* cursor_name = fl_mouse_cursor_handler_get_cursor_name (handler);
193+ GdkWindow* window =
194+ gtk_widget_get_window (gtk_widget_get_toplevel (GTK_WIDGET (self)));
195+ g_autoptr (GdkCursor) cursor =
196+ gdk_cursor_new_from_name (gdk_window_get_display (window), cursor_name);
197+ gdk_window_set_cursor (window, cursor);
198+ }
199+
200+ // Set the mouse cursor.
201+ static void setup_cursor (FlView* self) {
202+ FlMouseCursorHandler* handler =
203+ fl_engine_get_mouse_cursor_handler (self->engine );
204+
205+ self->cursor_changed_cb_id = g_signal_connect_swapped (
206+ handler, " cursor-changed" , G_CALLBACK (cursor_changed_cb), self);
207+ cursor_changed_cb (self);
208+ }
209+
187210// Updates the engine with the current window metrics.
188211static void handle_geometry_changed (FlView* self) {
189212 GtkAllocation allocation;
@@ -457,10 +480,7 @@ static GdkGLContext* create_context_cb(FlView* self) {
457480 fl_renderer_gdk_set_window (self->renderer ,
458481 gtk_widget_get_parent_window (GTK_WIDGET (self)));
459482
460- // Create system channel handlers.
461- FlBinaryMessenger* messenger = fl_engine_get_binary_messenger (self->engine );
462483 init_scrolling (self);
463- self->mouse_cursor_handler = fl_mouse_cursor_handler_new (messenger, self);
464484
465485 g_autoptr (GError) error = nullptr ;
466486 if (!fl_renderer_gdk_create_contexts (self->renderer , &error)) {
@@ -505,6 +525,8 @@ static void realize_cb(FlView* self) {
505525 return ;
506526 }
507527
528+ setup_cursor (self);
529+
508530 handle_geometry_changed (self);
509531
510532 self->view_accessible = fl_view_accessible_new (self->engine );
@@ -567,6 +589,13 @@ static void fl_view_dispose(GObject* object) {
567589 fl_engine_set_update_semantics_handler (self->engine , nullptr , nullptr ,
568590 nullptr );
569591
592+ FlMouseCursorHandler* handler =
593+ fl_engine_get_mouse_cursor_handler (self->engine );
594+ if (self->cursor_changed_cb_id != 0 ) {
595+ g_signal_handler_disconnect (handler, self->cursor_changed_cb_id );
596+ self->cursor_changed_cb_id = 0 ;
597+ }
598+
570599 // Stop rendering.
571600 fl_renderer_remove_view (FL_RENDERER (self->renderer ), self->view_id );
572601
@@ -589,7 +618,6 @@ static void fl_view_dispose(GObject* object) {
589618 g_clear_object (&self->pointer_manager );
590619 g_clear_object (&self->keyboard_manager );
591620 g_clear_object (&self->keyboard_handler );
592- g_clear_object (&self->mouse_cursor_handler );
593621 g_clear_object (&self->view_accessible );
594622 g_clear_object (&self->cancellable );
595623
@@ -750,6 +778,8 @@ G_MODULE_EXPORT FlView* fl_view_new_for_engine(FlEngine* engine) {
750778
751779 self->pointer_manager = fl_pointer_manager_new (self->view_id , engine);
752780
781+ setup_cursor (self);
782+
753783 return self;
754784}
755785
0 commit comments