From nobody Wed Oct 8 22:33:19 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 888842EE980; Tue, 24 Jun 2025 15:08:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750777725; cv=none; b=qqawr3U0OkUzf+lLjJHhtspGD3n3NCo18HXOk1VnRzGcG8z0QTzKwWzmEl9sUimhuhQTE7kOvJHmzOMprrWUXLyx8uW5DvY298isDNRZpWUGno8rX+K0Jd45wY4fBMil+CLmpDztsgDlbG/yKpaEDAra5eulGGhOupgbmMQ3Pkk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750777725; c=relaxed/simple; bh=xp6446iJXQaQj/u0PWhIbBfp6TSCs3uvRB+uvz0SEZ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tsEaSpP8c/c66dGUDLAu3OafNztMw7qvBwF97SUsqsFA1kiATFxs/aZqm+rCAX2sOwbX2jkkLI8stwEzCYwqDfU+P62mnAzobrDrkUiwb/PTCXl8F0KnGyYNt5D8/KuIROGxsj2+De1ZsFmlxAqM2TDc52+jARJjkZD2FyJKYRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=S8SlOiFI; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="S8SlOiFI" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 347ADC4CEE3; Tue, 24 Jun 2025 15:08:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1750777725; bh=xp6446iJXQaQj/u0PWhIbBfp6TSCs3uvRB+uvz0SEZ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S8SlOiFIYJpF1C+2PRMsC7cLXAHMLdbJeXqkmTc7rC8Su0ahvTQXdfZlngIobBEOw Z1sayoA4YjjVQtZeRm6axJ2kK4aySJifS+aMxuVzU/PVNDLAiYeiWadvw7b5feeA8v fZbb6z009Z5GUYqVyQiBnOou/QtuJImOR83hbKL+xpJHGIqFIH0DukJhPpEAB3XUlW 417nH0WiWbO4J50SYx36FmSjXkANDtsN0X8foAQZwtNaF0jPpWXHhowSw/CDQT24jW ZWMwdXwxX5HF69bTq84JNbfXd+mCSyx4aOfrZWss5wjt44Vg1v9gogKF55gHFpHr5L 9MHf+oKJkpeIQ== From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Masahiro Yamada , linux-kernel@vger.kernel.org Subject: [PATCH 43/66] kconfig: gconf: preserve menu selection when switching view mode Date: Wed, 25 Jun 2025 00:05:31 +0900 Message-ID: <20250624150645.1107002-44-masahiroy@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250624150645.1107002-1-masahiroy@kernel.org> References: <20250624150645.1107002-1-masahiroy@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Preserve the current menu selection when switching to a different view mode, as it improves usability. Signed-off-by: Masahiro Yamada --- scripts/kconfig/gconf.c | 86 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index cf9345ba23ce..184678dd4fa6 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c @@ -47,6 +47,7 @@ static GtkTreeStore *tree1, *tree2; static GtkTreeModel *model1, *model2; =20 static struct menu *browsed; // browsed menu for SINGLE/SPLIT view +static struct menu *selected; // selected entry =20 enum { COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE, @@ -68,6 +69,47 @@ static void conf_changed(bool dirty) =20 /* Utility Functions */ =20 +static void _select_menu(GtkTreeView *view, GtkTreeModel *model, + GtkTreeIter *parent, struct menu *match) +{ + GtkTreeIter iter; + gboolean valid; + + valid =3D gtk_tree_model_iter_children(model, &iter, parent); + while (valid) { + struct menu *menu; + + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); + + if (menu =3D=3D match) { + GtkTreeSelection *selection; + GtkTreePath *path; + + /* + * Expand parents to reflect the selection, and + * scroll down to it. + */ + path =3D gtk_tree_model_get_path(model, &iter); + gtk_tree_view_expand_to_path(view, path); + gtk_tree_view_scroll_to_cell(view, path, NULL, TRUE, + 0.5, 0.0); + gtk_tree_path_free(path); + + selection =3D gtk_tree_view_get_selection(view); + gtk_tree_selection_select_iter(selection, &iter); + } + + _select_menu(view, model, &iter, match); + + valid =3D gtk_tree_model_iter_next(model, &iter); + } +} + +static void select_menu(GtkTreeView *view, struct menu *match) +{ + _select_menu(view, gtk_tree_view_get_model(view), NULL, match); +} + static void set_view_mode(enum view_mode mode) { view_mode =3D mode; @@ -89,24 +131,40 @@ static void set_view_mode(enum view_mode mode) =20 switch (mode) { case SINGLE_VIEW: - browsed =3D &rootmenu; + if (selected) + browsed =3D menu_get_parent_menu(selected) ?: &rootmenu; + else + browsed =3D &rootmenu; display_tree_part(); + select_menu(GTK_TREE_VIEW(tree2_w), selected); gtk_widget_set_sensitive(single_btn, FALSE); break; case SPLIT_VIEW: + browsed =3D NULL; + if (selected) { + if (selected->type =3D=3D M_MENU) + browsed =3D selected; + else + browsed =3D menu_get_parent_menu(selected); + } gtk_tree_store_clear(tree2); display_list(); + if (browsed) + display_tree(tree2, browsed); + select_menu(GTK_TREE_VIEW(tree1_w), browsed); + select_menu(GTK_TREE_VIEW(tree2_w), selected); gtk_widget_set_sensitive(split_btn, FALSE); break; case FULL_VIEW: gtk_tree_store_clear(tree2); display_tree(tree2, &rootmenu); + select_menu(GTK_TREE_VIEW(tree2_w), selected); gtk_widget_set_sensitive(full_btn, FALSE); break; } =20 - if (mode !=3D SINGLE_VIEW) - gtk_widget_set_sensitive(back_btn, FALSE); + gtk_widget_set_sensitive(back_btn, + mode =3D=3D SINGLE_VIEW && browsed !=3D &rootmenu); } =20 static void text_insert_help(struct menu *menu) @@ -603,6 +661,8 @@ static gboolean on_treeview2_button_press_event(GtkWidg= et *widget, return FALSE; gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); =20 + selected =3D menu; + col =3D column2index(column); if (event->type =3D=3D GDK_2BUTTON_PRESS) { enum prop_type ptype; @@ -712,8 +772,12 @@ static gboolean on_treeview1_button_press_event(GtkWid= get *widget, if (event->type =3D=3D GDK_2BUTTON_PRESS) toggle_sym_value(menu); =20 - browsed =3D menu; - display_tree_part(); + selected =3D menu; + + if (menu->type =3D=3D M_MENU) { + browsed =3D menu; + display_tree_part(); + } =20 gtk_tree_view_set_cursor(view, path, NULL, FALSE); gtk_widget_grab_focus(tree2_w); @@ -1006,10 +1070,16 @@ static void _display_tree(GtkTreeStore *tree, struc= t menu *menu, enum prop_type ptype; GtkTreeIter iter; =20 - if (menu =3D=3D &rootmenu) - browsed =3D &rootmenu; - for (child =3D menu->list; child; child =3D child->next) { + /* + * REVISIT: + * menu_finalize() creates empty "if" entries. + * Do not confuse gtk_tree_model_get(), which would otherwise + * return "if" menu entry. + */ + if (child->type =3D=3D M_IF) + continue; + prop =3D child->prompt; ptype =3D prop ? prop->type : P_UNKNOWN; =20 --=20 2.43.0