[gtk: 1/2] label: Move focus out of widget after last link
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 1/2] label: Move focus out of widget after last link
- Date: Thu, 14 Apr 2022 11:36:20 +0000 (UTC)
commit e3320633a63e706c0681b20deee50dfb25ee2f97
Author: Julian Sparber <julian sparber net>
Date: Thu Apr 14 12:14:17 2022 +0200
label: Move focus out of widget after last link
This allows the user to navigate via tab the links in a label and exits
the widget after the last link, when moving forward, and first link,
when moving backward.
This also ensures that ellipsised links arn't focused.
Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4681
gtk/gtklabel.c | 26 ++++++++++++++++++--------
1 file 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]