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 47/66] kconfig: gconf: inline fill_row() into set_node()
Date: Wed, 25 Jun 2025 00:05:35 +0900	[thread overview]
Message-ID: <20250624150645.1107002-48-masahiroy@kernel.org> (raw)
In-Reply-To: <20250624150645.1107002-1-masahiroy@kernel.org>

The row[] array is used to prepare data passed to set_node(), but this
indirection is unnecessary. Squash fill_row() into set_node() and call
gtk_tree_store_set() directly.

Also, calling gdk_pixbuf_new_from_xpm_data() for every row is
inefficient. Call it once and store the resulting pixbuf in a global
variable.

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

 scripts/kconfig/gconf.c | 272 ++++++++++++++++------------------------
 1 file changed, 106 insertions(+), 166 deletions(-)

diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
index 0977d906bea6..0b73ba9eca14 100644
--- a/scripts/kconfig/gconf.c
+++ b/scripts/kconfig/gconf.c
@@ -44,6 +44,7 @@ static GtkWidget *save_menu_item;
 static GtkTextTag *tag1, *tag2;
 
 static GtkTreeStore *tree1, *tree2;
+static GdkPixbuf *pix_menu;
 
 static struct menu *browsed; // browsed menu for SINGLE/SPLIT view
 static struct menu *selected; // selected entry
@@ -58,9 +59,6 @@ enum {
 static void display_list(void);
 static void display_tree(GtkTreeStore *store, struct menu *menu);
 static void display_tree_part(void);
-static gchar **fill_row(struct menu *menu);
-static void set_node(GtkTreeStore *tree, GtkTreeIter *node,
-		     struct menu *menu, gchar **row);
 
 static void conf_changed(bool dirty)
 {
@@ -125,6 +123,104 @@ static void update_row_visibility(void)
 	_update_row_visibility(GTK_TREE_VIEW(tree2_w));
 }
 
+static void set_node(GtkTreeStore *tree, GtkTreeIter *node, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	tristate val;
+	gchar *option;
+	const gchar *_no = "";
+	const gchar *_mod = "";
+	const gchar *_yes = "";
+	const gchar *value = "";
+	GdkColor color;
+	gboolean editable = FALSE;
+	gboolean btnvis = FALSE;
+
+	option = g_strdup_printf("%s %s %s %s",
+				 menu->type == M_COMMENT ? "***" : "",
+				 menu_get_prompt(menu),
+				 menu->type == M_COMMENT ? "***" : "",
+				 sym && !sym_has_value(sym) ? "(NEW)" : "");
+
+	gdk_color_parse(menu_is_visible(menu) ? "Black" : "DarkGray", &color);
+
+	if (!sym)
+		goto set;
+
+	sym_calc_value(sym);
+
+	if (menu->type == M_CHOICE) {	// parse children to get a final value
+		struct symbol *def_sym = sym_calc_choice(menu);
+		struct menu *def_menu = NULL;
+
+		for (struct menu *child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		if (def_menu)
+			value = menu_get_prompt(def_menu);
+
+		goto set;
+	}
+
+	switch (sym_get_type(sym)) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+
+		btnvis = TRUE;
+
+		val = sym_get_tristate_value(sym);
+		switch (val) {
+		case no:
+			_no = "N";
+			value = "N";
+			break;
+		case mod:
+			_mod = "M";
+			value = "M";
+			break;
+		case yes:
+			_yes = "Y";
+			value = "Y";
+			break;
+		}
+
+		if (val != no && sym_tristate_within_range(sym, no))
+			_no = "_";
+		if (val != mod && sym_tristate_within_range(sym, mod))
+			_mod = "_";
+		if (val != yes && sym_tristate_within_range(sym, yes))
+			_yes = "_";
+		break;
+	default:
+		value = sym_get_string_value(sym);
+		editable = TRUE;
+		break;
+	}
+
+set:
+	gtk_tree_store_set(tree, node,
+			   COL_OPTION, option,
+			   COL_NAME, sym ? sym->name : "",
+			   COL_NO, _no,
+			   COL_MOD, _mod,
+			   COL_YES, _yes,
+			   COL_VALUE, value,
+			   COL_MENU, (gpointer) menu,
+			   COL_COLOR, &color,
+			   COL_EDIT, editable,
+			   COL_PIXBUF, pix_menu,
+			   COL_PIXVIS, view_mode == SINGLE_VIEW && menu->type == M_MENU,
+			   COL_BTNVIS, btnvis,
+			   COL_BTNACT, _yes[0] == 'Y',
+			   COL_BTNINC, _mod[0] == 'M',
+			   COL_BTNRAD, sym && sym_is_choice_value(sym),
+			   -1);
+
+	g_free(option);
+}
+
 static void _update_tree(GtkTreeStore *store, GtkTreeIter *parent)
 {
 	GtkTreeModel *model = GTK_TREE_MODEL(store);
@@ -138,7 +234,7 @@ static void _update_tree(GtkTreeStore *store, GtkTreeIter *parent)
 		gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1);
 
 		if (menu)
-			set_node(store, &iter, menu, fill_row(menu));
+			set_node(store, &iter, menu);
 
 		_update_tree(store, &iter);
 
@@ -563,6 +659,9 @@ static gboolean on_window1_delete_event(GtkWidget *widget, GdkEvent *event,
 
 	gtk_widget_destroy(dialog);
 
+	if (!ret)
+		g_object_unref(pix_menu);
+
 	return ret;
 }
 
@@ -824,167 +923,6 @@ static gboolean on_treeview1_button_press_event(GtkWidget *widget,
 	return FALSE;
 }
 
-
-/* Fill a row of strings */
-static gchar **fill_row(struct menu *menu)
-{
-	static gchar *row[COL_NUMBER];
-	struct symbol *sym = menu->sym;
-	const char *def;
-	int stype;
-	tristate val;
-	enum prop_type ptype;
-	int i;
-
-	for (i = COL_OPTION; i <= COL_COLOR; i++)
-		g_free(row[i]);
-	bzero(row, sizeof(row));
-
-	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
-
-	row[COL_OPTION] =
-	    g_strdup_printf("%s %s %s %s",
-			    ptype == P_COMMENT ? "***" : "",
-			    menu_get_prompt(menu),
-			    ptype == P_COMMENT ? "***" : "",
-			    sym && !sym_has_value(sym) ? "(NEW)" : "");
-
-	if (opt_mode == OPT_ALL && !menu_is_visible(menu))
-		row[COL_COLOR] = g_strdup("DarkGray");
-	else if (opt_mode == OPT_PROMPT &&
-			menu_has_prompt(menu) && !menu_is_visible(menu))
-		row[COL_COLOR] = g_strdup("DarkGray");
-	else
-		row[COL_COLOR] = g_strdup("Black");
-
-	switch (ptype) {
-	case P_MENU:
-		row[COL_PIXBUF] = (gchar *) xpm_menu;
-		if (view_mode == SINGLE_VIEW)
-			row[COL_PIXVIS] = GINT_TO_POINTER(TRUE);
-		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
-		break;
-	case P_COMMENT:
-		row[COL_PIXBUF] = (gchar *) xpm_void;
-		row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
-		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
-		break;
-	default:
-		row[COL_PIXBUF] = (gchar *) xpm_void;
-		row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
-		row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
-		break;
-	}
-
-	if (!sym)
-		return row;
-	row[COL_NAME] = g_strdup(sym->name);
-
-	sym_calc_value(sym);
-
-	if (sym_is_choice(sym)) {	// parse childs for getting final value
-		struct menu *child;
-		struct symbol *def_sym = sym_calc_choice(menu);
-		struct menu *def_menu = NULL;
-
-		for (child = menu->list; child; child = child->next) {
-			if (menu_is_visible(child)
-			    && child->sym == def_sym)
-				def_menu = child;
-		}
-
-		if (def_menu)
-			row[COL_VALUE] =
-			    g_strdup(menu_get_prompt(def_menu));
-
-		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
-		return row;
-	}
-	if (sym_is_choice_value(sym))
-		row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
-
-	stype = sym_get_type(sym);
-	switch (stype) {
-	case S_BOOLEAN:
-	case S_TRISTATE:
-		val = sym_get_tristate_value(sym);
-		switch (val) {
-		case no:
-			row[COL_NO] = g_strdup("N");
-			row[COL_VALUE] = g_strdup("N");
-			row[COL_BTNACT] = GINT_TO_POINTER(FALSE);
-			row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
-			break;
-		case mod:
-			row[COL_MOD] = g_strdup("M");
-			row[COL_VALUE] = g_strdup("M");
-			row[COL_BTNINC] = GINT_TO_POINTER(TRUE);
-			break;
-		case yes:
-			row[COL_YES] = g_strdup("Y");
-			row[COL_VALUE] = g_strdup("Y");
-			row[COL_BTNACT] = GINT_TO_POINTER(TRUE);
-			row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
-			break;
-		}
-
-		if (val != no && sym_tristate_within_range(sym, no))
-			row[COL_NO] = g_strdup("_");
-		if (val != mod && sym_tristate_within_range(sym, mod))
-			row[COL_MOD] = g_strdup("_");
-		if (val != yes && sym_tristate_within_range(sym, yes))
-			row[COL_YES] = g_strdup("_");
-		break;
-	case S_INT:
-	case S_HEX:
-	case S_STRING:
-		def = sym_get_string_value(sym);
-		row[COL_VALUE] = g_strdup(def);
-		row[COL_EDIT] = GINT_TO_POINTER(TRUE);
-		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
-		break;
-	}
-
-	return row;
-}
-
-
-/* Set the node content with a row of strings */
-static void set_node(GtkTreeStore *tree, GtkTreeIter *node,
-		     struct menu *menu, gchar **row)
-{
-	GdkColor color;
-	gboolean success;
-	GdkPixbuf *pix;
-
-	pix = gdk_pixbuf_new_from_xpm_data((const char **)
-					   row[COL_PIXBUF]);
-
-	gdk_color_parse(row[COL_COLOR], &color);
-	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1,
-				  FALSE, FALSE, &success);
-
-	gtk_tree_store_set(tree, node,
-			   COL_OPTION, row[COL_OPTION],
-			   COL_NAME, row[COL_NAME],
-			   COL_NO, row[COL_NO],
-			   COL_MOD, row[COL_MOD],
-			   COL_YES, row[COL_YES],
-			   COL_VALUE, row[COL_VALUE],
-			   COL_MENU, (gpointer) menu,
-			   COL_COLOR, &color,
-			   COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]),
-			   COL_PIXBUF, pix,
-			   COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]),
-			   COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]),
-			   COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]),
-			   COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]),
-			   COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]),
-			   -1);
-
-	g_object_unref(pix);
-}
-
 /* Display the whole tree (single/split/full view) */
 static void _display_tree(GtkTreeStore *tree, struct menu *menu,
 			  GtkTreeIter *parent)
@@ -1016,7 +954,7 @@ static void _display_tree(GtkTreeStore *tree, struct menu *menu,
 			continue;
 
 		gtk_tree_store_append(tree, &iter, parent);
-		set_node(tree, &iter, child, fill_row(child));
+		set_node(tree, &iter, child);
 
 		if ((view_mode != FULL_VIEW) && (ptype == P_MENU)
 		    && (tree == tree2))
@@ -1384,6 +1322,8 @@ static void init_right_tree(void)
 	g_signal_connect(G_OBJECT(renderer), "edited",
 			 G_CALLBACK(renderer_edited), tree2_w);
 
+	pix_menu = gdk_pixbuf_new_from_xpm_data((const char **)xpm_menu);
+
 	for (i = 0; i < COL_VALUE; i++) {
 		column = gtk_tree_view_get_column(view, i);
 		gtk_tree_view_column_set_resizable(column, TRUE);
-- 
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 ` [PATCH 43/66] kconfig: gconf: preserve menu selection when switching view mode Masahiro Yamada
2025-06-30  5:42   ` 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 ` Masahiro Yamada [this message]
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-48-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®