[gtk+] texthandle: Handle ltr/rtl positioning



commit 3a7689bae0005e003037785ea8a51ce9a4b4a07f
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jun 10 20:52:02 2015 +0200

    texthandle: Handle ltr/rtl positioning
    
    This setting is per handle, as is dependent on the selected text, rather
    than the locale.

 gtk/gtktexthandle.c        |   29 ++++++++++++++++++++++++++++-
 gtk/gtktexthandleprivate.h |    3 +++
 2 files changed, 31 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c
index 3ab33c6..231c4f4 100644
--- a/gtk/gtktexthandle.c
+++ b/gtk/gtktexthandle.c
@@ -47,6 +47,7 @@ struct _HandleWindow
   GtkBorder border;
   gint dx;
   gint dy;
+  GtkTextDirection dir;
   guint dragged : 1;
   guint mode_visible : 1;
   guint user_visible : 1;
@@ -296,6 +297,8 @@ _gtk_text_handle_ensure_widget (GtkTextHandle         *handle,
                              GDK_LEAVE_NOTIFY_MASK |
                              GDK_POINTER_MOTION_MASK);
 
+      gtk_widget_set_direction (widget, priv->windows[pos].dir);
+
       g_signal_connect (widget, "draw",
                         G_CALLBACK (gtk_text_handle_widget_draw), handle);
       g_signal_connect (widget, "event",
@@ -393,7 +396,10 @@ _gtk_text_handle_update (GtkTextHandle         *handle,
       if (pos == GTK_TEXT_HANDLE_POSITION_CURSOR &&
           priv->mode == GTK_TEXT_HANDLE_MODE_CURSOR)
         rect.x -= rect.width / 2;
-      else if (pos == GTK_TEXT_HANDLE_POSITION_SELECTION_START)
+      else if ((pos == GTK_TEXT_HANDLE_POSITION_CURSOR &&
+                handle_window->dir == GTK_TEXT_DIR_RTL) ||
+               (pos == GTK_TEXT_HANDLE_POSITION_SELECTION_START &&
+                handle_window->dir != GTK_TEXT_DIR_RTL))
         rect.x -= rect.width;
 
       border->top = height;
@@ -828,3 +834,24 @@ _gtk_text_handle_get_is_dragged (GtkTextHandle         *handle,
 
   return priv->windows[pos].dragged;
 }
+
+void
+_gtk_text_handle_set_direction (GtkTextHandle         *handle,
+                                GtkTextHandlePosition  pos,
+                                GtkTextDirection       dir)
+{
+  GtkTextHandlePrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_TEXT_HANDLE (handle), FALSE);
+
+  priv = handle->priv;
+  pos = CLAMP (pos, GTK_TEXT_HANDLE_POSITION_CURSOR,
+               GTK_TEXT_HANDLE_POSITION_SELECTION_START);
+  priv->windows[pos].dir = dir;
+
+  if (priv->windows[pos].widget)
+    {
+      gtk_widget_set_direction (priv->windows[pos].widget, dir);
+      _gtk_text_handle_update (handle, pos);
+    }
+}
diff --git a/gtk/gtktexthandleprivate.h b/gtk/gtktexthandleprivate.h
index ec826fd..c79aa04 100644
--- a/gtk/gtktexthandleprivate.h
+++ b/gtk/gtktexthandleprivate.h
@@ -81,6 +81,9 @@ void            _gtk_text_handle_set_visible  (GtkTextHandle         *handle,
 
 gboolean        _gtk_text_handle_get_is_dragged (GtkTextHandle         *handle,
                                                  GtkTextHandlePosition  pos);
+void            _gtk_text_handle_set_direction (GtkTextHandle         *handle,
+                                                GtkTextHandlePosition  pos,
+                                                GtkTextDirection       dir);
 
 G_END_DECLS
 


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