[gtk/ebassi/a11y-text-extents] a11y: Implement atspi.Text.GetCharacterExtents for GtkTextView




commit 7750a2c42362db7d2de7a0b05efd17372dcfc625
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Mon May 23 15:54:13 2022 +0100

    a11y: Implement atspi.Text.GetCharacterExtents for GtkTextView
    
    Retrieve the location of a given offset in window-relative coordinate
    space.

 gtk/a11y/gtkatspitext.c | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)
---
diff --git a/gtk/a11y/gtkatspitext.c b/gtk/a11y/gtkatspitext.c
index 338357f6d3..5bac320813 100644
--- a/gtk/a11y/gtkatspitext.c
+++ b/gtk/a11y/gtkatspitext.c
@@ -1098,7 +1098,40 @@ text_view_handle_method (GDBusConnection       *connection,
     }
   else if (g_strcmp0 (method_name, "GetCharacterExtents") == 0)
     {
-      g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED, 
"");
+      int offset = 0;
+      guint coords_type;
+
+      g_variant_get (parameters, "(iu)", &offset, &coords_type);
+
+      if (coords_type != ATSPI_COORD_TYPE_WINDOW)
+        {
+          g_dbus_method_invocation_return_error_literal (invocation,
+                                                         G_DBUS_ERROR,
+                                                         G_DBUS_ERROR_NOT_SUPPORTED,
+                                                         "Unsupported coordinate space");
+          return;
+        }
+
+      GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
+
+      GtkTextIter iter;
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
+
+      GdkRectangle rect = { 0, };
+      gtk_text_view_get_iter_location (GTK_TEXT_VIEW (widget), &iter, &rect);
+
+      int x, y;
+      gtk_text_view_buffer_to_window_coords (GTK_TEXT_VIEW (widget),
+                                             GTK_TEXT_WINDOW_WIDGET,
+                                             rect.x, rect.y,
+                                             &x, &y);
+
+      g_dbus_method_invocation_return_value (invocation,
+                                             g_variant_new ("(iiii)",
+                                                            x,
+                                                            y,
+                                                            rect.width,
+                                                            rect.height));
     }
   else if (g_strcmp0 (method_name, "GetRangeExtents") == 0)
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]