summaryrefslogtreecommitdiffstats
path: root/debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch')
-rw-r--r--debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch b/debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch
new file mode 100644
index 0000000..0378ab0
--- /dev/null
+++ b/debian/patches/keyboard-Resort-refilter-list-when-picking-shortlist.patch
@@ -0,0 +1,96 @@
+From: Will Thompson <wjt@endlessos.org>
+Date: Fri, 3 Mar 2023 13:17:18 +0000
+Subject: keyboard: Resort & refilter list when picking shortlist
+
+Each row of the keyboard layout/input method list has a flag for whether
+it is an "extra" layout, hidden by default, or not. All rows are added
+with the is_extra flag set to TRUE; later, they can be marked as
+non-extra in a few ways:
+
+- The currently-selected layout is (indirectly) marked as non-extra
+- Selecting a layout marks it as non-extra
+- 5 semi-arbitrary layouts are marked as non-extra
+
+To make the list work, the GtkListBox has sort and filter functions set:
+
+- The sort function sorts extra layouts after non-extra layouts
+- The filter function hides extra layouts, unless the user is searching
+ or has clicked the vertical ellipsis to see all layouts
+
+But previously, the sort and filter of the list were not always
+invalidated when one or more layouts' is_extra flags were changed. As a
+result, the list always showed no layouts by default, just the vertical
+ellipsis to see all layouts.
+
+Fix this by invalidating both sort and filter when a layout is marked
+non-extra.
+
+Bug: https://gitlab.gnome.org/GNOME/gnome-initial-setup/-/issues/165
+Origin: upstream, 44.rc, commit:151688f670e8c6f5ecc8a7bac686ddcc815cdf11
+---
+ .../pages/keyboard/cc-input-chooser.c | 22 +++++++++++++++++++---
+ 1 file changed, 19 insertions(+), 3 deletions(-)
+
+diff --git a/gnome-initial-setup/pages/keyboard/cc-input-chooser.c b/gnome-initial-setup/pages/keyboard/cc-input-chooser.c
+index efba249..2dd58e9 100644
+--- a/gnome-initial-setup/pages/keyboard/cc-input-chooser.c
++++ b/gnome-initial-setup/pages/keyboard/cc-input-chooser.c
+@@ -259,6 +259,7 @@ sync_all_checkmarks (CcInputChooser *chooser)
+ {
+ CcInputChooserPrivate *priv;
+ GtkWidget *row;
++ gboolean invalidate = FALSE;
+
+ priv = cc_input_chooser_get_instance_private (chooser);
+ row = gtk_widget_get_first_child (priv->input_list);
+@@ -271,7 +272,7 @@ sync_all_checkmarks (CcInputChooser *chooser)
+ widget = get_input_widget (child);
+
+ if (widget == NULL)
+- return;
++ break;
+
+ if (priv->id == NULL || priv->type == NULL)
+ should_be_visible = FALSE;
+@@ -280,13 +281,20 @@ sync_all_checkmarks (CcInputChooser *chooser)
+ g_strcmp0 (widget->type, priv->type) == 0;
+ gtk_widget_set_opacity (widget->checkmark, should_be_visible ? 1.0 : 0.0);
+
+- if (widget->is_extra && should_be_visible)
++ if (widget->is_extra && should_be_visible) {
++ g_debug ("Marking selected layout %s (%s:%s) as non-extra",
++ widget->name, widget->type, widget->id);
+ widget->is_extra = FALSE;
++ invalidate = TRUE;
++ }
+
+ row = gtk_widget_get_next_sibling (row);
+ }
+
+- gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->input_list));
++ if (invalidate) {
++ gtk_list_box_invalidate_sort (GTK_LIST_BOX (priv->input_list));
++ gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->input_list));
++ }
+ }
+
+ static GtkWidget *
+@@ -344,10 +352,18 @@ choose_non_extras (CcInputChooser *chooser)
+ if (widget == NULL)
+ break;
+
++ g_debug ("Picking %s (%s:%s) as non-extra",
++ widget->name, widget->type, widget->id);
+ widget->is_extra = FALSE;
+
+ row = gtk_widget_get_next_sibling (row);
+ }
++
++ /* Changing is_extra above affects the ordering and the visibility
++ * of the newly non-extra rows.
++ */
++ gtk_list_box_invalidate_sort (GTK_LIST_BOX (priv->input_list));
++ gtk_list_box_invalidate_filter (GTK_LIST_BOX (priv->input_list));
+ }
+
+ static void