mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Masahiro Yamada <masahiroy@kernel.org>
To: linux-kbuild@vger.kernel.org
Cc: Masahiro Yamada <masahiroy@kernel.org>, 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	[thread overview]
Message-ID: <20250624150645.1107002-44-masahiroy@kernel.org> (raw)
In-Reply-To: <20250624150645.1107002-1-masahiroy@kernel.org>

Preserve the current menu selection when switching to a different view
mode, as it improves usability.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 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;
 
 static struct menu *browsed; // browsed menu for SINGLE/SPLIT view
+static struct menu *selected; // selected entry
 
 enum {
 	COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE,
@@ -68,6 +69,47 @@ static void conf_changed(bool dirty)
 
 /* Utility Functions */
 
+static void _select_menu(GtkTreeView *view, GtkTreeModel *model,
+			 GtkTreeIter *parent, struct menu *match)
+{
+	GtkTreeIter iter;
+	gboolean valid;
+
+	valid = 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 == match) {
+			GtkTreeSelection *selection;
+			GtkTreePath *path;
+
+			/*
+			 * Expand parents to reflect the selection, and
+			 * scroll down to it.
+			 */
+			path = 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 = gtk_tree_view_get_selection(view);
+			gtk_tree_selection_select_iter(selection, &iter);
+		}
+
+		_select_menu(view, model, &iter, match);
+
+		valid = 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 = mode;
@@ -89,24 +131,40 @@ static void set_view_mode(enum view_mode mode)
 
 	switch (mode) {
 	case SINGLE_VIEW:
-		browsed = &rootmenu;
+		if (selected)
+			browsed = menu_get_parent_menu(selected) ?: &rootmenu;
+		else
+			browsed = &rootmenu;
 		display_tree_part();
+		select_menu(GTK_TREE_VIEW(tree2_w), selected);
 		gtk_widget_set_sensitive(single_btn, FALSE);
 		break;
 	case SPLIT_VIEW:
+		browsed = NULL;
+		if (selected) {
+			if (selected->type == M_MENU)
+				browsed = selected;
+			else
+				browsed = 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;
 	}
 
-	if (mode != SINGLE_VIEW)
-		gtk_widget_set_sensitive(back_btn, FALSE);
+	gtk_widget_set_sensitive(back_btn,
+				 mode == SINGLE_VIEW && browsed != &rootmenu);
 }
 
 static void text_insert_help(struct menu *menu)
@@ -603,6 +661,8 @@ static gboolean on_treeview2_button_press_event(GtkWidget *widget,
 		return FALSE;
 	gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1);
 
+	selected = menu;
+
 	col = column2index(column);
 	if (event->type == GDK_2BUTTON_PRESS) {
 		enum prop_type ptype;
@@ -712,8 +772,12 @@ static gboolean on_treeview1_button_press_event(GtkWidget *widget,
 	if (event->type == GDK_2BUTTON_PRESS)
 		toggle_sym_value(menu);
 
-	browsed = menu;
-	display_tree_part();
+	selected = menu;
+
+	if (menu->type == M_MENU) {
+		browsed = menu;
+		display_tree_part();
+	}
 
 	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, struct menu *menu,
 	enum prop_type ptype;
 	GtkTreeIter iter;
 
-	if (menu == &rootmenu)
-		browsed = &rootmenu;
-
 	for (child = menu->list; child; child = 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 == M_IF)
+			continue;
+
 		prop = child->prompt;
 		ptype = prop ? prop->type : P_UNKNOWN;
 
-- 
2.43.0


  parent reply	other threads:[~2025-06-24 15:08 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-24 15:04 [PATCH 00/66] kconfig: improve xconfig and gconfig Masahiro Yamada
2025-06-24 15:04 ` [PATCH 01/66] kconfig: set MENU_CHANGED to choice when the selected member is changed Masahiro Yamada
2025-06-30  6:34   ` Randy Dunlap
2025-07-02 13:23     ` Masahiro Yamada
2025-07-02 22:02       ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 02/66] kconfig: qconf: do not show checkbox icon for choice Masahiro Yamada
2025-06-29 20:15   ` Randy Dunlap
2025-06-30  3:36     ` Masahiro Yamada
2025-06-30  0:51   ` Randy Dunlap
2025-06-30  0:54     ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 03/66] kconfig: qconf: show selected choice in the Value column Masahiro Yamada
2025-06-30  0:56   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 04/66] kconfig: rename menu_get_parent_menu() to menu_get_menu_or_parent_menu() Masahiro Yamada
2025-06-30  0:58   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 05/66] kconfig: re-add menu_get_parent_menu() that returns parent menu Masahiro Yamada
2025-06-30  0:59   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 06/66] kconfig: gconf: make columns resizable Masahiro Yamada
2025-06-30  2:18   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 07/66] kconfig: gconf: fix potential memory leak in renderer_edited() Masahiro Yamada
2025-06-30  2:21   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 08/66] kconfig: gconf: always destroy dialog in on_window1_delete_event() Masahiro Yamada
2025-06-30  2:23   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 09/66] kconfig: gconf: remove old #ifdef GTK_CHECK_VERSION Masahiro Yamada
2025-06-24 15:04 ` [PATCH 10/66] kconfig: gconf: remove empty if-block Masahiro Yamada
2025-06-30  2:25   ` Randy Dunlap
2025-06-24 15:04 ` [PATCH 11/66] kconfig: gconf: remove meaningless code in init_main_window() Masahiro Yamada
2025-06-30  2:25   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 12/66] kconfig: gconf: remove unneeded gtk_tree_view_set_headers_visible() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 13/66] kconfig: gconf: remove gtk_tree_view_column_set_visible() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 14/66] kconfig: gconf: remove gtk_widget_realize() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 15/66] kconfig: gconf: remove gtk_tree_view_set_rules_hint() calls Masahiro Yamada
2025-06-24 15:05 ` [PATCH 16/66] kconfig: gconf: remove unnecessary gtk_set_locale() call Masahiro Yamada
2025-06-24 15:05 ` [PATCH 17/66] kconfig: gconf: remove internal-child="image" nodes from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 18/66] kconfig: gconf: remove parents[] array and indent variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 19/66] kconfig: gconf: remove unnecessary NULL checks for tree1 and tree2 Masahiro Yamada
2025-06-24 15:05 ` [PATCH 20/66] kconfig: gconf: remove unneeded variable in on_split_clicked() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 21/66] kconfig: gconf: remove unneeded variables in on_treeview*_button_press_event() Masahiro Yamada
2025-06-30  2:40   ` Randy Dunlap
2025-06-30  4:22     ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 22/66] kconfig: gconf: remove unused 'color' variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 23/66] kconfig: gconf: add static qualifiers to variables Masahiro Yamada
2025-06-24 15:05 ` [PATCH 24/66] kconfig: gconf: move init_*() functions below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 25/66] kconfig: gconf: refactor view setting code Masahiro Yamada
2025-06-30  2:51   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 26/66] kconfig: gconf: grey out button for current view Masahiro Yamada
2025-06-30  2:53   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 27/66] kconfig: gconf: move the main window event handlers below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 28/66] kconfig: gconf: move button1 initialization below Masahiro Yamada
2025-06-24 15:05 ` [PATCH 29/66] kconfig: gconf: add static qualifiers to event handlers Masahiro Yamada
2025-06-30  2:55   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 30/66] kconfig: gconf: remove glade_xml_signal_autoconnect() call Masahiro Yamada
2025-06-30  2:58   ` Randy Dunlap
2025-06-30  4:14     ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 31/66] kconfig: gconf: make key_press_event work in left pane too Masahiro Yamada
2025-06-24 15:05 ` [PATCH 32/66] kconfig: gconf: avoid hardcoding model2 in on_treeview2_cursor_changed() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 33/66] kconfig: gconf: avoid hardcoding model2 in renderer_edited() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 34/66] kconfig: gconf: avoid hardcoding model* in on_treeview*_button_press_event() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 35/66] kconfig: gconf: add on_save_clicked() event handler Masahiro Yamada
2025-06-24 15:05 ` [PATCH 36/66] kconfig: gconf: use GtkFileChooser in on_load1_activate() Masahiro Yamada
2025-06-30  3:14   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 37/66] kconfig: gconf: use GtkFileChooser in on_save_as1_activate() Masahiro Yamada
2025-06-30  3:20   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 38/66] kconfig: gconf: use GdkPixbuf in replace_button_icon() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 39/66] kconfig: gconf: refactor replace_button_icon() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 40/66] kconfig: gconf: make introduction, about, license dialogs modal Masahiro Yamada
2025-06-30  4:09   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 41/66] kconfig: gconf: remove global 'tree' variable Masahiro Yamada
2025-06-24 15:05 ` [PATCH 42/66] kconfig: gconf: merge 'current' and 'browsed' global variables Masahiro Yamada
2025-06-24 15:05 ` Masahiro Yamada [this message]
2025-06-30  5:42   ` [PATCH 43/66] kconfig: gconf: preserve menu selection when switching view mode Masahiro Yamada
2025-06-24 15:05 ` [PATCH 44/66] kconfig: gconf: use GtkTreeModelFilter to control row visibility Masahiro Yamada
2025-06-24 15:05 ` [PATCH 45/66] kconfig: gconf: remove global 'model1' and 'model2' variables Masahiro Yamada
2025-06-30  4:10   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 46/66] kconfig: gconf: remove init_tree_model() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 47/66] kconfig: gconf: inline fill_row() into set_node() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 48/66] kconfig: gconf: do not reconstruct tree store when a symbol is changed Masahiro Yamada
2025-06-24 15:05 ` [PATCH 49/66] kconfig: gconf: inline display_list() into set_view_mode() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 50/66] kconfig: gconf: remove dead code in display_tree_part() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 51/66] kconfig: gconf: rename display_tree_part() Masahiro Yamada
2025-06-24 15:05 ` [PATCH 52/66] kconfig: gconf: remove fixup_rootmenu() Masahiro Yamada
2025-06-27 12:46   ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 53/66] kconfig: gconf: use size_allocate event handler Masahiro Yamada
2025-06-29 17:56   ` Masahiro Yamada
2025-06-30  5:23     ` Randy Dunlap
2025-06-30  5:30       ` Masahiro Yamada
2025-06-24 15:05 ` [PATCH 54/66] kconfig: gconf: replace GDK_space with GDK_KEY_space Masahiro Yamada
2025-06-24 15:05 ` [PATCH 55/66] kconfig: gconf: replace GTK_STOCK_{OK,NO,CANCEL} Masahiro Yamada
2025-06-30  5:26   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 56/66] kconfig: gconf: remove "tooltips" property from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 57/66] kconfig: gconf: replace "tooltip" property with "tooltip-text" Masahiro Yamada
2025-06-30  5:36   ` Randy Dunlap
2025-06-24 15:05 ` [PATCH 58/66] kconfig: gconf: remove unnecessary default message in text view Masahiro Yamada
2025-06-24 15:05 ` [PATCH 59/66] kconfig: gconf: use gtk_check_menu_item_get_active() accessor Masahiro Yamada
2025-06-24 15:05 ` [PATCH 60/66] kconfig: gconf: use gtk_dialog_get_content_area() accessor Masahiro Yamada
2025-06-24 15:05 ` [PATCH 61/66] kconfig: gconf: remove GtkHandleBox from glade Masahiro Yamada
2025-06-24 15:05 ` [PATCH 62/66] kconfig: gconf: rename gconf.glade to gconf.ui Masahiro Yamada
2025-06-24 15:05 ` [PATCH 63/66] kconfig: gconf: migrate to GTK 3 Masahiro Yamada
2025-06-24 15:05 ` [PATCH 64/66] kconfig: gconf: replace GtkVbox with GtkBox Masahiro Yamada
2025-06-24 15:05 ` [PATCH 65/66] kconfig: gconf: replace GdkColor with GdkRGBA Masahiro Yamada
2025-06-24 15:05 ` [PATCH 66/66] kconfig: gconf: show GTK version in About dialog Masahiro Yamada
2025-06-30  6:06   ` Randy Dunlap
2025-06-30  6:55 ` [PATCH 00/66] kconfig: improve xconfig and gconfig Randy Dunlap
2025-06-30 15:48   ` Masahiro Yamada
2025-06-30 23:43     ` Randy Dunlap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250624150645.1107002-44-masahiroy@kernel.org \
    --to=masahiroy@kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®