From f9be809bc60236fed70672a9cd4bf9a602928b03 Mon Sep 17 00:00:00 2001 From: Christian Neumair Date: Tue, 6 May 2008 21:26:57 +0000 Subject: [PATCH] Wrap to next row/column when pressing arrow key, except if a11y is used. 2008-05-06 Christian Neumair * libnautilus-private/nautilus-icon-container.c (next_row_leftmost), (previous_row_rightmost), (next_column_highest), (previous_column_lowest), (last_column_lowest), (keyboard_end), (keyboard_arrow_key), (keyboard_right), (keyboard_left), (keyboard_down), (keyboard_up): Wrap to next row/column when pressing arrow key, except if a11y is used. Fixes #526802. For vertical layout, make the "End" key select bottom item in last column, instead of the last item in the bottom row. svn path=/trunk/; revision=14143 --- ChangeLog | 12 ++ libnautilus-private/nautilus-icon-container.c | 158 +++++++++++++++++- 2 files changed, 169 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 96fe9ba32..6b7075d1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-05-06 Christian Neumair + + * libnautilus-private/nautilus-icon-container.c + (next_row_leftmost), (previous_row_rightmost), + (next_column_highest), (previous_column_lowest), + (last_column_lowest), (keyboard_end), (keyboard_arrow_key), + (keyboard_right), (keyboard_left), (keyboard_down), (keyboard_up): + Wrap to next row/column when pressing arrow key, except if a11y is + used. Fixes #526802. + For vertical layout, make the "End" key select bottom item in last + column, instead of the last item in the bottom row. + 2008-05-05 A. Walton * libnautilus-private/nautilus-global-preferences.h: diff --git a/libnautilus-private/nautilus-icon-container.c b/libnautilus-private/nautilus-icon-container.c index 3de49428f..666201e4c 100644 --- a/libnautilus-private/nautilus-icon-container.c +++ b/libnautilus-private/nautilus-icon-container.c @@ -2806,6 +2806,66 @@ same_row_left_side_rightmost (NautilusIconContainer *container, return TRUE; } +static gboolean +next_row_leftmost (NautilusIconContainer *container, + NautilusIcon *start_icon, + NautilusIcon *best_so_far, + NautilusIcon *candidate, + void *data) +{ + /* sort out icons that are not below the current row */ + if (compare_with_start_row (container, candidate) >= 0) { + return FALSE; + } + + if (best_so_far != NULL) { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) { + /* candidate is above best choice, but below the current row */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) { + return TRUE; + } + } + + return best_so_far == NULL; +} + +static gboolean +previous_row_rightmost (NautilusIconContainer *container, + NautilusIcon *start_icon, + NautilusIcon *best_so_far, + NautilusIcon *candidate, + void *data) +{ + /* sort out icons that are not above the current row */ + if (compare_with_start_row (container, candidate) <= 0) { + return FALSE; + } + + if (best_so_far != NULL) { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) { + /* candidate is below the best choice, but above the current row */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) { + return TRUE; + } + } + + return best_so_far == NULL; +} + static gboolean same_column_above_lowest (NautilusIconContainer *container, NautilusIcon *start_icon, @@ -2868,6 +2928,79 @@ same_column_below_highest (NautilusIconContainer *container, return TRUE; } +static gboolean +next_column_highest (NautilusIconContainer *container, + NautilusIcon *start_icon, + NautilusIcon *best_so_far, + NautilusIcon *candidate, + void *data) +{ + /* sort out icons that are not after the current column */ + if (compare_with_start_column (container, candidate) >= 0) { + return FALSE; + } + + if (best_so_far != NULL) { + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) > 0) { + /* candidate is left of the best choice, but right of the current column */ + return TRUE; + } + + if (compare_icons_vertical_first (container, + best_so_far, + candidate) > 0) { + return TRUE; + } + } + + return best_so_far == NULL; +} + +static gboolean +previous_column_lowest (NautilusIconContainer *container, + NautilusIcon *start_icon, + NautilusIcon *best_so_far, + NautilusIcon *candidate, + void *data) +{ + /* sort out icons that are not before the current column */ + if (compare_with_start_column (container, candidate) <= 0) { + return FALSE; + } + + if (best_so_far != NULL) { + if (compare_icons_vertical_first (container, + best_so_far, + candidate) < 0) { + /* candidate is right of the best choice, but left of the current column */ + return TRUE; + } + + if (compare_icons_horizontal_first (container, + best_so_far, + candidate) < 0) { + return TRUE; + } + } + + return best_so_far == NULL; +} + +static gboolean +last_column_lowest (NautilusIconContainer *container, + NautilusIcon *start_icon, + NautilusIcon *best_so_far, + NautilusIcon *candidate, + void *data) +{ + if (best_so_far == NULL) { + return TRUE; + } + return compare_icons_horizontal_first (container, best_so_far, candidate) < 0; +} + static gboolean closest_in_90_degrees (NautilusIconContainer *container, NautilusIcon *start_icon, @@ -3036,7 +3169,11 @@ keyboard_end (NautilusIconContainer *container, from = find_best_selected_icon (container, NULL, leftmost_in_top_row, NULL); - to = find_best_icon (container, NULL, rightmost_in_bottom_row, NULL); + to = find_best_icon (container, NULL, + nautilus_icon_container_is_layout_vertical (container) ? + last_column_lowest : + rightmost_in_bottom_row, + NULL); container->details->arrow_key_axis = AXIS_NONE; keyboard_move_to (container, to, from, event); @@ -3082,6 +3219,7 @@ keyboard_arrow_key (NautilusIconContainer *container, IsBetterIconFunction better_start, IsBetterIconFunction empty_start, IsBetterIconFunction better_destination, + IsBetterIconFunction better_destination_fallback_if_no_a11y, IsBetterIconFunction better_destination_manual) { NautilusIcon *from; @@ -3128,6 +3266,20 @@ keyboard_arrow_key (NautilusIconContainer *container, (container, from, container->details->auto_layout ? better_destination : better_destination_manual, &data); + + /* only wrap around to next/previous row/column if no a11y is used. + * Visually impaired people may be easily confused by this. + */ + if (to == NULL && + better_destination_fallback_if_no_a11y != NULL && + container->details->auto_layout && + ATK_IS_NO_OP_OBJECT (gtk_widget_get_accessible (GTK_WIDGET (container)))) { + to = find_best_icon + (container, from, + better_destination_fallback_if_no_a11y, + &data); + } + } keyboard_move_to (container, to, from, event); @@ -3146,6 +3298,7 @@ keyboard_right (NautilusIconContainer *container, rightmost_in_bottom_row, leftmost_in_top_row, same_row_right_side_leftmost, + next_row_leftmost, closest_in_90_degrees); } @@ -3162,6 +3315,7 @@ keyboard_left (NautilusIconContainer *container, leftmost_in_top_row, rightmost_in_bottom_row, same_row_left_side_rightmost, + previous_row_rightmost, closest_in_90_degrees); } @@ -3178,6 +3332,7 @@ keyboard_down (NautilusIconContainer *container, rightmost_in_bottom_row, leftmost_in_top_row, same_column_below_highest, + next_column_highest, closest_in_90_degrees); } @@ -3194,6 +3349,7 @@ keyboard_up (NautilusIconContainer *container, leftmost_in_top_row, rightmost_in_bottom_row, same_column_above_lowest, + previous_column_lowest, closest_in_90_degrees); } -- GitLab