editablelabel: Defer changes on focus-out
authorMatthias Clasen <mclasen@redhat.com>
Tue, 18 Oct 2022 18:23:22 +0000 (14:23 -0400)
committerMat <mail@mathias.is>
Fri, 21 Oct 2022 11:38:08 +0000 (14:38 +0300)
We can get spurious focus-out/-in pairs when
the editable label is in a popover that gets
a Wayland keyboard enter event as a result of
clicking the editable label.

A timeout isn't a great solution, but nothing
better is available right now.

Fixes: #4864
gtk/gtkeditablelabel.c

index e107121ad91521889d2670192deb6b24a6fbce93..a4690960fb123c707bc849fe0d2f0d028edd9771 100644 (file)
@@ -192,11 +192,23 @@ gtk_editable_label_prepare_drag (GtkDragSource    *source,
                                          gtk_label_get_label (GTK_LABEL (self->label)));
 }
 
+static gboolean
+stop_editing_soon (gpointer data)
+{
+  GtkEventController *controller = data;
+  GtkWidget *widget = gtk_event_controller_get_widget (controller);
+
+  if (!gtk_event_controller_focus_contains_focus (GTK_EVENT_CONTROLLER_FOCUS (controller)))
+    gtk_editable_label_stop_editing (GTK_EDITABLE_LABEL (widget), TRUE);
+
+  return FALSE;
+}
+
 static void
 gtk_editable_label_focus_out (GtkEventController *controller,
                               GtkEditableLabel   *self)
 {
-  gtk_editable_label_stop_editing (self, TRUE);
+  g_timeout_add (100, stop_editing_soon, controller);
 }
 
 static void