gtkentrycompletion: Properly remove controller from entry
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 8 Jun 2018 11:31:32 +0000 (13:31 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 21 Jun 2018 10:54:03 +0000 (12:54 +0200)
When disconnecting the GtkEntry from the GtkEntryCompletion, we
must remove the controller in order to avoid dangling callbacks.

gtk/gtkentrycompletion.c

index ef25764fc1d72fd9d212eaf15e470d07e5746eb9..af90772162b9f361b60c1cfb74071b87512b2d53 100644 (file)
@@ -2448,9 +2448,10 @@ completion_insert_text_callback (GtkEntry           *entry,
 static void
 connect_completion_signals (GtkEntryCompletion *completion)
 {
+  GtkEntryCompletionPrivate *priv = completion->priv;
   GtkEventController *controller;
 
-  controller = gtk_event_controller_key_new ();
+  controller = priv->entry_key_controller = gtk_event_controller_key_new ();
   g_signal_connect (controller, "key-pressed",
                     G_CALLBACK (gtk_entry_completion_key_pressed), completion);
   g_signal_connect_swapped (controller, "focus-out",
@@ -2504,6 +2505,9 @@ unset_accessible_relation (GtkWidget *window,
 static void
 disconnect_completion_signals (GtkEntryCompletion *completion)
 {
+  gtk_widget_remove_controller (completion->priv->entry,
+                                completion->priv->entry_key_controller);
+
   if (completion->priv->changed_id > 0 &&
       g_signal_handler_is_connected (completion->priv->entry,
                                      completion->priv->changed_id))