[gtk+] Widget: Shuffle focus code around



commit 6e9d8577147de7856e7b937cb633088db2193164
Author: Timm Bäder <mail baedert org>
Date:   Fri Feb 10 16:58:17 2017 +0100

    Widget: Shuffle focus code around

 gtk/gtkwidget.c |   55 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 29 insertions(+), 26 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f01ebdd..ee67492 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -7310,44 +7310,47 @@ static gboolean
 gtk_widget_real_focus (GtkWidget         *widget,
                        GtkDirectionType   direction)
 {
-  if (!gtk_widget_get_can_focus (widget))
+  if (gtk_widget_get_can_focus (widget))
+    {
+      if (!gtk_widget_is_focus (widget))
+        {
+          gtk_widget_grab_focus (widget);
+          return TRUE;
+        }
+    }
+  else
     {
       /* @widget can't be focused, but maybe one of its child widgets. */
       GtkWidget *focus_child = gtk_widget_get_focus_child (widget);
       GtkWidget *child;
 
-      for (child = _gtk_widget_get_first_child (widget);
+      if (focus_child != NULL)
+        {
+          if (gtk_widget_child_focus (focus_child, direction))
+            return TRUE;
+
+          child = focus_child;
+        }
+      else
+        {
+          child = _gtk_widget_get_first_child (widget);
+        }
+
+      /* The current focus child didn't handle the focus, so lets'
+         try all its siblings. If  none of them accepts it, we simply
+         have to return FALSE since we couldn't handle it either. */
+      for (;
            child != NULL;
            child = _gtk_widget_get_next_sibling (child))
         {
-          if (focus_child)
-            {
-              if (focus_child == child)
-                {
-                  focus_child = NULL;
 
-                  if (gtk_widget_child_focus (child, direction))
-                    return TRUE;
-                }
-            }
-          else if (_gtk_widget_is_drawable (child) &&
-                   gtk_widget_is_ancestor (child, widget))
-            {
-              if (gtk_widget_child_focus (child, direction))
-                  return TRUE;
-            }
+          if (_gtk_widget_is_drawable (child) &&
+              gtk_widget_child_focus (child, direction))
+            return TRUE;
         }
-
-      return FALSE;
     }
 
-  if (!gtk_widget_is_focus (widget))
-    {
-      gtk_widget_grab_focus (widget);
-      return TRUE;
-    }
-  else
-    return FALSE;
+  return FALSE;
 }
 
 static void


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