⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gconf.c

📁 busybox最新版的源码:学习和应用的好东东,多的不说了,大家看后再说吧
💻 C
📖 第 1 页 / 共 3 页
字号:
	}	if (event->keyval == GDK_KP_Enter) {	}	if (widget == tree1_w)		return FALSE;	gtk_tree_model_get_iter(model2, &iter, path);	gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);	if (!strcasecmp(event->string, "n"))		col = COL_NO;	else if (!strcasecmp(event->string, "m"))		col = COL_MOD;	else if (!strcasecmp(event->string, "y"))		col = COL_YES;	else		col = -1;	change_sym_value(menu, col);	return FALSE;}/* Row selection changed: update help */voidon_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data){	GtkTreeSelection *selection;	GtkTreeIter iter;	struct menu *menu;	selection = gtk_tree_view_get_selection(treeview);	if (gtk_tree_selection_get_selected(selection, &model2, &iter)) {		gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);		text_insert_help(menu);	}}/* User click: display sub-tree in the right frame. */gbooleanon_treeview1_button_press_event(GtkWidget * widget,				GdkEventButton * event, gpointer user_data){	GtkTreeView *view = GTK_TREE_VIEW(widget);	GtkTreePath *path;	GtkTreeViewColumn *column;	GtkTreeIter iter;	struct menu *menu;	gint tx = (gint) event->x;	gint ty = (gint) event->y;	gint cx, cy;	gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx,				      &cy);	if (path == NULL)		return FALSE;	gtk_tree_model_get_iter(model1, &iter, path);	gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1);	if (event->type == GDK_2BUTTON_PRESS) {		toggle_sym_value(menu);		current = menu;		display_tree_part();	} else {		browsed = menu;		display_tree_part();	}	gtk_widget_realize(tree2_w);	gtk_tree_view_set_cursor(view, path, NULL, FALSE);	gtk_widget_grab_focus(tree2_w);	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]);	memset(row, 0, sizeof(row));	row[COL_OPTION] =	    g_strdup_printf("%s %s", menu_get_prompt(menu),			    sym ? (sym->				   flags & SYMBOL_NEW ? "(NEW)" : "") :			    "");	if (show_all && !menu_is_visible(menu))		row[COL_COLOR] = g_strdup("DarkGray");	else		row[COL_COLOR] = g_strdup("Black");	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;	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);	sym->flags &= ~SYMBOL_CHANGED;	if (sym_is_choice(sym)) {	// parse childs for getting final value		struct menu *child;		struct symbol *def_sym = sym_get_choice_value(sym);		struct menu *def_menu = NULL;		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);		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));	}	if (sym->flags & SYMBOL_CHOICEVAL)		row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);	stype = sym_get_type(sym);	switch (stype) {	case S_BOOLEAN:		if (GPOINTER_TO_INT(row[COL_PIXVIS]) == FALSE)			row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);		if (sym_is_choice(sym))			break;	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(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);}/* Add a node to the tree */static void place_node(struct menu *menu, char **row){	GtkTreeIter *parent = parents[indent - 1];	GtkTreeIter *node = parents[indent];	gtk_tree_store_append(tree, node, parent);	set_node(node, menu, row);}/* Find a node in the GTK+ tree */static GtkTreeIter found;/* * Find a menu in the GtkTree starting at parent. */GtkTreeIter *gtktree_iter_find_node(GtkTreeIter * parent,				    struct menu *tofind){	GtkTreeIter iter;	GtkTreeIter *child = &iter;	gboolean valid;	GtkTreeIter *ret;	valid = gtk_tree_model_iter_children(model2, child, parent);	while (valid) {		struct menu *menu;		gtk_tree_model_get(model2, child, 6, &menu, -1);		if (menu == tofind) {			memcpy(&found, child, sizeof(GtkTreeIter));			return &found;		}		ret = gtktree_iter_find_node(child, tofind);		if (ret)			return ret;		valid = gtk_tree_model_iter_next(model2, child);	}	return NULL;}/* * Update the tree by adding/removing entries * Does not change other nodes */static void update_tree(struct menu *src, GtkTreeIter * dst){	struct menu *child1;	GtkTreeIter iter, tmp;	GtkTreeIter *child2 = &iter;	gboolean valid;	GtkTreeIter *sibling;	struct symbol *sym;	struct property *prop;	struct menu *menu1, *menu2;	if (src == &rootmenu)		indent = 1;	valid = gtk_tree_model_iter_children(model2, child2, dst);	for (child1 = src->list; child1; child1 = child1->next) {		prop = child1->prompt;		sym = child1->sym;	      reparse:		menu1 = child1;		if (valid)			gtk_tree_model_get(model2, child2, COL_MENU,					   &menu2, -1);		else			menu2 = NULL;	// force adding of a first child#ifdef DEBUG		printf("%*c%s | %s\n", indent, ' ',		       menu1 ? menu_get_prompt(menu1) : "nil",		       menu2 ? menu_get_prompt(menu2) : "nil");#endif		if (!menu_is_visible(child1) && !show_all) {	// remove node			if (gtktree_iter_find_node(dst, menu1) != NULL) {				memcpy(&tmp, child2, sizeof(GtkTreeIter));				valid = gtk_tree_model_iter_next(model2,								 child2);				gtk_tree_store_remove(tree2, &tmp);				if (!valid)					return;	// next parent				else					goto reparse;	// next child			} else				continue;		}		if (menu1 != menu2) {			if (gtktree_iter_find_node(dst, menu1) == NULL) {	// add node				if (!valid && !menu2)					sibling = NULL;				else					sibling = child2;				gtk_tree_store_insert_before(tree2,							     child2,							     dst, sibling);				set_node(child2, menu1, fill_row(menu1));				if (menu2 == NULL)					valid = TRUE;			} else {	// remove node				memcpy(&tmp, child2, sizeof(GtkTreeIter));				valid = gtk_tree_model_iter_next(model2,								 child2);				gtk_tree_store_remove(tree2, &tmp);				if (!valid)					return;	// next parent				else					goto reparse;	// next child			}		} else if (sym && (sym->flags & SYMBOL_CHANGED)) {			set_node(child2, menu1, fill_row(menu1));		}		indent++;		update_tree(child1, child2);		indent--;		valid = gtk_tree_model_iter_next(model2, child2);	}}/* Display the whole tree (single/split/full view) */static void display_tree(struct menu *menu){	struct symbol *sym;	struct property *prop;	struct menu *child;	enum prop_type ptype;	if (menu == &rootmenu) {		indent = 1;		current = &rootmenu;	}	for (child = menu->list; child; child = child->next) {		prop = child->prompt;		sym = child->sym;		ptype = prop ? prop->type : P_UNKNOWN;		if (sym)			sym->flags &= ~SYMBOL_CHANGED;		if ((view_mode == SPLIT_VIEW)		    && !(child->flags & MENU_ROOT) && (tree == tree1))			continue;		if ((view_mode == SPLIT_VIEW) && (child->flags & MENU_ROOT)		    && (tree == tree2))			continue;		if (menu_is_visible(child) || show_all)			place_node(child, fill_row(child));#ifdef DEBUG		printf("%*c%s: ", indent, ' ', menu_get_prompt(child));		printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");		dbg_print_ptype(ptype);		printf(" | ");		if (sym) {			dbg_print_stype(sym->type);			printf(" | ");			dbg_print_flags(sym->flags);			printf("\n");		} else			printf("\n");#endif		if ((view_mode != FULL_VIEW) && (ptype == P_MENU)		    && (tree == tree2))			continue;/*		if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT))		    || (view_mode == FULL_VIEW)		    || (view_mode == SPLIT_VIEW))*/		if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT))		    || (view_mode == FULL_VIEW)		    || (view_mode == SPLIT_VIEW)) {			indent++;			display_tree(child);			indent--;		}	}}/* Display a part of the tree starting at current node (single/split view) */static void display_tree_part(void){	if (tree2)		gtk_tree_store_clear(tree2);	if (view_mode == SINGLE_VIEW)		display_tree(current);	else if (view_mode == SPLIT_VIEW)		display_tree(browsed);	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));}/* Display the list in the left frame (split view) */static void display_list(void){	if (tree1)		gtk_tree_store_clear(tree1);	tree = tree1;	display_tree(&rootmenu);	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w));	tree = tree2;}void fixup_rootmenu(struct menu *menu){	struct menu *child;	static int menu_cnt = 0;	menu->flags |= MENU_ROOT;	for (child = menu->list; child; child = child->next) {		if (child->prompt && child->prompt->type == P_MENU) {			menu_cnt++;			fixup_rootmenu(child);			menu_cnt--;		} else if (!menu_cnt)			fixup_rootmenu(child);	}}/* Main */int main(int ac, char *av[]){	const char *name;	char *env;	gchar *glade_file;#ifndef LKC_DIRECT_LINK	kconfig_load();#endif	bindtextdomain(PACKAGE, LOCALEDIR);	bind_textdomain_codeset(PACKAGE, "UTF-8");	textdomain(PACKAGE);	/* GTK stuffs */	gtk_set_locale();	gtk_init(&ac, &av);	glade_init();	//add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");	//add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");	/* Determine GUI path */	env = getenv(SRCTREE);	if (env)		glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL);	else if (av[0][0] == '/')		glade_file = g_strconcat(av[0], ".glade", NULL);	else		glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL);	/* Load the interface and connect signals */	init_main_window(glade_file);	init_tree_model();	init_left_tree();	init_right_tree();	/* Conf stuffs */	if (ac > 1 && av[1][0] == '-') {		switch (av[1][1]) {		case 'a':			//showAll = 1;			break;		case 'h':		case '?':			printf("%s <config>\n", av[0]);			exit(0);		}		name = av[2];	} else		name = av[1];	conf_parse(name);	fixup_rootmenu(&rootmenu);	conf_read(NULL);	switch (view_mode) {	case SINGLE_VIEW:		display_tree_part();		break;	case SPLIT_VIEW:		display_list();		break;	case FULL_VIEW:		display_tree(&rootmenu);		break;	}	gtk_main();	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -