diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-10-08 19:47:34 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-10-08 19:47:34 +0000 |
commit | b34cfc89e61684b8d1da26cbae305e405ecf1f8b (patch) | |
tree | a032b7e3b79a33c9f5b431147aacfe732fd7cab0 | |
parent | 40af368523b5a32b977c8eb810fc0acb42cb5ac7 (diff) | |
parent | df670047ea2fafb558dac1b148998735396ef857 (diff) | |
download | gtk+-b34cfc89e61684b8d1da26cbae305e405ecf1f8b.tar.gz |
Merge branch 'scrollto' into 'gtk-3-24'
Implement ATK's scrollSubstringTo()
See merge request GNOME/gtk!2671
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | gtk/a11y/gtktextviewaccessible.c | 94 | ||||
-rw-r--r-- | meson.build | 5 |
3 files changed, 98 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index a26b03d3c3..38fd9a4804 100644 --- a/configure.ac +++ b/configure.ac @@ -56,7 +56,7 @@ GLIB_VERSION_CFLAGS="-DGLIB_MIN_REQUIRED_VERSION=glib_min_required_version -DGLI m4_define([pango_required_version], [1.41.0]) m4_define([fribidi_required_version], [0.19.7]) -m4_define([atk_required_version], [2.15.1]) +m4_define([atk_required_version], [2.32.0]) m4_define([cairo_required_version], [1.14.0]) m4_define([gdk_pixbuf_required_version], [2.30.0]) m4_define([introspection_required_version], [1.39.0]) diff --git a/gtk/a11y/gtktextviewaccessible.c b/gtk/a11y/gtktextviewaccessible.c index c1092026bf..f490d3043d 100644 --- a/gtk/a11y/gtktextviewaccessible.c +++ b/gtk/a11y/gtktextviewaccessible.c @@ -1309,6 +1309,99 @@ gtk_text_view_accessible_set_selection (AtkText *text, return FALSE; } +static gboolean +gtk_text_view_accessible_scroll_substring_to(AtkText *text, + gint start_offset, + gint end_offset, + AtkScrollType type) +{ + GtkTextView *view; + GtkWidget *widget; + GtkTextBuffer *buffer; + GtkTextIter iter; + gdouble xalign = -1.0, yalign = -1.0; + gboolean use_align = TRUE; + gint offset, rtl = 0; + + if (end_offset < start_offset) + return FALSE; + + widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text)); + if (widget == NULL) + return FALSE; + + view = GTK_TEXT_VIEW (widget); + buffer = gtk_text_view_get_buffer (view); + + if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) + rtl = 1; + + /* + * Opportunistically pick which offset should be used to calculate + * the scrolling factor. + * + * Considering only an extremity of the substring is good enough when + * the selected string doesn't include line break and isn't larger than + * the visible rectangle. + */ + switch (type) + { + case ATK_SCROLL_TOP_LEFT: + offset = (rtl) ? end_offset : start_offset; + xalign = 0.0; + yalign = 0.0; + break; + case ATK_SCROLL_BOTTOM_RIGHT: + offset = (rtl) ? start_offset : end_offset; + xalign = 1.0; + yalign = 1.0; + break; + case ATK_SCROLL_TOP_EDGE: + offset = start_offset; + yalign = 0.0; + break; + case ATK_SCROLL_BOTTOM_EDGE: + offset = end_offset; + yalign = 1.0; + break; + case ATK_SCROLL_LEFT_EDGE: + offset = (rtl) ? end_offset : start_offset; + xalign = 0.0; + break; + case ATK_SCROLL_RIGHT_EDGE: + offset = (rtl) ? start_offset : end_offset; + xalign = 1.0; + break; + case ATK_SCROLL_ANYWHERE: + offset = start_offset; + use_align = FALSE; + xalign = yalign = 0.0; + break; + default: + return FALSE; + } + + gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset); + + /* Get current iter location to be able to scroll in a single direction. */ + if (use_align && (xalign == -1.0 || yalign == -1.0)) + { + GdkRectangle rect, irect; + + gtk_text_view_get_visible_rect (view, &rect); + gtk_text_view_get_iter_location (view, &iter, &irect); + + if (xalign == -1.0) + xalign = ((gdouble) (irect.x - rect.x)) / (rect.width - 1); + if (yalign == -1.0) + yalign = ((gdouble) (irect.y - rect.y)) / (rect.height - 1); + } + + gtk_text_view_scroll_to_iter (view, &iter, 0, use_align, xalign, yalign); + + return TRUE; +} + static void atk_text_interface_init (AtkTextIface *iface) { @@ -1329,6 +1422,7 @@ atk_text_interface_init (AtkTextIface *iface) iface->set_selection = gtk_text_view_accessible_set_selection; iface->get_run_attributes = gtk_text_view_accessible_get_run_attributes; iface->get_default_attributes = gtk_text_view_accessible_get_default_attributes; + iface->scroll_substring_to = gtk_text_view_accessible_scroll_substring_to; } /* atkeditabletext.h */ diff --git a/meson.build b/meson.build index 9c80fafc03..94ccb81432 100644 --- a/meson.build +++ b/meson.build @@ -26,7 +26,8 @@ endif glib_req = '>= @0@.@1@.@2@'.format(glib_major_req, glib_minor_req, glib_micro_req) pango_req = '>= 1.41.0' fribidi_req = '>= 0.19.7' -atk_req = '>= 2.15.1' +atk_req = '>= 2.32.0' +at_spi2_atk_req = '>= 2.15.1' cairo_req = '>= 1.14.0' gdk_pixbuf_req = '>= 2.30.0' introspection_req = '>= 1.39.0' @@ -575,7 +576,7 @@ if x11_enabled xfixes_dep = dependency('xfixes', required: false) xcomposite_dep = dependency('xcomposite', required: false) fontconfig_dep = dependency('fontconfig', fallback: ['fontconfig', 'fontconfig_dep']) - atkbridge_dep = dependency('atk-bridge-2.0', version: atk_req) + atkbridge_dep = dependency('atk-bridge-2.0', version: at_spi2_atk_req) x11_pkgs = ['fontconfig', 'x11', 'xext', 'xi', 'xrandr'] |