@@ -67,6 +67,11 @@ enum { PROP_FLUTTER_PROJECT = 1, PROP_LAST };
6767static void fl_view_plugin_registry_iface_init (
6868 FlPluginRegistryInterface* iface);
6969
70+ static gboolean text_input_im_filter_by_gtk (GtkIMContext* im_context,
71+ gpointer gdk_event);
72+
73+ static void redispatch_key_event_by_gtk (gpointer gdk_event);
74+
7075G_DEFINE_TYPE_WITH_CODE (
7176 FlView,
7277 fl_view,
@@ -83,6 +88,33 @@ static void fl_view_update_semantics_node_cb(FlEngine* engine,
8388 self->accessibility_plugin , node);
8489}
8590
91+ static void fl_view_init_keyboard (FlView* self) {
92+ FlBinaryMessenger* messenger = fl_engine_get_binary_messenger (self->engine );
93+ self->keyboard_manager = fl_keyboard_manager_new (
94+ fl_text_input_plugin_new (messenger, self, text_input_im_filter_by_gtk),
95+ redispatch_key_event_by_gtk);
96+ // The embedder responder must be added before the channel responder.
97+ fl_keyboard_manager_add_responder (
98+ self->keyboard_manager ,
99+ FL_KEY_RESPONDER (fl_key_embedder_responder_new (self->engine )));
100+ fl_keyboard_manager_add_responder (
101+ self->keyboard_manager ,
102+ FL_KEY_RESPONDER (fl_key_channel_responder_new (messenger)));
103+ }
104+
105+ // Called when the engine is restarted.
106+ //
107+ // This method should reset states to be as if the engine had just been started,
108+ // which usually indicates the user has requested a hot restart (Shift-R in the
109+ // Flutter CLI.)
110+ static void fl_view_on_pre_engine_restart_cb (FlEngine* engine,
111+ gpointer user_data) {
112+ FlView* self = FL_VIEW (user_data);
113+
114+ g_clear_object (&self->keyboard_manager );
115+ fl_view_init_keyboard (self);
116+ }
117+
86118// Converts a GDK button event into a Flutter event and sends it to the engine.
87119static gboolean fl_view_send_pointer_button_event (FlView* self,
88120 GdkEventButton* event) {
@@ -162,11 +194,6 @@ static void fl_view_plugin_registry_iface_init(
162194 iface->get_registrar_for_plugin = fl_view_get_registrar_for_plugin;
163195}
164196
165- static void redispatch_key_event_by_gtk (gpointer gdk_event);
166-
167- static gboolean text_input_im_filter_by_gtk (GtkIMContext* im_context,
168- gpointer gdk_event);
169-
170197static gboolean event_box_button_release_event (GtkWidget* widget,
171198 GdkEventButton* event,
172199 FlView* view);
@@ -198,20 +225,13 @@ static void fl_view_constructed(GObject* object) {
198225 self->engine = fl_engine_new (self->project , self->renderer );
199226 fl_engine_set_update_semantics_node_handler (
200227 self->engine , fl_view_update_semantics_node_cb, self, nullptr );
228+ fl_engine_set_on_pre_engine_restart_handler (
229+ self->engine , fl_view_on_pre_engine_restart_cb, self, nullptr );
201230
202231 // Create system channel handlers.
203232 FlBinaryMessenger* messenger = fl_engine_get_binary_messenger (self->engine );
204233 self->accessibility_plugin = fl_accessibility_plugin_new (self);
205- self->keyboard_manager = fl_keyboard_manager_new (
206- fl_text_input_plugin_new (messenger, self, text_input_im_filter_by_gtk),
207- redispatch_key_event_by_gtk);
208- // The embedder responder must be added before the channel responder.
209- fl_keyboard_manager_add_responder (
210- self->keyboard_manager ,
211- FL_KEY_RESPONDER (fl_key_embedder_responder_new (self->engine )));
212- fl_keyboard_manager_add_responder (
213- self->keyboard_manager ,
214- FL_KEY_RESPONDER (fl_key_channel_responder_new (messenger)));
234+ fl_view_init_keyboard (self);
215235 self->mouse_cursor_plugin = fl_mouse_cursor_plugin_new (messenger, self);
216236 self->platform_plugin = fl_platform_plugin_new (messenger);
217237
@@ -288,6 +308,8 @@ static void fl_view_dispose(GObject* object) {
288308 if (self->engine != nullptr ) {
289309 fl_engine_set_update_semantics_node_handler (self->engine , nullptr , nullptr ,
290310 nullptr );
311+ fl_engine_set_on_pre_engine_restart_handler (self->engine , nullptr , nullptr ,
312+ nullptr );
291313 }
292314
293315 g_clear_object (&self->project );
0 commit comments