widgetfocus: Sort children better for TAB
authorMatthias Clasen <mclasen@redhat.com>
Thu, 11 May 2023 19:35:27 +0000 (15:35 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 11 May 2023 19:35:27 +0000 (15:35 -0400)
When tabbing in a box, we really want to sort
children just along the main axis. Make it so.

gtk/gtkwidgetfocus.c

index df1c562ac6c834b066b9333c9e093650cf66f4ee..4dc8f28fd58517883b177954a7835c21eefb454c 100644 (file)
@@ -17,6 +17,8 @@
 
 #include "gtkwidgetprivate.h"
 #include "gtknative.h"
+#include "gtkboxlayout.h"
+#include "gtkorientable.h"
 
 typedef struct _CompareInfo CompareInfo;
 
@@ -434,7 +436,29 @@ gtk_widget_focus_sort (GtkWidget        *widget,
     {
     case GTK_DIR_TAB_FORWARD:
     case GTK_DIR_TAB_BACKWARD:
-      focus_sort_tab (widget, direction, focus_order);
+      {
+        GtkLayoutManager *layout = gtk_widget_get_layout_manager (widget);
+        if (GTK_IS_BOX_LAYOUT (layout))
+          {
+            GtkOrientation orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (layout));
+            if (orientation == GTK_ORIENTATION_HORIZONTAL)
+              {
+                if (direction == GTK_DIR_TAB_FORWARD)
+                  focus_sort_left_right (widget, GTK_DIR_RIGHT, focus_order);
+                else
+                  focus_sort_left_right (widget, GTK_DIR_LEFT, focus_order);
+              }
+            else
+              {
+                if (direction == GTK_DIR_TAB_FORWARD)
+                  focus_sort_up_down (widget, GTK_DIR_DOWN, focus_order);
+                else
+                  focus_sort_up_down (widget, GTK_DIR_UP, focus_order);
+              }
+          }
+        else
+          focus_sort_tab (widget, direction, focus_order);
+      }
       break;
     case GTK_DIR_UP:
     case GTK_DIR_DOWN: