[gnome-shell] st/scroll-bar: Fix horizontal bar in RTL locales



commit 0db41a3773eaf7d197d1dede4ec0d04f4b9aaf62
Author: Florian Müllner <fmuellner gnome org>
Date:   Tue Jun 16 23:07:08 2020 +0200

    st/scroll-bar: Fix horizontal bar in RTL locales
    
    As the view now scrolls from right-to-left in RTL locales, the
    scroll bar handle should reflect that.
    
    Likewise the event handling needs adjusting as well: Scrolling
    left should increase the adjustment value, and clicking the
    trough to the left of the handle as well.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1318

 src/st/st-scroll-bar.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 7 deletions(-)
---
diff --git a/src/st/st-scroll-bar.c b/src/st/st-scroll-bar.c
index 086da48f02..0bc4769a50 100644
--- a/src/st/st-scroll-bar.c
+++ b/src/st/st-scroll-bar.c
@@ -262,14 +262,25 @@ scroll_bar_allocate_children (StScrollBar           *bar,
         }
       else
         {
+          ClutterTextDirection direction;
+
           avail_size = content_box.x2 - content_box.x1;
           handle_size = increment * avail_size;
           handle_size = CLAMP (handle_size, min_size, max_size);
 
-          handle_box.x1 = content_box.x1 + position * (avail_size - handle_size);
-          handle_box.y1 = content_box.y1;
+          direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (bar));
+          if (direction == CLUTTER_TEXT_DIRECTION_RTL)
+            {
+              handle_box.x2 = content_box.x2 - position * (avail_size - handle_size);
+              handle_box.x1 = handle_box.x2 - handle_size;
+            }
+          else
+            {
+              handle_box.x1 = content_box.x1 + position * (avail_size - handle_size);
+              handle_box.x2 = handle_box.x1 + handle_size;
+            }
 
-          handle_box.x2 = handle_box.x1 + handle_size;
+          handle_box.y1 = content_box.y1;
           handle_box.y2 = content_box.y2;
         }
 
@@ -464,28 +475,40 @@ st_scroll_bar_scroll_event (ClutterActor       *actor,
                             ClutterScrollEvent *event)
 {
   StScrollBarPrivate *priv = ST_SCROLL_BAR_PRIVATE (actor);
+  ClutterTextDirection direction;
+  ClutterScrollDirection scroll_dir;
 
   if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
     return TRUE;
 
-  switch (event->direction)
+  direction = clutter_actor_get_text_direction (actor);
+  scroll_dir = event->direction;
+
+  switch (scroll_dir)
     {
     case CLUTTER_SCROLL_SMOOTH:
       {
         gdouble delta_x, delta_y;
         clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
 
+        if (direction == CLUTTER_TEXT_DIRECTION_RTL)
+          delta_x *= -1;
+
         if (priv->vertical)
           st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_y);
         else
           st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_x);
       }
       break;
-    case CLUTTER_SCROLL_UP:
-    case CLUTTER_SCROLL_DOWN:
     case CLUTTER_SCROLL_LEFT:
     case CLUTTER_SCROLL_RIGHT:
-      adjust_with_direction (priv->adjustment, event->direction);
+      if (direction == CLUTTER_TEXT_DIRECTION_RTL)
+          scroll_dir = scroll_dir == CLUTTER_SCROLL_LEFT ? CLUTTER_SCROLL_RIGHT
+                                                         : CLUTTER_SCROLL_LEFT;
+    /* Fall through */
+    case CLUTTER_SCROLL_UP:
+    case CLUTTER_SCROLL_DOWN:
+      adjust_with_direction (priv->adjustment, scroll_dir);
       break;
     default:
       g_return_val_if_reached (FALSE);
@@ -552,6 +575,7 @@ move_slider (StScrollBar *bar,
              gfloat       y)
 {
   StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (bar);
+  ClutterTextDirection direction;
   gdouble position, lower, upper, page_size;
   gfloat ux, uy, pos, size;
 
@@ -585,6 +609,10 @@ move_slider (StScrollBar *bar,
                             NULL,
                             &page_size);
 
+  direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (bar));
+  if (direction == CLUTTER_TEXT_DIRECTION_RTL)
+    pos = size - pos;
+
   position = ((pos / size)
               * (upper - lower - page_size))
              + lower;
@@ -668,6 +696,7 @@ static gboolean
 trough_paging_cb (StScrollBar *self)
 {
   StScrollBarPrivate *priv = st_scroll_bar_get_instance_private (self);
+  ClutterTextDirection direction;
   g_autoptr (ClutterTransition) transition = NULL;
   StSettings *settings;
   gfloat handle_pos, event_pos, tx, ty;
@@ -725,6 +754,10 @@ trough_paging_cb (StScrollBar *self)
                                        priv->move_y,
                                        &tx, &ty);
 
+  direction = clutter_actor_get_text_direction (CLUTTER_ACTOR (self));
+  if (direction == CLUTTER_TEXT_DIRECTION_RTL)
+    page_increment *= -1;
+
   if (priv->vertical)
     event_pos = ty;
   else


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