summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-04-14 11:36:19 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-04-14 11:36:19 +0000
commit00916c2b47bf4281a6bd95454b436fac856f6524 (patch)
tree93d575b9531d096c53a6e962335aa519ae35b453
parenta2599c2bb938b0b1afa9bed2f762d18772aa5fc0 (diff)
parente3320633a63e706c0681b20deee50dfb25ee2f97 (diff)
downloadgtk+-00916c2b47bf4281a6bd95454b436fac856f6524.tar.gz
Merge branch 'fix_link_tabs' into 'main'
label: Move focus out of widget after last link Closes #4681 See merge request GNOME/gtk!4636
-rw-r--r--gtk/gtklabel.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 7560e551fe..04ae996c20 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -1793,6 +1793,7 @@ gtk_label_focus (GtkWidget *widget,
{
info->selection_anchor = focus_link->start;
info->selection_end = focus_link->start;
+ break;
}
}
}
@@ -1856,7 +1857,6 @@ gtk_label_focus (GtkWidget *widget,
{
int focus_link_index;
int new_index = -1;
- int i;
if (info->n_links == 0)
goto out;
@@ -1870,29 +1870,39 @@ gtk_label_focus (GtkWidget *widget,
{
case GTK_DIR_TAB_FORWARD:
if (focus_link)
- new_index = (focus_link_index + 1) % info->n_links;
+ new_index = focus_link_index + 1;
else
new_index = 0;
- for (i = new_index; i < info->n_links; i++)
+ if (new_index >= info->n_links)
+ goto out;
+
+ while (new_index < info->n_links)
{
- const GtkLabelLink *link = &info->links[i];
+ const GtkLabelLink *link = &info->links[new_index];
if (!range_is_in_ellipsis (self, link->start, link->end))
break;
+
+ new_index++;
}
break;
case GTK_DIR_TAB_BACKWARD:
if (focus_link)
- new_index = focus_link_index == 0 ? info->n_links - 1 : focus_link_index - 1;
+ new_index = focus_link_index - 1;
else
new_index = info->n_links - 1;
- for (i = new_index; i >= 0; i--)
+ if (new_index < 0)
+ goto out;
+
+ while (new_index >= 0)
{
- const GtkLabelLink *link = &info->links[i];
+ const GtkLabelLink *link = &info->links[new_index];
if (!range_is_in_ellipsis (self, link->start, link->end))
break;
+
+ new_index--;
}
break;
@@ -1904,7 +1914,7 @@ gtk_label_focus (GtkWidget *widget,
goto out;
}
- if (new_index != -1)
+ if (new_index != -1 && new_index < info->n_links)
{
focus_link = &info->links[new_index];
info->selection_anchor = focus_link->start;