Use GWeakRef API (#55795)
For consistency with other code.
diff --git a/shell/platform/linux/fl_key_channel_responder.cc b/shell/platform/linux/fl_key_channel_responder.cc
index e5213a7..fa19707 100644
--- a/shell/platform/linux/fl_key_channel_responder.cc
+++ b/shell/platform/linux/fl_key_channel_responder.cc
@@ -42,7 +42,7 @@
GObject parent_instance;
// The current responder.
- FlKeyChannelResponder* responder;
+ GWeakRef responder;
// The callback provided by the caller #FlKeyboardHandler.
FlKeyResponderAsyncCallback callback;
// The user_data provided by the caller #FlKeyboardHandler.
@@ -56,12 +56,8 @@
static void fl_key_channel_user_data_dispose(GObject* object) {
g_return_if_fail(FL_IS_KEY_CHANNEL_USER_DATA(object));
FlKeyChannelUserData* self = FL_KEY_CHANNEL_USER_DATA(object);
- if (self->responder != nullptr) {
- g_object_remove_weak_pointer(
- G_OBJECT(self->responder),
- reinterpret_cast<gpointer*>(&(self->responder)));
- self->responder = nullptr;
- }
+
+ g_weak_ref_clear(&self->responder);
G_OBJECT_CLASS(fl_key_channel_user_data_parent_class)->dispose(object);
}
@@ -85,11 +81,7 @@
FlKeyChannelUserData* self = FL_KEY_CHANNEL_USER_DATA(
g_object_new(fl_key_channel_user_data_get_type(), nullptr));
- self->responder = responder;
- // Add a weak pointer so we can know if the key event responder disappeared
- // while the framework was responding.
- g_object_add_weak_pointer(G_OBJECT(responder),
- reinterpret_cast<gpointer*>(&(self->responder)));
+ g_weak_ref_init(&self->responder, responder);
self->callback = callback;
self->user_data = user_data;
return self;
@@ -136,13 +128,12 @@
gpointer user_data) {
g_autoptr(FlKeyChannelUserData) data = FL_KEY_CHANNEL_USER_DATA(user_data);
- // This is true if the weak pointer has been destroyed.
- if (data->responder == nullptr) {
+ g_autoptr(FlKeyChannelResponder) self =
+ FL_KEY_CHANNEL_RESPONDER(g_weak_ref_get(&data->responder));
+ if (self == nullptr) {
return;
}
- FlKeyChannelResponder* self = data->responder;
-
g_autoptr(GError) error = nullptr;
FlBasicMessageChannel* messageChannel = FL_BASIC_MESSAGE_CHANNEL(object);
FlValue* message =
diff --git a/shell/platform/linux/fl_keyboard_handler.cc b/shell/platform/linux/fl_keyboard_handler.cc
index 65673dc..f9c922a 100644
--- a/shell/platform/linux/fl_keyboard_handler.cc
+++ b/shell/platform/linux/fl_keyboard_handler.cc
@@ -85,8 +85,8 @@
struct _FlKeyboardHandlerUserData {
GObject parent_instance;
- // A weak reference to the owner handler.
- FlKeyboardHandler* handler;
+ // The owner handler.
+ GWeakRef handler;
uint64_t sequence_id;
};
@@ -97,11 +97,8 @@
static void fl_keyboard_handler_user_data_dispose(GObject* object) {
g_return_if_fail(FL_IS_KEYBOARD_HANDLER_USER_DATA(object));
FlKeyboardHandlerUserData* self = FL_KEYBOARD_HANDLER_USER_DATA(object);
- if (self->handler != nullptr) {
- g_object_remove_weak_pointer(G_OBJECT(self->handler),
- reinterpret_cast<gpointer*>(&(self->handler)));
- self->handler = nullptr;
- }
+
+ g_weak_ref_clear(&self->handler);
G_OBJECT_CLASS(fl_keyboard_handler_user_data_parent_class)->dispose(object);
}
@@ -121,11 +118,7 @@
FlKeyboardHandlerUserData* self = FL_KEYBOARD_HANDLER_USER_DATA(
g_object_new(fl_keyboard_handler_user_data_get_type(), nullptr));
- self->handler = handler;
- // Add a weak pointer so we can know if the key event responder disappeared
- // while the framework was responding.
- g_object_add_weak_pointer(G_OBJECT(handler),
- reinterpret_cast<gpointer*>(&(self->handler)));
+ g_weak_ref_init(&self->handler, handler);
self->sequence_id = sequence_id;
return self;
}
@@ -135,7 +128,7 @@
struct _FlKeyboardHandler {
GObject parent_instance;
- FlKeyboardViewDelegate* view_delegate;
+ GWeakRef view_delegate;
// An array of #FlKeyResponder. Elements are added with
// #fl_keyboard_handler_add_responder immediately after initialization and are
@@ -247,8 +240,18 @@
g_return_if_fail(FL_IS_KEYBOARD_HANDLER_USER_DATA(user_data_ptr));
FlKeyboardHandlerUserData* user_data =
FL_KEYBOARD_HANDLER_USER_DATA(user_data_ptr);
- FlKeyboardHandler* self = user_data->handler;
- g_return_if_fail(self->view_delegate != nullptr);
+
+ g_autoptr(FlKeyboardHandler) self =
+ FL_KEYBOARD_HANDLER(g_weak_ref_get(&user_data->handler));
+ if (self == nullptr) {
+ return;
+ }
+
+ g_autoptr(FlKeyboardViewDelegate) view_delegate =
+ FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
guint result_index = -1;
gboolean found = g_ptr_array_find_with_equal_func1(
@@ -268,11 +271,11 @@
bool should_redispatch =
!fl_keyboard_pending_event_get_any_handled(pending) &&
!fl_keyboard_view_delegate_text_filter_key_press(
- self->view_delegate, fl_keyboard_pending_event_get_event(pending));
+ view_delegate, fl_keyboard_pending_event_get_event(pending));
if (should_redispatch) {
g_ptr_array_add(self->pending_redispatches, pending);
fl_keyboard_view_delegate_redispatch_event(
- self->view_delegate,
+ view_delegate,
FL_KEY_EVENT(fl_keyboard_pending_event_get_event(pending)));
} else {
g_object_unref(pending);
@@ -293,6 +296,12 @@
// Make sure that Flutter has derived the layout for the group of the event,
// if the event contains a goal keycode.
static void guarantee_layout(FlKeyboardHandler* self, FlKeyEvent* event) {
+ g_autoptr(FlKeyboardViewDelegate) view_delegate =
+ FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
guint8 group = fl_key_event_get_group(event);
if (fl_keyboard_layout_has_group(self->derived_layout, group)) {
return;
@@ -311,8 +320,8 @@
std::string debug_layout_data;
for (uint16_t keycode = 0; keycode < 128; keycode += 1) {
std::vector<uint16_t> this_key_clues = {
- convert_key_to_char(self->view_delegate, keycode, group, 0),
- convert_key_to_char(self->view_delegate, keycode, group, 1), // Shift
+ convert_key_to_char(view_delegate, keycode, group, 0),
+ convert_key_to_char(view_delegate, keycode, group, 1), // Shift
};
debug_format_layout_data(debug_layout_data, keycode, this_key_clues[0],
this_key_clues[1]);
@@ -326,8 +335,8 @@
for (const LayoutGoal& keycode_goal : layout_goals) {
uint16_t keycode = keycode_goal.keycode;
std::vector<uint16_t> this_key_clues = {
- convert_key_to_char(self->view_delegate, keycode, group, 0),
- convert_key_to_char(self->view_delegate, keycode, group, 1), // Shift
+ convert_key_to_char(view_delegate, keycode, group, 0),
+ convert_key_to_char(view_delegate, keycode, group, 1), // Shift
};
// The logical key should be the first available clue from below:
@@ -376,8 +385,11 @@
static FlMethodResponse* get_keyboard_state(FlKeyboardHandler* self) {
g_autoptr(FlValue) result = fl_value_new_map();
+ g_autoptr(FlKeyboardViewDelegate) view_delegate =
+ FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+
GHashTable* pressing_records =
- fl_keyboard_view_delegate_get_keyboard_state(self->view_delegate);
+ fl_keyboard_view_delegate_get_keyboard_state(view_delegate);
g_hash_table_foreach(
pressing_records,
@@ -428,12 +440,7 @@
static void fl_keyboard_handler_dispose(GObject* object) {
FlKeyboardHandler* self = FL_KEYBOARD_HANDLER(object);
- if (self->view_delegate != nullptr) {
- g_object_remove_weak_pointer(
- G_OBJECT(self->view_delegate),
- reinterpret_cast<gpointer*>(&(self->view_delegate)));
- self->view_delegate = nullptr;
- }
+ g_weak_ref_clear(&self->view_delegate);
self->keycode_to_goals.reset();
self->logical_to_mandatory_goals.reset();
@@ -481,10 +488,7 @@
FlKeyboardHandler* self = FL_KEYBOARD_HANDLER(
g_object_new(fl_keyboard_handler_get_type(), nullptr));
- self->view_delegate = view_delegate;
- g_object_add_weak_pointer(
- G_OBJECT(view_delegate),
- reinterpret_cast<gpointer*>(&(self->view_delegate)));
+ g_weak_ref_init(&self->view_delegate, view_delegate);
// The embedder responder must be added before the channel responder.
g_ptr_array_add(
@@ -494,9 +498,13 @@
void* callback_user_data, void* send_key_event_user_data) {
FlKeyboardHandler* self =
FL_KEYBOARD_HANDLER(send_key_event_user_data);
- g_return_if_fail(self->view_delegate != nullptr);
+ g_autoptr(FlKeyboardViewDelegate) view_delegate =
+ FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
fl_keyboard_view_delegate_send_key_event(
- self->view_delegate, event, callback, callback_user_data);
+ view_delegate, event, callback, callback_user_data);
},
self)));
g_ptr_array_add(self->responder_list,
@@ -516,7 +524,6 @@
FlKeyEvent* event) {
g_return_val_if_fail(FL_IS_KEYBOARD_HANDLER(self), FALSE);
g_return_val_if_fail(event != nullptr, FALSE);
- g_return_val_if_fail(self->view_delegate != nullptr, FALSE);
guarantee_layout(self, event);
diff --git a/shell/platform/linux/fl_mouse_cursor_handler.cc b/shell/platform/linux/fl_mouse_cursor_handler.cc
index 107a8d6..d8fdc8c 100644
--- a/shell/platform/linux/fl_mouse_cursor_handler.cc
+++ b/shell/platform/linux/fl_mouse_cursor_handler.cc
@@ -22,7 +22,7 @@
FlMethodChannel* channel;
- FlView* view;
+ GWeakRef view;
GHashTable* system_cursor_table;
};
@@ -109,11 +109,14 @@
cursor_name = kFallbackCursor;
}
- GdkWindow* window =
- gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(self->view)));
- g_autoptr(GdkCursor) cursor =
- gdk_cursor_new_from_name(gdk_window_get_display(window), cursor_name);
- gdk_window_set_cursor(window, cursor);
+ g_autoptr(FlView) view = FL_VIEW(g_weak_ref_get(&self->view));
+ if (view != nullptr) {
+ GdkWindow* window =
+ gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(view)));
+ g_autoptr(GdkCursor) cursor =
+ gdk_cursor_new_from_name(gdk_window_get_display(window), cursor_name);
+ gdk_window_set_cursor(window, cursor);
+ }
return FL_METHOD_RESPONSE(fl_method_success_response_new(nullptr));
}
@@ -144,11 +147,7 @@
FlMouseCursorHandler* self = FL_MOUSE_CURSOR_HANDLER(object);
g_clear_object(&self->channel);
- if (self->view != nullptr) {
- g_object_remove_weak_pointer(G_OBJECT(self->view),
- reinterpret_cast<gpointer*>(&(self->view)));
- self->view = nullptr;
- }
+ g_weak_ref_clear(&self->view);
g_clear_pointer(&self->system_cursor_table, g_hash_table_unref);
G_OBJECT_CLASS(fl_mouse_cursor_handler_parent_class)->dispose(object);
@@ -173,11 +172,7 @@
fl_method_channel_new(messenger, kChannelName, FL_METHOD_CODEC(codec));
fl_method_channel_set_method_call_handler(self->channel, method_call_cb, self,
nullptr);
- self->view = view;
- if (view != nullptr) {
- g_object_add_weak_pointer(G_OBJECT(view),
- reinterpret_cast<gpointer*>(&(self->view)));
- }
+ g_weak_ref_init(&self->view, view);
return self;
}
diff --git a/shell/platform/linux/fl_plugin_registrar.cc b/shell/platform/linux/fl_plugin_registrar.cc
index 403af32..46b8ad7 100644
--- a/shell/platform/linux/fl_plugin_registrar.cc
+++ b/shell/platform/linux/fl_plugin_registrar.cc
@@ -17,7 +17,7 @@
GObject parent_instance;
// View that plugin is controlling.
- FlView* view;
+ GWeakRef view;
// Messenger to communicate on.
FlBinaryMessenger* messenger;
@@ -44,11 +44,7 @@
static void fl_plugin_registrar_impl_dispose(GObject* object) {
FlPluginRegistrarImpl* self = FL_PLUGIN_REGISTRAR_IMPL(object);
- if (self->view != nullptr) {
- g_object_remove_weak_pointer(G_OBJECT(self->view),
- reinterpret_cast<gpointer*>(&(self->view)));
- self->view = nullptr;
- }
+ g_weak_ref_clear(&self->view);
g_clear_object(&self->messenger);
g_clear_object(&self->texture_registrar);
@@ -72,7 +68,8 @@
static FlView* get_view(FlPluginRegistrar* registrar) {
FlPluginRegistrarImpl* self = FL_PLUGIN_REGISTRAR_IMPL(registrar);
- return self->view;
+ g_autoptr(FlView) view = FL_VIEW(g_weak_ref_get(&self->view));
+ return view;
}
static void fl_plugin_registrar_impl_iface_init(
@@ -98,11 +95,7 @@
// Added to stop compiler complaining about an unused function.
FL_IS_PLUGIN_REGISTRAR_IMPL(self);
- self->view = view;
- if (view != nullptr) {
- g_object_add_weak_pointer(G_OBJECT(view),
- reinterpret_cast<gpointer*>(&(self->view)));
- }
+ g_weak_ref_init(&self->view, view);
self->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger));
self->texture_registrar =
FL_TEXTURE_REGISTRAR(g_object_ref(texture_registrar));
diff --git a/shell/platform/linux/fl_scrolling_manager.cc b/shell/platform/linux/fl_scrolling_manager.cc
index 81b4fc5..7bfe1a2 100644
--- a/shell/platform/linux/fl_scrolling_manager.cc
+++ b/shell/platform/linux/fl_scrolling_manager.cc
@@ -9,7 +9,7 @@
struct _FlScrollingManager {
GObject parent_instance;
- FlScrollingViewDelegate* view_delegate;
+ GWeakRef view_delegate;
gdouble last_x;
gdouble last_y;
@@ -29,11 +29,7 @@
static void fl_scrolling_manager_dispose(GObject* object) {
FlScrollingManager* self = FL_SCROLLING_MANAGER(object);
- if (self->view_delegate != nullptr) {
- g_object_remove_weak_pointer(
- object, reinterpret_cast<gpointer*>(&self->view_delegate));
- self->view_delegate = nullptr;
- }
+ g_weak_ref_clear(&self->view_delegate);
G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(object);
}
@@ -51,11 +47,7 @@
FlScrollingManager* self = FL_SCROLLING_MANAGER(
g_object_new(fl_scrolling_manager_get_type(), nullptr));
- self->view_delegate = view_delegate;
- g_object_add_weak_pointer(
- G_OBJECT(view_delegate),
- reinterpret_cast<gpointer*>(&(self->view_delegate)));
-
+ g_weak_ref_init(&self->view_delegate, view_delegate);
self->pan_started = FALSE;
self->zoom_started = FALSE;
self->rotate_started = FALSE;
@@ -76,6 +68,12 @@
gint scale_factor) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
GdkEvent* event = reinterpret_cast<GdkEvent*>(scroll_event);
guint event_time = gdk_event_get_time(event);
@@ -113,7 +111,7 @@
scroll_delta_y *= -1;
if (gdk_event_is_scroll_stop_event(event)) {
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+ view_delegate, event_time * kMicrosecondsPerMillisecond,
event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
self->pan_x, self->pan_y, 0, 0);
self->pan_started = FALSE;
@@ -122,7 +120,7 @@
self->pan_x = 0;
self->pan_y = 0;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+ view_delegate, event_time * kMicrosecondsPerMillisecond,
event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
0, 0);
self->pan_started = TRUE;
@@ -130,7 +128,7 @@
self->pan_x += scroll_delta_x;
self->pan_y += scroll_delta_y;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+ view_delegate, event_time * kMicrosecondsPerMillisecond,
event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
self->pan_x, self->pan_y, 1, 0);
}
@@ -138,7 +136,7 @@
self->last_x = event_x * scale_factor;
self->last_y = event_y * scale_factor;
fl_scrolling_view_delegate_send_mouse_pointer_event(
- self->view_delegate,
+ view_delegate,
FlutterPointerPhase::kMove /* arbitrary value, phase will be ignored as
this is a discrete scroll event */
,
@@ -151,12 +149,18 @@
void fl_scrolling_manager_handle_rotation_begin(FlScrollingManager* self) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->rotate_started = TRUE;
if (!self->zoom_started) {
self->scale = 1;
self->rotation = 0;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomStart, 0, 0, 0, 0);
}
}
@@ -165,19 +169,31 @@
gdouble rotation) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->rotation = rotation;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomUpdate, 0, 0, self->scale, self->rotation);
}
void fl_scrolling_manager_handle_rotation_end(FlScrollingManager* self) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->rotate_started = FALSE;
if (!self->zoom_started) {
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomEnd, 0, 0, 0, 0);
}
}
@@ -185,12 +201,18 @@
void fl_scrolling_manager_handle_zoom_begin(FlScrollingManager* self) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->zoom_started = TRUE;
if (!self->rotate_started) {
self->scale = 1;
self->rotation = 0;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomStart, 0, 0, 0, 0);
}
}
@@ -199,19 +221,31 @@
gdouble scale) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->scale = scale;
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomUpdate, 0, 0, self->scale, self->rotation);
}
void fl_scrolling_manager_handle_zoom_end(FlScrollingManager* self) {
g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
+ g_autoptr(FlScrollingViewDelegate) view_delegate =
+ FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
self->zoom_started = FALSE;
if (!self->rotate_started) {
fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
- self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+ view_delegate, g_get_real_time(), self->last_x, self->last_y,
kPanZoomEnd, 0, 0, 0, 0);
}
}
diff --git a/shell/platform/linux/fl_settings_handler.cc b/shell/platform/linux/fl_settings_handler.cc
index 6ad6322..a62044b 100644
--- a/shell/platform/linux/fl_settings_handler.cc
+++ b/shell/platform/linux/fl_settings_handler.cc
@@ -23,7 +23,7 @@
GObject parent_instance;
FlBasicMessageChannel* channel;
- FlEngine* engine;
+ GWeakRef engine;
FlSettings* settings;
};
@@ -58,7 +58,8 @@
fl_basic_message_channel_send(self->channel, message, nullptr, nullptr,
nullptr);
- if (self->engine != nullptr) {
+ g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
+ if (engine != nullptr) {
int32_t flags = 0;
if (!fl_settings_get_enable_animations(self->settings)) {
flags |= kFlutterAccessibilityFeatureDisableAnimations;
@@ -66,7 +67,7 @@
if (fl_settings_get_high_contrast(self->settings)) {
flags |= kFlutterAccessibilityFeatureHighContrast;
}
- fl_engine_update_accessibility_features(self->engine, flags);
+ fl_engine_update_accessibility_features(engine, flags);
}
}
@@ -75,12 +76,7 @@
g_clear_object(&self->channel);
g_clear_object(&self->settings);
-
- if (self->engine != nullptr) {
- g_object_remove_weak_pointer(G_OBJECT(self),
- reinterpret_cast<gpointer*>(&(self->engine)));
- self->engine = nullptr;
- }
+ g_weak_ref_clear(&self->engine);
G_OBJECT_CLASS(fl_settings_handler_parent_class)->dispose(object);
}
@@ -97,9 +93,7 @@
FlSettingsHandler* self = FL_SETTINGS_HANDLER(
g_object_new(fl_settings_handler_get_type(), nullptr));
- self->engine = engine;
- g_object_add_weak_pointer(G_OBJECT(self),
- reinterpret_cast<gpointer*>(&(self->engine)));
+ g_weak_ref_init(&self->engine, engine);
FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
diff --git a/shell/platform/linux/fl_text_input_handler.cc b/shell/platform/linux/fl_text_input_handler.cc
index f4d3eb7..d9a8c08 100644
--- a/shell/platform/linux/fl_text_input_handler.cc
+++ b/shell/platform/linux/fl_text_input_handler.cc
@@ -82,7 +82,7 @@
// Input method.
GtkIMContext* im_context;
- FlTextInputViewDelegate* view_delegate;
+ GWeakRef view_delegate;
flutter::TextInputModel* text_model;
@@ -485,6 +485,12 @@
FlTextInputHandlerPrivate* priv = static_cast<FlTextInputHandlerPrivate*>(
fl_text_input_handler_get_instance_private(self));
+ g_autoptr(FlTextInputViewDelegate) view_delegate =
+ FL_TEXT_INPUT_VIEW_DELEGATE(g_weak_ref_get(&priv->view_delegate));
+ if (view_delegate == nullptr) {
+ return;
+ }
+
// Skip update if not composing to avoid setting to position 0.
if (!priv->text_model->composing()) {
return;
@@ -502,7 +508,7 @@
// Transform from Flutter view coordinates to GTK window coordinates.
GdkRectangle preedit_rect = {};
fl_text_input_view_delegate_translate_coordinates(
- priv->view_delegate, x, y, &preedit_rect.x, &preedit_rect.y);
+ view_delegate, x, y, &preedit_rect.x, &preedit_rect.y);
// Set the cursor location in window coordinates so that GTK can position any
// system input method windows.
@@ -603,12 +609,7 @@
delete priv->text_model;
priv->text_model = nullptr;
}
- if (priv->view_delegate != nullptr) {
- g_object_remove_weak_pointer(
- G_OBJECT(priv->view_delegate),
- reinterpret_cast<gpointer*>(&(priv->view_delegate)));
- priv->view_delegate = nullptr;
- }
+ g_weak_ref_clear(&priv->view_delegate);
G_OBJECT_CLASS(fl_text_input_handler_parent_class)->dispose(object);
}
@@ -765,10 +766,7 @@
init_im_context(self, im_context);
- priv->view_delegate = view_delegate;
- g_object_add_weak_pointer(
- G_OBJECT(view_delegate),
- reinterpret_cast<gpointer*>(&(priv->view_delegate)));
+ g_weak_ref_init(&priv->view_delegate, view_delegate);
return self;
}
diff --git a/shell/platform/linux/fl_view_accessible.cc b/shell/platform/linux/fl_view_accessible.cc
index d8e3b74..09bb839 100644
--- a/shell/platform/linux/fl_view_accessible.cc
+++ b/shell/platform/linux/fl_view_accessible.cc
@@ -13,7 +13,7 @@
struct _FlViewAccessible {
AtkPlug parent_instance;
- FlEngine* engine;
+ GWeakRef engine;
// Semantics nodes keyed by ID
GHashTable* semantics_nodes_by_id;
@@ -28,11 +28,16 @@
static FlAccessibleNode* create_node(FlViewAccessible* self,
FlutterSemanticsNode2* semantics) {
- if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
- return fl_accessible_text_field_new(self->engine, semantics->id);
+ g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
+ if (engine == nullptr) {
+ return nullptr;
}
- return fl_accessible_node_new(self->engine, semantics->id);
+ if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
+ return fl_accessible_text_field_new(engine, semantics->id);
+ }
+
+ return fl_accessible_node_new(engine, semantics->id);
}
static FlAccessibleNode* lookup_node(FlViewAccessible* self, int32_t id) {
@@ -107,11 +112,7 @@
g_clear_pointer(&self->semantics_nodes_by_id, g_hash_table_unref);
- if (self->engine != nullptr) {
- g_object_remove_weak_pointer(object,
- reinterpret_cast<gpointer*>(&self->engine));
- self->engine = nullptr;
- }
+ g_weak_ref_clear(&self->engine);
G_OBJECT_CLASS(fl_view_accessible_parent_class)->dispose(object);
}
@@ -133,9 +134,7 @@
FlViewAccessible* fl_view_accessible_new(FlEngine* engine) {
FlViewAccessible* self =
FL_VIEW_ACCESSIBLE(g_object_new(fl_view_accessible_get_type(), nullptr));
- self->engine = engine;
- g_object_add_weak_pointer(G_OBJECT(self),
- reinterpret_cast<gpointer*>(&self->engine));
+ g_weak_ref_init(&self->engine, engine);
return self;
}