[gtk+] TextView—Fix inverted movements by arrows in RTL
- From: Daniel Boles <dboles src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] TextView—Fix inverted movements by arrows in RTL
- Date: Sun, 19 Feb 2017 12:40:55 +0000 (UTC)
commit 0128b8d33f47c9387ee342a1158f3038e02eff49
Author: Daniel Boles <dboles src gnome org>
Date: Sat Feb 18 22:50:00 2017 +0000
TextView—Fix inverted movements by arrows in RTL
Using Ctrl + left/right to skip between words, or left/right to cancel a
selection, were causing movement on the screen in the opposite direction
of the glyph on the key. This was surprising and awful UX for RTL users.
This is based on a patch covering the former case by:
Author: Mehdi Sadeghi <mehdi mehdix org>
Date: Sat Feb 18 02:16:00 2017 +0000
https://bugzilla.gnome.org/show_bug.cgi?id=136059
gtk/gtktextview.c | 20 +++++++++++++++++++-
1 files changed, 19 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 7f4f79a..1ab5f47 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -6343,6 +6343,17 @@ move_cursor (GtkTextView *text_view,
gtk_text_view_check_cursor_blink (text_view);
}
+static gboolean
+iter_line_is_rtl (GtkTextIter *iter, GtkTextLayout *layout)
+{
+ GtkTextLine *line = _gtk_text_iter_get_text_line (iter);
+ GtkTextLineDisplay *display = gtk_text_layout_get_line_display (layout, line, FALSE);
+ const gchar *text = pango_layout_get_text (display->layout);
+ PangoDirection pango_dir = pango_find_base_dir (text, -1);
+
+ return pango_dir == PANGO_DIRECTION_RTL;
+}
+
static void
gtk_text_view_move_cursor (GtkTextView *text_view,
GtkMovementStep step,
@@ -6437,15 +6448,19 @@ gtk_text_view_move_cursor (GtkTextView *text_view,
if (! extend_selection)
{
+ gboolean move_forward = count > 0;
GtkTextIter sel_bound;
gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &sel_bound,
gtk_text_buffer_get_selection_bound (get_buffer (text_view)));
+ if (iter_line_is_rtl (&insert, priv->layout))
+ move_forward = !move_forward;
+
/* if we move forward, assume the cursor is at the end of the selection;
* if we move backward, assume the cursor is at the start
*/
- if (count > 0)
+ if (move_forward)
gtk_text_iter_order (&sel_bound, &insert);
else
gtk_text_iter_order (&insert, &sel_bound);
@@ -6477,6 +6492,9 @@ gtk_text_view_move_cursor (GtkTextView *text_view,
break;
case GTK_MOVEMENT_WORDS:
+ if (iter_line_is_rtl (&newplace, priv->layout))
+ count *= -1;
+
if (count < 0)
gtk_text_iter_backward_visible_word_starts (&newplace, -count);
else if (count > 0)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]