xref: /OK3568_Linux_fs/buildroot/support/kconfig/gconf.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* Hey EMACS -*- linux-c -*- */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info>
5*4882a593Smuzhiyun  * Released under the terms of the GNU GPL v2.0.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifdef HAVE_CONFIG_H
10*4882a593Smuzhiyun #  include <config.h>
11*4882a593Smuzhiyun #endif
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <stdlib.h>
14*4882a593Smuzhiyun #include "lkc.h"
15*4882a593Smuzhiyun #include "images.c"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <glade/glade.h>
18*4882a593Smuzhiyun #include <gtk/gtk.h>
19*4882a593Smuzhiyun #include <glib.h>
20*4882a593Smuzhiyun #include <gdk/gdkkeysyms.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include <stdio.h>
23*4882a593Smuzhiyun #include <string.h>
24*4882a593Smuzhiyun #include <unistd.h>
25*4882a593Smuzhiyun #include <time.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun //#define DEBUG
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum {
30*4882a593Smuzhiyun 	SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun enum {
34*4882a593Smuzhiyun 	OPT_NORMAL, OPT_ALL, OPT_PROMPT
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun static gint view_mode = FULL_VIEW;
38*4882a593Smuzhiyun static gboolean show_name = TRUE;
39*4882a593Smuzhiyun static gboolean show_range = TRUE;
40*4882a593Smuzhiyun static gboolean show_value = TRUE;
41*4882a593Smuzhiyun static gboolean resizeable = FALSE;
42*4882a593Smuzhiyun static int opt_mode = OPT_NORMAL;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun GtkWidget *main_wnd = NULL;
45*4882a593Smuzhiyun GtkWidget *tree1_w = NULL;	// left  frame
46*4882a593Smuzhiyun GtkWidget *tree2_w = NULL;	// right frame
47*4882a593Smuzhiyun GtkWidget *text_w = NULL;
48*4882a593Smuzhiyun GtkWidget *hpaned = NULL;
49*4882a593Smuzhiyun GtkWidget *vpaned = NULL;
50*4882a593Smuzhiyun GtkWidget *back_btn = NULL;
51*4882a593Smuzhiyun GtkWidget *save_btn = NULL;
52*4882a593Smuzhiyun GtkWidget *save_menu_item = NULL;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun GtkTextTag *tag1, *tag2;
55*4882a593Smuzhiyun GdkColor color;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun GtkTreeStore *tree1, *tree2, *tree;
58*4882a593Smuzhiyun GtkTreeModel *model1, *model2;
59*4882a593Smuzhiyun static GtkTreeIter *parents[256];
60*4882a593Smuzhiyun static gint indent;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun static struct menu *current; // current node for SINGLE view
63*4882a593Smuzhiyun static struct menu *browsed; // browsed node for SPLIT view
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun enum {
66*4882a593Smuzhiyun 	COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE,
67*4882a593Smuzhiyun 	COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF,
68*4882a593Smuzhiyun 	COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD,
69*4882a593Smuzhiyun 	COL_NUMBER
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun static void display_list(void);
73*4882a593Smuzhiyun static void display_tree(struct menu *menu);
74*4882a593Smuzhiyun static void display_tree_part(void);
75*4882a593Smuzhiyun static void update_tree(struct menu *src, GtkTreeIter * dst);
76*4882a593Smuzhiyun static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row);
77*4882a593Smuzhiyun static gchar **fill_row(struct menu *menu);
78*4882a593Smuzhiyun static void conf_changed(void);
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* Helping/Debugging Functions */
81*4882a593Smuzhiyun 
dbg_sym_flags(int val)82*4882a593Smuzhiyun const char *dbg_sym_flags(int val)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	static char buf[256];
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	bzero(buf, 256);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	if (val & SYMBOL_CONST)
89*4882a593Smuzhiyun 		strcat(buf, "const/");
90*4882a593Smuzhiyun 	if (val & SYMBOL_CHECK)
91*4882a593Smuzhiyun 		strcat(buf, "check/");
92*4882a593Smuzhiyun 	if (val & SYMBOL_CHOICE)
93*4882a593Smuzhiyun 		strcat(buf, "choice/");
94*4882a593Smuzhiyun 	if (val & SYMBOL_CHOICEVAL)
95*4882a593Smuzhiyun 		strcat(buf, "choiceval/");
96*4882a593Smuzhiyun 	if (val & SYMBOL_VALID)
97*4882a593Smuzhiyun 		strcat(buf, "valid/");
98*4882a593Smuzhiyun 	if (val & SYMBOL_OPTIONAL)
99*4882a593Smuzhiyun 		strcat(buf, "optional/");
100*4882a593Smuzhiyun 	if (val & SYMBOL_WRITE)
101*4882a593Smuzhiyun 		strcat(buf, "write/");
102*4882a593Smuzhiyun 	if (val & SYMBOL_CHANGED)
103*4882a593Smuzhiyun 		strcat(buf, "changed/");
104*4882a593Smuzhiyun 	if (val & SYMBOL_AUTO)
105*4882a593Smuzhiyun 		strcat(buf, "auto/");
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	buf[strlen(buf) - 1] = '\0';
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return buf;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
replace_button_icon(GladeXML * xml,GdkDrawable * window,GtkStyle * style,gchar * btn_name,gchar ** xpm)112*4882a593Smuzhiyun void replace_button_icon(GladeXML * xml, GdkDrawable * window,
113*4882a593Smuzhiyun 			 GtkStyle * style, gchar * btn_name, gchar ** xpm)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	GdkPixmap *pixmap;
116*4882a593Smuzhiyun 	GdkBitmap *mask;
117*4882a593Smuzhiyun 	GtkToolButton *button;
118*4882a593Smuzhiyun 	GtkWidget *image;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	pixmap = gdk_pixmap_create_from_xpm_d(window, &mask,
121*4882a593Smuzhiyun 					      &style->bg[GTK_STATE_NORMAL],
122*4882a593Smuzhiyun 					      xpm);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name));
125*4882a593Smuzhiyun 	image = gtk_image_new_from_pixmap(pixmap, mask);
126*4882a593Smuzhiyun 	gtk_widget_show(image);
127*4882a593Smuzhiyun 	gtk_tool_button_set_icon_widget(button, image);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* Main Window Initialization */
init_main_window(const gchar * glade_file)131*4882a593Smuzhiyun void init_main_window(const gchar * glade_file)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	GladeXML *xml;
134*4882a593Smuzhiyun 	GtkWidget *widget;
135*4882a593Smuzhiyun 	GtkTextBuffer *txtbuf;
136*4882a593Smuzhiyun 	GtkStyle *style;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	xml = glade_xml_new(glade_file, "window1", NULL);
139*4882a593Smuzhiyun 	if (!xml)
140*4882a593Smuzhiyun 		g_error(_("GUI loading failed !\n"));
141*4882a593Smuzhiyun 	glade_xml_signal_autoconnect(xml);
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	main_wnd = glade_xml_get_widget(xml, "window1");
144*4882a593Smuzhiyun 	hpaned = glade_xml_get_widget(xml, "hpaned1");
145*4882a593Smuzhiyun 	vpaned = glade_xml_get_widget(xml, "vpaned1");
146*4882a593Smuzhiyun 	tree1_w = glade_xml_get_widget(xml, "treeview1");
147*4882a593Smuzhiyun 	tree2_w = glade_xml_get_widget(xml, "treeview2");
148*4882a593Smuzhiyun 	text_w = glade_xml_get_widget(xml, "textview3");
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	back_btn = glade_xml_get_widget(xml, "button1");
151*4882a593Smuzhiyun 	gtk_widget_set_sensitive(back_btn, FALSE);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	widget = glade_xml_get_widget(xml, "show_name1");
154*4882a593Smuzhiyun 	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
155*4882a593Smuzhiyun 				       show_name);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	widget = glade_xml_get_widget(xml, "show_range1");
158*4882a593Smuzhiyun 	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
159*4882a593Smuzhiyun 				       show_range);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	widget = glade_xml_get_widget(xml, "show_data1");
162*4882a593Smuzhiyun 	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
163*4882a593Smuzhiyun 				       show_value);
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	save_btn = glade_xml_get_widget(xml, "button3");
166*4882a593Smuzhiyun 	save_menu_item = glade_xml_get_widget(xml, "save1");
167*4882a593Smuzhiyun 	conf_set_changed_callback(conf_changed);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	style = gtk_widget_get_style(main_wnd);
170*4882a593Smuzhiyun 	widget = glade_xml_get_widget(xml, "toolbar1");
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	replace_button_icon(xml, main_wnd->window, style,
173*4882a593Smuzhiyun 			    "button4", (gchar **) xpm_single_view);
174*4882a593Smuzhiyun 	replace_button_icon(xml, main_wnd->window, style,
175*4882a593Smuzhiyun 			    "button5", (gchar **) xpm_split_view);
176*4882a593Smuzhiyun 	replace_button_icon(xml, main_wnd->window, style,
177*4882a593Smuzhiyun 			    "button6", (gchar **) xpm_tree_view);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 	txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
180*4882a593Smuzhiyun 	tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1",
181*4882a593Smuzhiyun 					  "foreground", "red",
182*4882a593Smuzhiyun 					  "weight", PANGO_WEIGHT_BOLD,
183*4882a593Smuzhiyun 					  NULL);
184*4882a593Smuzhiyun 	tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2",
185*4882a593Smuzhiyun 					  /*"style", PANGO_STYLE_OBLIQUE, */
186*4882a593Smuzhiyun 					  NULL);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	gtk_widget_show(main_wnd);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
init_tree_model(void)193*4882a593Smuzhiyun void init_tree_model(void)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	gint i;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	tree = tree2 = gtk_tree_store_new(COL_NUMBER,
198*4882a593Smuzhiyun 					  G_TYPE_STRING, G_TYPE_STRING,
199*4882a593Smuzhiyun 					  G_TYPE_STRING, G_TYPE_STRING,
200*4882a593Smuzhiyun 					  G_TYPE_STRING, G_TYPE_STRING,
201*4882a593Smuzhiyun 					  G_TYPE_POINTER, GDK_TYPE_COLOR,
202*4882a593Smuzhiyun 					  G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
203*4882a593Smuzhiyun 					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
204*4882a593Smuzhiyun 					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
205*4882a593Smuzhiyun 					  G_TYPE_BOOLEAN);
206*4882a593Smuzhiyun 	model2 = GTK_TREE_MODEL(tree2);
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	for (parents[0] = NULL, i = 1; i < 256; i++)
209*4882a593Smuzhiyun 		parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter));
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	tree1 = gtk_tree_store_new(COL_NUMBER,
212*4882a593Smuzhiyun 				   G_TYPE_STRING, G_TYPE_STRING,
213*4882a593Smuzhiyun 				   G_TYPE_STRING, G_TYPE_STRING,
214*4882a593Smuzhiyun 				   G_TYPE_STRING, G_TYPE_STRING,
215*4882a593Smuzhiyun 				   G_TYPE_POINTER, GDK_TYPE_COLOR,
216*4882a593Smuzhiyun 				   G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
217*4882a593Smuzhiyun 				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
218*4882a593Smuzhiyun 				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
219*4882a593Smuzhiyun 				   G_TYPE_BOOLEAN);
220*4882a593Smuzhiyun 	model1 = GTK_TREE_MODEL(tree1);
221*4882a593Smuzhiyun }
222*4882a593Smuzhiyun 
init_left_tree(void)223*4882a593Smuzhiyun void init_left_tree(void)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	GtkTreeView *view = GTK_TREE_VIEW(tree1_w);
226*4882a593Smuzhiyun 	GtkCellRenderer *renderer;
227*4882a593Smuzhiyun 	GtkTreeSelection *sel;
228*4882a593Smuzhiyun 	GtkTreeViewColumn *column;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	gtk_tree_view_set_model(view, model1);
231*4882a593Smuzhiyun 	gtk_tree_view_set_headers_visible(view, TRUE);
232*4882a593Smuzhiyun 	gtk_tree_view_set_rules_hint(view, TRUE);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	column = gtk_tree_view_column_new();
235*4882a593Smuzhiyun 	gtk_tree_view_append_column(view, column);
236*4882a593Smuzhiyun 	gtk_tree_view_column_set_title(column, _("Options"));
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_toggle_new();
239*4882a593Smuzhiyun 	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
240*4882a593Smuzhiyun 					renderer, FALSE);
241*4882a593Smuzhiyun 	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
242*4882a593Smuzhiyun 					    renderer,
243*4882a593Smuzhiyun 					    "active", COL_BTNACT,
244*4882a593Smuzhiyun 					    "inconsistent", COL_BTNINC,
245*4882a593Smuzhiyun 					    "visible", COL_BTNVIS,
246*4882a593Smuzhiyun 					    "radio", COL_BTNRAD, NULL);
247*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
248*4882a593Smuzhiyun 	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
249*4882a593Smuzhiyun 					renderer, FALSE);
250*4882a593Smuzhiyun 	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
251*4882a593Smuzhiyun 					    renderer,
252*4882a593Smuzhiyun 					    "text", COL_OPTION,
253*4882a593Smuzhiyun 					    "foreground-gdk",
254*4882a593Smuzhiyun 					    COL_COLOR, NULL);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	sel = gtk_tree_view_get_selection(view);
257*4882a593Smuzhiyun 	gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
258*4882a593Smuzhiyun 	gtk_widget_realize(tree1_w);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun static void renderer_edited(GtkCellRendererText * cell,
262*4882a593Smuzhiyun 			    const gchar * path_string,
263*4882a593Smuzhiyun 			    const gchar * new_text, gpointer user_data);
264*4882a593Smuzhiyun 
init_right_tree(void)265*4882a593Smuzhiyun void init_right_tree(void)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 	GtkTreeView *view = GTK_TREE_VIEW(tree2_w);
268*4882a593Smuzhiyun 	GtkCellRenderer *renderer;
269*4882a593Smuzhiyun 	GtkTreeSelection *sel;
270*4882a593Smuzhiyun 	GtkTreeViewColumn *column;
271*4882a593Smuzhiyun 	gint i;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	gtk_tree_view_set_model(view, model2);
274*4882a593Smuzhiyun 	gtk_tree_view_set_headers_visible(view, TRUE);
275*4882a593Smuzhiyun 	gtk_tree_view_set_rules_hint(view, TRUE);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	column = gtk_tree_view_column_new();
278*4882a593Smuzhiyun 	gtk_tree_view_append_column(view, column);
279*4882a593Smuzhiyun 	gtk_tree_view_column_set_title(column, _("Options"));
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_pixbuf_new();
282*4882a593Smuzhiyun 	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
283*4882a593Smuzhiyun 					renderer, FALSE);
284*4882a593Smuzhiyun 	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
285*4882a593Smuzhiyun 					    renderer,
286*4882a593Smuzhiyun 					    "pixbuf", COL_PIXBUF,
287*4882a593Smuzhiyun 					    "visible", COL_PIXVIS, NULL);
288*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_toggle_new();
289*4882a593Smuzhiyun 	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
290*4882a593Smuzhiyun 					renderer, FALSE);
291*4882a593Smuzhiyun 	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
292*4882a593Smuzhiyun 					    renderer,
293*4882a593Smuzhiyun 					    "active", COL_BTNACT,
294*4882a593Smuzhiyun 					    "inconsistent", COL_BTNINC,
295*4882a593Smuzhiyun 					    "visible", COL_BTNVIS,
296*4882a593Smuzhiyun 					    "radio", COL_BTNRAD, NULL);
297*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
298*4882a593Smuzhiyun 	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
299*4882a593Smuzhiyun 					renderer, FALSE);
300*4882a593Smuzhiyun 	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
301*4882a593Smuzhiyun 					    renderer,
302*4882a593Smuzhiyun 					    "text", COL_OPTION,
303*4882a593Smuzhiyun 					    "foreground-gdk",
304*4882a593Smuzhiyun 					    COL_COLOR, NULL);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
307*4882a593Smuzhiyun 	gtk_tree_view_insert_column_with_attributes(view, -1,
308*4882a593Smuzhiyun 						    _("Name"), renderer,
309*4882a593Smuzhiyun 						    "text", COL_NAME,
310*4882a593Smuzhiyun 						    "foreground-gdk",
311*4882a593Smuzhiyun 						    COL_COLOR, NULL);
312*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
313*4882a593Smuzhiyun 	gtk_tree_view_insert_column_with_attributes(view, -1,
314*4882a593Smuzhiyun 						    "N", renderer,
315*4882a593Smuzhiyun 						    "text", COL_NO,
316*4882a593Smuzhiyun 						    "foreground-gdk",
317*4882a593Smuzhiyun 						    COL_COLOR, NULL);
318*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
319*4882a593Smuzhiyun 	gtk_tree_view_insert_column_with_attributes(view, -1,
320*4882a593Smuzhiyun 						    "M", renderer,
321*4882a593Smuzhiyun 						    "text", COL_MOD,
322*4882a593Smuzhiyun 						    "foreground-gdk",
323*4882a593Smuzhiyun 						    COL_COLOR, NULL);
324*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
325*4882a593Smuzhiyun 	gtk_tree_view_insert_column_with_attributes(view, -1,
326*4882a593Smuzhiyun 						    "Y", renderer,
327*4882a593Smuzhiyun 						    "text", COL_YES,
328*4882a593Smuzhiyun 						    "foreground-gdk",
329*4882a593Smuzhiyun 						    COL_COLOR, NULL);
330*4882a593Smuzhiyun 	renderer = gtk_cell_renderer_text_new();
331*4882a593Smuzhiyun 	gtk_tree_view_insert_column_with_attributes(view, -1,
332*4882a593Smuzhiyun 						    _("Value"), renderer,
333*4882a593Smuzhiyun 						    "text", COL_VALUE,
334*4882a593Smuzhiyun 						    "editable",
335*4882a593Smuzhiyun 						    COL_EDIT,
336*4882a593Smuzhiyun 						    "foreground-gdk",
337*4882a593Smuzhiyun 						    COL_COLOR, NULL);
338*4882a593Smuzhiyun 	g_signal_connect(G_OBJECT(renderer), "edited",
339*4882a593Smuzhiyun 			 G_CALLBACK(renderer_edited), NULL);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	column = gtk_tree_view_get_column(view, COL_NAME);
342*4882a593Smuzhiyun 	gtk_tree_view_column_set_visible(column, show_name);
343*4882a593Smuzhiyun 	column = gtk_tree_view_get_column(view, COL_NO);
344*4882a593Smuzhiyun 	gtk_tree_view_column_set_visible(column, show_range);
345*4882a593Smuzhiyun 	column = gtk_tree_view_get_column(view, COL_MOD);
346*4882a593Smuzhiyun 	gtk_tree_view_column_set_visible(column, show_range);
347*4882a593Smuzhiyun 	column = gtk_tree_view_get_column(view, COL_YES);
348*4882a593Smuzhiyun 	gtk_tree_view_column_set_visible(column, show_range);
349*4882a593Smuzhiyun 	column = gtk_tree_view_get_column(view, COL_VALUE);
350*4882a593Smuzhiyun 	gtk_tree_view_column_set_visible(column, show_value);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	if (resizeable) {
353*4882a593Smuzhiyun 		for (i = 0; i < COL_VALUE; i++) {
354*4882a593Smuzhiyun 			column = gtk_tree_view_get_column(view, i);
355*4882a593Smuzhiyun 			gtk_tree_view_column_set_resizable(column, TRUE);
356*4882a593Smuzhiyun 		}
357*4882a593Smuzhiyun 	}
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	sel = gtk_tree_view_get_selection(view);
360*4882a593Smuzhiyun 	gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
361*4882a593Smuzhiyun }
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun /* Utility Functions */
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 
text_insert_help(struct menu * menu)367*4882a593Smuzhiyun static void text_insert_help(struct menu *menu)
368*4882a593Smuzhiyun {
369*4882a593Smuzhiyun 	GtkTextBuffer *buffer;
370*4882a593Smuzhiyun 	GtkTextIter start, end;
371*4882a593Smuzhiyun 	const char *prompt = _(menu_get_prompt(menu));
372*4882a593Smuzhiyun 	struct gstr help = str_new();
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	menu_get_ext_help(menu, &help);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
377*4882a593Smuzhiyun 	gtk_text_buffer_get_bounds(buffer, &start, &end);
378*4882a593Smuzhiyun 	gtk_text_buffer_delete(buffer, &start, &end);
379*4882a593Smuzhiyun 	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	gtk_text_buffer_get_end_iter(buffer, &end);
382*4882a593Smuzhiyun 	gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
383*4882a593Smuzhiyun 					 NULL);
384*4882a593Smuzhiyun 	gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
385*4882a593Smuzhiyun 	gtk_text_buffer_get_end_iter(buffer, &end);
386*4882a593Smuzhiyun 	gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
387*4882a593Smuzhiyun 					 NULL);
388*4882a593Smuzhiyun 	str_free(&help);
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 
text_insert_msg(const char * title,const char * message)392*4882a593Smuzhiyun static void text_insert_msg(const char *title, const char *message)
393*4882a593Smuzhiyun {
394*4882a593Smuzhiyun 	GtkTextBuffer *buffer;
395*4882a593Smuzhiyun 	GtkTextIter start, end;
396*4882a593Smuzhiyun 	const char *msg = message;
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
399*4882a593Smuzhiyun 	gtk_text_buffer_get_bounds(buffer, &start, &end);
400*4882a593Smuzhiyun 	gtk_text_buffer_delete(buffer, &start, &end);
401*4882a593Smuzhiyun 	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15);
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	gtk_text_buffer_get_end_iter(buffer, &end);
404*4882a593Smuzhiyun 	gtk_text_buffer_insert_with_tags(buffer, &end, title, -1, tag1,
405*4882a593Smuzhiyun 					 NULL);
406*4882a593Smuzhiyun 	gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
407*4882a593Smuzhiyun 	gtk_text_buffer_get_end_iter(buffer, &end);
408*4882a593Smuzhiyun 	gtk_text_buffer_insert_with_tags(buffer, &end, msg, -1, tag2,
409*4882a593Smuzhiyun 					 NULL);
410*4882a593Smuzhiyun }
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun /* Main Windows Callbacks */
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun void on_save_activate(GtkMenuItem * menuitem, gpointer user_data);
on_window1_delete_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)416*4882a593Smuzhiyun gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event,
417*4882a593Smuzhiyun 				 gpointer user_data)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun 	GtkWidget *dialog, *label;
420*4882a593Smuzhiyun 	gint result;
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	if (!conf_get_changed())
423*4882a593Smuzhiyun 		return FALSE;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	dialog = gtk_dialog_new_with_buttons(_("Warning !"),
426*4882a593Smuzhiyun 					     GTK_WINDOW(main_wnd),
427*4882a593Smuzhiyun 					     (GtkDialogFlags)
428*4882a593Smuzhiyun 					     (GTK_DIALOG_MODAL |
429*4882a593Smuzhiyun 					      GTK_DIALOG_DESTROY_WITH_PARENT),
430*4882a593Smuzhiyun 					     GTK_STOCK_OK,
431*4882a593Smuzhiyun 					     GTK_RESPONSE_YES,
432*4882a593Smuzhiyun 					     GTK_STOCK_NO,
433*4882a593Smuzhiyun 					     GTK_RESPONSE_NO,
434*4882a593Smuzhiyun 					     GTK_STOCK_CANCEL,
435*4882a593Smuzhiyun 					     GTK_RESPONSE_CANCEL, NULL);
436*4882a593Smuzhiyun 	gtk_dialog_set_default_response(GTK_DIALOG(dialog),
437*4882a593Smuzhiyun 					GTK_RESPONSE_CANCEL);
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	label = gtk_label_new(_("\nSave configuration ?\n"));
440*4882a593Smuzhiyun 	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
441*4882a593Smuzhiyun 	gtk_widget_show(label);
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	result = gtk_dialog_run(GTK_DIALOG(dialog));
444*4882a593Smuzhiyun 	switch (result) {
445*4882a593Smuzhiyun 	case GTK_RESPONSE_YES:
446*4882a593Smuzhiyun 		on_save_activate(NULL, NULL);
447*4882a593Smuzhiyun 		return FALSE;
448*4882a593Smuzhiyun 	case GTK_RESPONSE_NO:
449*4882a593Smuzhiyun 		return FALSE;
450*4882a593Smuzhiyun 	case GTK_RESPONSE_CANCEL:
451*4882a593Smuzhiyun 	case GTK_RESPONSE_DELETE_EVENT:
452*4882a593Smuzhiyun 	default:
453*4882a593Smuzhiyun 		gtk_widget_destroy(dialog);
454*4882a593Smuzhiyun 		return TRUE;
455*4882a593Smuzhiyun 	}
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun 	return FALSE;
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 
on_window1_destroy(GtkObject * object,gpointer user_data)461*4882a593Smuzhiyun void on_window1_destroy(GtkObject * object, gpointer user_data)
462*4882a593Smuzhiyun {
463*4882a593Smuzhiyun 	gtk_main_quit();
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun void
on_window1_size_request(GtkWidget * widget,GtkRequisition * requisition,gpointer user_data)468*4882a593Smuzhiyun on_window1_size_request(GtkWidget * widget,
469*4882a593Smuzhiyun 			GtkRequisition * requisition, gpointer user_data)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun 	static gint old_h;
472*4882a593Smuzhiyun 	gint w, h;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	if (widget->window == NULL)
475*4882a593Smuzhiyun 		gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h);
476*4882a593Smuzhiyun 	else
477*4882a593Smuzhiyun 		gdk_window_get_size(widget->window, &w, &h);
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	if (h == old_h)
480*4882a593Smuzhiyun 		return;
481*4882a593Smuzhiyun 	old_h = h;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3);
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun /* Menu & Toolbar Callbacks */
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun static void
load_filename(GtkFileSelection * file_selector,gpointer user_data)491*4882a593Smuzhiyun load_filename(GtkFileSelection * file_selector, gpointer user_data)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun 	const gchar *fn;
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION
496*4882a593Smuzhiyun 					     (user_data));
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	if (conf_read(fn))
499*4882a593Smuzhiyun 		text_insert_msg(_("Error"), _("Unable to load configuration !"));
500*4882a593Smuzhiyun 	else
501*4882a593Smuzhiyun 		display_tree(&rootmenu);
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun 
on_load1_activate(GtkMenuItem * menuitem,gpointer user_data)504*4882a593Smuzhiyun void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun 	GtkWidget *fs;
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun 	fs = gtk_file_selection_new(_("Load file..."));
509*4882a593Smuzhiyun 	g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
510*4882a593Smuzhiyun 			 "clicked",
511*4882a593Smuzhiyun 			 G_CALLBACK(load_filename), (gpointer) fs);
512*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT
513*4882a593Smuzhiyun 				 (GTK_FILE_SELECTION(fs)->ok_button),
514*4882a593Smuzhiyun 				 "clicked", G_CALLBACK(gtk_widget_destroy),
515*4882a593Smuzhiyun 				 (gpointer) fs);
516*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT
517*4882a593Smuzhiyun 				 (GTK_FILE_SELECTION(fs)->cancel_button),
518*4882a593Smuzhiyun 				 "clicked", G_CALLBACK(gtk_widget_destroy),
519*4882a593Smuzhiyun 				 (gpointer) fs);
520*4882a593Smuzhiyun 	gtk_widget_show(fs);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 
on_save_activate(GtkMenuItem * menuitem,gpointer user_data)524*4882a593Smuzhiyun void on_save_activate(GtkMenuItem * menuitem, gpointer user_data)
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun 	if (conf_write(NULL))
527*4882a593Smuzhiyun 		text_insert_msg(_("Error"), _("Unable to save configuration !"));
528*4882a593Smuzhiyun }
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun static void
store_filename(GtkFileSelection * file_selector,gpointer user_data)532*4882a593Smuzhiyun store_filename(GtkFileSelection * file_selector, gpointer user_data)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	const gchar *fn;
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION
537*4882a593Smuzhiyun 					     (user_data));
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	if (conf_write(fn))
540*4882a593Smuzhiyun 		text_insert_msg(_("Error"), _("Unable to save configuration !"));
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	gtk_widget_destroy(GTK_WIDGET(user_data));
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun 
on_save_as1_activate(GtkMenuItem * menuitem,gpointer user_data)545*4882a593Smuzhiyun void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data)
546*4882a593Smuzhiyun {
547*4882a593Smuzhiyun 	GtkWidget *fs;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	fs = gtk_file_selection_new(_("Save file as..."));
550*4882a593Smuzhiyun 	g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
551*4882a593Smuzhiyun 			 "clicked",
552*4882a593Smuzhiyun 			 G_CALLBACK(store_filename), (gpointer) fs);
553*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT
554*4882a593Smuzhiyun 				 (GTK_FILE_SELECTION(fs)->ok_button),
555*4882a593Smuzhiyun 				 "clicked", G_CALLBACK(gtk_widget_destroy),
556*4882a593Smuzhiyun 				 (gpointer) fs);
557*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT
558*4882a593Smuzhiyun 				 (GTK_FILE_SELECTION(fs)->cancel_button),
559*4882a593Smuzhiyun 				 "clicked", G_CALLBACK(gtk_widget_destroy),
560*4882a593Smuzhiyun 				 (gpointer) fs);
561*4882a593Smuzhiyun 	gtk_widget_show(fs);
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 
on_quit1_activate(GtkMenuItem * menuitem,gpointer user_data)565*4882a593Smuzhiyun void on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun 	if (!on_window1_delete_event(NULL, NULL, NULL))
568*4882a593Smuzhiyun 		gtk_widget_destroy(GTK_WIDGET(main_wnd));
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 
on_show_name1_activate(GtkMenuItem * menuitem,gpointer user_data)572*4882a593Smuzhiyun void on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun 	GtkTreeViewColumn *col;
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	show_name = GTK_CHECK_MENU_ITEM(menuitem)->active;
577*4882a593Smuzhiyun 	col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME);
578*4882a593Smuzhiyun 	if (col)
579*4882a593Smuzhiyun 		gtk_tree_view_column_set_visible(col, show_name);
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 
on_show_range1_activate(GtkMenuItem * menuitem,gpointer user_data)583*4882a593Smuzhiyun void on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	GtkTreeViewColumn *col;
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	show_range = GTK_CHECK_MENU_ITEM(menuitem)->active;
588*4882a593Smuzhiyun 	col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO);
589*4882a593Smuzhiyun 	if (col)
590*4882a593Smuzhiyun 		gtk_tree_view_column_set_visible(col, show_range);
591*4882a593Smuzhiyun 	col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_MOD);
592*4882a593Smuzhiyun 	if (col)
593*4882a593Smuzhiyun 		gtk_tree_view_column_set_visible(col, show_range);
594*4882a593Smuzhiyun 	col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_YES);
595*4882a593Smuzhiyun 	if (col)
596*4882a593Smuzhiyun 		gtk_tree_view_column_set_visible(col, show_range);
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 
on_show_data1_activate(GtkMenuItem * menuitem,gpointer user_data)601*4882a593Smuzhiyun void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
602*4882a593Smuzhiyun {
603*4882a593Smuzhiyun 	GtkTreeViewColumn *col;
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun 	show_value = GTK_CHECK_MENU_ITEM(menuitem)->active;
606*4882a593Smuzhiyun 	col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE);
607*4882a593Smuzhiyun 	if (col)
608*4882a593Smuzhiyun 		gtk_tree_view_column_set_visible(col, show_value);
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun void
on_set_option_mode1_activate(GtkMenuItem * menuitem,gpointer user_data)613*4882a593Smuzhiyun on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun 	opt_mode = OPT_NORMAL;
616*4882a593Smuzhiyun 	gtk_tree_store_clear(tree2);
617*4882a593Smuzhiyun 	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun void
on_set_option_mode2_activate(GtkMenuItem * menuitem,gpointer user_data)622*4882a593Smuzhiyun on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
623*4882a593Smuzhiyun {
624*4882a593Smuzhiyun 	opt_mode = OPT_ALL;
625*4882a593Smuzhiyun 	gtk_tree_store_clear(tree2);
626*4882a593Smuzhiyun 	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun void
on_set_option_mode3_activate(GtkMenuItem * menuitem,gpointer user_data)631*4882a593Smuzhiyun on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
632*4882a593Smuzhiyun {
633*4882a593Smuzhiyun 	opt_mode = OPT_PROMPT;
634*4882a593Smuzhiyun 	gtk_tree_store_clear(tree2);
635*4882a593Smuzhiyun 	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun 
on_introduction1_activate(GtkMenuItem * menuitem,gpointer user_data)639*4882a593Smuzhiyun void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun 	GtkWidget *dialog;
642*4882a593Smuzhiyun 	const gchar *intro_text = _(
643*4882a593Smuzhiyun 	    "Welcome to gkc, the GTK+ graphical configuration tool\n"
644*4882a593Smuzhiyun 	    "For each option, a blank box indicates the feature is disabled, a\n"
645*4882a593Smuzhiyun 	    "check indicates it is enabled, and a dot indicates that it is to\n"
646*4882a593Smuzhiyun 	    "be compiled as a module.  Clicking on the box will cycle through the three states.\n"
647*4882a593Smuzhiyun 	    "\n"
648*4882a593Smuzhiyun 	    "If you do not see an option (e.g., a device driver) that you\n"
649*4882a593Smuzhiyun 	    "believe should be present, try turning on Show All Options\n"
650*4882a593Smuzhiyun 	    "under the Options menu.\n"
651*4882a593Smuzhiyun 	    "Although there is no cross reference yet to help you figure out\n"
652*4882a593Smuzhiyun 	    "what other options must be enabled to support the option you\n"
653*4882a593Smuzhiyun 	    "are interested in, you can still view the help of a grayed-out\n"
654*4882a593Smuzhiyun 	    "option.\n"
655*4882a593Smuzhiyun 	    "\n"
656*4882a593Smuzhiyun 	    "Toggling Show Debug Info under the Options menu will show \n"
657*4882a593Smuzhiyun 	    "the dependencies, which you can then match by examining other options.");
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun 	dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
660*4882a593Smuzhiyun 					GTK_DIALOG_DESTROY_WITH_PARENT,
661*4882a593Smuzhiyun 					GTK_MESSAGE_INFO,
662*4882a593Smuzhiyun 					GTK_BUTTONS_CLOSE, "%s", intro_text);
663*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
664*4882a593Smuzhiyun 				 G_CALLBACK(gtk_widget_destroy),
665*4882a593Smuzhiyun 				 GTK_OBJECT(dialog));
666*4882a593Smuzhiyun 	gtk_widget_show_all(dialog);
667*4882a593Smuzhiyun }
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 
on_about1_activate(GtkMenuItem * menuitem,gpointer user_data)670*4882a593Smuzhiyun void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data)
671*4882a593Smuzhiyun {
672*4882a593Smuzhiyun 	GtkWidget *dialog;
673*4882a593Smuzhiyun 	const gchar *about_text =
674*4882a593Smuzhiyun 	    _("gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n"
675*4882a593Smuzhiyun 	      "Based on the source code from Roman Zippel.\n");
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
678*4882a593Smuzhiyun 					GTK_DIALOG_DESTROY_WITH_PARENT,
679*4882a593Smuzhiyun 					GTK_MESSAGE_INFO,
680*4882a593Smuzhiyun 					GTK_BUTTONS_CLOSE, "%s", about_text);
681*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
682*4882a593Smuzhiyun 				 G_CALLBACK(gtk_widget_destroy),
683*4882a593Smuzhiyun 				 GTK_OBJECT(dialog));
684*4882a593Smuzhiyun 	gtk_widget_show_all(dialog);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 
on_license1_activate(GtkMenuItem * menuitem,gpointer user_data)688*4882a593Smuzhiyun void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	GtkWidget *dialog;
691*4882a593Smuzhiyun 	const gchar *license_text =
692*4882a593Smuzhiyun 	    _("gkc is released under the terms of the GNU GPL v2.\n"
693*4882a593Smuzhiyun 	      "For more information, please see the source code or\n"
694*4882a593Smuzhiyun 	      "visit http://www.fsf.org/licenses/licenses.html\n");
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
697*4882a593Smuzhiyun 					GTK_DIALOG_DESTROY_WITH_PARENT,
698*4882a593Smuzhiyun 					GTK_MESSAGE_INFO,
699*4882a593Smuzhiyun 					GTK_BUTTONS_CLOSE, "%s", license_text);
700*4882a593Smuzhiyun 	g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
701*4882a593Smuzhiyun 				 G_CALLBACK(gtk_widget_destroy),
702*4882a593Smuzhiyun 				 GTK_OBJECT(dialog));
703*4882a593Smuzhiyun 	gtk_widget_show_all(dialog);
704*4882a593Smuzhiyun }
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 
on_back_clicked(GtkButton * button,gpointer user_data)707*4882a593Smuzhiyun void on_back_clicked(GtkButton * button, gpointer user_data)
708*4882a593Smuzhiyun {
709*4882a593Smuzhiyun 	enum prop_type ptype;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	current = current->parent;
712*4882a593Smuzhiyun 	ptype = current->prompt ? current->prompt->type : P_UNKNOWN;
713*4882a593Smuzhiyun 	if (ptype != P_MENU)
714*4882a593Smuzhiyun 		current = current->parent;
715*4882a593Smuzhiyun 	display_tree_part();
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	if (current == &rootmenu)
718*4882a593Smuzhiyun 		gtk_widget_set_sensitive(back_btn, FALSE);
719*4882a593Smuzhiyun }
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 
on_load_clicked(GtkButton * button,gpointer user_data)722*4882a593Smuzhiyun void on_load_clicked(GtkButton * button, gpointer user_data)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun 	on_load1_activate(NULL, user_data);
725*4882a593Smuzhiyun }
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 
on_single_clicked(GtkButton * button,gpointer user_data)728*4882a593Smuzhiyun void on_single_clicked(GtkButton * button, gpointer user_data)
729*4882a593Smuzhiyun {
730*4882a593Smuzhiyun 	view_mode = SINGLE_VIEW;
731*4882a593Smuzhiyun 	gtk_widget_hide(tree1_w);
732*4882a593Smuzhiyun 	current = &rootmenu;
733*4882a593Smuzhiyun 	display_tree_part();
734*4882a593Smuzhiyun }
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 
on_split_clicked(GtkButton * button,gpointer user_data)737*4882a593Smuzhiyun void on_split_clicked(GtkButton * button, gpointer user_data)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun 	gint w, h;
740*4882a593Smuzhiyun 	view_mode = SPLIT_VIEW;
741*4882a593Smuzhiyun 	gtk_widget_show(tree1_w);
742*4882a593Smuzhiyun 	gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h);
743*4882a593Smuzhiyun 	gtk_paned_set_position(GTK_PANED(hpaned), w / 2);
744*4882a593Smuzhiyun 	if (tree2)
745*4882a593Smuzhiyun 		gtk_tree_store_clear(tree2);
746*4882a593Smuzhiyun 	display_list();
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	/* Disable back btn, like in full mode. */
749*4882a593Smuzhiyun 	gtk_widget_set_sensitive(back_btn, FALSE);
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 
on_full_clicked(GtkButton * button,gpointer user_data)753*4882a593Smuzhiyun void on_full_clicked(GtkButton * button, gpointer user_data)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun 	view_mode = FULL_VIEW;
756*4882a593Smuzhiyun 	gtk_widget_hide(tree1_w);
757*4882a593Smuzhiyun 	if (tree2)
758*4882a593Smuzhiyun 		gtk_tree_store_clear(tree2);
759*4882a593Smuzhiyun 	display_tree(&rootmenu);
760*4882a593Smuzhiyun 	gtk_widget_set_sensitive(back_btn, FALSE);
761*4882a593Smuzhiyun }
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 
on_collapse_clicked(GtkButton * button,gpointer user_data)764*4882a593Smuzhiyun void on_collapse_clicked(GtkButton * button, gpointer user_data)
765*4882a593Smuzhiyun {
766*4882a593Smuzhiyun 	gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w));
767*4882a593Smuzhiyun }
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun 
on_expand_clicked(GtkButton * button,gpointer user_data)770*4882a593Smuzhiyun void on_expand_clicked(GtkButton * button, gpointer user_data)
771*4882a593Smuzhiyun {
772*4882a593Smuzhiyun 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));
773*4882a593Smuzhiyun }
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun /* CTree Callbacks */
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun /* Change hex/int/string value in the cell */
renderer_edited(GtkCellRendererText * cell,const gchar * path_string,const gchar * new_text,gpointer user_data)779*4882a593Smuzhiyun static void renderer_edited(GtkCellRendererText * cell,
780*4882a593Smuzhiyun 			    const gchar * path_string,
781*4882a593Smuzhiyun 			    const gchar * new_text, gpointer user_data)
782*4882a593Smuzhiyun {
783*4882a593Smuzhiyun 	GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
784*4882a593Smuzhiyun 	GtkTreeIter iter;
785*4882a593Smuzhiyun 	const char *old_def, *new_def;
786*4882a593Smuzhiyun 	struct menu *menu;
787*4882a593Smuzhiyun 	struct symbol *sym;
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	if (!gtk_tree_model_get_iter(model2, &iter, path))
790*4882a593Smuzhiyun 		return;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
793*4882a593Smuzhiyun 	sym = menu->sym;
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 	gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1);
796*4882a593Smuzhiyun 	new_def = new_text;
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	sym_set_string_value(sym, new_def);
799*4882a593Smuzhiyun 
800*4882a593Smuzhiyun 	update_tree(&rootmenu, NULL);
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	gtk_tree_path_free(path);
803*4882a593Smuzhiyun }
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun /* Change the value of a symbol and update the tree */
change_sym_value(struct menu * menu,gint col)806*4882a593Smuzhiyun static void change_sym_value(struct menu *menu, gint col)
807*4882a593Smuzhiyun {
808*4882a593Smuzhiyun 	struct symbol *sym = menu->sym;
809*4882a593Smuzhiyun 	tristate newval;
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun 	if (!sym)
812*4882a593Smuzhiyun 		return;
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun 	if (col == COL_NO)
815*4882a593Smuzhiyun 		newval = no;
816*4882a593Smuzhiyun 	else if (col == COL_MOD)
817*4882a593Smuzhiyun 		newval = mod;
818*4882a593Smuzhiyun 	else if (col == COL_YES)
819*4882a593Smuzhiyun 		newval = yes;
820*4882a593Smuzhiyun 	else
821*4882a593Smuzhiyun 		return;
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 	switch (sym_get_type(sym)) {
824*4882a593Smuzhiyun 	case S_BOOLEAN:
825*4882a593Smuzhiyun 	case S_TRISTATE:
826*4882a593Smuzhiyun 		if (!sym_tristate_within_range(sym, newval))
827*4882a593Smuzhiyun 			newval = yes;
828*4882a593Smuzhiyun 		sym_set_tristate_value(sym, newval);
829*4882a593Smuzhiyun 		if (view_mode == FULL_VIEW)
830*4882a593Smuzhiyun 			update_tree(&rootmenu, NULL);
831*4882a593Smuzhiyun 		else if (view_mode == SPLIT_VIEW) {
832*4882a593Smuzhiyun 			update_tree(browsed, NULL);
833*4882a593Smuzhiyun 			display_list();
834*4882a593Smuzhiyun 		}
835*4882a593Smuzhiyun 		else if (view_mode == SINGLE_VIEW)
836*4882a593Smuzhiyun 			display_tree_part();	//fixme: keep exp/coll
837*4882a593Smuzhiyun 		break;
838*4882a593Smuzhiyun 	case S_INT:
839*4882a593Smuzhiyun 	case S_HEX:
840*4882a593Smuzhiyun 	case S_STRING:
841*4882a593Smuzhiyun 	default:
842*4882a593Smuzhiyun 		break;
843*4882a593Smuzhiyun 	}
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun 
toggle_sym_value(struct menu * menu)846*4882a593Smuzhiyun static void toggle_sym_value(struct menu *menu)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun 	if (!menu->sym)
849*4882a593Smuzhiyun 		return;
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	sym_toggle_tristate_value(menu->sym);
852*4882a593Smuzhiyun 	if (view_mode == FULL_VIEW)
853*4882a593Smuzhiyun 		update_tree(&rootmenu, NULL);
854*4882a593Smuzhiyun 	else if (view_mode == SPLIT_VIEW) {
855*4882a593Smuzhiyun 		update_tree(browsed, NULL);
856*4882a593Smuzhiyun 		display_list();
857*4882a593Smuzhiyun 	}
858*4882a593Smuzhiyun 	else if (view_mode == SINGLE_VIEW)
859*4882a593Smuzhiyun 		display_tree_part();	//fixme: keep exp/coll
860*4882a593Smuzhiyun }
861*4882a593Smuzhiyun 
column2index(GtkTreeViewColumn * column)862*4882a593Smuzhiyun static gint column2index(GtkTreeViewColumn * column)
863*4882a593Smuzhiyun {
864*4882a593Smuzhiyun 	gint i;
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	for (i = 0; i < COL_NUMBER; i++) {
867*4882a593Smuzhiyun 		GtkTreeViewColumn *col;
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 		col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), i);
870*4882a593Smuzhiyun 		if (col == column)
871*4882a593Smuzhiyun 			return i;
872*4882a593Smuzhiyun 	}
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	return -1;
875*4882a593Smuzhiyun }
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun /* User click: update choice (full) or goes down (single) */
879*4882a593Smuzhiyun gboolean
on_treeview2_button_press_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)880*4882a593Smuzhiyun on_treeview2_button_press_event(GtkWidget * widget,
881*4882a593Smuzhiyun 				GdkEventButton * event, gpointer user_data)
882*4882a593Smuzhiyun {
883*4882a593Smuzhiyun 	GtkTreeView *view = GTK_TREE_VIEW(widget);
884*4882a593Smuzhiyun 	GtkTreePath *path;
885*4882a593Smuzhiyun 	GtkTreeViewColumn *column;
886*4882a593Smuzhiyun 	GtkTreeIter iter;
887*4882a593Smuzhiyun 	struct menu *menu;
888*4882a593Smuzhiyun 	gint col;
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun #if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK
891*4882a593Smuzhiyun 	gint tx = (gint) event->x;
892*4882a593Smuzhiyun 	gint ty = (gint) event->y;
893*4882a593Smuzhiyun 	gint cx, cy;
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun 	gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx,
896*4882a593Smuzhiyun 				      &cy);
897*4882a593Smuzhiyun #else
898*4882a593Smuzhiyun 	gtk_tree_view_get_cursor(view, &path, &column);
899*4882a593Smuzhiyun #endif
900*4882a593Smuzhiyun 	if (path == NULL)
901*4882a593Smuzhiyun 		return FALSE;
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun 	if (!gtk_tree_model_get_iter(model2, &iter, path))
904*4882a593Smuzhiyun 		return FALSE;
905*4882a593Smuzhiyun 	gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	col = column2index(column);
908*4882a593Smuzhiyun 	if (event->type == GDK_2BUTTON_PRESS) {
909*4882a593Smuzhiyun 		enum prop_type ptype;
910*4882a593Smuzhiyun 		ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 		if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) {
913*4882a593Smuzhiyun 			// goes down into menu
914*4882a593Smuzhiyun 			current = menu;
915*4882a593Smuzhiyun 			display_tree_part();
916*4882a593Smuzhiyun 			gtk_widget_set_sensitive(back_btn, TRUE);
917*4882a593Smuzhiyun 		} else if (col == COL_OPTION) {
918*4882a593Smuzhiyun 			toggle_sym_value(menu);
919*4882a593Smuzhiyun 			gtk_tree_view_expand_row(view, path, TRUE);
920*4882a593Smuzhiyun 		}
921*4882a593Smuzhiyun 	} else {
922*4882a593Smuzhiyun 		if (col == COL_VALUE) {
923*4882a593Smuzhiyun 			toggle_sym_value(menu);
924*4882a593Smuzhiyun 			gtk_tree_view_expand_row(view, path, TRUE);
925*4882a593Smuzhiyun 		} else if (col == COL_NO || col == COL_MOD
926*4882a593Smuzhiyun 			   || col == COL_YES) {
927*4882a593Smuzhiyun 			change_sym_value(menu, col);
928*4882a593Smuzhiyun 			gtk_tree_view_expand_row(view, path, TRUE);
929*4882a593Smuzhiyun 		}
930*4882a593Smuzhiyun 	}
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 	return FALSE;
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun /* Key pressed: update choice */
936*4882a593Smuzhiyun gboolean
on_treeview2_key_press_event(GtkWidget * widget,GdkEventKey * event,gpointer user_data)937*4882a593Smuzhiyun on_treeview2_key_press_event(GtkWidget * widget,
938*4882a593Smuzhiyun 			     GdkEventKey * event, gpointer user_data)
939*4882a593Smuzhiyun {
940*4882a593Smuzhiyun 	GtkTreeView *view = GTK_TREE_VIEW(widget);
941*4882a593Smuzhiyun 	GtkTreePath *path;
942*4882a593Smuzhiyun 	GtkTreeViewColumn *column;
943*4882a593Smuzhiyun 	GtkTreeIter iter;
944*4882a593Smuzhiyun 	struct menu *menu;
945*4882a593Smuzhiyun 	gint col;
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	gtk_tree_view_get_cursor(view, &path, &column);
948*4882a593Smuzhiyun 	if (path == NULL)
949*4882a593Smuzhiyun 		return FALSE;
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun 	if (event->keyval == GDK_space) {
952*4882a593Smuzhiyun 		if (gtk_tree_view_row_expanded(view, path))
953*4882a593Smuzhiyun 			gtk_tree_view_collapse_row(view, path);
954*4882a593Smuzhiyun 		else
955*4882a593Smuzhiyun 			gtk_tree_view_expand_row(view, path, FALSE);
956*4882a593Smuzhiyun 		return TRUE;
957*4882a593Smuzhiyun 	}
958*4882a593Smuzhiyun 	if (event->keyval == GDK_KP_Enter) {
959*4882a593Smuzhiyun 	}
960*4882a593Smuzhiyun 	if (widget == tree1_w)
961*4882a593Smuzhiyun 		return FALSE;
962*4882a593Smuzhiyun 
963*4882a593Smuzhiyun 	gtk_tree_model_get_iter(model2, &iter, path);
964*4882a593Smuzhiyun 	gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun 	if (!strcasecmp(event->string, "n"))
967*4882a593Smuzhiyun 		col = COL_NO;
968*4882a593Smuzhiyun 	else if (!strcasecmp(event->string, "m"))
969*4882a593Smuzhiyun 		col = COL_MOD;
970*4882a593Smuzhiyun 	else if (!strcasecmp(event->string, "y"))
971*4882a593Smuzhiyun 		col = COL_YES;
972*4882a593Smuzhiyun 	else
973*4882a593Smuzhiyun 		col = -1;
974*4882a593Smuzhiyun 	change_sym_value(menu, col);
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	return FALSE;
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun /* Row selection changed: update help */
981*4882a593Smuzhiyun void
on_treeview2_cursor_changed(GtkTreeView * treeview,gpointer user_data)982*4882a593Smuzhiyun on_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun 	GtkTreeSelection *selection;
985*4882a593Smuzhiyun 	GtkTreeIter iter;
986*4882a593Smuzhiyun 	struct menu *menu;
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	selection = gtk_tree_view_get_selection(treeview);
989*4882a593Smuzhiyun 	if (gtk_tree_selection_get_selected(selection, &model2, &iter)) {
990*4882a593Smuzhiyun 		gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
991*4882a593Smuzhiyun 		text_insert_help(menu);
992*4882a593Smuzhiyun 	}
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun /* User click: display sub-tree in the right frame. */
997*4882a593Smuzhiyun gboolean
on_treeview1_button_press_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)998*4882a593Smuzhiyun on_treeview1_button_press_event(GtkWidget * widget,
999*4882a593Smuzhiyun 				GdkEventButton * event, gpointer user_data)
1000*4882a593Smuzhiyun {
1001*4882a593Smuzhiyun 	GtkTreeView *view = GTK_TREE_VIEW(widget);
1002*4882a593Smuzhiyun 	GtkTreePath *path;
1003*4882a593Smuzhiyun 	GtkTreeViewColumn *column;
1004*4882a593Smuzhiyun 	GtkTreeIter iter;
1005*4882a593Smuzhiyun 	struct menu *menu;
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun 	gint tx = (gint) event->x;
1008*4882a593Smuzhiyun 	gint ty = (gint) event->y;
1009*4882a593Smuzhiyun 	gint cx, cy;
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 	gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx,
1012*4882a593Smuzhiyun 				      &cy);
1013*4882a593Smuzhiyun 	if (path == NULL)
1014*4882a593Smuzhiyun 		return FALSE;
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 	gtk_tree_model_get_iter(model1, &iter, path);
1017*4882a593Smuzhiyun 	gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1);
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun 	if (event->type == GDK_2BUTTON_PRESS) {
1020*4882a593Smuzhiyun 		toggle_sym_value(menu);
1021*4882a593Smuzhiyun 		current = menu;
1022*4882a593Smuzhiyun 		display_tree_part();
1023*4882a593Smuzhiyun 	} else {
1024*4882a593Smuzhiyun 		browsed = menu;
1025*4882a593Smuzhiyun 		display_tree_part();
1026*4882a593Smuzhiyun 	}
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 	gtk_widget_realize(tree2_w);
1029*4882a593Smuzhiyun 	gtk_tree_view_set_cursor(view, path, NULL, FALSE);
1030*4882a593Smuzhiyun 	gtk_widget_grab_focus(tree2_w);
1031*4882a593Smuzhiyun 
1032*4882a593Smuzhiyun 	return FALSE;
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun /* Fill a row of strings */
fill_row(struct menu * menu)1037*4882a593Smuzhiyun static gchar **fill_row(struct menu *menu)
1038*4882a593Smuzhiyun {
1039*4882a593Smuzhiyun 	static gchar *row[COL_NUMBER];
1040*4882a593Smuzhiyun 	struct symbol *sym = menu->sym;
1041*4882a593Smuzhiyun 	const char *def;
1042*4882a593Smuzhiyun 	int stype;
1043*4882a593Smuzhiyun 	tristate val;
1044*4882a593Smuzhiyun 	enum prop_type ptype;
1045*4882a593Smuzhiyun 	int i;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun 	for (i = COL_OPTION; i <= COL_COLOR; i++)
1048*4882a593Smuzhiyun 		g_free(row[i]);
1049*4882a593Smuzhiyun 	bzero(row, sizeof(row));
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 	row[COL_OPTION] =
1052*4882a593Smuzhiyun 	    g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
1053*4882a593Smuzhiyun 			    sym && !sym_has_value(sym) ? "(NEW)" : "");
1054*4882a593Smuzhiyun 
1055*4882a593Smuzhiyun 	if (opt_mode == OPT_ALL && !menu_is_visible(menu))
1056*4882a593Smuzhiyun 		row[COL_COLOR] = g_strdup("DarkGray");
1057*4882a593Smuzhiyun 	else if (opt_mode == OPT_PROMPT &&
1058*4882a593Smuzhiyun 			menu_has_prompt(menu) && !menu_is_visible(menu))
1059*4882a593Smuzhiyun 		row[COL_COLOR] = g_strdup("DarkGray");
1060*4882a593Smuzhiyun 	else
1061*4882a593Smuzhiyun 		row[COL_COLOR] = g_strdup("Black");
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun 	ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
1064*4882a593Smuzhiyun 	switch (ptype) {
1065*4882a593Smuzhiyun 	case P_MENU:
1066*4882a593Smuzhiyun 		row[COL_PIXBUF] = (gchar *) xpm_menu;
1067*4882a593Smuzhiyun 		if (view_mode == SINGLE_VIEW)
1068*4882a593Smuzhiyun 			row[COL_PIXVIS] = GINT_TO_POINTER(TRUE);
1069*4882a593Smuzhiyun 		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
1070*4882a593Smuzhiyun 		break;
1071*4882a593Smuzhiyun 	case P_COMMENT:
1072*4882a593Smuzhiyun 		row[COL_PIXBUF] = (gchar *) xpm_void;
1073*4882a593Smuzhiyun 		row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
1074*4882a593Smuzhiyun 		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
1075*4882a593Smuzhiyun 		break;
1076*4882a593Smuzhiyun 	default:
1077*4882a593Smuzhiyun 		row[COL_PIXBUF] = (gchar *) xpm_void;
1078*4882a593Smuzhiyun 		row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
1079*4882a593Smuzhiyun 		row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
1080*4882a593Smuzhiyun 		break;
1081*4882a593Smuzhiyun 	}
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	if (!sym)
1084*4882a593Smuzhiyun 		return row;
1085*4882a593Smuzhiyun 	row[COL_NAME] = g_strdup(sym->name);
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun 	sym_calc_value(sym);
1088*4882a593Smuzhiyun 	sym->flags &= ~SYMBOL_CHANGED;
1089*4882a593Smuzhiyun 
1090*4882a593Smuzhiyun 	if (sym_is_choice(sym)) {	// parse childs for getting final value
1091*4882a593Smuzhiyun 		struct menu *child;
1092*4882a593Smuzhiyun 		struct symbol *def_sym = sym_get_choice_value(sym);
1093*4882a593Smuzhiyun 		struct menu *def_menu = NULL;
1094*4882a593Smuzhiyun 
1095*4882a593Smuzhiyun 		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun 		for (child = menu->list; child; child = child->next) {
1098*4882a593Smuzhiyun 			if (menu_is_visible(child)
1099*4882a593Smuzhiyun 			    && child->sym == def_sym)
1100*4882a593Smuzhiyun 				def_menu = child;
1101*4882a593Smuzhiyun 		}
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun 		if (def_menu)
1104*4882a593Smuzhiyun 			row[COL_VALUE] =
1105*4882a593Smuzhiyun 			    g_strdup(_(menu_get_prompt(def_menu)));
1106*4882a593Smuzhiyun 	}
1107*4882a593Smuzhiyun 	if (sym->flags & SYMBOL_CHOICEVAL)
1108*4882a593Smuzhiyun 		row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	stype = sym_get_type(sym);
1111*4882a593Smuzhiyun 	switch (stype) {
1112*4882a593Smuzhiyun 	case S_BOOLEAN:
1113*4882a593Smuzhiyun 		if (GPOINTER_TO_INT(row[COL_PIXVIS]) == FALSE)
1114*4882a593Smuzhiyun 			row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
1115*4882a593Smuzhiyun 		if (sym_is_choice(sym))
1116*4882a593Smuzhiyun 			break;
1117*4882a593Smuzhiyun 		/* fall through */
1118*4882a593Smuzhiyun 	case S_TRISTATE:
1119*4882a593Smuzhiyun 		val = sym_get_tristate_value(sym);
1120*4882a593Smuzhiyun 		switch (val) {
1121*4882a593Smuzhiyun 		case no:
1122*4882a593Smuzhiyun 			row[COL_NO] = g_strdup("N");
1123*4882a593Smuzhiyun 			row[COL_VALUE] = g_strdup("N");
1124*4882a593Smuzhiyun 			row[COL_BTNACT] = GINT_TO_POINTER(FALSE);
1125*4882a593Smuzhiyun 			row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
1126*4882a593Smuzhiyun 			break;
1127*4882a593Smuzhiyun 		case mod:
1128*4882a593Smuzhiyun 			row[COL_MOD] = g_strdup("M");
1129*4882a593Smuzhiyun 			row[COL_VALUE] = g_strdup("M");
1130*4882a593Smuzhiyun 			row[COL_BTNINC] = GINT_TO_POINTER(TRUE);
1131*4882a593Smuzhiyun 			break;
1132*4882a593Smuzhiyun 		case yes:
1133*4882a593Smuzhiyun 			row[COL_YES] = g_strdup("Y");
1134*4882a593Smuzhiyun 			row[COL_VALUE] = g_strdup("Y");
1135*4882a593Smuzhiyun 			row[COL_BTNACT] = GINT_TO_POINTER(TRUE);
1136*4882a593Smuzhiyun 			row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
1137*4882a593Smuzhiyun 			break;
1138*4882a593Smuzhiyun 		}
1139*4882a593Smuzhiyun 
1140*4882a593Smuzhiyun 		if (val != no && sym_tristate_within_range(sym, no))
1141*4882a593Smuzhiyun 			row[COL_NO] = g_strdup("_");
1142*4882a593Smuzhiyun 		if (val != mod && sym_tristate_within_range(sym, mod))
1143*4882a593Smuzhiyun 			row[COL_MOD] = g_strdup("_");
1144*4882a593Smuzhiyun 		if (val != yes && sym_tristate_within_range(sym, yes))
1145*4882a593Smuzhiyun 			row[COL_YES] = g_strdup("_");
1146*4882a593Smuzhiyun 		break;
1147*4882a593Smuzhiyun 	case S_INT:
1148*4882a593Smuzhiyun 	case S_HEX:
1149*4882a593Smuzhiyun 	case S_STRING:
1150*4882a593Smuzhiyun 		def = sym_get_string_value(sym);
1151*4882a593Smuzhiyun 		row[COL_VALUE] = g_strdup(def);
1152*4882a593Smuzhiyun 		row[COL_EDIT] = GINT_TO_POINTER(TRUE);
1153*4882a593Smuzhiyun 		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
1154*4882a593Smuzhiyun 		break;
1155*4882a593Smuzhiyun 	}
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	return row;
1158*4882a593Smuzhiyun }
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 
1161*4882a593Smuzhiyun /* Set the node content with a row of strings */
set_node(GtkTreeIter * node,struct menu * menu,gchar ** row)1162*4882a593Smuzhiyun static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row)
1163*4882a593Smuzhiyun {
1164*4882a593Smuzhiyun 	GdkColor color;
1165*4882a593Smuzhiyun 	gboolean success;
1166*4882a593Smuzhiyun 	GdkPixbuf *pix;
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	pix = gdk_pixbuf_new_from_xpm_data((const char **)
1169*4882a593Smuzhiyun 					   row[COL_PIXBUF]);
1170*4882a593Smuzhiyun 
1171*4882a593Smuzhiyun 	gdk_color_parse(row[COL_COLOR], &color);
1172*4882a593Smuzhiyun 	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1,
1173*4882a593Smuzhiyun 				  FALSE, FALSE, &success);
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun 	gtk_tree_store_set(tree, node,
1176*4882a593Smuzhiyun 			   COL_OPTION, row[COL_OPTION],
1177*4882a593Smuzhiyun 			   COL_NAME, row[COL_NAME],
1178*4882a593Smuzhiyun 			   COL_NO, row[COL_NO],
1179*4882a593Smuzhiyun 			   COL_MOD, row[COL_MOD],
1180*4882a593Smuzhiyun 			   COL_YES, row[COL_YES],
1181*4882a593Smuzhiyun 			   COL_VALUE, row[COL_VALUE],
1182*4882a593Smuzhiyun 			   COL_MENU, (gpointer) menu,
1183*4882a593Smuzhiyun 			   COL_COLOR, &color,
1184*4882a593Smuzhiyun 			   COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]),
1185*4882a593Smuzhiyun 			   COL_PIXBUF, pix,
1186*4882a593Smuzhiyun 			   COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]),
1187*4882a593Smuzhiyun 			   COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]),
1188*4882a593Smuzhiyun 			   COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]),
1189*4882a593Smuzhiyun 			   COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]),
1190*4882a593Smuzhiyun 			   COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]),
1191*4882a593Smuzhiyun 			   -1);
1192*4882a593Smuzhiyun 
1193*4882a593Smuzhiyun 	g_object_unref(pix);
1194*4882a593Smuzhiyun }
1195*4882a593Smuzhiyun 
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun /* Add a node to the tree */
place_node(struct menu * menu,char ** row)1198*4882a593Smuzhiyun static void place_node(struct menu *menu, char **row)
1199*4882a593Smuzhiyun {
1200*4882a593Smuzhiyun 	GtkTreeIter *parent = parents[indent - 1];
1201*4882a593Smuzhiyun 	GtkTreeIter *node = parents[indent];
1202*4882a593Smuzhiyun 
1203*4882a593Smuzhiyun 	gtk_tree_store_append(tree, node, parent);
1204*4882a593Smuzhiyun 	set_node(node, menu, row);
1205*4882a593Smuzhiyun }
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun /* Find a node in the GTK+ tree */
1209*4882a593Smuzhiyun static GtkTreeIter found;
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun /*
1212*4882a593Smuzhiyun  * Find a menu in the GtkTree starting at parent.
1213*4882a593Smuzhiyun  */
gtktree_iter_find_node(GtkTreeIter * parent,struct menu * tofind)1214*4882a593Smuzhiyun GtkTreeIter *gtktree_iter_find_node(GtkTreeIter * parent,
1215*4882a593Smuzhiyun 				    struct menu *tofind)
1216*4882a593Smuzhiyun {
1217*4882a593Smuzhiyun 	GtkTreeIter iter;
1218*4882a593Smuzhiyun 	GtkTreeIter *child = &iter;
1219*4882a593Smuzhiyun 	gboolean valid;
1220*4882a593Smuzhiyun 	GtkTreeIter *ret;
1221*4882a593Smuzhiyun 
1222*4882a593Smuzhiyun 	valid = gtk_tree_model_iter_children(model2, child, parent);
1223*4882a593Smuzhiyun 	while (valid) {
1224*4882a593Smuzhiyun 		struct menu *menu;
1225*4882a593Smuzhiyun 
1226*4882a593Smuzhiyun 		gtk_tree_model_get(model2, child, 6, &menu, -1);
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun 		if (menu == tofind) {
1229*4882a593Smuzhiyun 			memcpy(&found, child, sizeof(GtkTreeIter));
1230*4882a593Smuzhiyun 			return &found;
1231*4882a593Smuzhiyun 		}
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun 		ret = gtktree_iter_find_node(child, tofind);
1234*4882a593Smuzhiyun 		if (ret)
1235*4882a593Smuzhiyun 			return ret;
1236*4882a593Smuzhiyun 
1237*4882a593Smuzhiyun 		valid = gtk_tree_model_iter_next(model2, child);
1238*4882a593Smuzhiyun 	}
1239*4882a593Smuzhiyun 
1240*4882a593Smuzhiyun 	return NULL;
1241*4882a593Smuzhiyun }
1242*4882a593Smuzhiyun 
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun /*
1245*4882a593Smuzhiyun  * Update the tree by adding/removing entries
1246*4882a593Smuzhiyun  * Does not change other nodes
1247*4882a593Smuzhiyun  */
update_tree(struct menu * src,GtkTreeIter * dst)1248*4882a593Smuzhiyun static void update_tree(struct menu *src, GtkTreeIter * dst)
1249*4882a593Smuzhiyun {
1250*4882a593Smuzhiyun 	struct menu *child1;
1251*4882a593Smuzhiyun 	GtkTreeIter iter, tmp;
1252*4882a593Smuzhiyun 	GtkTreeIter *child2 = &iter;
1253*4882a593Smuzhiyun 	gboolean valid;
1254*4882a593Smuzhiyun 	GtkTreeIter *sibling;
1255*4882a593Smuzhiyun 	struct symbol *sym;
1256*4882a593Smuzhiyun 	struct menu *menu1, *menu2;
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun 	if (src == &rootmenu)
1259*4882a593Smuzhiyun 		indent = 1;
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun 	valid = gtk_tree_model_iter_children(model2, child2, dst);
1262*4882a593Smuzhiyun 	for (child1 = src->list; child1; child1 = child1->next) {
1263*4882a593Smuzhiyun 
1264*4882a593Smuzhiyun 		sym = child1->sym;
1265*4882a593Smuzhiyun 
1266*4882a593Smuzhiyun 	      reparse:
1267*4882a593Smuzhiyun 		menu1 = child1;
1268*4882a593Smuzhiyun 		if (valid)
1269*4882a593Smuzhiyun 			gtk_tree_model_get(model2, child2, COL_MENU,
1270*4882a593Smuzhiyun 					   &menu2, -1);
1271*4882a593Smuzhiyun 		else
1272*4882a593Smuzhiyun 			menu2 = NULL;	// force adding of a first child
1273*4882a593Smuzhiyun 
1274*4882a593Smuzhiyun #ifdef DEBUG
1275*4882a593Smuzhiyun 		printf("%*c%s | %s\n", indent, ' ',
1276*4882a593Smuzhiyun 		       menu1 ? menu_get_prompt(menu1) : "nil",
1277*4882a593Smuzhiyun 		       menu2 ? menu_get_prompt(menu2) : "nil");
1278*4882a593Smuzhiyun #endif
1279*4882a593Smuzhiyun 
1280*4882a593Smuzhiyun 		if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
1281*4882a593Smuzhiyun 		    (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) ||
1282*4882a593Smuzhiyun 		    (opt_mode == OPT_ALL    && !menu_get_prompt(child1))) {
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun 			/* remove node */
1285*4882a593Smuzhiyun 			if (gtktree_iter_find_node(dst, menu1) != NULL) {
1286*4882a593Smuzhiyun 				memcpy(&tmp, child2, sizeof(GtkTreeIter));
1287*4882a593Smuzhiyun 				valid = gtk_tree_model_iter_next(model2,
1288*4882a593Smuzhiyun 								 child2);
1289*4882a593Smuzhiyun 				gtk_tree_store_remove(tree2, &tmp);
1290*4882a593Smuzhiyun 				if (!valid)
1291*4882a593Smuzhiyun 					return;		/* next parent */
1292*4882a593Smuzhiyun 				else
1293*4882a593Smuzhiyun 					goto reparse;	/* next child */
1294*4882a593Smuzhiyun 			} else
1295*4882a593Smuzhiyun 				continue;
1296*4882a593Smuzhiyun 		}
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun 		if (menu1 != menu2) {
1299*4882a593Smuzhiyun 			if (gtktree_iter_find_node(dst, menu1) == NULL) {	// add node
1300*4882a593Smuzhiyun 				if (!valid && !menu2)
1301*4882a593Smuzhiyun 					sibling = NULL;
1302*4882a593Smuzhiyun 				else
1303*4882a593Smuzhiyun 					sibling = child2;
1304*4882a593Smuzhiyun 				gtk_tree_store_insert_before(tree2,
1305*4882a593Smuzhiyun 							     child2,
1306*4882a593Smuzhiyun 							     dst, sibling);
1307*4882a593Smuzhiyun 				set_node(child2, menu1, fill_row(menu1));
1308*4882a593Smuzhiyun 				if (menu2 == NULL)
1309*4882a593Smuzhiyun 					valid = TRUE;
1310*4882a593Smuzhiyun 			} else {	// remove node
1311*4882a593Smuzhiyun 				memcpy(&tmp, child2, sizeof(GtkTreeIter));
1312*4882a593Smuzhiyun 				valid = gtk_tree_model_iter_next(model2,
1313*4882a593Smuzhiyun 								 child2);
1314*4882a593Smuzhiyun 				gtk_tree_store_remove(tree2, &tmp);
1315*4882a593Smuzhiyun 				if (!valid)
1316*4882a593Smuzhiyun 					return;	// next parent
1317*4882a593Smuzhiyun 				else
1318*4882a593Smuzhiyun 					goto reparse;	// next child
1319*4882a593Smuzhiyun 			}
1320*4882a593Smuzhiyun 		} else if (sym && (sym->flags & SYMBOL_CHANGED)) {
1321*4882a593Smuzhiyun 			set_node(child2, menu1, fill_row(menu1));
1322*4882a593Smuzhiyun 		}
1323*4882a593Smuzhiyun 
1324*4882a593Smuzhiyun 		indent++;
1325*4882a593Smuzhiyun 		update_tree(child1, child2);
1326*4882a593Smuzhiyun 		indent--;
1327*4882a593Smuzhiyun 
1328*4882a593Smuzhiyun 		valid = gtk_tree_model_iter_next(model2, child2);
1329*4882a593Smuzhiyun 	}
1330*4882a593Smuzhiyun }
1331*4882a593Smuzhiyun 
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun /* Display the whole tree (single/split/full view) */
display_tree(struct menu * menu)1334*4882a593Smuzhiyun static void display_tree(struct menu *menu)
1335*4882a593Smuzhiyun {
1336*4882a593Smuzhiyun 	struct symbol *sym;
1337*4882a593Smuzhiyun 	struct property *prop;
1338*4882a593Smuzhiyun 	struct menu *child;
1339*4882a593Smuzhiyun 	enum prop_type ptype;
1340*4882a593Smuzhiyun 
1341*4882a593Smuzhiyun 	if (menu == &rootmenu) {
1342*4882a593Smuzhiyun 		indent = 1;
1343*4882a593Smuzhiyun 		current = &rootmenu;
1344*4882a593Smuzhiyun 	}
1345*4882a593Smuzhiyun 
1346*4882a593Smuzhiyun 	for (child = menu->list; child; child = child->next) {
1347*4882a593Smuzhiyun 		prop = child->prompt;
1348*4882a593Smuzhiyun 		sym = child->sym;
1349*4882a593Smuzhiyun 		ptype = prop ? prop->type : P_UNKNOWN;
1350*4882a593Smuzhiyun 
1351*4882a593Smuzhiyun 		if (sym)
1352*4882a593Smuzhiyun 			sym->flags &= ~SYMBOL_CHANGED;
1353*4882a593Smuzhiyun 
1354*4882a593Smuzhiyun 		if ((view_mode == SPLIT_VIEW)
1355*4882a593Smuzhiyun 		    && !(child->flags & MENU_ROOT) && (tree == tree1))
1356*4882a593Smuzhiyun 			continue;
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun 		if ((view_mode == SPLIT_VIEW) && (child->flags & MENU_ROOT)
1359*4882a593Smuzhiyun 		    && (tree == tree2))
1360*4882a593Smuzhiyun 			continue;
1361*4882a593Smuzhiyun 
1362*4882a593Smuzhiyun 		if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
1363*4882a593Smuzhiyun 		    (opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
1364*4882a593Smuzhiyun 		    (opt_mode == OPT_ALL    && menu_get_prompt(child)))
1365*4882a593Smuzhiyun 			place_node(child, fill_row(child));
1366*4882a593Smuzhiyun #ifdef DEBUG
1367*4882a593Smuzhiyun 		printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
1368*4882a593Smuzhiyun 		printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
1369*4882a593Smuzhiyun 		printf("%s", prop_get_type_name(ptype));
1370*4882a593Smuzhiyun 		printf(" | ");
1371*4882a593Smuzhiyun 		if (sym) {
1372*4882a593Smuzhiyun 			printf("%s", sym_type_name(sym->type));
1373*4882a593Smuzhiyun 			printf(" | ");
1374*4882a593Smuzhiyun 			printf("%s", dbg_sym_flags(sym->flags));
1375*4882a593Smuzhiyun 			printf("\n");
1376*4882a593Smuzhiyun 		} else
1377*4882a593Smuzhiyun 			printf("\n");
1378*4882a593Smuzhiyun #endif
1379*4882a593Smuzhiyun 		if ((view_mode != FULL_VIEW) && (ptype == P_MENU)
1380*4882a593Smuzhiyun 		    && (tree == tree2))
1381*4882a593Smuzhiyun 			continue;
1382*4882a593Smuzhiyun /*
1383*4882a593Smuzhiyun 		if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT))
1384*4882a593Smuzhiyun 		    || (view_mode == FULL_VIEW)
1385*4882a593Smuzhiyun 		    || (view_mode == SPLIT_VIEW))*/
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun 		/* Change paned position if the view is not in 'split mode' */
1388*4882a593Smuzhiyun 		if (view_mode == SINGLE_VIEW || view_mode == FULL_VIEW) {
1389*4882a593Smuzhiyun 			gtk_paned_set_position(GTK_PANED(hpaned), 0);
1390*4882a593Smuzhiyun 		}
1391*4882a593Smuzhiyun 
1392*4882a593Smuzhiyun 		if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT))
1393*4882a593Smuzhiyun 		    || (view_mode == FULL_VIEW)
1394*4882a593Smuzhiyun 		    || (view_mode == SPLIT_VIEW)) {
1395*4882a593Smuzhiyun 			indent++;
1396*4882a593Smuzhiyun 			display_tree(child);
1397*4882a593Smuzhiyun 			indent--;
1398*4882a593Smuzhiyun 		}
1399*4882a593Smuzhiyun 	}
1400*4882a593Smuzhiyun }
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun /* Display a part of the tree starting at current node (single/split view) */
display_tree_part(void)1403*4882a593Smuzhiyun static void display_tree_part(void)
1404*4882a593Smuzhiyun {
1405*4882a593Smuzhiyun 	if (tree2)
1406*4882a593Smuzhiyun 		gtk_tree_store_clear(tree2);
1407*4882a593Smuzhiyun 	if (view_mode == SINGLE_VIEW)
1408*4882a593Smuzhiyun 		display_tree(current);
1409*4882a593Smuzhiyun 	else if (view_mode == SPLIT_VIEW)
1410*4882a593Smuzhiyun 		display_tree(browsed);
1411*4882a593Smuzhiyun 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));
1412*4882a593Smuzhiyun }
1413*4882a593Smuzhiyun 
1414*4882a593Smuzhiyun /* Display the list in the left frame (split view) */
display_list(void)1415*4882a593Smuzhiyun static void display_list(void)
1416*4882a593Smuzhiyun {
1417*4882a593Smuzhiyun 	if (tree1)
1418*4882a593Smuzhiyun 		gtk_tree_store_clear(tree1);
1419*4882a593Smuzhiyun 
1420*4882a593Smuzhiyun 	tree = tree1;
1421*4882a593Smuzhiyun 	display_tree(&rootmenu);
1422*4882a593Smuzhiyun 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w));
1423*4882a593Smuzhiyun 	tree = tree2;
1424*4882a593Smuzhiyun }
1425*4882a593Smuzhiyun 
fixup_rootmenu(struct menu * menu)1426*4882a593Smuzhiyun void fixup_rootmenu(struct menu *menu)
1427*4882a593Smuzhiyun {
1428*4882a593Smuzhiyun 	struct menu *child;
1429*4882a593Smuzhiyun 	static int menu_cnt = 0;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun 	menu->flags |= MENU_ROOT;
1432*4882a593Smuzhiyun 	for (child = menu->list; child; child = child->next) {
1433*4882a593Smuzhiyun 		if (child->prompt && child->prompt->type == P_MENU) {
1434*4882a593Smuzhiyun 			menu_cnt++;
1435*4882a593Smuzhiyun 			fixup_rootmenu(child);
1436*4882a593Smuzhiyun 			menu_cnt--;
1437*4882a593Smuzhiyun 		} else if (!menu_cnt)
1438*4882a593Smuzhiyun 			fixup_rootmenu(child);
1439*4882a593Smuzhiyun 	}
1440*4882a593Smuzhiyun }
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun 
1443*4882a593Smuzhiyun /* Main */
main(int ac,char * av[])1444*4882a593Smuzhiyun int main(int ac, char *av[])
1445*4882a593Smuzhiyun {
1446*4882a593Smuzhiyun 	const char *name;
1447*4882a593Smuzhiyun 	char *env;
1448*4882a593Smuzhiyun 	gchar *glade_file;
1449*4882a593Smuzhiyun 
1450*4882a593Smuzhiyun 	bindtextdomain(PACKAGE, LOCALEDIR);
1451*4882a593Smuzhiyun 	bind_textdomain_codeset(PACKAGE, "UTF-8");
1452*4882a593Smuzhiyun 	textdomain(PACKAGE);
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun 	/* GTK stuffs */
1455*4882a593Smuzhiyun 	gtk_set_locale();
1456*4882a593Smuzhiyun 	gtk_init(&ac, &av);
1457*4882a593Smuzhiyun 	glade_init();
1458*4882a593Smuzhiyun 
1459*4882a593Smuzhiyun 	//add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
1460*4882a593Smuzhiyun 	//add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");
1461*4882a593Smuzhiyun 
1462*4882a593Smuzhiyun 	/* Determine GUI path */
1463*4882a593Smuzhiyun 	env = getenv(SRCTREE);
1464*4882a593Smuzhiyun 	if (env)
1465*4882a593Smuzhiyun 		glade_file = g_strconcat(env, "/support/kconfig/gconf.glade", NULL);
1466*4882a593Smuzhiyun 	else if (av[0][0] == '/')
1467*4882a593Smuzhiyun 		glade_file = g_strconcat(av[0], ".glade", NULL);
1468*4882a593Smuzhiyun 	else
1469*4882a593Smuzhiyun 		glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL);
1470*4882a593Smuzhiyun 
1471*4882a593Smuzhiyun 	/* Conf stuffs */
1472*4882a593Smuzhiyun 	if (ac > 1 && av[1][0] == '-') {
1473*4882a593Smuzhiyun 		switch (av[1][1]) {
1474*4882a593Smuzhiyun 		case 'a':
1475*4882a593Smuzhiyun 			//showAll = 1;
1476*4882a593Smuzhiyun 			break;
1477*4882a593Smuzhiyun 		case 's':
1478*4882a593Smuzhiyun 			conf_set_message_callback(NULL);
1479*4882a593Smuzhiyun 			break;
1480*4882a593Smuzhiyun 		case 'h':
1481*4882a593Smuzhiyun 		case '?':
1482*4882a593Smuzhiyun 			printf("%s [-s] <config>\n", av[0]);
1483*4882a593Smuzhiyun 			exit(0);
1484*4882a593Smuzhiyun 		}
1485*4882a593Smuzhiyun 		name = av[2];
1486*4882a593Smuzhiyun 	} else
1487*4882a593Smuzhiyun 		name = av[1];
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun 	conf_parse(name);
1490*4882a593Smuzhiyun 	fixup_rootmenu(&rootmenu);
1491*4882a593Smuzhiyun 	conf_read(NULL);
1492*4882a593Smuzhiyun 
1493*4882a593Smuzhiyun 	/* Load the interface and connect signals */
1494*4882a593Smuzhiyun 	init_main_window(glade_file);
1495*4882a593Smuzhiyun 	init_tree_model();
1496*4882a593Smuzhiyun 	init_left_tree();
1497*4882a593Smuzhiyun 	init_right_tree();
1498*4882a593Smuzhiyun 
1499*4882a593Smuzhiyun 	switch (view_mode) {
1500*4882a593Smuzhiyun 	case SINGLE_VIEW:
1501*4882a593Smuzhiyun 		display_tree_part();
1502*4882a593Smuzhiyun 		break;
1503*4882a593Smuzhiyun 	case SPLIT_VIEW:
1504*4882a593Smuzhiyun 		display_list();
1505*4882a593Smuzhiyun 		break;
1506*4882a593Smuzhiyun 	case FULL_VIEW:
1507*4882a593Smuzhiyun 		display_tree(&rootmenu);
1508*4882a593Smuzhiyun 		break;
1509*4882a593Smuzhiyun 	}
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun 	gtk_main();
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun 	return 0;
1514*4882a593Smuzhiyun }
1515*4882a593Smuzhiyun 
conf_changed(void)1516*4882a593Smuzhiyun static void conf_changed(void)
1517*4882a593Smuzhiyun {
1518*4882a593Smuzhiyun 	bool changed = conf_get_changed();
1519*4882a593Smuzhiyun 	gtk_widget_set_sensitive(save_btn, changed);
1520*4882a593Smuzhiyun 	gtk_widget_set_sensitive(save_menu_item, changed);
1521*4882a593Smuzhiyun }
1522