text: Fix fallout from focus changes
authorMatthias Clasen <mclasen@redhat.com>
Sun, 16 Apr 2023 06:49:20 +0000 (08:49 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 21 Apr 2023 07:22:42 +0000 (09:22 +0200)
We don't get proper notification for when the toplevel
is-active property changes, so monitor has-focus, and
update cursor blinking.

gtk/gtktext.c

index 7b7d2eb4a5d5ff358c2daf068ca84550020142ab..c7316478e7536c6814ef1f700fa26feacde2e261 100644 (file)
@@ -320,6 +320,8 @@ static void   gtk_text_get_property         (GObject      *object,
                                              guint         prop_id,
                                              GValue       *value,
                                              GParamSpec   *pspec);
+static void   gtk_text_notify               (GObject      *object,
+                                             GParamSpec   *pspec);
 static void   gtk_text_finalize             (GObject      *object);
 static void   gtk_text_dispose              (GObject      *object);
 
@@ -738,6 +740,7 @@ gtk_text_class_init (GtkTextClass *class)
   gobject_class->finalize = gtk_text_finalize;
   gobject_class->set_property = gtk_text_set_property;
   gobject_class->get_property = gtk_text_get_property;
+  gobject_class->notify = gtk_text_notify;
 
   widget_class->map = gtk_text_map;
   widget_class->unmap = gtk_text_unmap;
@@ -1815,6 +1818,17 @@ gtk_text_get_property (GObject    *object,
     }
 }
 
+static void
+gtk_text_notify (GObject    *object,
+                 GParamSpec *pspec)
+{
+  if (pspec->name == I_("has-focus"))
+    gtk_text_check_cursor_blink (GTK_TEXT (object));
+
+  if (G_OBJECT_CLASS (gtk_text_parent_class)->notify)
+    G_OBJECT_CLASS (gtk_text_parent_class)->notify (object, pspec);
+}
+
 static void
 gtk_text_ensure_text_handles (GtkText *self)
 {
@@ -6455,8 +6469,11 @@ static gboolean
 cursor_blinks (GtkText *self)
 {
   GtkTextPrivate *priv = gtk_text_get_instance_private (self);
+  GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (self));
 
-  if (gtk_event_controller_focus_is_focus (GTK_EVENT_CONTROLLER_FOCUS (priv->focus_controller)) &&
+  if (gtk_widget_get_mapped (GTK_WIDGET (self)) &&
+      gtk_window_is_active (GTK_WINDOW (root)) &&
+      gtk_event_controller_focus_is_focus (GTK_EVENT_CONTROLLER_FOCUS (priv->focus_controller)) &&
       priv->editable &&
       priv->selection_bound == priv->current_pos)
     {