1542 lines · 38.8 KB · C
RawDownload
/* Hey EMACS -*- linux-c -*- *//* * * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info> * Released under the terms of the GNU GPL v2.0. * */ #ifdef HAVE_CONFIG_H#  include <config.h>#endif #include "lkc.h"#include "images.c" #include <glade/glade.h>#include <gtk/gtk.h>#include <glib.h>#include <gdk/gdkkeysyms.h> #include <stdio.h>#include <string.h>#include <unistd.h>#include <time.h>#include <stdlib.h> //#define DEBUG enum {	SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW}; enum {	OPT_NORMAL, OPT_ALL, OPT_PROMPT}; static gint view_mode = FULL_VIEW;static gboolean show_name = TRUE;static gboolean show_range = TRUE;static gboolean show_value = TRUE;static gboolean resizeable = FALSE;static int opt_mode = OPT_NORMAL; GtkWidget *main_wnd = NULL;GtkWidget *tree1_w = NULL;	// left  frameGtkWidget *tree2_w = NULL;	// right frameGtkWidget *text_w = NULL;GtkWidget *hpaned = NULL;GtkWidget *vpaned = NULL;GtkWidget *back_btn = NULL;GtkWidget *save_btn = NULL;GtkWidget *save_menu_item = NULL; GtkTextTag *tag1, *tag2;GdkColor color; GtkTreeStore *tree1, *tree2, *tree;GtkTreeModel *model1, *model2;static GtkTreeIter *parents[256];static gint indent; static struct menu *current; // current node for SINGLE viewstatic struct menu *browsed; // browsed node for SPLIT view enum {	COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE,	COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF,	COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD,	COL_NUMBER}; static void display_list(void);static void display_tree(struct menu *menu);static void display_tree_part(void);static void update_tree(struct menu *src, GtkTreeIter * dst);static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row);static gchar **fill_row(struct menu *menu);static void conf_changed(void); /* Helping/Debugging Functions */ const char *dbg_sym_flags(int val){	static char buf[256]; 	bzero(buf, 256); 	if (val & SYMBOL_CONST)		strcat(buf, "const/");	if (val & SYMBOL_CHECK)		strcat(buf, "check/");	if (val & SYMBOL_CHOICE)		strcat(buf, "choice/");	if (val & SYMBOL_CHOICEVAL)		strcat(buf, "choiceval/");	if (val & SYMBOL_VALID)		strcat(buf, "valid/");	if (val & SYMBOL_OPTIONAL)		strcat(buf, "optional/");	if (val & SYMBOL_WRITE)		strcat(buf, "write/");	if (val & SYMBOL_CHANGED)		strcat(buf, "changed/");	if (val & SYMBOL_AUTO)		strcat(buf, "auto/"); 	buf[strlen(buf) - 1] = '\0'; 	return buf;} void replace_button_icon(GladeXML * xml, GdkDrawable * window,			 GtkStyle * style, gchar * btn_name, gchar ** xpm){	GdkPixmap *pixmap;	GdkBitmap *mask;	GtkToolButton *button;	GtkWidget *image; 	pixmap = gdk_pixmap_create_from_xpm_d(window, &mask,					      &style->bg[GTK_STATE_NORMAL],					      xpm); 	button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name));	image = gtk_image_new_from_pixmap(pixmap, mask);	gtk_widget_show(image);	gtk_tool_button_set_icon_widget(button, image);} /* Main Window Initialization */void init_main_window(const gchar * glade_file){	GladeXML *xml;	GtkWidget *widget;	GtkTextBuffer *txtbuf;	GtkStyle *style; 	xml = glade_xml_new(glade_file, "window1", NULL);	if (!xml)		g_error(_("GUI loading failed !\n"));	glade_xml_signal_autoconnect(xml); 	main_wnd = glade_xml_get_widget(xml, "window1");	hpaned = glade_xml_get_widget(xml, "hpaned1");	vpaned = glade_xml_get_widget(xml, "vpaned1");	tree1_w = glade_xml_get_widget(xml, "treeview1");	tree2_w = glade_xml_get_widget(xml, "treeview2");	text_w = glade_xml_get_widget(xml, "textview3"); 	back_btn = glade_xml_get_widget(xml, "button1");	gtk_widget_set_sensitive(back_btn, FALSE); 	widget = glade_xml_get_widget(xml, "show_name1");	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,				       show_name); 	widget = glade_xml_get_widget(xml, "show_range1");	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,				       show_range); 	widget = glade_xml_get_widget(xml, "show_data1");	gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,				       show_value); 	save_btn = glade_xml_get_widget(xml, "button3");	save_menu_item = glade_xml_get_widget(xml, "save1");	conf_set_changed_callback(conf_changed); 	style = gtk_widget_get_style(main_wnd);	widget = glade_xml_get_widget(xml, "toolbar1"); #if 0	/* Use stock Gtk icons instead */	replace_button_icon(xml, main_wnd->window, style,			    "button1", (gchar **) xpm_back);	replace_button_icon(xml, main_wnd->window, style,			    "button2", (gchar **) xpm_load);	replace_button_icon(xml, main_wnd->window, style,			    "button3", (gchar **) xpm_save);#endif	replace_button_icon(xml, main_wnd->window, style,			    "button4", (gchar **) xpm_single_view);	replace_button_icon(xml, main_wnd->window, style,			    "button5", (gchar **) xpm_split_view);	replace_button_icon(xml, main_wnd->window, style,			    "button6", (gchar **) xpm_tree_view); #if 0	switch (view_mode) {	case SINGLE_VIEW:		widget = glade_xml_get_widget(xml, "button4");		g_signal_emit_by_name(widget, "clicked");		break;	case SPLIT_VIEW:		widget = glade_xml_get_widget(xml, "button5");		g_signal_emit_by_name(widget, "clicked");		break;	case FULL_VIEW:		widget = glade_xml_get_widget(xml, "button6");		g_signal_emit_by_name(widget, "clicked");		break;	}#endif	txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));	tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1",					  "foreground", "red",					  "weight", PANGO_WEIGHT_BOLD,					  NULL);	tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2",					  /*"style", PANGO_STYLE_OBLIQUE, */					  NULL); 	gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text); 	gtk_widget_show(main_wnd);} void init_tree_model(void){	gint i; 	tree = tree2 = gtk_tree_store_new(COL_NUMBER,					  G_TYPE_STRING, G_TYPE_STRING,					  G_TYPE_STRING, G_TYPE_STRING,					  G_TYPE_STRING, G_TYPE_STRING,					  G_TYPE_POINTER, GDK_TYPE_COLOR,					  G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,					  G_TYPE_BOOLEAN);	model2 = GTK_TREE_MODEL(tree2); 	for (parents[0] = NULL, i = 1; i < 256; i++)		parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter)); 	tree1 = gtk_tree_store_new(COL_NUMBER,				   G_TYPE_STRING, G_TYPE_STRING,				   G_TYPE_STRING, G_TYPE_STRING,				   G_TYPE_STRING, G_TYPE_STRING,				   G_TYPE_POINTER, GDK_TYPE_COLOR,				   G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,				   G_TYPE_BOOLEAN);	model1 = GTK_TREE_MODEL(tree1);} void init_left_tree(void){	GtkTreeView *view = GTK_TREE_VIEW(tree1_w);	GtkCellRenderer *renderer;	GtkTreeSelection *sel;	GtkTreeViewColumn *column; 	gtk_tree_view_set_model(view, model1);	gtk_tree_view_set_headers_visible(view, TRUE);	gtk_tree_view_set_rules_hint(view, TRUE); 	column = gtk_tree_view_column_new();	gtk_tree_view_append_column(view, column);	gtk_tree_view_column_set_title(column, _("Options")); 	renderer = gtk_cell_renderer_toggle_new();	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),					renderer, FALSE);	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),					    renderer,					    "active", COL_BTNACT,					    "inconsistent", COL_BTNINC,					    "visible", COL_BTNVIS,					    "radio", COL_BTNRAD, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),					renderer, FALSE);	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),					    renderer,					    "text", COL_OPTION,					    "foreground-gdk",					    COL_COLOR, NULL); 	sel = gtk_tree_view_get_selection(view);	gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);	gtk_widget_realize(tree1_w);} static void renderer_edited(GtkCellRendererText * cell,			    const gchar * path_string,			    const gchar * new_text, gpointer user_data); void init_right_tree(void){	GtkTreeView *view = GTK_TREE_VIEW(tree2_w);	GtkCellRenderer *renderer;	GtkTreeSelection *sel;	GtkTreeViewColumn *column;	gint i; 	gtk_tree_view_set_model(view, model2);	gtk_tree_view_set_headers_visible(view, TRUE);	gtk_tree_view_set_rules_hint(view, TRUE); 	column = gtk_tree_view_column_new();	gtk_tree_view_append_column(view, column);	gtk_tree_view_column_set_title(column, _("Options")); 	renderer = gtk_cell_renderer_pixbuf_new();	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),					renderer, FALSE);	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),					    renderer,					    "pixbuf", COL_PIXBUF,					    "visible", COL_PIXVIS, NULL);	renderer = gtk_cell_renderer_toggle_new();	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),					renderer, FALSE);	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),					    renderer,					    "active", COL_BTNACT,					    "inconsistent", COL_BTNINC,					    "visible", COL_BTNVIS,					    "radio", COL_BTNRAD, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),					renderer, FALSE);	gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),					    renderer,					    "text", COL_OPTION,					    "foreground-gdk",					    COL_COLOR, NULL); 	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_insert_column_with_attributes(view, -1,						    _("Name"), renderer,						    "text", COL_NAME,						    "foreground-gdk",						    COL_COLOR, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_insert_column_with_attributes(view, -1,						    "N", renderer,						    "text", COL_NO,						    "foreground-gdk",						    COL_COLOR, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_insert_column_with_attributes(view, -1,						    "M", renderer,						    "text", COL_MOD,						    "foreground-gdk",						    COL_COLOR, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_insert_column_with_attributes(view, -1,						    "Y", renderer,						    "text", COL_YES,						    "foreground-gdk",						    COL_COLOR, NULL);	renderer = gtk_cell_renderer_text_new();	gtk_tree_view_insert_column_with_attributes(view, -1,						    _("Value"), renderer,						    "text", COL_VALUE,						    "editable",						    COL_EDIT,						    "foreground-gdk",						    COL_COLOR, NULL);	g_signal_connect(G_OBJECT(renderer), "edited",			 G_CALLBACK(renderer_edited), NULL); 	column = gtk_tree_view_get_column(view, COL_NAME);	gtk_tree_view_column_set_visible(column, show_name);	column = gtk_tree_view_get_column(view, COL_NO);	gtk_tree_view_column_set_visible(column, show_range);	column = gtk_tree_view_get_column(view, COL_MOD);	gtk_tree_view_column_set_visible(column, show_range);	column = gtk_tree_view_get_column(view, COL_YES);	gtk_tree_view_column_set_visible(column, show_range);	column = gtk_tree_view_get_column(view, COL_VALUE);	gtk_tree_view_column_set_visible(column, show_value); 	if (resizeable) {		for (i = 0; i < COL_VALUE; i++) {			column = gtk_tree_view_get_column(view, i);			gtk_tree_view_column_set_resizable(column, TRUE);		}	} 	sel = gtk_tree_view_get_selection(view);	gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);}  /* Utility Functions */  static void text_insert_help(struct menu *menu){	GtkTextBuffer *buffer;	GtkTextIter start, end;	const char *prompt = _(menu_get_prompt(menu));	struct gstr help = str_new(); 	menu_get_ext_help(menu, &help); 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));	gtk_text_buffer_get_bounds(buffer, &start, &end);	gtk_text_buffer_delete(buffer, &start, &end);	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); 	gtk_text_buffer_get_end_iter(buffer, &end);	gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,					 NULL);	gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);	gtk_text_buffer_get_end_iter(buffer, &end);	gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,					 NULL);	str_free(&help);}  static void text_insert_msg(const char *title, const char *message){	GtkTextBuffer *buffer;	GtkTextIter start, end;	const char *msg = message; 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));	gtk_text_buffer_get_bounds(buffer, &start, &end);	gtk_text_buffer_delete(buffer, &start, &end);	gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); 	gtk_text_buffer_get_end_iter(buffer, &end);	gtk_text_buffer_insert_with_tags(buffer, &end, title, -1, tag1,					 NULL);	gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);	gtk_text_buffer_get_end_iter(buffer, &end);	gtk_text_buffer_insert_with_tags(buffer, &end, msg, -1, tag2,					 NULL);}  /* Main Windows Callbacks */ void on_save_activate(GtkMenuItem * menuitem, gpointer user_data);gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event,				 gpointer user_data){	GtkWidget *dialog, *label;	gint result; 	if (!conf_get_changed())		return FALSE; 	dialog = gtk_dialog_new_with_buttons(_("Warning !"),					     GTK_WINDOW(main_wnd),					     (GtkDialogFlags)					     (GTK_DIALOG_MODAL |					      GTK_DIALOG_DESTROY_WITH_PARENT),					     GTK_STOCK_OK,					     GTK_RESPONSE_YES,					     GTK_STOCK_NO,					     GTK_RESPONSE_NO,					     GTK_STOCK_CANCEL,					     GTK_RESPONSE_CANCEL, NULL);	gtk_dialog_set_default_response(GTK_DIALOG(dialog),					GTK_RESPONSE_CANCEL); 	label = gtk_label_new(_("\nSave configuration ?\n"));	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);	gtk_widget_show(label); 	result = gtk_dialog_run(GTK_DIALOG(dialog));	switch (result) {	case GTK_RESPONSE_YES:		on_save_activate(NULL, NULL);		return FALSE;	case GTK_RESPONSE_NO:		return FALSE;	case GTK_RESPONSE_CANCEL:	case GTK_RESPONSE_DELETE_EVENT:	default:		gtk_widget_destroy(dialog);		return TRUE;	} 	return FALSE;}  void on_window1_destroy(GtkObject * object, gpointer user_data){	gtk_main_quit();}  voidon_window1_size_request(GtkWidget * widget,			GtkRequisition * requisition, gpointer user_data){	static gint old_h;	gint w, h; 	if (widget->window == NULL)		gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h);	else

Lines 1–500 of 1542.