summaryrefslogtreecommitdiff
path: root/gtk/gtkwidgetfocus.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkwidgetfocus.c')
-rw-r--r--gtk/gtkwidgetfocus.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/gtk/gtkwidgetfocus.c b/gtk/gtkwidgetfocus.c
index af68bd7a56..26f7f8ae24 100644
--- a/gtk/gtkwidgetfocus.c
+++ b/gtk/gtkwidgetfocus.c
@@ -155,15 +155,11 @@ static gboolean
old_focus_coords (GtkWidget *widget,
graphene_rect_t *old_focus_bounds)
{
- GtkWidget *toplevel = _gtk_widget_get_toplevel (widget);
GtkWidget *old_focus;
- if (GTK_IS_WINDOW (toplevel))
- {
- old_focus = gtk_window_get_focus (GTK_WINDOW (toplevel));
- if (old_focus)
- return gtk_widget_compute_bounds (old_focus, widget, old_focus_bounds);
- }
+ old_focus = gtk_root_get_focus (gtk_widget_get_root (widget));
+ if (old_focus)
+ return gtk_widget_compute_bounds (old_focus, widget, old_focus_bounds);
return FALSE;
}
@@ -426,7 +422,9 @@ gtk_widget_focus_sort (GtkWidget *widget,
child != NULL;
child = _gtk_widget_get_next_sibling (child))
{
- if (_gtk_widget_get_realized (child))
+ if (_gtk_widget_get_realized (child) &&
+ _gtk_widget_is_drawable (child) &&
+ gtk_widget_get_sensitive (child))
g_ptr_array_add (focus_order, child);
}
}
@@ -454,13 +452,17 @@ gtk_widget_focus_sort (GtkWidget *widget,
gboolean
gtk_widget_focus_move (GtkWidget *widget,
- GtkDirectionType direction,
- GPtrArray *focus_order)
+ GtkDirectionType direction)
{
+ GPtrArray *focus_order;
GtkWidget *focus_child = gtk_widget_get_focus_child (widget);
int i;
+ gboolean ret = FALSE;
- for (i = 0; i < focus_order->len; i ++)
+ focus_order = g_ptr_array_new ();
+ gtk_widget_focus_sort (widget, direction, focus_order);
+
+ for (i = 0; i < focus_order->len && !ret; i++)
{
GtkWidget *child = g_ptr_array_index (focus_order, i);
@@ -469,18 +471,17 @@ gtk_widget_focus_move (GtkWidget *widget,
if (focus_child == child)
{
focus_child = NULL;
-
- if (gtk_widget_child_focus (child, direction))
- return TRUE;
+ ret = gtk_widget_child_focus (child, direction);
}
}
else if (_gtk_widget_is_drawable (child) &&
gtk_widget_is_ancestor (child, widget))
{
- if (gtk_widget_child_focus (child, direction))
- return TRUE;
+ ret = gtk_widget_child_focus (child, direction);
}
}
- return FALSE;
+ g_ptr_array_unref (focus_order);
+
+ return ret;
}