[gtk+/wip/baedert/focus: 18/20] Widget: Shuffle focus code around
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/focus: 18/20] Widget: Shuffle focus code around
- Date: Fri, 10 Feb 2017 20:56:23 +0000 (UTC)
commit 436714743437ffe176f25eb06b7bea544f022c85
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 dc84149..2d478d1 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]