gtktextviewaccessible: update cursor position after text suppression
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 4 Apr 2018 16:18:29 +0000 (18:18 +0200)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 4 Apr 2018 16:26:55 +0000 (18:26 +0200)
delete_range_cb is set to be called before the text suppression done by
the gtktextlayout (otherwise it does not work properly). But at that
point the cursor position is not yet up to date.  We thus need to move
the accessibility cursor notification to after the actual text
suppression, by using another callback.

This fixes cursor position in brltty screen reading.

(cherry picked from commit fa6994d0331a219e85dce01007b2d6f3f7fd43c9)

gtk/a11y/gtktextviewaccessible.c

index 3d46ed1ba084a59ca0abb56591ae164394705e51..b6b5a657f279706c8fe8fd7db8806485ddbe82d1 100644 (file)
@@ -39,19 +39,23 @@ struct _GtkTextViewAccessiblePrivate
   gint selection_bound;
 };
 
-static void       insert_text_cb       (GtkTextBuffer    *buffer,
-                                                        GtkTextIter      *arg1,
-                                                        gchar            *arg2,
-                                                        gint             arg3,
-                                                        gpointer         user_data);
-static void       delete_range_cb      (GtkTextBuffer    *buffer,
-                                                        GtkTextIter      *arg1,
-                                                        GtkTextIter      *arg2,
-                                                        gpointer         user_data);
-static void       mark_set_cb          (GtkTextBuffer    *buffer,
-                                                        GtkTextIter      *arg1,
-                                                        GtkTextMark      *arg2,
-                                                        gpointer         user_data);
+static void       insert_text_cb        (GtkTextBuffer    *buffer,
+                                                         GtkTextIter      *arg1,
+                                                         gchar            *arg2,
+                                                         gint             arg3,
+                                                         gpointer         user_data);
+static void       delete_range_cb       (GtkTextBuffer    *buffer,
+                                                         GtkTextIter      *arg1,
+                                                         GtkTextIter      *arg2,
+                                                         gpointer         user_data);
+static void       delete_range_after_cb (GtkTextBuffer    *buffer,
+                                                         GtkTextIter      *arg1,
+                                                         GtkTextIter      *arg2,
+                                                         gpointer         user_data);
+static void       mark_set_cb           (GtkTextBuffer    *buffer,
+                                                         GtkTextIter      *arg1,
+                                                         GtkTextMark      *arg2,
+                                                         gpointer         user_data);
 
 
 static void atk_editable_text_interface_init      (AtkEditableTextIface      *iface);
@@ -132,6 +136,7 @@ gtk_text_view_accessible_change_buffer (GtkTextViewAccessible *accessible,
     {
       g_signal_connect_after (new_buffer, "insert-text", G_CALLBACK (insert_text_cb), accessible);
       g_signal_connect (new_buffer, "delete-range", G_CALLBACK (delete_range_cb), accessible);
+      g_signal_connect_after (new_buffer, "delete-range", G_CALLBACK (delete_range_after_cb), accessible);
       g_signal_connect_after (new_buffer, "mark-set", G_CALLBACK (mark_set_cb), accessible);
 
       g_signal_emit_by_name (accessible,
@@ -1801,6 +1806,15 @@ delete_range_cb (GtkTextBuffer *buffer,
                          "text-changed::delete",
                          offset,
                          length);
+}
+
+static void
+delete_range_after_cb (GtkTextBuffer *buffer,
+                       GtkTextIter   *start,
+                       GtkTextIter   *end,
+                       gpointer       data)
+{
+  GtkTextViewAccessible *accessible = data;
 
   gtk_text_view_accessible_update_cursor (accessible, buffer);
 }