162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <stdlib.h> 762306a36Sopenharmony_ci#include "lkc.h" 862306a36Sopenharmony_ci#include "images.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <glade/glade.h> 1162306a36Sopenharmony_ci#include <gtk/gtk.h> 1262306a36Sopenharmony_ci#include <glib.h> 1362306a36Sopenharmony_ci#include <gdk/gdkkeysyms.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <stdio.h> 1662306a36Sopenharmony_ci#include <string.h> 1762306a36Sopenharmony_ci#include <strings.h> 1862306a36Sopenharmony_ci#include <unistd.h> 1962306a36Sopenharmony_ci#include <time.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci//#define DEBUG 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum { 2462306a36Sopenharmony_ci SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cienum { 2862306a36Sopenharmony_ci OPT_NORMAL, OPT_ALL, OPT_PROMPT 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic gint view_mode = FULL_VIEW; 3262306a36Sopenharmony_cistatic gboolean show_name = TRUE; 3362306a36Sopenharmony_cistatic gboolean show_range = TRUE; 3462306a36Sopenharmony_cistatic gboolean show_value = TRUE; 3562306a36Sopenharmony_cistatic gboolean resizeable = FALSE; 3662306a36Sopenharmony_cistatic int opt_mode = OPT_NORMAL; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciGtkWidget *main_wnd = NULL; 3962306a36Sopenharmony_ciGtkWidget *tree1_w = NULL; // left frame 4062306a36Sopenharmony_ciGtkWidget *tree2_w = NULL; // right frame 4162306a36Sopenharmony_ciGtkWidget *text_w = NULL; 4262306a36Sopenharmony_ciGtkWidget *hpaned = NULL; 4362306a36Sopenharmony_ciGtkWidget *vpaned = NULL; 4462306a36Sopenharmony_ciGtkWidget *back_btn = NULL; 4562306a36Sopenharmony_ciGtkWidget *save_btn = NULL; 4662306a36Sopenharmony_ciGtkWidget *save_menu_item = NULL; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciGtkTextTag *tag1, *tag2; 4962306a36Sopenharmony_ciGdkColor color; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciGtkTreeStore *tree1, *tree2, *tree; 5262306a36Sopenharmony_ciGtkTreeModel *model1, *model2; 5362306a36Sopenharmony_cistatic GtkTreeIter *parents[256]; 5462306a36Sopenharmony_cistatic gint indent; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic struct menu *current; // current node for SINGLE view 5762306a36Sopenharmony_cistatic struct menu *browsed; // browsed node for SPLIT view 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cienum { 6062306a36Sopenharmony_ci COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE, 6162306a36Sopenharmony_ci COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF, 6262306a36Sopenharmony_ci COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD, 6362306a36Sopenharmony_ci COL_NUMBER 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic void display_list(void); 6762306a36Sopenharmony_cistatic void display_tree(struct menu *menu); 6862306a36Sopenharmony_cistatic void display_tree_part(void); 6962306a36Sopenharmony_cistatic void update_tree(struct menu *src, GtkTreeIter * dst); 7062306a36Sopenharmony_cistatic void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row); 7162306a36Sopenharmony_cistatic gchar **fill_row(struct menu *menu); 7262306a36Sopenharmony_cistatic void conf_changed(void); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* Helping/Debugging Functions */ 7562306a36Sopenharmony_ci#ifdef DEBUG 7662306a36Sopenharmony_cistatic const char *dbg_sym_flags(int val) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci static char buf[256]; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci bzero(buf, 256); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci if (val & SYMBOL_CONST) 8362306a36Sopenharmony_ci strcat(buf, "const/"); 8462306a36Sopenharmony_ci if (val & SYMBOL_CHECK) 8562306a36Sopenharmony_ci strcat(buf, "check/"); 8662306a36Sopenharmony_ci if (val & SYMBOL_CHOICE) 8762306a36Sopenharmony_ci strcat(buf, "choice/"); 8862306a36Sopenharmony_ci if (val & SYMBOL_CHOICEVAL) 8962306a36Sopenharmony_ci strcat(buf, "choiceval/"); 9062306a36Sopenharmony_ci if (val & SYMBOL_VALID) 9162306a36Sopenharmony_ci strcat(buf, "valid/"); 9262306a36Sopenharmony_ci if (val & SYMBOL_OPTIONAL) 9362306a36Sopenharmony_ci strcat(buf, "optional/"); 9462306a36Sopenharmony_ci if (val & SYMBOL_WRITE) 9562306a36Sopenharmony_ci strcat(buf, "write/"); 9662306a36Sopenharmony_ci if (val & SYMBOL_CHANGED) 9762306a36Sopenharmony_ci strcat(buf, "changed/"); 9862306a36Sopenharmony_ci if (val & SYMBOL_NO_WRITE) 9962306a36Sopenharmony_ci strcat(buf, "no_write/"); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci buf[strlen(buf) - 1] = '\0'; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci return buf; 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci#endif 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic void replace_button_icon(GladeXML *xml, GdkDrawable *window, 10862306a36Sopenharmony_ci GtkStyle *style, gchar *btn_name, gchar **xpm) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci GdkPixmap *pixmap; 11162306a36Sopenharmony_ci GdkBitmap *mask; 11262306a36Sopenharmony_ci GtkToolButton *button; 11362306a36Sopenharmony_ci GtkWidget *image; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci pixmap = gdk_pixmap_create_from_xpm_d(window, &mask, 11662306a36Sopenharmony_ci &style->bg[GTK_STATE_NORMAL], 11762306a36Sopenharmony_ci xpm); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name)); 12062306a36Sopenharmony_ci image = gtk_image_new_from_pixmap(pixmap, mask); 12162306a36Sopenharmony_ci gtk_widget_show(image); 12262306a36Sopenharmony_ci gtk_tool_button_set_icon_widget(button, image); 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci/* Main Window Initialization */ 12662306a36Sopenharmony_cistatic void init_main_window(const gchar *glade_file) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci GladeXML *xml; 12962306a36Sopenharmony_ci GtkWidget *widget; 13062306a36Sopenharmony_ci GtkTextBuffer *txtbuf; 13162306a36Sopenharmony_ci GtkStyle *style; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci xml = glade_xml_new(glade_file, "window1", NULL); 13462306a36Sopenharmony_ci if (!xml) 13562306a36Sopenharmony_ci g_error("GUI loading failed !\n"); 13662306a36Sopenharmony_ci glade_xml_signal_autoconnect(xml); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci main_wnd = glade_xml_get_widget(xml, "window1"); 13962306a36Sopenharmony_ci hpaned = glade_xml_get_widget(xml, "hpaned1"); 14062306a36Sopenharmony_ci vpaned = glade_xml_get_widget(xml, "vpaned1"); 14162306a36Sopenharmony_ci tree1_w = glade_xml_get_widget(xml, "treeview1"); 14262306a36Sopenharmony_ci tree2_w = glade_xml_get_widget(xml, "treeview2"); 14362306a36Sopenharmony_ci text_w = glade_xml_get_widget(xml, "textview3"); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci back_btn = glade_xml_get_widget(xml, "button1"); 14662306a36Sopenharmony_ci gtk_widget_set_sensitive(back_btn, FALSE); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci widget = glade_xml_get_widget(xml, "show_name1"); 14962306a36Sopenharmony_ci gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 15062306a36Sopenharmony_ci show_name); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci widget = glade_xml_get_widget(xml, "show_range1"); 15362306a36Sopenharmony_ci gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 15462306a36Sopenharmony_ci show_range); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci widget = glade_xml_get_widget(xml, "show_data1"); 15762306a36Sopenharmony_ci gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 15862306a36Sopenharmony_ci show_value); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci save_btn = glade_xml_get_widget(xml, "button3"); 16162306a36Sopenharmony_ci save_menu_item = glade_xml_get_widget(xml, "save1"); 16262306a36Sopenharmony_ci conf_set_changed_callback(conf_changed); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci style = gtk_widget_get_style(main_wnd); 16562306a36Sopenharmony_ci widget = glade_xml_get_widget(xml, "toolbar1"); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci replace_button_icon(xml, main_wnd->window, style, 16862306a36Sopenharmony_ci "button4", (gchar **) xpm_single_view); 16962306a36Sopenharmony_ci replace_button_icon(xml, main_wnd->window, style, 17062306a36Sopenharmony_ci "button5", (gchar **) xpm_split_view); 17162306a36Sopenharmony_ci replace_button_icon(xml, main_wnd->window, style, 17262306a36Sopenharmony_ci "button6", (gchar **) xpm_tree_view); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 17562306a36Sopenharmony_ci tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1", 17662306a36Sopenharmony_ci "foreground", "red", 17762306a36Sopenharmony_ci "weight", PANGO_WEIGHT_BOLD, 17862306a36Sopenharmony_ci NULL); 17962306a36Sopenharmony_ci tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2", 18062306a36Sopenharmony_ci /*"style", PANGO_STYLE_OBLIQUE, */ 18162306a36Sopenharmony_ci NULL); 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text); 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci gtk_widget_show(main_wnd); 18662306a36Sopenharmony_ci} 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic void init_tree_model(void) 18962306a36Sopenharmony_ci{ 19062306a36Sopenharmony_ci gint i; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci tree = tree2 = gtk_tree_store_new(COL_NUMBER, 19362306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 19462306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 19562306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 19662306a36Sopenharmony_ci G_TYPE_POINTER, GDK_TYPE_COLOR, 19762306a36Sopenharmony_ci G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 19862306a36Sopenharmony_ci G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 19962306a36Sopenharmony_ci G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 20062306a36Sopenharmony_ci G_TYPE_BOOLEAN); 20162306a36Sopenharmony_ci model2 = GTK_TREE_MODEL(tree2); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci for (parents[0] = NULL, i = 1; i < 256; i++) 20462306a36Sopenharmony_ci parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter)); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci tree1 = gtk_tree_store_new(COL_NUMBER, 20762306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 20862306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 20962306a36Sopenharmony_ci G_TYPE_STRING, G_TYPE_STRING, 21062306a36Sopenharmony_ci G_TYPE_POINTER, GDK_TYPE_COLOR, 21162306a36Sopenharmony_ci G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 21262306a36Sopenharmony_ci G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 21362306a36Sopenharmony_ci G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 21462306a36Sopenharmony_ci G_TYPE_BOOLEAN); 21562306a36Sopenharmony_ci model1 = GTK_TREE_MODEL(tree1); 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistatic void init_left_tree(void) 21962306a36Sopenharmony_ci{ 22062306a36Sopenharmony_ci GtkTreeView *view = GTK_TREE_VIEW(tree1_w); 22162306a36Sopenharmony_ci GtkCellRenderer *renderer; 22262306a36Sopenharmony_ci GtkTreeSelection *sel; 22362306a36Sopenharmony_ci GtkTreeViewColumn *column; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci gtk_tree_view_set_model(view, model1); 22662306a36Sopenharmony_ci gtk_tree_view_set_headers_visible(view, TRUE); 22762306a36Sopenharmony_ci gtk_tree_view_set_rules_hint(view, TRUE); 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci column = gtk_tree_view_column_new(); 23062306a36Sopenharmony_ci gtk_tree_view_append_column(view, column); 23162306a36Sopenharmony_ci gtk_tree_view_column_set_title(column, "Options"); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci renderer = gtk_cell_renderer_toggle_new(); 23462306a36Sopenharmony_ci gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 23562306a36Sopenharmony_ci renderer, FALSE); 23662306a36Sopenharmony_ci gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 23762306a36Sopenharmony_ci renderer, 23862306a36Sopenharmony_ci "active", COL_BTNACT, 23962306a36Sopenharmony_ci "inconsistent", COL_BTNINC, 24062306a36Sopenharmony_ci "visible", COL_BTNVIS, 24162306a36Sopenharmony_ci "radio", COL_BTNRAD, NULL); 24262306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 24362306a36Sopenharmony_ci gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 24462306a36Sopenharmony_ci renderer, FALSE); 24562306a36Sopenharmony_ci gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 24662306a36Sopenharmony_ci renderer, 24762306a36Sopenharmony_ci "text", COL_OPTION, 24862306a36Sopenharmony_ci "foreground-gdk", 24962306a36Sopenharmony_ci COL_COLOR, NULL); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci sel = gtk_tree_view_get_selection(view); 25262306a36Sopenharmony_ci gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 25362306a36Sopenharmony_ci gtk_widget_realize(tree1_w); 25462306a36Sopenharmony_ci} 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cistatic void renderer_edited(GtkCellRendererText * cell, 25762306a36Sopenharmony_ci const gchar * path_string, 25862306a36Sopenharmony_ci const gchar * new_text, gpointer user_data); 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic void init_right_tree(void) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci GtkTreeView *view = GTK_TREE_VIEW(tree2_w); 26362306a36Sopenharmony_ci GtkCellRenderer *renderer; 26462306a36Sopenharmony_ci GtkTreeSelection *sel; 26562306a36Sopenharmony_ci GtkTreeViewColumn *column; 26662306a36Sopenharmony_ci gint i; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci gtk_tree_view_set_model(view, model2); 26962306a36Sopenharmony_ci gtk_tree_view_set_headers_visible(view, TRUE); 27062306a36Sopenharmony_ci gtk_tree_view_set_rules_hint(view, TRUE); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci column = gtk_tree_view_column_new(); 27362306a36Sopenharmony_ci gtk_tree_view_append_column(view, column); 27462306a36Sopenharmony_ci gtk_tree_view_column_set_title(column, "Options"); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci renderer = gtk_cell_renderer_pixbuf_new(); 27762306a36Sopenharmony_ci gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 27862306a36Sopenharmony_ci renderer, FALSE); 27962306a36Sopenharmony_ci gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 28062306a36Sopenharmony_ci renderer, 28162306a36Sopenharmony_ci "pixbuf", COL_PIXBUF, 28262306a36Sopenharmony_ci "visible", COL_PIXVIS, NULL); 28362306a36Sopenharmony_ci renderer = gtk_cell_renderer_toggle_new(); 28462306a36Sopenharmony_ci gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 28562306a36Sopenharmony_ci renderer, FALSE); 28662306a36Sopenharmony_ci gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 28762306a36Sopenharmony_ci renderer, 28862306a36Sopenharmony_ci "active", COL_BTNACT, 28962306a36Sopenharmony_ci "inconsistent", COL_BTNINC, 29062306a36Sopenharmony_ci "visible", COL_BTNVIS, 29162306a36Sopenharmony_ci "radio", COL_BTNRAD, NULL); 29262306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 29362306a36Sopenharmony_ci gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 29462306a36Sopenharmony_ci renderer, FALSE); 29562306a36Sopenharmony_ci gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 29662306a36Sopenharmony_ci renderer, 29762306a36Sopenharmony_ci "text", COL_OPTION, 29862306a36Sopenharmony_ci "foreground-gdk", 29962306a36Sopenharmony_ci COL_COLOR, NULL); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 30262306a36Sopenharmony_ci gtk_tree_view_insert_column_with_attributes(view, -1, 30362306a36Sopenharmony_ci "Name", renderer, 30462306a36Sopenharmony_ci "text", COL_NAME, 30562306a36Sopenharmony_ci "foreground-gdk", 30662306a36Sopenharmony_ci COL_COLOR, NULL); 30762306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 30862306a36Sopenharmony_ci gtk_tree_view_insert_column_with_attributes(view, -1, 30962306a36Sopenharmony_ci "N", renderer, 31062306a36Sopenharmony_ci "text", COL_NO, 31162306a36Sopenharmony_ci "foreground-gdk", 31262306a36Sopenharmony_ci COL_COLOR, NULL); 31362306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 31462306a36Sopenharmony_ci gtk_tree_view_insert_column_with_attributes(view, -1, 31562306a36Sopenharmony_ci "M", renderer, 31662306a36Sopenharmony_ci "text", COL_MOD, 31762306a36Sopenharmony_ci "foreground-gdk", 31862306a36Sopenharmony_ci COL_COLOR, NULL); 31962306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 32062306a36Sopenharmony_ci gtk_tree_view_insert_column_with_attributes(view, -1, 32162306a36Sopenharmony_ci "Y", renderer, 32262306a36Sopenharmony_ci "text", COL_YES, 32362306a36Sopenharmony_ci "foreground-gdk", 32462306a36Sopenharmony_ci COL_COLOR, NULL); 32562306a36Sopenharmony_ci renderer = gtk_cell_renderer_text_new(); 32662306a36Sopenharmony_ci gtk_tree_view_insert_column_with_attributes(view, -1, 32762306a36Sopenharmony_ci "Value", renderer, 32862306a36Sopenharmony_ci "text", COL_VALUE, 32962306a36Sopenharmony_ci "editable", 33062306a36Sopenharmony_ci COL_EDIT, 33162306a36Sopenharmony_ci "foreground-gdk", 33262306a36Sopenharmony_ci COL_COLOR, NULL); 33362306a36Sopenharmony_ci g_signal_connect(G_OBJECT(renderer), "edited", 33462306a36Sopenharmony_ci G_CALLBACK(renderer_edited), NULL); 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, COL_NAME); 33762306a36Sopenharmony_ci gtk_tree_view_column_set_visible(column, show_name); 33862306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, COL_NO); 33962306a36Sopenharmony_ci gtk_tree_view_column_set_visible(column, show_range); 34062306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, COL_MOD); 34162306a36Sopenharmony_ci gtk_tree_view_column_set_visible(column, show_range); 34262306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, COL_YES); 34362306a36Sopenharmony_ci gtk_tree_view_column_set_visible(column, show_range); 34462306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, COL_VALUE); 34562306a36Sopenharmony_ci gtk_tree_view_column_set_visible(column, show_value); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci if (resizeable) { 34862306a36Sopenharmony_ci for (i = 0; i < COL_VALUE; i++) { 34962306a36Sopenharmony_ci column = gtk_tree_view_get_column(view, i); 35062306a36Sopenharmony_ci gtk_tree_view_column_set_resizable(column, TRUE); 35162306a36Sopenharmony_ci } 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci sel = gtk_tree_view_get_selection(view); 35562306a36Sopenharmony_ci gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 35662306a36Sopenharmony_ci} 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci/* Utility Functions */ 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_cistatic void text_insert_help(struct menu *menu) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci GtkTextBuffer *buffer; 36562306a36Sopenharmony_ci GtkTextIter start, end; 36662306a36Sopenharmony_ci const char *prompt = menu_get_prompt(menu); 36762306a36Sopenharmony_ci struct gstr help = str_new(); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci menu_get_ext_help(menu, &help); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 37262306a36Sopenharmony_ci gtk_text_buffer_get_bounds(buffer, &start, &end); 37362306a36Sopenharmony_ci gtk_text_buffer_delete(buffer, &start, &end); 37462306a36Sopenharmony_ci gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci gtk_text_buffer_get_end_iter(buffer, &end); 37762306a36Sopenharmony_ci gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1, 37862306a36Sopenharmony_ci NULL); 37962306a36Sopenharmony_ci gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); 38062306a36Sopenharmony_ci gtk_text_buffer_get_end_iter(buffer, &end); 38162306a36Sopenharmony_ci gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2, 38262306a36Sopenharmony_ci NULL); 38362306a36Sopenharmony_ci str_free(&help); 38462306a36Sopenharmony_ci} 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_cistatic void text_insert_msg(const char *title, const char *message) 38862306a36Sopenharmony_ci{ 38962306a36Sopenharmony_ci GtkTextBuffer *buffer; 39062306a36Sopenharmony_ci GtkTextIter start, end; 39162306a36Sopenharmony_ci const char *msg = message; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 39462306a36Sopenharmony_ci gtk_text_buffer_get_bounds(buffer, &start, &end); 39562306a36Sopenharmony_ci gtk_text_buffer_delete(buffer, &start, &end); 39662306a36Sopenharmony_ci gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci gtk_text_buffer_get_end_iter(buffer, &end); 39962306a36Sopenharmony_ci gtk_text_buffer_insert_with_tags(buffer, &end, title, -1, tag1, 40062306a36Sopenharmony_ci NULL); 40162306a36Sopenharmony_ci gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); 40262306a36Sopenharmony_ci gtk_text_buffer_get_end_iter(buffer, &end); 40362306a36Sopenharmony_ci gtk_text_buffer_insert_with_tags(buffer, &end, msg, -1, tag2, 40462306a36Sopenharmony_ci NULL); 40562306a36Sopenharmony_ci} 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* Main Windows Callbacks */ 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_civoid on_save_activate(GtkMenuItem * menuitem, gpointer user_data); 41162306a36Sopenharmony_cigboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event, 41262306a36Sopenharmony_ci gpointer user_data) 41362306a36Sopenharmony_ci{ 41462306a36Sopenharmony_ci GtkWidget *dialog, *label; 41562306a36Sopenharmony_ci gint result; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci if (!conf_get_changed()) 41862306a36Sopenharmony_ci return FALSE; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci dialog = gtk_dialog_new_with_buttons("Warning !", 42162306a36Sopenharmony_ci GTK_WINDOW(main_wnd), 42262306a36Sopenharmony_ci (GtkDialogFlags) 42362306a36Sopenharmony_ci (GTK_DIALOG_MODAL | 42462306a36Sopenharmony_ci GTK_DIALOG_DESTROY_WITH_PARENT), 42562306a36Sopenharmony_ci GTK_STOCK_OK, 42662306a36Sopenharmony_ci GTK_RESPONSE_YES, 42762306a36Sopenharmony_ci GTK_STOCK_NO, 42862306a36Sopenharmony_ci GTK_RESPONSE_NO, 42962306a36Sopenharmony_ci GTK_STOCK_CANCEL, 43062306a36Sopenharmony_ci GTK_RESPONSE_CANCEL, NULL); 43162306a36Sopenharmony_ci gtk_dialog_set_default_response(GTK_DIALOG(dialog), 43262306a36Sopenharmony_ci GTK_RESPONSE_CANCEL); 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci label = gtk_label_new("\nSave configuration ?\n"); 43562306a36Sopenharmony_ci gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); 43662306a36Sopenharmony_ci gtk_widget_show(label); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci result = gtk_dialog_run(GTK_DIALOG(dialog)); 43962306a36Sopenharmony_ci switch (result) { 44062306a36Sopenharmony_ci case GTK_RESPONSE_YES: 44162306a36Sopenharmony_ci on_save_activate(NULL, NULL); 44262306a36Sopenharmony_ci return FALSE; 44362306a36Sopenharmony_ci case GTK_RESPONSE_NO: 44462306a36Sopenharmony_ci return FALSE; 44562306a36Sopenharmony_ci case GTK_RESPONSE_CANCEL: 44662306a36Sopenharmony_ci case GTK_RESPONSE_DELETE_EVENT: 44762306a36Sopenharmony_ci default: 44862306a36Sopenharmony_ci gtk_widget_destroy(dialog); 44962306a36Sopenharmony_ci return TRUE; 45062306a36Sopenharmony_ci } 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci return FALSE; 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_civoid on_window1_destroy(GtkObject * object, gpointer user_data) 45762306a36Sopenharmony_ci{ 45862306a36Sopenharmony_ci gtk_main_quit(); 45962306a36Sopenharmony_ci} 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_civoid 46362306a36Sopenharmony_cion_window1_size_request(GtkWidget * widget, 46462306a36Sopenharmony_ci GtkRequisition * requisition, gpointer user_data) 46562306a36Sopenharmony_ci{ 46662306a36Sopenharmony_ci static gint old_h; 46762306a36Sopenharmony_ci gint w, h; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci if (widget->window == NULL) 47062306a36Sopenharmony_ci gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); 47162306a36Sopenharmony_ci else 47262306a36Sopenharmony_ci gdk_window_get_size(widget->window, &w, &h); 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if (h == old_h) 47562306a36Sopenharmony_ci return; 47662306a36Sopenharmony_ci old_h = h; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3); 47962306a36Sopenharmony_ci} 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci/* Menu & Toolbar Callbacks */ 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_cistatic void 48662306a36Sopenharmony_ciload_filename(GtkFileSelection * file_selector, gpointer user_data) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci const gchar *fn; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION 49162306a36Sopenharmony_ci (user_data)); 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci if (conf_read(fn)) 49462306a36Sopenharmony_ci text_insert_msg("Error", "Unable to load configuration !"); 49562306a36Sopenharmony_ci else 49662306a36Sopenharmony_ci display_tree(&rootmenu); 49762306a36Sopenharmony_ci} 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_civoid on_load1_activate(GtkMenuItem * menuitem, gpointer user_data) 50062306a36Sopenharmony_ci{ 50162306a36Sopenharmony_ci GtkWidget *fs; 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci fs = gtk_file_selection_new("Load file..."); 50462306a36Sopenharmony_ci g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), 50562306a36Sopenharmony_ci "clicked", 50662306a36Sopenharmony_ci G_CALLBACK(load_filename), (gpointer) fs); 50762306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT 50862306a36Sopenharmony_ci (GTK_FILE_SELECTION(fs)->ok_button), 50962306a36Sopenharmony_ci "clicked", G_CALLBACK(gtk_widget_destroy), 51062306a36Sopenharmony_ci (gpointer) fs); 51162306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT 51262306a36Sopenharmony_ci (GTK_FILE_SELECTION(fs)->cancel_button), 51362306a36Sopenharmony_ci "clicked", G_CALLBACK(gtk_widget_destroy), 51462306a36Sopenharmony_ci (gpointer) fs); 51562306a36Sopenharmony_ci gtk_widget_show(fs); 51662306a36Sopenharmony_ci} 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_civoid on_save_activate(GtkMenuItem * menuitem, gpointer user_data) 52062306a36Sopenharmony_ci{ 52162306a36Sopenharmony_ci if (conf_write(NULL)) 52262306a36Sopenharmony_ci text_insert_msg("Error", "Unable to save configuration !"); 52362306a36Sopenharmony_ci conf_write_autoconf(0); 52462306a36Sopenharmony_ci} 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_cistatic void 52862306a36Sopenharmony_cistore_filename(GtkFileSelection * file_selector, gpointer user_data) 52962306a36Sopenharmony_ci{ 53062306a36Sopenharmony_ci const gchar *fn; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ci fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION 53362306a36Sopenharmony_ci (user_data)); 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci if (conf_write(fn)) 53662306a36Sopenharmony_ci text_insert_msg("Error", "Unable to save configuration !"); 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci gtk_widget_destroy(GTK_WIDGET(user_data)); 53962306a36Sopenharmony_ci} 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_civoid on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data) 54262306a36Sopenharmony_ci{ 54362306a36Sopenharmony_ci GtkWidget *fs; 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci fs = gtk_file_selection_new("Save file as..."); 54662306a36Sopenharmony_ci g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), 54762306a36Sopenharmony_ci "clicked", 54862306a36Sopenharmony_ci G_CALLBACK(store_filename), (gpointer) fs); 54962306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT 55062306a36Sopenharmony_ci (GTK_FILE_SELECTION(fs)->ok_button), 55162306a36Sopenharmony_ci "clicked", G_CALLBACK(gtk_widget_destroy), 55262306a36Sopenharmony_ci (gpointer) fs); 55362306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT 55462306a36Sopenharmony_ci (GTK_FILE_SELECTION(fs)->cancel_button), 55562306a36Sopenharmony_ci "clicked", G_CALLBACK(gtk_widget_destroy), 55662306a36Sopenharmony_ci (gpointer) fs); 55762306a36Sopenharmony_ci gtk_widget_show(fs); 55862306a36Sopenharmony_ci} 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_civoid on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data) 56262306a36Sopenharmony_ci{ 56362306a36Sopenharmony_ci if (!on_window1_delete_event(NULL, NULL, NULL)) 56462306a36Sopenharmony_ci gtk_widget_destroy(GTK_WIDGET(main_wnd)); 56562306a36Sopenharmony_ci} 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_civoid on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data) 56962306a36Sopenharmony_ci{ 57062306a36Sopenharmony_ci GtkTreeViewColumn *col; 57162306a36Sopenharmony_ci 57262306a36Sopenharmony_ci show_name = GTK_CHECK_MENU_ITEM(menuitem)->active; 57362306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME); 57462306a36Sopenharmony_ci if (col) 57562306a36Sopenharmony_ci gtk_tree_view_column_set_visible(col, show_name); 57662306a36Sopenharmony_ci} 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_civoid on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data) 58062306a36Sopenharmony_ci{ 58162306a36Sopenharmony_ci GtkTreeViewColumn *col; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci show_range = GTK_CHECK_MENU_ITEM(menuitem)->active; 58462306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO); 58562306a36Sopenharmony_ci if (col) 58662306a36Sopenharmony_ci gtk_tree_view_column_set_visible(col, show_range); 58762306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_MOD); 58862306a36Sopenharmony_ci if (col) 58962306a36Sopenharmony_ci gtk_tree_view_column_set_visible(col, show_range); 59062306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_YES); 59162306a36Sopenharmony_ci if (col) 59262306a36Sopenharmony_ci gtk_tree_view_column_set_visible(col, show_range); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci} 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_civoid on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data) 59862306a36Sopenharmony_ci{ 59962306a36Sopenharmony_ci GtkTreeViewColumn *col; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci show_value = GTK_CHECK_MENU_ITEM(menuitem)->active; 60262306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE); 60362306a36Sopenharmony_ci if (col) 60462306a36Sopenharmony_ci gtk_tree_view_column_set_visible(col, show_value); 60562306a36Sopenharmony_ci} 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_civoid 60962306a36Sopenharmony_cion_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci opt_mode = OPT_NORMAL; 61262306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 61362306a36Sopenharmony_ci display_tree(&rootmenu); /* instead of update_tree to speed-up */ 61462306a36Sopenharmony_ci} 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_civoid 61862306a36Sopenharmony_cion_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data) 61962306a36Sopenharmony_ci{ 62062306a36Sopenharmony_ci opt_mode = OPT_ALL; 62162306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 62262306a36Sopenharmony_ci display_tree(&rootmenu); /* instead of update_tree to speed-up */ 62362306a36Sopenharmony_ci} 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_civoid 62762306a36Sopenharmony_cion_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data) 62862306a36Sopenharmony_ci{ 62962306a36Sopenharmony_ci opt_mode = OPT_PROMPT; 63062306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 63162306a36Sopenharmony_ci display_tree(&rootmenu); /* instead of update_tree to speed-up */ 63262306a36Sopenharmony_ci} 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci 63562306a36Sopenharmony_civoid on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) 63662306a36Sopenharmony_ci{ 63762306a36Sopenharmony_ci GtkWidget *dialog; 63862306a36Sopenharmony_ci const gchar *intro_text = 63962306a36Sopenharmony_ci "Welcome to gconfig, the GTK+ graphical configuration tool.\n" 64062306a36Sopenharmony_ci "For each option, a blank box indicates the feature is disabled, a\n" 64162306a36Sopenharmony_ci "check indicates it is enabled, and a dot indicates that it is to\n" 64262306a36Sopenharmony_ci "be compiled as a module. Clicking on the box will cycle through the three states.\n" 64362306a36Sopenharmony_ci "\n" 64462306a36Sopenharmony_ci "If you do not see an option (e.g., a device driver) that you\n" 64562306a36Sopenharmony_ci "believe should be present, try turning on Show All Options\n" 64662306a36Sopenharmony_ci "under the Options menu.\n" 64762306a36Sopenharmony_ci "Although there is no cross reference yet to help you figure out\n" 64862306a36Sopenharmony_ci "what other options must be enabled to support the option you\n" 64962306a36Sopenharmony_ci "are interested in, you can still view the help of a grayed-out\n" 65062306a36Sopenharmony_ci "option."; 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ci dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), 65362306a36Sopenharmony_ci GTK_DIALOG_DESTROY_WITH_PARENT, 65462306a36Sopenharmony_ci GTK_MESSAGE_INFO, 65562306a36Sopenharmony_ci GTK_BUTTONS_CLOSE, "%s", intro_text); 65662306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 65762306a36Sopenharmony_ci G_CALLBACK(gtk_widget_destroy), 65862306a36Sopenharmony_ci GTK_OBJECT(dialog)); 65962306a36Sopenharmony_ci gtk_widget_show_all(dialog); 66062306a36Sopenharmony_ci} 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_civoid on_about1_activate(GtkMenuItem * menuitem, gpointer user_data) 66462306a36Sopenharmony_ci{ 66562306a36Sopenharmony_ci GtkWidget *dialog; 66662306a36Sopenharmony_ci const gchar *about_text = 66762306a36Sopenharmony_ci "gconfig is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n" 66862306a36Sopenharmony_ci "Based on the source code from Roman Zippel.\n"; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), 67162306a36Sopenharmony_ci GTK_DIALOG_DESTROY_WITH_PARENT, 67262306a36Sopenharmony_ci GTK_MESSAGE_INFO, 67362306a36Sopenharmony_ci GTK_BUTTONS_CLOSE, "%s", about_text); 67462306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 67562306a36Sopenharmony_ci G_CALLBACK(gtk_widget_destroy), 67662306a36Sopenharmony_ci GTK_OBJECT(dialog)); 67762306a36Sopenharmony_ci gtk_widget_show_all(dialog); 67862306a36Sopenharmony_ci} 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_civoid on_license1_activate(GtkMenuItem * menuitem, gpointer user_data) 68262306a36Sopenharmony_ci{ 68362306a36Sopenharmony_ci GtkWidget *dialog; 68462306a36Sopenharmony_ci const gchar *license_text = 68562306a36Sopenharmony_ci "gconfig is released under the terms of the GNU GPL v2.\n" 68662306a36Sopenharmony_ci "For more information, please see the source code or\n" 68762306a36Sopenharmony_ci "visit http://www.fsf.org/licenses/licenses.html\n"; 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), 69062306a36Sopenharmony_ci GTK_DIALOG_DESTROY_WITH_PARENT, 69162306a36Sopenharmony_ci GTK_MESSAGE_INFO, 69262306a36Sopenharmony_ci GTK_BUTTONS_CLOSE, "%s", license_text); 69362306a36Sopenharmony_ci g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 69462306a36Sopenharmony_ci G_CALLBACK(gtk_widget_destroy), 69562306a36Sopenharmony_ci GTK_OBJECT(dialog)); 69662306a36Sopenharmony_ci gtk_widget_show_all(dialog); 69762306a36Sopenharmony_ci} 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_civoid on_back_clicked(GtkButton * button, gpointer user_data) 70162306a36Sopenharmony_ci{ 70262306a36Sopenharmony_ci enum prop_type ptype; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci current = current->parent; 70562306a36Sopenharmony_ci ptype = current->prompt ? current->prompt->type : P_UNKNOWN; 70662306a36Sopenharmony_ci if (ptype != P_MENU) 70762306a36Sopenharmony_ci current = current->parent; 70862306a36Sopenharmony_ci display_tree_part(); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci if (current == &rootmenu) 71162306a36Sopenharmony_ci gtk_widget_set_sensitive(back_btn, FALSE); 71262306a36Sopenharmony_ci} 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_civoid on_load_clicked(GtkButton * button, gpointer user_data) 71662306a36Sopenharmony_ci{ 71762306a36Sopenharmony_ci on_load1_activate(NULL, user_data); 71862306a36Sopenharmony_ci} 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_civoid on_single_clicked(GtkButton * button, gpointer user_data) 72262306a36Sopenharmony_ci{ 72362306a36Sopenharmony_ci view_mode = SINGLE_VIEW; 72462306a36Sopenharmony_ci gtk_widget_hide(tree1_w); 72562306a36Sopenharmony_ci current = &rootmenu; 72662306a36Sopenharmony_ci display_tree_part(); 72762306a36Sopenharmony_ci} 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_civoid on_split_clicked(GtkButton * button, gpointer user_data) 73162306a36Sopenharmony_ci{ 73262306a36Sopenharmony_ci gint w, h; 73362306a36Sopenharmony_ci view_mode = SPLIT_VIEW; 73462306a36Sopenharmony_ci gtk_widget_show(tree1_w); 73562306a36Sopenharmony_ci gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); 73662306a36Sopenharmony_ci gtk_paned_set_position(GTK_PANED(hpaned), w / 2); 73762306a36Sopenharmony_ci if (tree2) 73862306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 73962306a36Sopenharmony_ci display_list(); 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci /* Disable back btn, like in full mode. */ 74262306a36Sopenharmony_ci gtk_widget_set_sensitive(back_btn, FALSE); 74362306a36Sopenharmony_ci} 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_civoid on_full_clicked(GtkButton * button, gpointer user_data) 74762306a36Sopenharmony_ci{ 74862306a36Sopenharmony_ci view_mode = FULL_VIEW; 74962306a36Sopenharmony_ci gtk_widget_hide(tree1_w); 75062306a36Sopenharmony_ci if (tree2) 75162306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 75262306a36Sopenharmony_ci display_tree(&rootmenu); 75362306a36Sopenharmony_ci gtk_widget_set_sensitive(back_btn, FALSE); 75462306a36Sopenharmony_ci} 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_civoid on_collapse_clicked(GtkButton * button, gpointer user_data) 75862306a36Sopenharmony_ci{ 75962306a36Sopenharmony_ci gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w)); 76062306a36Sopenharmony_ci} 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_civoid on_expand_clicked(GtkButton * button, gpointer user_data) 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); 76662306a36Sopenharmony_ci} 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci/* CTree Callbacks */ 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci/* Change hex/int/string value in the cell */ 77262306a36Sopenharmony_cistatic void renderer_edited(GtkCellRendererText * cell, 77362306a36Sopenharmony_ci const gchar * path_string, 77462306a36Sopenharmony_ci const gchar * new_text, gpointer user_data) 77562306a36Sopenharmony_ci{ 77662306a36Sopenharmony_ci GtkTreePath *path = gtk_tree_path_new_from_string(path_string); 77762306a36Sopenharmony_ci GtkTreeIter iter; 77862306a36Sopenharmony_ci const char *old_def, *new_def; 77962306a36Sopenharmony_ci struct menu *menu; 78062306a36Sopenharmony_ci struct symbol *sym; 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci if (!gtk_tree_model_get_iter(model2, &iter, path)) 78362306a36Sopenharmony_ci return; 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 78662306a36Sopenharmony_ci sym = menu->sym; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1); 78962306a36Sopenharmony_ci new_def = new_text; 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci sym_set_string_value(sym, new_def); 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci update_tree(&rootmenu, NULL); 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ci gtk_tree_path_free(path); 79662306a36Sopenharmony_ci} 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci/* Change the value of a symbol and update the tree */ 79962306a36Sopenharmony_cistatic void change_sym_value(struct menu *menu, gint col) 80062306a36Sopenharmony_ci{ 80162306a36Sopenharmony_ci struct symbol *sym = menu->sym; 80262306a36Sopenharmony_ci tristate newval; 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_ci if (!sym) 80562306a36Sopenharmony_ci return; 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ci if (col == COL_NO) 80862306a36Sopenharmony_ci newval = no; 80962306a36Sopenharmony_ci else if (col == COL_MOD) 81062306a36Sopenharmony_ci newval = mod; 81162306a36Sopenharmony_ci else if (col == COL_YES) 81262306a36Sopenharmony_ci newval = yes; 81362306a36Sopenharmony_ci else 81462306a36Sopenharmony_ci return; 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci switch (sym_get_type(sym)) { 81762306a36Sopenharmony_ci case S_BOOLEAN: 81862306a36Sopenharmony_ci case S_TRISTATE: 81962306a36Sopenharmony_ci if (!sym_tristate_within_range(sym, newval)) 82062306a36Sopenharmony_ci newval = yes; 82162306a36Sopenharmony_ci sym_set_tristate_value(sym, newval); 82262306a36Sopenharmony_ci if (view_mode == FULL_VIEW) 82362306a36Sopenharmony_ci update_tree(&rootmenu, NULL); 82462306a36Sopenharmony_ci else if (view_mode == SPLIT_VIEW) { 82562306a36Sopenharmony_ci update_tree(browsed, NULL); 82662306a36Sopenharmony_ci display_list(); 82762306a36Sopenharmony_ci } 82862306a36Sopenharmony_ci else if (view_mode == SINGLE_VIEW) 82962306a36Sopenharmony_ci display_tree_part(); //fixme: keep exp/coll 83062306a36Sopenharmony_ci break; 83162306a36Sopenharmony_ci case S_INT: 83262306a36Sopenharmony_ci case S_HEX: 83362306a36Sopenharmony_ci case S_STRING: 83462306a36Sopenharmony_ci default: 83562306a36Sopenharmony_ci break; 83662306a36Sopenharmony_ci } 83762306a36Sopenharmony_ci} 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_cistatic void toggle_sym_value(struct menu *menu) 84062306a36Sopenharmony_ci{ 84162306a36Sopenharmony_ci if (!menu->sym) 84262306a36Sopenharmony_ci return; 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ci sym_toggle_tristate_value(menu->sym); 84562306a36Sopenharmony_ci if (view_mode == FULL_VIEW) 84662306a36Sopenharmony_ci update_tree(&rootmenu, NULL); 84762306a36Sopenharmony_ci else if (view_mode == SPLIT_VIEW) { 84862306a36Sopenharmony_ci update_tree(browsed, NULL); 84962306a36Sopenharmony_ci display_list(); 85062306a36Sopenharmony_ci } 85162306a36Sopenharmony_ci else if (view_mode == SINGLE_VIEW) 85262306a36Sopenharmony_ci display_tree_part(); //fixme: keep exp/coll 85362306a36Sopenharmony_ci} 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_cistatic gint column2index(GtkTreeViewColumn * column) 85662306a36Sopenharmony_ci{ 85762306a36Sopenharmony_ci gint i; 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci for (i = 0; i < COL_NUMBER; i++) { 86062306a36Sopenharmony_ci GtkTreeViewColumn *col; 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), i); 86362306a36Sopenharmony_ci if (col == column) 86462306a36Sopenharmony_ci return i; 86562306a36Sopenharmony_ci } 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ci return -1; 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci/* User click: update choice (full) or goes down (single) */ 87262306a36Sopenharmony_cigboolean 87362306a36Sopenharmony_cion_treeview2_button_press_event(GtkWidget * widget, 87462306a36Sopenharmony_ci GdkEventButton * event, gpointer user_data) 87562306a36Sopenharmony_ci{ 87662306a36Sopenharmony_ci GtkTreeView *view = GTK_TREE_VIEW(widget); 87762306a36Sopenharmony_ci GtkTreePath *path; 87862306a36Sopenharmony_ci GtkTreeViewColumn *column; 87962306a36Sopenharmony_ci GtkTreeIter iter; 88062306a36Sopenharmony_ci struct menu *menu; 88162306a36Sopenharmony_ci gint col; 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci#if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK 88462306a36Sopenharmony_ci gint tx = (gint) event->x; 88562306a36Sopenharmony_ci gint ty = (gint) event->y; 88662306a36Sopenharmony_ci gint cx, cy; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, 88962306a36Sopenharmony_ci &cy); 89062306a36Sopenharmony_ci#else 89162306a36Sopenharmony_ci gtk_tree_view_get_cursor(view, &path, &column); 89262306a36Sopenharmony_ci#endif 89362306a36Sopenharmony_ci if (path == NULL) 89462306a36Sopenharmony_ci return FALSE; 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci if (!gtk_tree_model_get_iter(model2, &iter, path)) 89762306a36Sopenharmony_ci return FALSE; 89862306a36Sopenharmony_ci gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci col = column2index(column); 90162306a36Sopenharmony_ci if (event->type == GDK_2BUTTON_PRESS) { 90262306a36Sopenharmony_ci enum prop_type ptype; 90362306a36Sopenharmony_ci ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) { 90662306a36Sopenharmony_ci // goes down into menu 90762306a36Sopenharmony_ci current = menu; 90862306a36Sopenharmony_ci display_tree_part(); 90962306a36Sopenharmony_ci gtk_widget_set_sensitive(back_btn, TRUE); 91062306a36Sopenharmony_ci } else if (col == COL_OPTION) { 91162306a36Sopenharmony_ci toggle_sym_value(menu); 91262306a36Sopenharmony_ci gtk_tree_view_expand_row(view, path, TRUE); 91362306a36Sopenharmony_ci } 91462306a36Sopenharmony_ci } else { 91562306a36Sopenharmony_ci if (col == COL_VALUE) { 91662306a36Sopenharmony_ci toggle_sym_value(menu); 91762306a36Sopenharmony_ci gtk_tree_view_expand_row(view, path, TRUE); 91862306a36Sopenharmony_ci } else if (col == COL_NO || col == COL_MOD 91962306a36Sopenharmony_ci || col == COL_YES) { 92062306a36Sopenharmony_ci change_sym_value(menu, col); 92162306a36Sopenharmony_ci gtk_tree_view_expand_row(view, path, TRUE); 92262306a36Sopenharmony_ci } 92362306a36Sopenharmony_ci } 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci return FALSE; 92662306a36Sopenharmony_ci} 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci/* Key pressed: update choice */ 92962306a36Sopenharmony_cigboolean 93062306a36Sopenharmony_cion_treeview2_key_press_event(GtkWidget * widget, 93162306a36Sopenharmony_ci GdkEventKey * event, gpointer user_data) 93262306a36Sopenharmony_ci{ 93362306a36Sopenharmony_ci GtkTreeView *view = GTK_TREE_VIEW(widget); 93462306a36Sopenharmony_ci GtkTreePath *path; 93562306a36Sopenharmony_ci GtkTreeViewColumn *column; 93662306a36Sopenharmony_ci GtkTreeIter iter; 93762306a36Sopenharmony_ci struct menu *menu; 93862306a36Sopenharmony_ci gint col; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci gtk_tree_view_get_cursor(view, &path, &column); 94162306a36Sopenharmony_ci if (path == NULL) 94262306a36Sopenharmony_ci return FALSE; 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci if (event->keyval == GDK_space) { 94562306a36Sopenharmony_ci if (gtk_tree_view_row_expanded(view, path)) 94662306a36Sopenharmony_ci gtk_tree_view_collapse_row(view, path); 94762306a36Sopenharmony_ci else 94862306a36Sopenharmony_ci gtk_tree_view_expand_row(view, path, FALSE); 94962306a36Sopenharmony_ci return TRUE; 95062306a36Sopenharmony_ci } 95162306a36Sopenharmony_ci if (event->keyval == GDK_KP_Enter) { 95262306a36Sopenharmony_ci } 95362306a36Sopenharmony_ci if (widget == tree1_w) 95462306a36Sopenharmony_ci return FALSE; 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_ci gtk_tree_model_get_iter(model2, &iter, path); 95762306a36Sopenharmony_ci gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci if (!strcasecmp(event->string, "n")) 96062306a36Sopenharmony_ci col = COL_NO; 96162306a36Sopenharmony_ci else if (!strcasecmp(event->string, "m")) 96262306a36Sopenharmony_ci col = COL_MOD; 96362306a36Sopenharmony_ci else if (!strcasecmp(event->string, "y")) 96462306a36Sopenharmony_ci col = COL_YES; 96562306a36Sopenharmony_ci else 96662306a36Sopenharmony_ci col = -1; 96762306a36Sopenharmony_ci change_sym_value(menu, col); 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_ci return FALSE; 97062306a36Sopenharmony_ci} 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci/* Row selection changed: update help */ 97462306a36Sopenharmony_civoid 97562306a36Sopenharmony_cion_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data) 97662306a36Sopenharmony_ci{ 97762306a36Sopenharmony_ci GtkTreeSelection *selection; 97862306a36Sopenharmony_ci GtkTreeIter iter; 97962306a36Sopenharmony_ci struct menu *menu; 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci selection = gtk_tree_view_get_selection(treeview); 98262306a36Sopenharmony_ci if (gtk_tree_selection_get_selected(selection, &model2, &iter)) { 98362306a36Sopenharmony_ci gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 98462306a36Sopenharmony_ci text_insert_help(menu); 98562306a36Sopenharmony_ci } 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci/* User click: display sub-tree in the right frame. */ 99062306a36Sopenharmony_cigboolean 99162306a36Sopenharmony_cion_treeview1_button_press_event(GtkWidget * widget, 99262306a36Sopenharmony_ci GdkEventButton * event, gpointer user_data) 99362306a36Sopenharmony_ci{ 99462306a36Sopenharmony_ci GtkTreeView *view = GTK_TREE_VIEW(widget); 99562306a36Sopenharmony_ci GtkTreePath *path; 99662306a36Sopenharmony_ci GtkTreeViewColumn *column; 99762306a36Sopenharmony_ci GtkTreeIter iter; 99862306a36Sopenharmony_ci struct menu *menu; 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_ci gint tx = (gint) event->x; 100162306a36Sopenharmony_ci gint ty = (gint) event->y; 100262306a36Sopenharmony_ci gint cx, cy; 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, 100562306a36Sopenharmony_ci &cy); 100662306a36Sopenharmony_ci if (path == NULL) 100762306a36Sopenharmony_ci return FALSE; 100862306a36Sopenharmony_ci 100962306a36Sopenharmony_ci gtk_tree_model_get_iter(model1, &iter, path); 101062306a36Sopenharmony_ci gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1); 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci if (event->type == GDK_2BUTTON_PRESS) { 101362306a36Sopenharmony_ci toggle_sym_value(menu); 101462306a36Sopenharmony_ci current = menu; 101562306a36Sopenharmony_ci display_tree_part(); 101662306a36Sopenharmony_ci } else { 101762306a36Sopenharmony_ci browsed = menu; 101862306a36Sopenharmony_ci display_tree_part(); 101962306a36Sopenharmony_ci } 102062306a36Sopenharmony_ci 102162306a36Sopenharmony_ci gtk_widget_realize(tree2_w); 102262306a36Sopenharmony_ci gtk_tree_view_set_cursor(view, path, NULL, FALSE); 102362306a36Sopenharmony_ci gtk_widget_grab_focus(tree2_w); 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci return FALSE; 102662306a36Sopenharmony_ci} 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci/* Fill a row of strings */ 103062306a36Sopenharmony_cistatic gchar **fill_row(struct menu *menu) 103162306a36Sopenharmony_ci{ 103262306a36Sopenharmony_ci static gchar *row[COL_NUMBER]; 103362306a36Sopenharmony_ci struct symbol *sym = menu->sym; 103462306a36Sopenharmony_ci const char *def; 103562306a36Sopenharmony_ci int stype; 103662306a36Sopenharmony_ci tristate val; 103762306a36Sopenharmony_ci enum prop_type ptype; 103862306a36Sopenharmony_ci int i; 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci for (i = COL_OPTION; i <= COL_COLOR; i++) 104162306a36Sopenharmony_ci g_free(row[i]); 104262306a36Sopenharmony_ci bzero(row, sizeof(row)); 104362306a36Sopenharmony_ci 104462306a36Sopenharmony_ci ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_ci row[COL_OPTION] = 104762306a36Sopenharmony_ci g_strdup_printf("%s %s %s %s", 104862306a36Sopenharmony_ci ptype == P_COMMENT ? "***" : "", 104962306a36Sopenharmony_ci menu_get_prompt(menu), 105062306a36Sopenharmony_ci ptype == P_COMMENT ? "***" : "", 105162306a36Sopenharmony_ci sym && !sym_has_value(sym) ? "(NEW)" : ""); 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci if (opt_mode == OPT_ALL && !menu_is_visible(menu)) 105462306a36Sopenharmony_ci row[COL_COLOR] = g_strdup("DarkGray"); 105562306a36Sopenharmony_ci else if (opt_mode == OPT_PROMPT && 105662306a36Sopenharmony_ci menu_has_prompt(menu) && !menu_is_visible(menu)) 105762306a36Sopenharmony_ci row[COL_COLOR] = g_strdup("DarkGray"); 105862306a36Sopenharmony_ci else 105962306a36Sopenharmony_ci row[COL_COLOR] = g_strdup("Black"); 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci switch (ptype) { 106262306a36Sopenharmony_ci case P_MENU: 106362306a36Sopenharmony_ci row[COL_PIXBUF] = (gchar *) xpm_menu; 106462306a36Sopenharmony_ci if (view_mode == SINGLE_VIEW) 106562306a36Sopenharmony_ci row[COL_PIXVIS] = GINT_TO_POINTER(TRUE); 106662306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 106762306a36Sopenharmony_ci break; 106862306a36Sopenharmony_ci case P_COMMENT: 106962306a36Sopenharmony_ci row[COL_PIXBUF] = (gchar *) xpm_void; 107062306a36Sopenharmony_ci row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); 107162306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 107262306a36Sopenharmony_ci break; 107362306a36Sopenharmony_ci default: 107462306a36Sopenharmony_ci row[COL_PIXBUF] = (gchar *) xpm_void; 107562306a36Sopenharmony_ci row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); 107662306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); 107762306a36Sopenharmony_ci break; 107862306a36Sopenharmony_ci } 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_ci if (!sym) 108162306a36Sopenharmony_ci return row; 108262306a36Sopenharmony_ci row[COL_NAME] = g_strdup(sym->name); 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_ci sym_calc_value(sym); 108562306a36Sopenharmony_ci sym->flags &= ~SYMBOL_CHANGED; 108662306a36Sopenharmony_ci 108762306a36Sopenharmony_ci if (sym_is_choice(sym)) { // parse childs for getting final value 108862306a36Sopenharmony_ci struct menu *child; 108962306a36Sopenharmony_ci struct symbol *def_sym = sym_get_choice_value(sym); 109062306a36Sopenharmony_ci struct menu *def_menu = NULL; 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci for (child = menu->list; child; child = child->next) { 109562306a36Sopenharmony_ci if (menu_is_visible(child) 109662306a36Sopenharmony_ci && child->sym == def_sym) 109762306a36Sopenharmony_ci def_menu = child; 109862306a36Sopenharmony_ci } 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_ci if (def_menu) 110162306a36Sopenharmony_ci row[COL_VALUE] = 110262306a36Sopenharmony_ci g_strdup(menu_get_prompt(def_menu)); 110362306a36Sopenharmony_ci } 110462306a36Sopenharmony_ci if (sym->flags & SYMBOL_CHOICEVAL) 110562306a36Sopenharmony_ci row[COL_BTNRAD] = GINT_TO_POINTER(TRUE); 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci stype = sym_get_type(sym); 110862306a36Sopenharmony_ci switch (stype) { 110962306a36Sopenharmony_ci case S_BOOLEAN: 111062306a36Sopenharmony_ci if (GPOINTER_TO_INT(row[COL_PIXVIS]) == FALSE) 111162306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); 111262306a36Sopenharmony_ci if (sym_is_choice(sym)) 111362306a36Sopenharmony_ci break; 111462306a36Sopenharmony_ci /* fall through */ 111562306a36Sopenharmony_ci case S_TRISTATE: 111662306a36Sopenharmony_ci val = sym_get_tristate_value(sym); 111762306a36Sopenharmony_ci switch (val) { 111862306a36Sopenharmony_ci case no: 111962306a36Sopenharmony_ci row[COL_NO] = g_strdup("N"); 112062306a36Sopenharmony_ci row[COL_VALUE] = g_strdup("N"); 112162306a36Sopenharmony_ci row[COL_BTNACT] = GINT_TO_POINTER(FALSE); 112262306a36Sopenharmony_ci row[COL_BTNINC] = GINT_TO_POINTER(FALSE); 112362306a36Sopenharmony_ci break; 112462306a36Sopenharmony_ci case mod: 112562306a36Sopenharmony_ci row[COL_MOD] = g_strdup("M"); 112662306a36Sopenharmony_ci row[COL_VALUE] = g_strdup("M"); 112762306a36Sopenharmony_ci row[COL_BTNINC] = GINT_TO_POINTER(TRUE); 112862306a36Sopenharmony_ci break; 112962306a36Sopenharmony_ci case yes: 113062306a36Sopenharmony_ci row[COL_YES] = g_strdup("Y"); 113162306a36Sopenharmony_ci row[COL_VALUE] = g_strdup("Y"); 113262306a36Sopenharmony_ci row[COL_BTNACT] = GINT_TO_POINTER(TRUE); 113362306a36Sopenharmony_ci row[COL_BTNINC] = GINT_TO_POINTER(FALSE); 113462306a36Sopenharmony_ci break; 113562306a36Sopenharmony_ci } 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_ci if (val != no && sym_tristate_within_range(sym, no)) 113862306a36Sopenharmony_ci row[COL_NO] = g_strdup("_"); 113962306a36Sopenharmony_ci if (val != mod && sym_tristate_within_range(sym, mod)) 114062306a36Sopenharmony_ci row[COL_MOD] = g_strdup("_"); 114162306a36Sopenharmony_ci if (val != yes && sym_tristate_within_range(sym, yes)) 114262306a36Sopenharmony_ci row[COL_YES] = g_strdup("_"); 114362306a36Sopenharmony_ci break; 114462306a36Sopenharmony_ci case S_INT: 114562306a36Sopenharmony_ci case S_HEX: 114662306a36Sopenharmony_ci case S_STRING: 114762306a36Sopenharmony_ci def = sym_get_string_value(sym); 114862306a36Sopenharmony_ci row[COL_VALUE] = g_strdup(def); 114962306a36Sopenharmony_ci row[COL_EDIT] = GINT_TO_POINTER(TRUE); 115062306a36Sopenharmony_ci row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 115162306a36Sopenharmony_ci break; 115262306a36Sopenharmony_ci } 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci return row; 115562306a36Sopenharmony_ci} 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_ci/* Set the node content with a row of strings */ 115962306a36Sopenharmony_cistatic void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row) 116062306a36Sopenharmony_ci{ 116162306a36Sopenharmony_ci GdkColor color; 116262306a36Sopenharmony_ci gboolean success; 116362306a36Sopenharmony_ci GdkPixbuf *pix; 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_ci pix = gdk_pixbuf_new_from_xpm_data((const char **) 116662306a36Sopenharmony_ci row[COL_PIXBUF]); 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci gdk_color_parse(row[COL_COLOR], &color); 116962306a36Sopenharmony_ci gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1, 117062306a36Sopenharmony_ci FALSE, FALSE, &success); 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci gtk_tree_store_set(tree, node, 117362306a36Sopenharmony_ci COL_OPTION, row[COL_OPTION], 117462306a36Sopenharmony_ci COL_NAME, row[COL_NAME], 117562306a36Sopenharmony_ci COL_NO, row[COL_NO], 117662306a36Sopenharmony_ci COL_MOD, row[COL_MOD], 117762306a36Sopenharmony_ci COL_YES, row[COL_YES], 117862306a36Sopenharmony_ci COL_VALUE, row[COL_VALUE], 117962306a36Sopenharmony_ci COL_MENU, (gpointer) menu, 118062306a36Sopenharmony_ci COL_COLOR, &color, 118162306a36Sopenharmony_ci COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]), 118262306a36Sopenharmony_ci COL_PIXBUF, pix, 118362306a36Sopenharmony_ci COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]), 118462306a36Sopenharmony_ci COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]), 118562306a36Sopenharmony_ci COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]), 118662306a36Sopenharmony_ci COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]), 118762306a36Sopenharmony_ci COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]), 118862306a36Sopenharmony_ci -1); 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci g_object_unref(pix); 119162306a36Sopenharmony_ci} 119262306a36Sopenharmony_ci 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci/* Add a node to the tree */ 119562306a36Sopenharmony_cistatic void place_node(struct menu *menu, char **row) 119662306a36Sopenharmony_ci{ 119762306a36Sopenharmony_ci GtkTreeIter *parent = parents[indent - 1]; 119862306a36Sopenharmony_ci GtkTreeIter *node = parents[indent]; 119962306a36Sopenharmony_ci 120062306a36Sopenharmony_ci gtk_tree_store_append(tree, node, parent); 120162306a36Sopenharmony_ci set_node(node, menu, row); 120262306a36Sopenharmony_ci} 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci/* Find a node in the GTK+ tree */ 120662306a36Sopenharmony_cistatic GtkTreeIter found; 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci/* 120962306a36Sopenharmony_ci * Find a menu in the GtkTree starting at parent. 121062306a36Sopenharmony_ci */ 121162306a36Sopenharmony_cistatic GtkTreeIter *gtktree_iter_find_node(GtkTreeIter *parent, 121262306a36Sopenharmony_ci struct menu *tofind) 121362306a36Sopenharmony_ci{ 121462306a36Sopenharmony_ci GtkTreeIter iter; 121562306a36Sopenharmony_ci GtkTreeIter *child = &iter; 121662306a36Sopenharmony_ci gboolean valid; 121762306a36Sopenharmony_ci GtkTreeIter *ret; 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_ci valid = gtk_tree_model_iter_children(model2, child, parent); 122062306a36Sopenharmony_ci while (valid) { 122162306a36Sopenharmony_ci struct menu *menu; 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_ci gtk_tree_model_get(model2, child, 6, &menu, -1); 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci if (menu == tofind) { 122662306a36Sopenharmony_ci memcpy(&found, child, sizeof(GtkTreeIter)); 122762306a36Sopenharmony_ci return &found; 122862306a36Sopenharmony_ci } 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci ret = gtktree_iter_find_node(child, tofind); 123162306a36Sopenharmony_ci if (ret) 123262306a36Sopenharmony_ci return ret; 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci valid = gtk_tree_model_iter_next(model2, child); 123562306a36Sopenharmony_ci } 123662306a36Sopenharmony_ci 123762306a36Sopenharmony_ci return NULL; 123862306a36Sopenharmony_ci} 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_ci/* 124262306a36Sopenharmony_ci * Update the tree by adding/removing entries 124362306a36Sopenharmony_ci * Does not change other nodes 124462306a36Sopenharmony_ci */ 124562306a36Sopenharmony_cistatic void update_tree(struct menu *src, GtkTreeIter * dst) 124662306a36Sopenharmony_ci{ 124762306a36Sopenharmony_ci struct menu *child1; 124862306a36Sopenharmony_ci GtkTreeIter iter, tmp; 124962306a36Sopenharmony_ci GtkTreeIter *child2 = &iter; 125062306a36Sopenharmony_ci gboolean valid; 125162306a36Sopenharmony_ci GtkTreeIter *sibling; 125262306a36Sopenharmony_ci struct symbol *sym; 125362306a36Sopenharmony_ci struct menu *menu1, *menu2; 125462306a36Sopenharmony_ci 125562306a36Sopenharmony_ci if (src == &rootmenu) 125662306a36Sopenharmony_ci indent = 1; 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_ci valid = gtk_tree_model_iter_children(model2, child2, dst); 125962306a36Sopenharmony_ci for (child1 = src->list; child1; child1 = child1->next) { 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_ci sym = child1->sym; 126262306a36Sopenharmony_ci 126362306a36Sopenharmony_ci reparse: 126462306a36Sopenharmony_ci menu1 = child1; 126562306a36Sopenharmony_ci if (valid) 126662306a36Sopenharmony_ci gtk_tree_model_get(model2, child2, COL_MENU, 126762306a36Sopenharmony_ci &menu2, -1); 126862306a36Sopenharmony_ci else 126962306a36Sopenharmony_ci menu2 = NULL; // force adding of a first child 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_ci#ifdef DEBUG 127262306a36Sopenharmony_ci printf("%*c%s | %s\n", indent, ' ', 127362306a36Sopenharmony_ci menu1 ? menu_get_prompt(menu1) : "nil", 127462306a36Sopenharmony_ci menu2 ? menu_get_prompt(menu2) : "nil"); 127562306a36Sopenharmony_ci#endif 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) || 127862306a36Sopenharmony_ci (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) || 127962306a36Sopenharmony_ci (opt_mode == OPT_ALL && !menu_get_prompt(child1))) { 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci /* remove node */ 128262306a36Sopenharmony_ci if (gtktree_iter_find_node(dst, menu1) != NULL) { 128362306a36Sopenharmony_ci memcpy(&tmp, child2, sizeof(GtkTreeIter)); 128462306a36Sopenharmony_ci valid = gtk_tree_model_iter_next(model2, 128562306a36Sopenharmony_ci child2); 128662306a36Sopenharmony_ci gtk_tree_store_remove(tree2, &tmp); 128762306a36Sopenharmony_ci if (!valid) 128862306a36Sopenharmony_ci return; /* next parent */ 128962306a36Sopenharmony_ci else 129062306a36Sopenharmony_ci goto reparse; /* next child */ 129162306a36Sopenharmony_ci } else 129262306a36Sopenharmony_ci continue; 129362306a36Sopenharmony_ci } 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci if (menu1 != menu2) { 129662306a36Sopenharmony_ci if (gtktree_iter_find_node(dst, menu1) == NULL) { // add node 129762306a36Sopenharmony_ci if (!valid && !menu2) 129862306a36Sopenharmony_ci sibling = NULL; 129962306a36Sopenharmony_ci else 130062306a36Sopenharmony_ci sibling = child2; 130162306a36Sopenharmony_ci gtk_tree_store_insert_before(tree2, 130262306a36Sopenharmony_ci child2, 130362306a36Sopenharmony_ci dst, sibling); 130462306a36Sopenharmony_ci set_node(child2, menu1, fill_row(menu1)); 130562306a36Sopenharmony_ci if (menu2 == NULL) 130662306a36Sopenharmony_ci valid = TRUE; 130762306a36Sopenharmony_ci } else { // remove node 130862306a36Sopenharmony_ci memcpy(&tmp, child2, sizeof(GtkTreeIter)); 130962306a36Sopenharmony_ci valid = gtk_tree_model_iter_next(model2, 131062306a36Sopenharmony_ci child2); 131162306a36Sopenharmony_ci gtk_tree_store_remove(tree2, &tmp); 131262306a36Sopenharmony_ci if (!valid) 131362306a36Sopenharmony_ci return; // next parent 131462306a36Sopenharmony_ci else 131562306a36Sopenharmony_ci goto reparse; // next child 131662306a36Sopenharmony_ci } 131762306a36Sopenharmony_ci } else if (sym && (sym->flags & SYMBOL_CHANGED)) { 131862306a36Sopenharmony_ci set_node(child2, menu1, fill_row(menu1)); 131962306a36Sopenharmony_ci } 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_ci indent++; 132262306a36Sopenharmony_ci update_tree(child1, child2); 132362306a36Sopenharmony_ci indent--; 132462306a36Sopenharmony_ci 132562306a36Sopenharmony_ci valid = gtk_tree_model_iter_next(model2, child2); 132662306a36Sopenharmony_ci } 132762306a36Sopenharmony_ci} 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci/* Display the whole tree (single/split/full view) */ 133162306a36Sopenharmony_cistatic void display_tree(struct menu *menu) 133262306a36Sopenharmony_ci{ 133362306a36Sopenharmony_ci struct symbol *sym; 133462306a36Sopenharmony_ci struct property *prop; 133562306a36Sopenharmony_ci struct menu *child; 133662306a36Sopenharmony_ci enum prop_type ptype; 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci if (menu == &rootmenu) { 133962306a36Sopenharmony_ci indent = 1; 134062306a36Sopenharmony_ci current = &rootmenu; 134162306a36Sopenharmony_ci } 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci for (child = menu->list; child; child = child->next) { 134462306a36Sopenharmony_ci prop = child->prompt; 134562306a36Sopenharmony_ci sym = child->sym; 134662306a36Sopenharmony_ci ptype = prop ? prop->type : P_UNKNOWN; 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_ci if (sym) 134962306a36Sopenharmony_ci sym->flags &= ~SYMBOL_CHANGED; 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci if ((view_mode == SPLIT_VIEW) 135262306a36Sopenharmony_ci && !(child->flags & MENU_ROOT) && (tree == tree1)) 135362306a36Sopenharmony_ci continue; 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_ci if ((view_mode == SPLIT_VIEW) && (child->flags & MENU_ROOT) 135662306a36Sopenharmony_ci && (tree == tree2)) 135762306a36Sopenharmony_ci continue; 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) || 136062306a36Sopenharmony_ci (opt_mode == OPT_PROMPT && menu_has_prompt(child)) || 136162306a36Sopenharmony_ci (opt_mode == OPT_ALL && menu_get_prompt(child))) 136262306a36Sopenharmony_ci place_node(child, fill_row(child)); 136362306a36Sopenharmony_ci#ifdef DEBUG 136462306a36Sopenharmony_ci printf("%*c%s: ", indent, ' ', menu_get_prompt(child)); 136562306a36Sopenharmony_ci printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : ""); 136662306a36Sopenharmony_ci printf("%s", prop_get_type_name(ptype)); 136762306a36Sopenharmony_ci printf(" | "); 136862306a36Sopenharmony_ci if (sym) { 136962306a36Sopenharmony_ci printf("%s", sym_type_name(sym->type)); 137062306a36Sopenharmony_ci printf(" | "); 137162306a36Sopenharmony_ci printf("%s", dbg_sym_flags(sym->flags)); 137262306a36Sopenharmony_ci printf("\n"); 137362306a36Sopenharmony_ci } else 137462306a36Sopenharmony_ci printf("\n"); 137562306a36Sopenharmony_ci#endif 137662306a36Sopenharmony_ci if ((view_mode != FULL_VIEW) && (ptype == P_MENU) 137762306a36Sopenharmony_ci && (tree == tree2)) 137862306a36Sopenharmony_ci continue; 137962306a36Sopenharmony_ci/* 138062306a36Sopenharmony_ci if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT)) 138162306a36Sopenharmony_ci || (view_mode == FULL_VIEW) 138262306a36Sopenharmony_ci || (view_mode == SPLIT_VIEW))*/ 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_ci /* Change paned position if the view is not in 'split mode' */ 138562306a36Sopenharmony_ci if (view_mode == SINGLE_VIEW || view_mode == FULL_VIEW) { 138662306a36Sopenharmony_ci gtk_paned_set_position(GTK_PANED(hpaned), 0); 138762306a36Sopenharmony_ci } 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_ci if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT)) 139062306a36Sopenharmony_ci || (view_mode == FULL_VIEW) 139162306a36Sopenharmony_ci || (view_mode == SPLIT_VIEW)) { 139262306a36Sopenharmony_ci indent++; 139362306a36Sopenharmony_ci display_tree(child); 139462306a36Sopenharmony_ci indent--; 139562306a36Sopenharmony_ci } 139662306a36Sopenharmony_ci } 139762306a36Sopenharmony_ci} 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_ci/* Display a part of the tree starting at current node (single/split view) */ 140062306a36Sopenharmony_cistatic void display_tree_part(void) 140162306a36Sopenharmony_ci{ 140262306a36Sopenharmony_ci if (tree2) 140362306a36Sopenharmony_ci gtk_tree_store_clear(tree2); 140462306a36Sopenharmony_ci if (view_mode == SINGLE_VIEW) 140562306a36Sopenharmony_ci display_tree(current); 140662306a36Sopenharmony_ci else if (view_mode == SPLIT_VIEW) 140762306a36Sopenharmony_ci display_tree(browsed); 140862306a36Sopenharmony_ci gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); 140962306a36Sopenharmony_ci} 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci/* Display the list in the left frame (split view) */ 141262306a36Sopenharmony_cistatic void display_list(void) 141362306a36Sopenharmony_ci{ 141462306a36Sopenharmony_ci if (tree1) 141562306a36Sopenharmony_ci gtk_tree_store_clear(tree1); 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_ci tree = tree1; 141862306a36Sopenharmony_ci display_tree(&rootmenu); 141962306a36Sopenharmony_ci gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w)); 142062306a36Sopenharmony_ci tree = tree2; 142162306a36Sopenharmony_ci} 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_cistatic void fixup_rootmenu(struct menu *menu) 142462306a36Sopenharmony_ci{ 142562306a36Sopenharmony_ci struct menu *child; 142662306a36Sopenharmony_ci static int menu_cnt = 0; 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci menu->flags |= MENU_ROOT; 142962306a36Sopenharmony_ci for (child = menu->list; child; child = child->next) { 143062306a36Sopenharmony_ci if (child->prompt && child->prompt->type == P_MENU) { 143162306a36Sopenharmony_ci menu_cnt++; 143262306a36Sopenharmony_ci fixup_rootmenu(child); 143362306a36Sopenharmony_ci menu_cnt--; 143462306a36Sopenharmony_ci } else if (!menu_cnt) 143562306a36Sopenharmony_ci fixup_rootmenu(child); 143662306a36Sopenharmony_ci } 143762306a36Sopenharmony_ci} 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_ci/* Main */ 144162306a36Sopenharmony_ciint main(int ac, char *av[]) 144262306a36Sopenharmony_ci{ 144362306a36Sopenharmony_ci const char *name; 144462306a36Sopenharmony_ci char *env; 144562306a36Sopenharmony_ci gchar *glade_file; 144662306a36Sopenharmony_ci 144762306a36Sopenharmony_ci /* GTK stuffs */ 144862306a36Sopenharmony_ci gtk_set_locale(); 144962306a36Sopenharmony_ci gtk_init(&ac, &av); 145062306a36Sopenharmony_ci glade_init(); 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci /* Determine GUI path */ 145362306a36Sopenharmony_ci env = getenv(SRCTREE); 145462306a36Sopenharmony_ci if (env) 145562306a36Sopenharmony_ci glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL); 145662306a36Sopenharmony_ci else if (av[0][0] == '/') 145762306a36Sopenharmony_ci glade_file = g_strconcat(av[0], ".glade", NULL); 145862306a36Sopenharmony_ci else 145962306a36Sopenharmony_ci glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL); 146062306a36Sopenharmony_ci 146162306a36Sopenharmony_ci /* Conf stuffs */ 146262306a36Sopenharmony_ci if (ac > 1 && av[1][0] == '-') { 146362306a36Sopenharmony_ci switch (av[1][1]) { 146462306a36Sopenharmony_ci case 'a': 146562306a36Sopenharmony_ci //showAll = 1; 146662306a36Sopenharmony_ci break; 146762306a36Sopenharmony_ci case 's': 146862306a36Sopenharmony_ci conf_set_message_callback(NULL); 146962306a36Sopenharmony_ci break; 147062306a36Sopenharmony_ci case 'h': 147162306a36Sopenharmony_ci case '?': 147262306a36Sopenharmony_ci printf("%s [-s] <config>\n", av[0]); 147362306a36Sopenharmony_ci exit(0); 147462306a36Sopenharmony_ci } 147562306a36Sopenharmony_ci name = av[2]; 147662306a36Sopenharmony_ci } else 147762306a36Sopenharmony_ci name = av[1]; 147862306a36Sopenharmony_ci 147962306a36Sopenharmony_ci conf_parse(name); 148062306a36Sopenharmony_ci fixup_rootmenu(&rootmenu); 148162306a36Sopenharmony_ci conf_read(NULL); 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci /* Load the interface and connect signals */ 148462306a36Sopenharmony_ci init_main_window(glade_file); 148562306a36Sopenharmony_ci init_tree_model(); 148662306a36Sopenharmony_ci init_left_tree(); 148762306a36Sopenharmony_ci init_right_tree(); 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ci switch (view_mode) { 149062306a36Sopenharmony_ci case SINGLE_VIEW: 149162306a36Sopenharmony_ci display_tree_part(); 149262306a36Sopenharmony_ci break; 149362306a36Sopenharmony_ci case SPLIT_VIEW: 149462306a36Sopenharmony_ci display_list(); 149562306a36Sopenharmony_ci break; 149662306a36Sopenharmony_ci case FULL_VIEW: 149762306a36Sopenharmony_ci display_tree(&rootmenu); 149862306a36Sopenharmony_ci break; 149962306a36Sopenharmony_ci } 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ci gtk_main(); 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci return 0; 150462306a36Sopenharmony_ci} 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_cistatic void conf_changed(void) 150762306a36Sopenharmony_ci{ 150862306a36Sopenharmony_ci bool changed = conf_get_changed(); 150962306a36Sopenharmony_ci gtk_widget_set_sensitive(save_btn, changed); 151062306a36Sopenharmony_ci gtk_widget_set_sensitive(save_menu_item, changed); 151162306a36Sopenharmony_ci} 1512