10a9064fbSMasahiro Yamada /* Hey EMACS -*- linux-c -*- */
20a9064fbSMasahiro Yamada /*
30a9064fbSMasahiro Yamada *
40a9064fbSMasahiro Yamada * Copyright (C) 2002-2003 Romain Lievin <roms@tilp.info>
50a9064fbSMasahiro Yamada * Released under the terms of the GNU GPL v2.0.
60a9064fbSMasahiro Yamada *
70a9064fbSMasahiro Yamada */
80a9064fbSMasahiro Yamada
90a9064fbSMasahiro Yamada #ifdef HAVE_CONFIG_H
100a9064fbSMasahiro Yamada # include <config.h>
110a9064fbSMasahiro Yamada #endif
120a9064fbSMasahiro Yamada
130a9064fbSMasahiro Yamada #include <stdlib.h>
140a9064fbSMasahiro Yamada #include "lkc.h"
150a9064fbSMasahiro Yamada #include "images.c"
160a9064fbSMasahiro Yamada
170a9064fbSMasahiro Yamada #include <glade/glade.h>
180a9064fbSMasahiro Yamada #include <gtk/gtk.h>
190a9064fbSMasahiro Yamada #include <glib.h>
200a9064fbSMasahiro Yamada #include <gdk/gdkkeysyms.h>
210a9064fbSMasahiro Yamada
220a9064fbSMasahiro Yamada #include <stdio.h>
230a9064fbSMasahiro Yamada #include <string.h>
240a9064fbSMasahiro Yamada #include <unistd.h>
250a9064fbSMasahiro Yamada #include <time.h>
260a9064fbSMasahiro Yamada
270a9064fbSMasahiro Yamada //#define DEBUG
280a9064fbSMasahiro Yamada
290a9064fbSMasahiro Yamada enum {
300a9064fbSMasahiro Yamada SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
310a9064fbSMasahiro Yamada };
320a9064fbSMasahiro Yamada
330a9064fbSMasahiro Yamada enum {
340a9064fbSMasahiro Yamada OPT_NORMAL, OPT_ALL, OPT_PROMPT
350a9064fbSMasahiro Yamada };
360a9064fbSMasahiro Yamada
370a9064fbSMasahiro Yamada static gint view_mode = FULL_VIEW;
380a9064fbSMasahiro Yamada static gboolean show_name = TRUE;
390a9064fbSMasahiro Yamada static gboolean show_range = TRUE;
400a9064fbSMasahiro Yamada static gboolean show_value = TRUE;
410a9064fbSMasahiro Yamada static gboolean resizeable = FALSE;
420a9064fbSMasahiro Yamada static int opt_mode = OPT_NORMAL;
430a9064fbSMasahiro Yamada
440a9064fbSMasahiro Yamada GtkWidget *main_wnd = NULL;
450a9064fbSMasahiro Yamada GtkWidget *tree1_w = NULL; // left frame
460a9064fbSMasahiro Yamada GtkWidget *tree2_w = NULL; // right frame
470a9064fbSMasahiro Yamada GtkWidget *text_w = NULL;
480a9064fbSMasahiro Yamada GtkWidget *hpaned = NULL;
490a9064fbSMasahiro Yamada GtkWidget *vpaned = NULL;
500a9064fbSMasahiro Yamada GtkWidget *back_btn = NULL;
510a9064fbSMasahiro Yamada GtkWidget *save_btn = NULL;
520a9064fbSMasahiro Yamada GtkWidget *save_menu_item = NULL;
530a9064fbSMasahiro Yamada
540a9064fbSMasahiro Yamada GtkTextTag *tag1, *tag2;
550a9064fbSMasahiro Yamada GdkColor color;
560a9064fbSMasahiro Yamada
570a9064fbSMasahiro Yamada GtkTreeStore *tree1, *tree2, *tree;
580a9064fbSMasahiro Yamada GtkTreeModel *model1, *model2;
590a9064fbSMasahiro Yamada static GtkTreeIter *parents[256];
600a9064fbSMasahiro Yamada static gint indent;
610a9064fbSMasahiro Yamada
620a9064fbSMasahiro Yamada static struct menu *current; // current node for SINGLE view
630a9064fbSMasahiro Yamada static struct menu *browsed; // browsed node for SPLIT view
640a9064fbSMasahiro Yamada
650a9064fbSMasahiro Yamada enum {
660a9064fbSMasahiro Yamada COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE,
670a9064fbSMasahiro Yamada COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF,
680a9064fbSMasahiro Yamada COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD,
690a9064fbSMasahiro Yamada COL_NUMBER
700a9064fbSMasahiro Yamada };
710a9064fbSMasahiro Yamada
720a9064fbSMasahiro Yamada static void display_list(void);
730a9064fbSMasahiro Yamada static void display_tree(struct menu *menu);
740a9064fbSMasahiro Yamada static void display_tree_part(void);
750a9064fbSMasahiro Yamada static void update_tree(struct menu *src, GtkTreeIter * dst);
760a9064fbSMasahiro Yamada static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row);
770a9064fbSMasahiro Yamada static gchar **fill_row(struct menu *menu);
780a9064fbSMasahiro Yamada static void conf_changed(void);
790a9064fbSMasahiro Yamada
800a9064fbSMasahiro Yamada /* Helping/Debugging Functions */
810a9064fbSMasahiro Yamada
dbg_sym_flags(int val)820a9064fbSMasahiro Yamada const char *dbg_sym_flags(int val)
830a9064fbSMasahiro Yamada {
840a9064fbSMasahiro Yamada static char buf[256];
850a9064fbSMasahiro Yamada
860a9064fbSMasahiro Yamada bzero(buf, 256);
870a9064fbSMasahiro Yamada
880a9064fbSMasahiro Yamada if (val & SYMBOL_CONST)
890a9064fbSMasahiro Yamada strcat(buf, "const/");
900a9064fbSMasahiro Yamada if (val & SYMBOL_CHECK)
910a9064fbSMasahiro Yamada strcat(buf, "check/");
920a9064fbSMasahiro Yamada if (val & SYMBOL_CHOICE)
930a9064fbSMasahiro Yamada strcat(buf, "choice/");
940a9064fbSMasahiro Yamada if (val & SYMBOL_CHOICEVAL)
950a9064fbSMasahiro Yamada strcat(buf, "choiceval/");
960a9064fbSMasahiro Yamada if (val & SYMBOL_VALID)
970a9064fbSMasahiro Yamada strcat(buf, "valid/");
980a9064fbSMasahiro Yamada if (val & SYMBOL_OPTIONAL)
990a9064fbSMasahiro Yamada strcat(buf, "optional/");
1000a9064fbSMasahiro Yamada if (val & SYMBOL_WRITE)
1010a9064fbSMasahiro Yamada strcat(buf, "write/");
1020a9064fbSMasahiro Yamada if (val & SYMBOL_CHANGED)
1030a9064fbSMasahiro Yamada strcat(buf, "changed/");
1040a9064fbSMasahiro Yamada if (val & SYMBOL_AUTO)
1050a9064fbSMasahiro Yamada strcat(buf, "auto/");
1060a9064fbSMasahiro Yamada
1070a9064fbSMasahiro Yamada buf[strlen(buf) - 1] = '\0';
1080a9064fbSMasahiro Yamada
1090a9064fbSMasahiro Yamada return buf;
1100a9064fbSMasahiro Yamada }
1110a9064fbSMasahiro Yamada
replace_button_icon(GladeXML * xml,GdkDrawable * window,GtkStyle * style,gchar * btn_name,gchar ** xpm)1120a9064fbSMasahiro Yamada void replace_button_icon(GladeXML * xml, GdkDrawable * window,
1130a9064fbSMasahiro Yamada GtkStyle * style, gchar * btn_name, gchar ** xpm)
1140a9064fbSMasahiro Yamada {
1150a9064fbSMasahiro Yamada GdkPixmap *pixmap;
1160a9064fbSMasahiro Yamada GdkBitmap *mask;
1170a9064fbSMasahiro Yamada GtkToolButton *button;
1180a9064fbSMasahiro Yamada GtkWidget *image;
1190a9064fbSMasahiro Yamada
1200a9064fbSMasahiro Yamada pixmap = gdk_pixmap_create_from_xpm_d(window, &mask,
1210a9064fbSMasahiro Yamada &style->bg[GTK_STATE_NORMAL],
1220a9064fbSMasahiro Yamada xpm);
1230a9064fbSMasahiro Yamada
1240a9064fbSMasahiro Yamada button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name));
1250a9064fbSMasahiro Yamada image = gtk_image_new_from_pixmap(pixmap, mask);
1260a9064fbSMasahiro Yamada gtk_widget_show(image);
1270a9064fbSMasahiro Yamada gtk_tool_button_set_icon_widget(button, image);
1280a9064fbSMasahiro Yamada }
1290a9064fbSMasahiro Yamada
1300a9064fbSMasahiro Yamada /* Main Window Initialization */
init_main_window(const gchar * glade_file)1310a9064fbSMasahiro Yamada void init_main_window(const gchar * glade_file)
1320a9064fbSMasahiro Yamada {
1330a9064fbSMasahiro Yamada GladeXML *xml;
1340a9064fbSMasahiro Yamada GtkWidget *widget;
1350a9064fbSMasahiro Yamada GtkTextBuffer *txtbuf;
1360a9064fbSMasahiro Yamada GtkStyle *style;
1370a9064fbSMasahiro Yamada
1380a9064fbSMasahiro Yamada xml = glade_xml_new(glade_file, "window1", NULL);
1390a9064fbSMasahiro Yamada if (!xml)
1400a9064fbSMasahiro Yamada g_error(_("GUI loading failed !\n"));
1410a9064fbSMasahiro Yamada glade_xml_signal_autoconnect(xml);
1420a9064fbSMasahiro Yamada
1430a9064fbSMasahiro Yamada main_wnd = glade_xml_get_widget(xml, "window1");
1440a9064fbSMasahiro Yamada hpaned = glade_xml_get_widget(xml, "hpaned1");
1450a9064fbSMasahiro Yamada vpaned = glade_xml_get_widget(xml, "vpaned1");
1460a9064fbSMasahiro Yamada tree1_w = glade_xml_get_widget(xml, "treeview1");
1470a9064fbSMasahiro Yamada tree2_w = glade_xml_get_widget(xml, "treeview2");
1480a9064fbSMasahiro Yamada text_w = glade_xml_get_widget(xml, "textview3");
1490a9064fbSMasahiro Yamada
1500a9064fbSMasahiro Yamada back_btn = glade_xml_get_widget(xml, "button1");
1510a9064fbSMasahiro Yamada gtk_widget_set_sensitive(back_btn, FALSE);
1520a9064fbSMasahiro Yamada
1530a9064fbSMasahiro Yamada widget = glade_xml_get_widget(xml, "show_name1");
1540a9064fbSMasahiro Yamada gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
1550a9064fbSMasahiro Yamada show_name);
1560a9064fbSMasahiro Yamada
1570a9064fbSMasahiro Yamada widget = glade_xml_get_widget(xml, "show_range1");
1580a9064fbSMasahiro Yamada gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
1590a9064fbSMasahiro Yamada show_range);
1600a9064fbSMasahiro Yamada
1610a9064fbSMasahiro Yamada widget = glade_xml_get_widget(xml, "show_data1");
1620a9064fbSMasahiro Yamada gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget,
1630a9064fbSMasahiro Yamada show_value);
1640a9064fbSMasahiro Yamada
1650a9064fbSMasahiro Yamada save_btn = glade_xml_get_widget(xml, "button3");
1660a9064fbSMasahiro Yamada save_menu_item = glade_xml_get_widget(xml, "save1");
1670a9064fbSMasahiro Yamada conf_set_changed_callback(conf_changed);
1680a9064fbSMasahiro Yamada
1690a9064fbSMasahiro Yamada style = gtk_widget_get_style(main_wnd);
1700a9064fbSMasahiro Yamada widget = glade_xml_get_widget(xml, "toolbar1");
1710a9064fbSMasahiro Yamada
1720a9064fbSMasahiro Yamada replace_button_icon(xml, main_wnd->window, style,
1730a9064fbSMasahiro Yamada "button4", (gchar **) xpm_single_view);
1740a9064fbSMasahiro Yamada replace_button_icon(xml, main_wnd->window, style,
1750a9064fbSMasahiro Yamada "button5", (gchar **) xpm_split_view);
1760a9064fbSMasahiro Yamada replace_button_icon(xml, main_wnd->window, style,
1770a9064fbSMasahiro Yamada "button6", (gchar **) xpm_tree_view);
1780a9064fbSMasahiro Yamada
1790a9064fbSMasahiro Yamada txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
1800a9064fbSMasahiro Yamada tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1",
1810a9064fbSMasahiro Yamada "foreground", "red",
1820a9064fbSMasahiro Yamada "weight", PANGO_WEIGHT_BOLD,
1830a9064fbSMasahiro Yamada NULL);
1840a9064fbSMasahiro Yamada tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2",
1850a9064fbSMasahiro Yamada /*"style", PANGO_STYLE_OBLIQUE, */
1860a9064fbSMasahiro Yamada NULL);
1870a9064fbSMasahiro Yamada
1880a9064fbSMasahiro Yamada gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text);
1890a9064fbSMasahiro Yamada
1900a9064fbSMasahiro Yamada gtk_widget_show(main_wnd);
1910a9064fbSMasahiro Yamada }
1920a9064fbSMasahiro Yamada
init_tree_model(void)1930a9064fbSMasahiro Yamada void init_tree_model(void)
1940a9064fbSMasahiro Yamada {
1950a9064fbSMasahiro Yamada gint i;
1960a9064fbSMasahiro Yamada
1970a9064fbSMasahiro Yamada tree = tree2 = gtk_tree_store_new(COL_NUMBER,
1980a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
1990a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
2000a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
2010a9064fbSMasahiro Yamada G_TYPE_POINTER, GDK_TYPE_COLOR,
2020a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
2030a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
2040a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
2050a9064fbSMasahiro Yamada G_TYPE_BOOLEAN);
2060a9064fbSMasahiro Yamada model2 = GTK_TREE_MODEL(tree2);
2070a9064fbSMasahiro Yamada
2080a9064fbSMasahiro Yamada for (parents[0] = NULL, i = 1; i < 256; i++)
2090a9064fbSMasahiro Yamada parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter));
2100a9064fbSMasahiro Yamada
2110a9064fbSMasahiro Yamada tree1 = gtk_tree_store_new(COL_NUMBER,
2120a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
2130a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
2140a9064fbSMasahiro Yamada G_TYPE_STRING, G_TYPE_STRING,
2150a9064fbSMasahiro Yamada G_TYPE_POINTER, GDK_TYPE_COLOR,
2160a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
2170a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
2180a9064fbSMasahiro Yamada G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
2190a9064fbSMasahiro Yamada G_TYPE_BOOLEAN);
2200a9064fbSMasahiro Yamada model1 = GTK_TREE_MODEL(tree1);
2210a9064fbSMasahiro Yamada }
2220a9064fbSMasahiro Yamada
init_left_tree(void)2230a9064fbSMasahiro Yamada void init_left_tree(void)
2240a9064fbSMasahiro Yamada {
2250a9064fbSMasahiro Yamada GtkTreeView *view = GTK_TREE_VIEW(tree1_w);
2260a9064fbSMasahiro Yamada GtkCellRenderer *renderer;
2270a9064fbSMasahiro Yamada GtkTreeSelection *sel;
2280a9064fbSMasahiro Yamada GtkTreeViewColumn *column;
2290a9064fbSMasahiro Yamada
2300a9064fbSMasahiro Yamada gtk_tree_view_set_model(view, model1);
2310a9064fbSMasahiro Yamada gtk_tree_view_set_headers_visible(view, TRUE);
2320a9064fbSMasahiro Yamada gtk_tree_view_set_rules_hint(view, TRUE);
2330a9064fbSMasahiro Yamada
2340a9064fbSMasahiro Yamada column = gtk_tree_view_column_new();
2350a9064fbSMasahiro Yamada gtk_tree_view_append_column(view, column);
2360a9064fbSMasahiro Yamada gtk_tree_view_column_set_title(column, _("Options"));
2370a9064fbSMasahiro Yamada
2380a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_toggle_new();
2390a9064fbSMasahiro Yamada gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
2400a9064fbSMasahiro Yamada renderer, FALSE);
2410a9064fbSMasahiro Yamada gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
2420a9064fbSMasahiro Yamada renderer,
2430a9064fbSMasahiro Yamada "active", COL_BTNACT,
2440a9064fbSMasahiro Yamada "inconsistent", COL_BTNINC,
2450a9064fbSMasahiro Yamada "visible", COL_BTNVIS,
2460a9064fbSMasahiro Yamada "radio", COL_BTNRAD, NULL);
2470a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
2480a9064fbSMasahiro Yamada gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
2490a9064fbSMasahiro Yamada renderer, FALSE);
2500a9064fbSMasahiro Yamada gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
2510a9064fbSMasahiro Yamada renderer,
2520a9064fbSMasahiro Yamada "text", COL_OPTION,
2530a9064fbSMasahiro Yamada "foreground-gdk",
2540a9064fbSMasahiro Yamada COL_COLOR, NULL);
2550a9064fbSMasahiro Yamada
2560a9064fbSMasahiro Yamada sel = gtk_tree_view_get_selection(view);
2570a9064fbSMasahiro Yamada gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
2580a9064fbSMasahiro Yamada gtk_widget_realize(tree1_w);
2590a9064fbSMasahiro Yamada }
2600a9064fbSMasahiro Yamada
2610a9064fbSMasahiro Yamada static void renderer_edited(GtkCellRendererText * cell,
2620a9064fbSMasahiro Yamada const gchar * path_string,
2630a9064fbSMasahiro Yamada const gchar * new_text, gpointer user_data);
2640a9064fbSMasahiro Yamada
init_right_tree(void)2650a9064fbSMasahiro Yamada void init_right_tree(void)
2660a9064fbSMasahiro Yamada {
2670a9064fbSMasahiro Yamada GtkTreeView *view = GTK_TREE_VIEW(tree2_w);
2680a9064fbSMasahiro Yamada GtkCellRenderer *renderer;
2690a9064fbSMasahiro Yamada GtkTreeSelection *sel;
2700a9064fbSMasahiro Yamada GtkTreeViewColumn *column;
2710a9064fbSMasahiro Yamada gint i;
2720a9064fbSMasahiro Yamada
2730a9064fbSMasahiro Yamada gtk_tree_view_set_model(view, model2);
2740a9064fbSMasahiro Yamada gtk_tree_view_set_headers_visible(view, TRUE);
2750a9064fbSMasahiro Yamada gtk_tree_view_set_rules_hint(view, TRUE);
2760a9064fbSMasahiro Yamada
2770a9064fbSMasahiro Yamada column = gtk_tree_view_column_new();
2780a9064fbSMasahiro Yamada gtk_tree_view_append_column(view, column);
2790a9064fbSMasahiro Yamada gtk_tree_view_column_set_title(column, _("Options"));
2800a9064fbSMasahiro Yamada
2810a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_pixbuf_new();
2820a9064fbSMasahiro Yamada gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
2830a9064fbSMasahiro Yamada renderer, FALSE);
2840a9064fbSMasahiro Yamada gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
2850a9064fbSMasahiro Yamada renderer,
2860a9064fbSMasahiro Yamada "pixbuf", COL_PIXBUF,
2870a9064fbSMasahiro Yamada "visible", COL_PIXVIS, NULL);
2880a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_toggle_new();
2890a9064fbSMasahiro Yamada gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
2900a9064fbSMasahiro Yamada renderer, FALSE);
2910a9064fbSMasahiro Yamada gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
2920a9064fbSMasahiro Yamada renderer,
2930a9064fbSMasahiro Yamada "active", COL_BTNACT,
2940a9064fbSMasahiro Yamada "inconsistent", COL_BTNINC,
2950a9064fbSMasahiro Yamada "visible", COL_BTNVIS,
2960a9064fbSMasahiro Yamada "radio", COL_BTNRAD, NULL);
2970a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
2980a9064fbSMasahiro Yamada gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
2990a9064fbSMasahiro Yamada renderer, FALSE);
3000a9064fbSMasahiro Yamada gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column),
3010a9064fbSMasahiro Yamada renderer,
3020a9064fbSMasahiro Yamada "text", COL_OPTION,
3030a9064fbSMasahiro Yamada "foreground-gdk",
3040a9064fbSMasahiro Yamada COL_COLOR, NULL);
3050a9064fbSMasahiro Yamada
3060a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
3070a9064fbSMasahiro Yamada gtk_tree_view_insert_column_with_attributes(view, -1,
3080a9064fbSMasahiro Yamada _("Name"), renderer,
3090a9064fbSMasahiro Yamada "text", COL_NAME,
3100a9064fbSMasahiro Yamada "foreground-gdk",
3110a9064fbSMasahiro Yamada COL_COLOR, NULL);
3120a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
3130a9064fbSMasahiro Yamada gtk_tree_view_insert_column_with_attributes(view, -1,
3140a9064fbSMasahiro Yamada "N", renderer,
3150a9064fbSMasahiro Yamada "text", COL_NO,
3160a9064fbSMasahiro Yamada "foreground-gdk",
3170a9064fbSMasahiro Yamada COL_COLOR, NULL);
3180a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
3190a9064fbSMasahiro Yamada gtk_tree_view_insert_column_with_attributes(view, -1,
3200a9064fbSMasahiro Yamada "M", renderer,
3210a9064fbSMasahiro Yamada "text", COL_MOD,
3220a9064fbSMasahiro Yamada "foreground-gdk",
3230a9064fbSMasahiro Yamada COL_COLOR, NULL);
3240a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
3250a9064fbSMasahiro Yamada gtk_tree_view_insert_column_with_attributes(view, -1,
3260a9064fbSMasahiro Yamada "Y", renderer,
3270a9064fbSMasahiro Yamada "text", COL_YES,
3280a9064fbSMasahiro Yamada "foreground-gdk",
3290a9064fbSMasahiro Yamada COL_COLOR, NULL);
3300a9064fbSMasahiro Yamada renderer = gtk_cell_renderer_text_new();
3310a9064fbSMasahiro Yamada gtk_tree_view_insert_column_with_attributes(view, -1,
3320a9064fbSMasahiro Yamada _("Value"), renderer,
3330a9064fbSMasahiro Yamada "text", COL_VALUE,
3340a9064fbSMasahiro Yamada "editable",
3350a9064fbSMasahiro Yamada COL_EDIT,
3360a9064fbSMasahiro Yamada "foreground-gdk",
3370a9064fbSMasahiro Yamada COL_COLOR, NULL);
3380a9064fbSMasahiro Yamada g_signal_connect(G_OBJECT(renderer), "edited",
3390a9064fbSMasahiro Yamada G_CALLBACK(renderer_edited), NULL);
3400a9064fbSMasahiro Yamada
3410a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, COL_NAME);
3420a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(column, show_name);
3430a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, COL_NO);
3440a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(column, show_range);
3450a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, COL_MOD);
3460a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(column, show_range);
3470a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, COL_YES);
3480a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(column, show_range);
3490a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, COL_VALUE);
3500a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(column, show_value);
3510a9064fbSMasahiro Yamada
3520a9064fbSMasahiro Yamada if (resizeable) {
3530a9064fbSMasahiro Yamada for (i = 0; i < COL_VALUE; i++) {
3540a9064fbSMasahiro Yamada column = gtk_tree_view_get_column(view, i);
3550a9064fbSMasahiro Yamada gtk_tree_view_column_set_resizable(column, TRUE);
3560a9064fbSMasahiro Yamada }
3570a9064fbSMasahiro Yamada }
3580a9064fbSMasahiro Yamada
3590a9064fbSMasahiro Yamada sel = gtk_tree_view_get_selection(view);
3600a9064fbSMasahiro Yamada gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
3610a9064fbSMasahiro Yamada }
3620a9064fbSMasahiro Yamada
3630a9064fbSMasahiro Yamada
3640a9064fbSMasahiro Yamada /* Utility Functions */
3650a9064fbSMasahiro Yamada
3660a9064fbSMasahiro Yamada
text_insert_help(struct menu * menu)3670a9064fbSMasahiro Yamada static void text_insert_help(struct menu *menu)
3680a9064fbSMasahiro Yamada {
3690a9064fbSMasahiro Yamada GtkTextBuffer *buffer;
3700a9064fbSMasahiro Yamada GtkTextIter start, end;
3710a9064fbSMasahiro Yamada const char *prompt = _(menu_get_prompt(menu));
3720a9064fbSMasahiro Yamada struct gstr help = str_new();
3730a9064fbSMasahiro Yamada
3740a9064fbSMasahiro Yamada menu_get_ext_help(menu, &help);
3750a9064fbSMasahiro Yamada
3760a9064fbSMasahiro Yamada buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
3770a9064fbSMasahiro Yamada gtk_text_buffer_get_bounds(buffer, &start, &end);
3780a9064fbSMasahiro Yamada gtk_text_buffer_delete(buffer, &start, &end);
3790a9064fbSMasahiro Yamada gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15);
3800a9064fbSMasahiro Yamada
3810a9064fbSMasahiro Yamada gtk_text_buffer_get_end_iter(buffer, &end);
3820a9064fbSMasahiro Yamada gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
3830a9064fbSMasahiro Yamada NULL);
3840a9064fbSMasahiro Yamada gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
3850a9064fbSMasahiro Yamada gtk_text_buffer_get_end_iter(buffer, &end);
3860a9064fbSMasahiro Yamada gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
3870a9064fbSMasahiro Yamada NULL);
3880a9064fbSMasahiro Yamada str_free(&help);
3890a9064fbSMasahiro Yamada }
3900a9064fbSMasahiro Yamada
3910a9064fbSMasahiro Yamada
text_insert_msg(const char * title,const char * message)3920a9064fbSMasahiro Yamada static void text_insert_msg(const char *title, const char *message)
3930a9064fbSMasahiro Yamada {
3940a9064fbSMasahiro Yamada GtkTextBuffer *buffer;
3950a9064fbSMasahiro Yamada GtkTextIter start, end;
3960a9064fbSMasahiro Yamada const char *msg = message;
3970a9064fbSMasahiro Yamada
3980a9064fbSMasahiro Yamada buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
3990a9064fbSMasahiro Yamada gtk_text_buffer_get_bounds(buffer, &start, &end);
4000a9064fbSMasahiro Yamada gtk_text_buffer_delete(buffer, &start, &end);
4010a9064fbSMasahiro Yamada gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15);
4020a9064fbSMasahiro Yamada
4030a9064fbSMasahiro Yamada gtk_text_buffer_get_end_iter(buffer, &end);
4040a9064fbSMasahiro Yamada gtk_text_buffer_insert_with_tags(buffer, &end, title, -1, tag1,
4050a9064fbSMasahiro Yamada NULL);
4060a9064fbSMasahiro Yamada gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
4070a9064fbSMasahiro Yamada gtk_text_buffer_get_end_iter(buffer, &end);
4080a9064fbSMasahiro Yamada gtk_text_buffer_insert_with_tags(buffer, &end, msg, -1, tag2,
4090a9064fbSMasahiro Yamada NULL);
4100a9064fbSMasahiro Yamada }
4110a9064fbSMasahiro Yamada
4120a9064fbSMasahiro Yamada
4130a9064fbSMasahiro Yamada /* Main Windows Callbacks */
4140a9064fbSMasahiro Yamada
4150a9064fbSMasahiro Yamada void on_save_activate(GtkMenuItem * menuitem, gpointer user_data);
on_window1_delete_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)4160a9064fbSMasahiro Yamada gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event,
4170a9064fbSMasahiro Yamada gpointer user_data)
4180a9064fbSMasahiro Yamada {
4190a9064fbSMasahiro Yamada GtkWidget *dialog, *label;
4200a9064fbSMasahiro Yamada gint result;
4210a9064fbSMasahiro Yamada
4220a9064fbSMasahiro Yamada if (!conf_get_changed())
4230a9064fbSMasahiro Yamada return FALSE;
4240a9064fbSMasahiro Yamada
4250a9064fbSMasahiro Yamada dialog = gtk_dialog_new_with_buttons(_("Warning !"),
4260a9064fbSMasahiro Yamada GTK_WINDOW(main_wnd),
4270a9064fbSMasahiro Yamada (GtkDialogFlags)
4280a9064fbSMasahiro Yamada (GTK_DIALOG_MODAL |
4290a9064fbSMasahiro Yamada GTK_DIALOG_DESTROY_WITH_PARENT),
4300a9064fbSMasahiro Yamada GTK_STOCK_OK,
4310a9064fbSMasahiro Yamada GTK_RESPONSE_YES,
4320a9064fbSMasahiro Yamada GTK_STOCK_NO,
4330a9064fbSMasahiro Yamada GTK_RESPONSE_NO,
4340a9064fbSMasahiro Yamada GTK_STOCK_CANCEL,
4350a9064fbSMasahiro Yamada GTK_RESPONSE_CANCEL, NULL);
4360a9064fbSMasahiro Yamada gtk_dialog_set_default_response(GTK_DIALOG(dialog),
4370a9064fbSMasahiro Yamada GTK_RESPONSE_CANCEL);
4380a9064fbSMasahiro Yamada
4390a9064fbSMasahiro Yamada label = gtk_label_new(_("\nSave configuration ?\n"));
4400a9064fbSMasahiro Yamada gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
4410a9064fbSMasahiro Yamada gtk_widget_show(label);
4420a9064fbSMasahiro Yamada
4430a9064fbSMasahiro Yamada result = gtk_dialog_run(GTK_DIALOG(dialog));
4440a9064fbSMasahiro Yamada switch (result) {
4450a9064fbSMasahiro Yamada case GTK_RESPONSE_YES:
4460a9064fbSMasahiro Yamada on_save_activate(NULL, NULL);
4470a9064fbSMasahiro Yamada return FALSE;
4480a9064fbSMasahiro Yamada case GTK_RESPONSE_NO:
4490a9064fbSMasahiro Yamada return FALSE;
4500a9064fbSMasahiro Yamada case GTK_RESPONSE_CANCEL:
4510a9064fbSMasahiro Yamada case GTK_RESPONSE_DELETE_EVENT:
4520a9064fbSMasahiro Yamada default:
4530a9064fbSMasahiro Yamada gtk_widget_destroy(dialog);
4540a9064fbSMasahiro Yamada return TRUE;
4550a9064fbSMasahiro Yamada }
4560a9064fbSMasahiro Yamada
4570a9064fbSMasahiro Yamada return FALSE;
4580a9064fbSMasahiro Yamada }
4590a9064fbSMasahiro Yamada
4600a9064fbSMasahiro Yamada
on_window1_destroy(GtkObject * object,gpointer user_data)4610a9064fbSMasahiro Yamada void on_window1_destroy(GtkObject * object, gpointer user_data)
4620a9064fbSMasahiro Yamada {
4630a9064fbSMasahiro Yamada gtk_main_quit();
4640a9064fbSMasahiro Yamada }
4650a9064fbSMasahiro Yamada
4660a9064fbSMasahiro Yamada
4670a9064fbSMasahiro Yamada void
on_window1_size_request(GtkWidget * widget,GtkRequisition * requisition,gpointer user_data)4680a9064fbSMasahiro Yamada on_window1_size_request(GtkWidget * widget,
4690a9064fbSMasahiro Yamada GtkRequisition * requisition, gpointer user_data)
4700a9064fbSMasahiro Yamada {
4710a9064fbSMasahiro Yamada static gint old_h;
4720a9064fbSMasahiro Yamada gint w, h;
4730a9064fbSMasahiro Yamada
4740a9064fbSMasahiro Yamada if (widget->window == NULL)
4750a9064fbSMasahiro Yamada gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h);
4760a9064fbSMasahiro Yamada else
4770a9064fbSMasahiro Yamada gdk_window_get_size(widget->window, &w, &h);
4780a9064fbSMasahiro Yamada
4790a9064fbSMasahiro Yamada if (h == old_h)
4800a9064fbSMasahiro Yamada return;
4810a9064fbSMasahiro Yamada old_h = h;
4820a9064fbSMasahiro Yamada
4830a9064fbSMasahiro Yamada gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3);
4840a9064fbSMasahiro Yamada }
4850a9064fbSMasahiro Yamada
4860a9064fbSMasahiro Yamada
4870a9064fbSMasahiro Yamada /* Menu & Toolbar Callbacks */
4880a9064fbSMasahiro Yamada
4890a9064fbSMasahiro Yamada
4900a9064fbSMasahiro Yamada static void
load_filename(GtkFileSelection * file_selector,gpointer user_data)4910a9064fbSMasahiro Yamada load_filename(GtkFileSelection * file_selector, gpointer user_data)
4920a9064fbSMasahiro Yamada {
4930a9064fbSMasahiro Yamada const gchar *fn;
4940a9064fbSMasahiro Yamada
4950a9064fbSMasahiro Yamada fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION
4960a9064fbSMasahiro Yamada (user_data));
4970a9064fbSMasahiro Yamada
4980a9064fbSMasahiro Yamada if (conf_read(fn))
4990a9064fbSMasahiro Yamada text_insert_msg(_("Error"), _("Unable to load configuration !"));
5000a9064fbSMasahiro Yamada else
5010a9064fbSMasahiro Yamada display_tree(&rootmenu);
5020a9064fbSMasahiro Yamada }
5030a9064fbSMasahiro Yamada
on_load1_activate(GtkMenuItem * menuitem,gpointer user_data)5040a9064fbSMasahiro Yamada void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data)
5050a9064fbSMasahiro Yamada {
5060a9064fbSMasahiro Yamada GtkWidget *fs;
5070a9064fbSMasahiro Yamada
5080a9064fbSMasahiro Yamada fs = gtk_file_selection_new(_("Load file..."));
5090a9064fbSMasahiro Yamada g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
5100a9064fbSMasahiro Yamada "clicked",
5110a9064fbSMasahiro Yamada G_CALLBACK(load_filename), (gpointer) fs);
5120a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT
5130a9064fbSMasahiro Yamada (GTK_FILE_SELECTION(fs)->ok_button),
5140a9064fbSMasahiro Yamada "clicked", G_CALLBACK(gtk_widget_destroy),
5150a9064fbSMasahiro Yamada (gpointer) fs);
5160a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT
5170a9064fbSMasahiro Yamada (GTK_FILE_SELECTION(fs)->cancel_button),
5180a9064fbSMasahiro Yamada "clicked", G_CALLBACK(gtk_widget_destroy),
5190a9064fbSMasahiro Yamada (gpointer) fs);
5200a9064fbSMasahiro Yamada gtk_widget_show(fs);
5210a9064fbSMasahiro Yamada }
5220a9064fbSMasahiro Yamada
5230a9064fbSMasahiro Yamada
on_save_activate(GtkMenuItem * menuitem,gpointer user_data)5240a9064fbSMasahiro Yamada void on_save_activate(GtkMenuItem * menuitem, gpointer user_data)
5250a9064fbSMasahiro Yamada {
5260a9064fbSMasahiro Yamada if (conf_write(NULL))
5270a9064fbSMasahiro Yamada text_insert_msg(_("Error"), _("Unable to save configuration !"));
5280a9064fbSMasahiro Yamada }
5290a9064fbSMasahiro Yamada
5300a9064fbSMasahiro Yamada
5310a9064fbSMasahiro Yamada static void
store_filename(GtkFileSelection * file_selector,gpointer user_data)5320a9064fbSMasahiro Yamada store_filename(GtkFileSelection * file_selector, gpointer user_data)
5330a9064fbSMasahiro Yamada {
5340a9064fbSMasahiro Yamada const gchar *fn;
5350a9064fbSMasahiro Yamada
5360a9064fbSMasahiro Yamada fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION
5370a9064fbSMasahiro Yamada (user_data));
5380a9064fbSMasahiro Yamada
5390a9064fbSMasahiro Yamada if (conf_write(fn))
5400a9064fbSMasahiro Yamada text_insert_msg(_("Error"), _("Unable to save configuration !"));
5410a9064fbSMasahiro Yamada
5420a9064fbSMasahiro Yamada gtk_widget_destroy(GTK_WIDGET(user_data));
5430a9064fbSMasahiro Yamada }
5440a9064fbSMasahiro Yamada
on_save_as1_activate(GtkMenuItem * menuitem,gpointer user_data)5450a9064fbSMasahiro Yamada void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data)
5460a9064fbSMasahiro Yamada {
5470a9064fbSMasahiro Yamada GtkWidget *fs;
5480a9064fbSMasahiro Yamada
5490a9064fbSMasahiro Yamada fs = gtk_file_selection_new(_("Save file as..."));
5500a9064fbSMasahiro Yamada g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button),
5510a9064fbSMasahiro Yamada "clicked",
5520a9064fbSMasahiro Yamada G_CALLBACK(store_filename), (gpointer) fs);
5530a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT
5540a9064fbSMasahiro Yamada (GTK_FILE_SELECTION(fs)->ok_button),
5550a9064fbSMasahiro Yamada "clicked", G_CALLBACK(gtk_widget_destroy),
5560a9064fbSMasahiro Yamada (gpointer) fs);
5570a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT
5580a9064fbSMasahiro Yamada (GTK_FILE_SELECTION(fs)->cancel_button),
5590a9064fbSMasahiro Yamada "clicked", G_CALLBACK(gtk_widget_destroy),
5600a9064fbSMasahiro Yamada (gpointer) fs);
5610a9064fbSMasahiro Yamada gtk_widget_show(fs);
5620a9064fbSMasahiro Yamada }
5630a9064fbSMasahiro Yamada
5640a9064fbSMasahiro Yamada
on_quit1_activate(GtkMenuItem * menuitem,gpointer user_data)5650a9064fbSMasahiro Yamada void on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data)
5660a9064fbSMasahiro Yamada {
5670a9064fbSMasahiro Yamada if (!on_window1_delete_event(NULL, NULL, NULL))
5680a9064fbSMasahiro Yamada gtk_widget_destroy(GTK_WIDGET(main_wnd));
5690a9064fbSMasahiro Yamada }
5700a9064fbSMasahiro Yamada
5710a9064fbSMasahiro Yamada
on_show_name1_activate(GtkMenuItem * menuitem,gpointer user_data)5720a9064fbSMasahiro Yamada void on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data)
5730a9064fbSMasahiro Yamada {
5740a9064fbSMasahiro Yamada GtkTreeViewColumn *col;
5750a9064fbSMasahiro Yamada
5760a9064fbSMasahiro Yamada show_name = GTK_CHECK_MENU_ITEM(menuitem)->active;
5770a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME);
5780a9064fbSMasahiro Yamada if (col)
5790a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(col, show_name);
5800a9064fbSMasahiro Yamada }
5810a9064fbSMasahiro Yamada
5820a9064fbSMasahiro Yamada
on_show_range1_activate(GtkMenuItem * menuitem,gpointer user_data)5830a9064fbSMasahiro Yamada void on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data)
5840a9064fbSMasahiro Yamada {
5850a9064fbSMasahiro Yamada GtkTreeViewColumn *col;
5860a9064fbSMasahiro Yamada
5870a9064fbSMasahiro Yamada show_range = GTK_CHECK_MENU_ITEM(menuitem)->active;
5880a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO);
5890a9064fbSMasahiro Yamada if (col)
5900a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(col, show_range);
5910a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_MOD);
5920a9064fbSMasahiro Yamada if (col)
5930a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(col, show_range);
5940a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_YES);
5950a9064fbSMasahiro Yamada if (col)
5960a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(col, show_range);
5970a9064fbSMasahiro Yamada
5980a9064fbSMasahiro Yamada }
5990a9064fbSMasahiro Yamada
6000a9064fbSMasahiro Yamada
on_show_data1_activate(GtkMenuItem * menuitem,gpointer user_data)6010a9064fbSMasahiro Yamada void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
6020a9064fbSMasahiro Yamada {
6030a9064fbSMasahiro Yamada GtkTreeViewColumn *col;
6040a9064fbSMasahiro Yamada
6050a9064fbSMasahiro Yamada show_value = GTK_CHECK_MENU_ITEM(menuitem)->active;
6060a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE);
6070a9064fbSMasahiro Yamada if (col)
6080a9064fbSMasahiro Yamada gtk_tree_view_column_set_visible(col, show_value);
6090a9064fbSMasahiro Yamada }
6100a9064fbSMasahiro Yamada
6110a9064fbSMasahiro Yamada
6120a9064fbSMasahiro Yamada void
on_set_option_mode1_activate(GtkMenuItem * menuitem,gpointer user_data)6130a9064fbSMasahiro Yamada on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
6140a9064fbSMasahiro Yamada {
6150a9064fbSMasahiro Yamada opt_mode = OPT_NORMAL;
6160a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
6170a9064fbSMasahiro Yamada display_tree(&rootmenu); /* instead of update_tree to speed-up */
6180a9064fbSMasahiro Yamada }
6190a9064fbSMasahiro Yamada
6200a9064fbSMasahiro Yamada
6210a9064fbSMasahiro Yamada void
on_set_option_mode2_activate(GtkMenuItem * menuitem,gpointer user_data)6220a9064fbSMasahiro Yamada on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
6230a9064fbSMasahiro Yamada {
6240a9064fbSMasahiro Yamada opt_mode = OPT_ALL;
6250a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
6260a9064fbSMasahiro Yamada display_tree(&rootmenu); /* instead of update_tree to speed-up */
6270a9064fbSMasahiro Yamada }
6280a9064fbSMasahiro Yamada
6290a9064fbSMasahiro Yamada
6300a9064fbSMasahiro Yamada void
on_set_option_mode3_activate(GtkMenuItem * menuitem,gpointer user_data)6310a9064fbSMasahiro Yamada on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
6320a9064fbSMasahiro Yamada {
6330a9064fbSMasahiro Yamada opt_mode = OPT_PROMPT;
6340a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
6350a9064fbSMasahiro Yamada display_tree(&rootmenu); /* instead of update_tree to speed-up */
6360a9064fbSMasahiro Yamada }
6370a9064fbSMasahiro Yamada
6380a9064fbSMasahiro Yamada
on_introduction1_activate(GtkMenuItem * menuitem,gpointer user_data)6390a9064fbSMasahiro Yamada void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
6400a9064fbSMasahiro Yamada {
6410a9064fbSMasahiro Yamada GtkWidget *dialog;
6420a9064fbSMasahiro Yamada const gchar *intro_text = _(
6430a9064fbSMasahiro Yamada "Welcome to gkc, the GTK+ graphical configuration tool\n"
6440a9064fbSMasahiro Yamada "For each option, a blank box indicates the feature is disabled, a\n"
6450a9064fbSMasahiro Yamada "check indicates it is enabled, and a dot indicates that it is to\n"
6460a9064fbSMasahiro Yamada "be compiled as a module. Clicking on the box will cycle through the three states.\n"
6470a9064fbSMasahiro Yamada "\n"
6480a9064fbSMasahiro Yamada "If you do not see an option (e.g., a device driver) that you\n"
6490a9064fbSMasahiro Yamada "believe should be present, try turning on Show All Options\n"
6500a9064fbSMasahiro Yamada "under the Options menu.\n"
6510a9064fbSMasahiro Yamada "Although there is no cross reference yet to help you figure out\n"
6520a9064fbSMasahiro Yamada "what other options must be enabled to support the option you\n"
6530a9064fbSMasahiro Yamada "are interested in, you can still view the help of a grayed-out\n"
6540a9064fbSMasahiro Yamada "option.\n"
6550a9064fbSMasahiro Yamada "\n"
6560a9064fbSMasahiro Yamada "Toggling Show Debug Info under the Options menu will show \n"
6570a9064fbSMasahiro Yamada "the dependencies, which you can then match by examining other options.");
6580a9064fbSMasahiro Yamada
6590a9064fbSMasahiro Yamada dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
6600a9064fbSMasahiro Yamada GTK_DIALOG_DESTROY_WITH_PARENT,
6610a9064fbSMasahiro Yamada GTK_MESSAGE_INFO,
6620a9064fbSMasahiro Yamada GTK_BUTTONS_CLOSE, "%s", intro_text);
6630a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
6640a9064fbSMasahiro Yamada G_CALLBACK(gtk_widget_destroy),
6650a9064fbSMasahiro Yamada GTK_OBJECT(dialog));
6660a9064fbSMasahiro Yamada gtk_widget_show_all(dialog);
6670a9064fbSMasahiro Yamada }
6680a9064fbSMasahiro Yamada
6690a9064fbSMasahiro Yamada
on_about1_activate(GtkMenuItem * menuitem,gpointer user_data)6700a9064fbSMasahiro Yamada void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data)
6710a9064fbSMasahiro Yamada {
6720a9064fbSMasahiro Yamada GtkWidget *dialog;
6730a9064fbSMasahiro Yamada const gchar *about_text =
6740a9064fbSMasahiro Yamada _("gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n"
6750a9064fbSMasahiro Yamada "Based on the source code from Roman Zippel.\n");
6760a9064fbSMasahiro Yamada
6770a9064fbSMasahiro Yamada dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
6780a9064fbSMasahiro Yamada GTK_DIALOG_DESTROY_WITH_PARENT,
6790a9064fbSMasahiro Yamada GTK_MESSAGE_INFO,
6800a9064fbSMasahiro Yamada GTK_BUTTONS_CLOSE, "%s", about_text);
6810a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
6820a9064fbSMasahiro Yamada G_CALLBACK(gtk_widget_destroy),
6830a9064fbSMasahiro Yamada GTK_OBJECT(dialog));
6840a9064fbSMasahiro Yamada gtk_widget_show_all(dialog);
6850a9064fbSMasahiro Yamada }
6860a9064fbSMasahiro Yamada
6870a9064fbSMasahiro Yamada
on_license1_activate(GtkMenuItem * menuitem,gpointer user_data)6880a9064fbSMasahiro Yamada void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data)
6890a9064fbSMasahiro Yamada {
6900a9064fbSMasahiro Yamada GtkWidget *dialog;
6910a9064fbSMasahiro Yamada const gchar *license_text =
6920a9064fbSMasahiro Yamada _("gkc is released under the terms of the GNU GPL v2.\n"
6930a9064fbSMasahiro Yamada "For more information, please see the source code or\n"
6940a9064fbSMasahiro Yamada "visit http://www.fsf.org/licenses/licenses.html\n");
6950a9064fbSMasahiro Yamada
6960a9064fbSMasahiro Yamada dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd),
6970a9064fbSMasahiro Yamada GTK_DIALOG_DESTROY_WITH_PARENT,
6980a9064fbSMasahiro Yamada GTK_MESSAGE_INFO,
6990a9064fbSMasahiro Yamada GTK_BUTTONS_CLOSE, "%s", license_text);
7000a9064fbSMasahiro Yamada g_signal_connect_swapped(GTK_OBJECT(dialog), "response",
7010a9064fbSMasahiro Yamada G_CALLBACK(gtk_widget_destroy),
7020a9064fbSMasahiro Yamada GTK_OBJECT(dialog));
7030a9064fbSMasahiro Yamada gtk_widget_show_all(dialog);
7040a9064fbSMasahiro Yamada }
7050a9064fbSMasahiro Yamada
7060a9064fbSMasahiro Yamada
on_back_clicked(GtkButton * button,gpointer user_data)7070a9064fbSMasahiro Yamada void on_back_clicked(GtkButton * button, gpointer user_data)
7080a9064fbSMasahiro Yamada {
7090a9064fbSMasahiro Yamada enum prop_type ptype;
7100a9064fbSMasahiro Yamada
7110a9064fbSMasahiro Yamada current = current->parent;
7120a9064fbSMasahiro Yamada ptype = current->prompt ? current->prompt->type : P_UNKNOWN;
7130a9064fbSMasahiro Yamada if (ptype != P_MENU)
7140a9064fbSMasahiro Yamada current = current->parent;
7150a9064fbSMasahiro Yamada display_tree_part();
7160a9064fbSMasahiro Yamada
7170a9064fbSMasahiro Yamada if (current == &rootmenu)
7180a9064fbSMasahiro Yamada gtk_widget_set_sensitive(back_btn, FALSE);
7190a9064fbSMasahiro Yamada }
7200a9064fbSMasahiro Yamada
7210a9064fbSMasahiro Yamada
on_load_clicked(GtkButton * button,gpointer user_data)7220a9064fbSMasahiro Yamada void on_load_clicked(GtkButton * button, gpointer user_data)
7230a9064fbSMasahiro Yamada {
7240a9064fbSMasahiro Yamada on_load1_activate(NULL, user_data);
7250a9064fbSMasahiro Yamada }
7260a9064fbSMasahiro Yamada
7270a9064fbSMasahiro Yamada
on_single_clicked(GtkButton * button,gpointer user_data)7280a9064fbSMasahiro Yamada void on_single_clicked(GtkButton * button, gpointer user_data)
7290a9064fbSMasahiro Yamada {
7300a9064fbSMasahiro Yamada view_mode = SINGLE_VIEW;
7310a9064fbSMasahiro Yamada gtk_widget_hide(tree1_w);
7320a9064fbSMasahiro Yamada current = &rootmenu;
7330a9064fbSMasahiro Yamada display_tree_part();
7340a9064fbSMasahiro Yamada }
7350a9064fbSMasahiro Yamada
7360a9064fbSMasahiro Yamada
on_split_clicked(GtkButton * button,gpointer user_data)7370a9064fbSMasahiro Yamada void on_split_clicked(GtkButton * button, gpointer user_data)
7380a9064fbSMasahiro Yamada {
7390a9064fbSMasahiro Yamada gint w, h;
7400a9064fbSMasahiro Yamada view_mode = SPLIT_VIEW;
7410a9064fbSMasahiro Yamada gtk_widget_show(tree1_w);
7420a9064fbSMasahiro Yamada gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h);
7430a9064fbSMasahiro Yamada gtk_paned_set_position(GTK_PANED(hpaned), w / 2);
7440a9064fbSMasahiro Yamada if (tree2)
7450a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
7460a9064fbSMasahiro Yamada display_list();
7470a9064fbSMasahiro Yamada
7480a9064fbSMasahiro Yamada /* Disable back btn, like in full mode. */
7490a9064fbSMasahiro Yamada gtk_widget_set_sensitive(back_btn, FALSE);
7500a9064fbSMasahiro Yamada }
7510a9064fbSMasahiro Yamada
7520a9064fbSMasahiro Yamada
on_full_clicked(GtkButton * button,gpointer user_data)7530a9064fbSMasahiro Yamada void on_full_clicked(GtkButton * button, gpointer user_data)
7540a9064fbSMasahiro Yamada {
7550a9064fbSMasahiro Yamada view_mode = FULL_VIEW;
7560a9064fbSMasahiro Yamada gtk_widget_hide(tree1_w);
7570a9064fbSMasahiro Yamada if (tree2)
7580a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
7590a9064fbSMasahiro Yamada display_tree(&rootmenu);
7600a9064fbSMasahiro Yamada gtk_widget_set_sensitive(back_btn, FALSE);
7610a9064fbSMasahiro Yamada }
7620a9064fbSMasahiro Yamada
7630a9064fbSMasahiro Yamada
on_collapse_clicked(GtkButton * button,gpointer user_data)7640a9064fbSMasahiro Yamada void on_collapse_clicked(GtkButton * button, gpointer user_data)
7650a9064fbSMasahiro Yamada {
7660a9064fbSMasahiro Yamada gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w));
7670a9064fbSMasahiro Yamada }
7680a9064fbSMasahiro Yamada
7690a9064fbSMasahiro Yamada
on_expand_clicked(GtkButton * button,gpointer user_data)7700a9064fbSMasahiro Yamada void on_expand_clicked(GtkButton * button, gpointer user_data)
7710a9064fbSMasahiro Yamada {
7720a9064fbSMasahiro Yamada gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));
7730a9064fbSMasahiro Yamada }
7740a9064fbSMasahiro Yamada
7750a9064fbSMasahiro Yamada
7760a9064fbSMasahiro Yamada /* CTree Callbacks */
7770a9064fbSMasahiro Yamada
7780a9064fbSMasahiro Yamada /* Change hex/int/string value in the cell */
renderer_edited(GtkCellRendererText * cell,const gchar * path_string,const gchar * new_text,gpointer user_data)7790a9064fbSMasahiro Yamada static void renderer_edited(GtkCellRendererText * cell,
7800a9064fbSMasahiro Yamada const gchar * path_string,
7810a9064fbSMasahiro Yamada const gchar * new_text, gpointer user_data)
7820a9064fbSMasahiro Yamada {
7830a9064fbSMasahiro Yamada GtkTreePath *path = gtk_tree_path_new_from_string(path_string);
7840a9064fbSMasahiro Yamada GtkTreeIter iter;
7850a9064fbSMasahiro Yamada const char *old_def, *new_def;
7860a9064fbSMasahiro Yamada struct menu *menu;
7870a9064fbSMasahiro Yamada struct symbol *sym;
7880a9064fbSMasahiro Yamada
7890a9064fbSMasahiro Yamada if (!gtk_tree_model_get_iter(model2, &iter, path))
7900a9064fbSMasahiro Yamada return;
7910a9064fbSMasahiro Yamada
7920a9064fbSMasahiro Yamada gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
7930a9064fbSMasahiro Yamada sym = menu->sym;
7940a9064fbSMasahiro Yamada
7950a9064fbSMasahiro Yamada gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1);
7960a9064fbSMasahiro Yamada new_def = new_text;
7970a9064fbSMasahiro Yamada
7980a9064fbSMasahiro Yamada sym_set_string_value(sym, new_def);
7990a9064fbSMasahiro Yamada
8000a9064fbSMasahiro Yamada update_tree(&rootmenu, NULL);
8010a9064fbSMasahiro Yamada
8020a9064fbSMasahiro Yamada gtk_tree_path_free(path);
8030a9064fbSMasahiro Yamada }
8040a9064fbSMasahiro Yamada
8050a9064fbSMasahiro Yamada /* Change the value of a symbol and update the tree */
change_sym_value(struct menu * menu,gint col)8060a9064fbSMasahiro Yamada static void change_sym_value(struct menu *menu, gint col)
8070a9064fbSMasahiro Yamada {
8080a9064fbSMasahiro Yamada struct symbol *sym = menu->sym;
8090a9064fbSMasahiro Yamada tristate newval;
8100a9064fbSMasahiro Yamada
8110a9064fbSMasahiro Yamada if (!sym)
8120a9064fbSMasahiro Yamada return;
8130a9064fbSMasahiro Yamada
8140a9064fbSMasahiro Yamada if (col == COL_NO)
8150a9064fbSMasahiro Yamada newval = no;
8160a9064fbSMasahiro Yamada else if (col == COL_MOD)
8170a9064fbSMasahiro Yamada newval = mod;
8180a9064fbSMasahiro Yamada else if (col == COL_YES)
8190a9064fbSMasahiro Yamada newval = yes;
8200a9064fbSMasahiro Yamada else
8210a9064fbSMasahiro Yamada return;
8220a9064fbSMasahiro Yamada
8230a9064fbSMasahiro Yamada switch (sym_get_type(sym)) {
8240a9064fbSMasahiro Yamada case S_BOOLEAN:
8250a9064fbSMasahiro Yamada case S_TRISTATE:
8260a9064fbSMasahiro Yamada if (!sym_tristate_within_range(sym, newval))
8270a9064fbSMasahiro Yamada newval = yes;
8280a9064fbSMasahiro Yamada sym_set_tristate_value(sym, newval);
8290a9064fbSMasahiro Yamada if (view_mode == FULL_VIEW)
8300a9064fbSMasahiro Yamada update_tree(&rootmenu, NULL);
8310a9064fbSMasahiro Yamada else if (view_mode == SPLIT_VIEW) {
8320a9064fbSMasahiro Yamada update_tree(browsed, NULL);
8330a9064fbSMasahiro Yamada display_list();
8340a9064fbSMasahiro Yamada }
8350a9064fbSMasahiro Yamada else if (view_mode == SINGLE_VIEW)
8360a9064fbSMasahiro Yamada display_tree_part(); //fixme: keep exp/coll
8370a9064fbSMasahiro Yamada break;
8380a9064fbSMasahiro Yamada case S_INT:
8390a9064fbSMasahiro Yamada case S_HEX:
8400a9064fbSMasahiro Yamada case S_STRING:
8410a9064fbSMasahiro Yamada default:
8420a9064fbSMasahiro Yamada break;
8430a9064fbSMasahiro Yamada }
8440a9064fbSMasahiro Yamada }
8450a9064fbSMasahiro Yamada
toggle_sym_value(struct menu * menu)8460a9064fbSMasahiro Yamada static void toggle_sym_value(struct menu *menu)
8470a9064fbSMasahiro Yamada {
8480a9064fbSMasahiro Yamada if (!menu->sym)
8490a9064fbSMasahiro Yamada return;
8500a9064fbSMasahiro Yamada
8510a9064fbSMasahiro Yamada sym_toggle_tristate_value(menu->sym);
8520a9064fbSMasahiro Yamada if (view_mode == FULL_VIEW)
8530a9064fbSMasahiro Yamada update_tree(&rootmenu, NULL);
8540a9064fbSMasahiro Yamada else if (view_mode == SPLIT_VIEW) {
8550a9064fbSMasahiro Yamada update_tree(browsed, NULL);
8560a9064fbSMasahiro Yamada display_list();
8570a9064fbSMasahiro Yamada }
8580a9064fbSMasahiro Yamada else if (view_mode == SINGLE_VIEW)
8590a9064fbSMasahiro Yamada display_tree_part(); //fixme: keep exp/coll
8600a9064fbSMasahiro Yamada }
8610a9064fbSMasahiro Yamada
column2index(GtkTreeViewColumn * column)8620a9064fbSMasahiro Yamada static gint column2index(GtkTreeViewColumn * column)
8630a9064fbSMasahiro Yamada {
8640a9064fbSMasahiro Yamada gint i;
8650a9064fbSMasahiro Yamada
8660a9064fbSMasahiro Yamada for (i = 0; i < COL_NUMBER; i++) {
8670a9064fbSMasahiro Yamada GtkTreeViewColumn *col;
8680a9064fbSMasahiro Yamada
8690a9064fbSMasahiro Yamada col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), i);
8700a9064fbSMasahiro Yamada if (col == column)
8710a9064fbSMasahiro Yamada return i;
8720a9064fbSMasahiro Yamada }
8730a9064fbSMasahiro Yamada
8740a9064fbSMasahiro Yamada return -1;
8750a9064fbSMasahiro Yamada }
8760a9064fbSMasahiro Yamada
8770a9064fbSMasahiro Yamada
8780a9064fbSMasahiro Yamada /* User click: update choice (full) or goes down (single) */
8790a9064fbSMasahiro Yamada gboolean
on_treeview2_button_press_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)8800a9064fbSMasahiro Yamada on_treeview2_button_press_event(GtkWidget * widget,
8810a9064fbSMasahiro Yamada GdkEventButton * event, gpointer user_data)
8820a9064fbSMasahiro Yamada {
8830a9064fbSMasahiro Yamada GtkTreeView *view = GTK_TREE_VIEW(widget);
8840a9064fbSMasahiro Yamada GtkTreePath *path;
8850a9064fbSMasahiro Yamada GtkTreeViewColumn *column;
8860a9064fbSMasahiro Yamada GtkTreeIter iter;
8870a9064fbSMasahiro Yamada struct menu *menu;
8880a9064fbSMasahiro Yamada gint col;
8890a9064fbSMasahiro Yamada
8900a9064fbSMasahiro Yamada #if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK
8910a9064fbSMasahiro Yamada gint tx = (gint) event->x;
8920a9064fbSMasahiro Yamada gint ty = (gint) event->y;
8930a9064fbSMasahiro Yamada gint cx, cy;
8940a9064fbSMasahiro Yamada
8950a9064fbSMasahiro Yamada gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx,
8960a9064fbSMasahiro Yamada &cy);
8970a9064fbSMasahiro Yamada #else
8980a9064fbSMasahiro Yamada gtk_tree_view_get_cursor(view, &path, &column);
8990a9064fbSMasahiro Yamada #endif
9000a9064fbSMasahiro Yamada if (path == NULL)
9010a9064fbSMasahiro Yamada return FALSE;
9020a9064fbSMasahiro Yamada
9030a9064fbSMasahiro Yamada if (!gtk_tree_model_get_iter(model2, &iter, path))
9040a9064fbSMasahiro Yamada return FALSE;
9050a9064fbSMasahiro Yamada gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
9060a9064fbSMasahiro Yamada
9070a9064fbSMasahiro Yamada col = column2index(column);
9080a9064fbSMasahiro Yamada if (event->type == GDK_2BUTTON_PRESS) {
9090a9064fbSMasahiro Yamada enum prop_type ptype;
9100a9064fbSMasahiro Yamada ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
9110a9064fbSMasahiro Yamada
9120a9064fbSMasahiro Yamada if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) {
9130a9064fbSMasahiro Yamada // goes down into menu
9140a9064fbSMasahiro Yamada current = menu;
9150a9064fbSMasahiro Yamada display_tree_part();
9160a9064fbSMasahiro Yamada gtk_widget_set_sensitive(back_btn, TRUE);
9170a9064fbSMasahiro Yamada } else if ((col == COL_OPTION)) {
9180a9064fbSMasahiro Yamada toggle_sym_value(menu);
9190a9064fbSMasahiro Yamada gtk_tree_view_expand_row(view, path, TRUE);
9200a9064fbSMasahiro Yamada }
9210a9064fbSMasahiro Yamada } else {
9220a9064fbSMasahiro Yamada if (col == COL_VALUE) {
9230a9064fbSMasahiro Yamada toggle_sym_value(menu);
9240a9064fbSMasahiro Yamada gtk_tree_view_expand_row(view, path, TRUE);
9250a9064fbSMasahiro Yamada } else if (col == COL_NO || col == COL_MOD
9260a9064fbSMasahiro Yamada || col == COL_YES) {
9270a9064fbSMasahiro Yamada change_sym_value(menu, col);
9280a9064fbSMasahiro Yamada gtk_tree_view_expand_row(view, path, TRUE);
9290a9064fbSMasahiro Yamada }
9300a9064fbSMasahiro Yamada }
9310a9064fbSMasahiro Yamada
9320a9064fbSMasahiro Yamada return FALSE;
9330a9064fbSMasahiro Yamada }
9340a9064fbSMasahiro Yamada
9350a9064fbSMasahiro Yamada /* Key pressed: update choice */
9360a9064fbSMasahiro Yamada gboolean
on_treeview2_key_press_event(GtkWidget * widget,GdkEventKey * event,gpointer user_data)9370a9064fbSMasahiro Yamada on_treeview2_key_press_event(GtkWidget * widget,
9380a9064fbSMasahiro Yamada GdkEventKey * event, gpointer user_data)
9390a9064fbSMasahiro Yamada {
9400a9064fbSMasahiro Yamada GtkTreeView *view = GTK_TREE_VIEW(widget);
9410a9064fbSMasahiro Yamada GtkTreePath *path;
9420a9064fbSMasahiro Yamada GtkTreeViewColumn *column;
9430a9064fbSMasahiro Yamada GtkTreeIter iter;
9440a9064fbSMasahiro Yamada struct menu *menu;
9450a9064fbSMasahiro Yamada gint col;
9460a9064fbSMasahiro Yamada
9470a9064fbSMasahiro Yamada gtk_tree_view_get_cursor(view, &path, &column);
9480a9064fbSMasahiro Yamada if (path == NULL)
9490a9064fbSMasahiro Yamada return FALSE;
9500a9064fbSMasahiro Yamada
9510a9064fbSMasahiro Yamada if (event->keyval == GDK_space) {
9520a9064fbSMasahiro Yamada if (gtk_tree_view_row_expanded(view, path))
9530a9064fbSMasahiro Yamada gtk_tree_view_collapse_row(view, path);
9540a9064fbSMasahiro Yamada else
9550a9064fbSMasahiro Yamada gtk_tree_view_expand_row(view, path, FALSE);
9560a9064fbSMasahiro Yamada return TRUE;
9570a9064fbSMasahiro Yamada }
9580a9064fbSMasahiro Yamada if (event->keyval == GDK_KP_Enter) {
9590a9064fbSMasahiro Yamada }
9600a9064fbSMasahiro Yamada if (widget == tree1_w)
9610a9064fbSMasahiro Yamada return FALSE;
9620a9064fbSMasahiro Yamada
9630a9064fbSMasahiro Yamada gtk_tree_model_get_iter(model2, &iter, path);
9640a9064fbSMasahiro Yamada gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
9650a9064fbSMasahiro Yamada
9660a9064fbSMasahiro Yamada if (!strcasecmp(event->string, "n"))
9670a9064fbSMasahiro Yamada col = COL_NO;
9680a9064fbSMasahiro Yamada else if (!strcasecmp(event->string, "m"))
9690a9064fbSMasahiro Yamada col = COL_MOD;
9700a9064fbSMasahiro Yamada else if (!strcasecmp(event->string, "y"))
9710a9064fbSMasahiro Yamada col = COL_YES;
9720a9064fbSMasahiro Yamada else
9730a9064fbSMasahiro Yamada col = -1;
9740a9064fbSMasahiro Yamada change_sym_value(menu, col);
9750a9064fbSMasahiro Yamada
9760a9064fbSMasahiro Yamada return FALSE;
9770a9064fbSMasahiro Yamada }
9780a9064fbSMasahiro Yamada
9790a9064fbSMasahiro Yamada
9800a9064fbSMasahiro Yamada /* Row selection changed: update help */
9810a9064fbSMasahiro Yamada void
on_treeview2_cursor_changed(GtkTreeView * treeview,gpointer user_data)9820a9064fbSMasahiro Yamada on_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data)
9830a9064fbSMasahiro Yamada {
9840a9064fbSMasahiro Yamada GtkTreeSelection *selection;
9850a9064fbSMasahiro Yamada GtkTreeIter iter;
9860a9064fbSMasahiro Yamada struct menu *menu;
9870a9064fbSMasahiro Yamada
9880a9064fbSMasahiro Yamada selection = gtk_tree_view_get_selection(treeview);
9890a9064fbSMasahiro Yamada if (gtk_tree_selection_get_selected(selection, &model2, &iter)) {
9900a9064fbSMasahiro Yamada gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
9910a9064fbSMasahiro Yamada text_insert_help(menu);
9920a9064fbSMasahiro Yamada }
9930a9064fbSMasahiro Yamada }
9940a9064fbSMasahiro Yamada
9950a9064fbSMasahiro Yamada
9960a9064fbSMasahiro Yamada /* User click: display sub-tree in the right frame. */
9970a9064fbSMasahiro Yamada gboolean
on_treeview1_button_press_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)9980a9064fbSMasahiro Yamada on_treeview1_button_press_event(GtkWidget * widget,
9990a9064fbSMasahiro Yamada GdkEventButton * event, gpointer user_data)
10000a9064fbSMasahiro Yamada {
10010a9064fbSMasahiro Yamada GtkTreeView *view = GTK_TREE_VIEW(widget);
10020a9064fbSMasahiro Yamada GtkTreePath *path;
10030a9064fbSMasahiro Yamada GtkTreeViewColumn *column;
10040a9064fbSMasahiro Yamada GtkTreeIter iter;
10050a9064fbSMasahiro Yamada struct menu *menu;
10060a9064fbSMasahiro Yamada
10070a9064fbSMasahiro Yamada gint tx = (gint) event->x;
10080a9064fbSMasahiro Yamada gint ty = (gint) event->y;
10090a9064fbSMasahiro Yamada gint cx, cy;
10100a9064fbSMasahiro Yamada
10110a9064fbSMasahiro Yamada gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx,
10120a9064fbSMasahiro Yamada &cy);
10130a9064fbSMasahiro Yamada if (path == NULL)
10140a9064fbSMasahiro Yamada return FALSE;
10150a9064fbSMasahiro Yamada
10160a9064fbSMasahiro Yamada gtk_tree_model_get_iter(model1, &iter, path);
10170a9064fbSMasahiro Yamada gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1);
10180a9064fbSMasahiro Yamada
10190a9064fbSMasahiro Yamada if (event->type == GDK_2BUTTON_PRESS) {
10200a9064fbSMasahiro Yamada toggle_sym_value(menu);
10210a9064fbSMasahiro Yamada current = menu;
10220a9064fbSMasahiro Yamada display_tree_part();
10230a9064fbSMasahiro Yamada } else {
10240a9064fbSMasahiro Yamada browsed = menu;
10250a9064fbSMasahiro Yamada display_tree_part();
10260a9064fbSMasahiro Yamada }
10270a9064fbSMasahiro Yamada
10280a9064fbSMasahiro Yamada gtk_widget_realize(tree2_w);
10290a9064fbSMasahiro Yamada gtk_tree_view_set_cursor(view, path, NULL, FALSE);
10300a9064fbSMasahiro Yamada gtk_widget_grab_focus(tree2_w);
10310a9064fbSMasahiro Yamada
10320a9064fbSMasahiro Yamada return FALSE;
10330a9064fbSMasahiro Yamada }
10340a9064fbSMasahiro Yamada
10350a9064fbSMasahiro Yamada
10360a9064fbSMasahiro Yamada /* Fill a row of strings */
fill_row(struct menu * menu)10370a9064fbSMasahiro Yamada static gchar **fill_row(struct menu *menu)
10380a9064fbSMasahiro Yamada {
10390a9064fbSMasahiro Yamada static gchar *row[COL_NUMBER];
10400a9064fbSMasahiro Yamada struct symbol *sym = menu->sym;
10410a9064fbSMasahiro Yamada const char *def;
10420a9064fbSMasahiro Yamada int stype;
10430a9064fbSMasahiro Yamada tristate val;
10440a9064fbSMasahiro Yamada enum prop_type ptype;
10450a9064fbSMasahiro Yamada int i;
10460a9064fbSMasahiro Yamada
10470a9064fbSMasahiro Yamada for (i = COL_OPTION; i <= COL_COLOR; i++)
10480a9064fbSMasahiro Yamada g_free(row[i]);
10490a9064fbSMasahiro Yamada bzero(row, sizeof(row));
10500a9064fbSMasahiro Yamada
10510a9064fbSMasahiro Yamada row[COL_OPTION] =
10520a9064fbSMasahiro Yamada g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
10530a9064fbSMasahiro Yamada sym && !sym_has_value(sym) ? "(NEW)" : "");
10540a9064fbSMasahiro Yamada
10550a9064fbSMasahiro Yamada if (opt_mode == OPT_ALL && !menu_is_visible(menu))
10560a9064fbSMasahiro Yamada row[COL_COLOR] = g_strdup("DarkGray");
10570a9064fbSMasahiro Yamada else if (opt_mode == OPT_PROMPT &&
10580a9064fbSMasahiro Yamada menu_has_prompt(menu) && !menu_is_visible(menu))
10590a9064fbSMasahiro Yamada row[COL_COLOR] = g_strdup("DarkGray");
10600a9064fbSMasahiro Yamada else
10610a9064fbSMasahiro Yamada row[COL_COLOR] = g_strdup("Black");
10620a9064fbSMasahiro Yamada
10630a9064fbSMasahiro Yamada ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
10640a9064fbSMasahiro Yamada switch (ptype) {
10650a9064fbSMasahiro Yamada case P_MENU:
10660a9064fbSMasahiro Yamada row[COL_PIXBUF] = (gchar *) xpm_menu;
10670a9064fbSMasahiro Yamada if (view_mode == SINGLE_VIEW)
10680a9064fbSMasahiro Yamada row[COL_PIXVIS] = GINT_TO_POINTER(TRUE);
10690a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
10700a9064fbSMasahiro Yamada break;
10710a9064fbSMasahiro Yamada case P_COMMENT:
10720a9064fbSMasahiro Yamada row[COL_PIXBUF] = (gchar *) xpm_void;
10730a9064fbSMasahiro Yamada row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
10740a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
10750a9064fbSMasahiro Yamada break;
10760a9064fbSMasahiro Yamada default:
10770a9064fbSMasahiro Yamada row[COL_PIXBUF] = (gchar *) xpm_void;
10780a9064fbSMasahiro Yamada row[COL_PIXVIS] = GINT_TO_POINTER(FALSE);
10790a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
10800a9064fbSMasahiro Yamada break;
10810a9064fbSMasahiro Yamada }
10820a9064fbSMasahiro Yamada
10830a9064fbSMasahiro Yamada if (!sym)
10840a9064fbSMasahiro Yamada return row;
10850a9064fbSMasahiro Yamada row[COL_NAME] = g_strdup(sym->name);
10860a9064fbSMasahiro Yamada
10870a9064fbSMasahiro Yamada sym_calc_value(sym);
10880a9064fbSMasahiro Yamada sym->flags &= ~SYMBOL_CHANGED;
10890a9064fbSMasahiro Yamada
10900a9064fbSMasahiro Yamada if (sym_is_choice(sym)) { // parse childs for getting final value
10910a9064fbSMasahiro Yamada struct menu *child;
10920a9064fbSMasahiro Yamada struct symbol *def_sym = sym_get_choice_value(sym);
10930a9064fbSMasahiro Yamada struct menu *def_menu = NULL;
10940a9064fbSMasahiro Yamada
10950a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
10960a9064fbSMasahiro Yamada
10970a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) {
10980a9064fbSMasahiro Yamada if (menu_is_visible(child)
10990a9064fbSMasahiro Yamada && child->sym == def_sym)
11000a9064fbSMasahiro Yamada def_menu = child;
11010a9064fbSMasahiro Yamada }
11020a9064fbSMasahiro Yamada
11030a9064fbSMasahiro Yamada if (def_menu)
11040a9064fbSMasahiro Yamada row[COL_VALUE] =
11050a9064fbSMasahiro Yamada g_strdup(_(menu_get_prompt(def_menu)));
11060a9064fbSMasahiro Yamada }
11070a9064fbSMasahiro Yamada if (sym->flags & SYMBOL_CHOICEVAL)
11080a9064fbSMasahiro Yamada row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
11090a9064fbSMasahiro Yamada
11100a9064fbSMasahiro Yamada stype = sym_get_type(sym);
11110a9064fbSMasahiro Yamada switch (stype) {
11120a9064fbSMasahiro Yamada case S_BOOLEAN:
11130a9064fbSMasahiro Yamada if (GPOINTER_TO_INT(row[COL_PIXVIS]) == FALSE)
11140a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
11150a9064fbSMasahiro Yamada if (sym_is_choice(sym))
11160a9064fbSMasahiro Yamada break;
11170a9064fbSMasahiro Yamada /* fall through */
11180a9064fbSMasahiro Yamada case S_TRISTATE:
11190a9064fbSMasahiro Yamada val = sym_get_tristate_value(sym);
11200a9064fbSMasahiro Yamada switch (val) {
11210a9064fbSMasahiro Yamada case no:
11220a9064fbSMasahiro Yamada row[COL_NO] = g_strdup("N");
11230a9064fbSMasahiro Yamada row[COL_VALUE] = g_strdup("N");
11240a9064fbSMasahiro Yamada row[COL_BTNACT] = GINT_TO_POINTER(FALSE);
11250a9064fbSMasahiro Yamada row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
11260a9064fbSMasahiro Yamada break;
11270a9064fbSMasahiro Yamada case mod:
11280a9064fbSMasahiro Yamada row[COL_MOD] = g_strdup("M");
11290a9064fbSMasahiro Yamada row[COL_VALUE] = g_strdup("M");
11300a9064fbSMasahiro Yamada row[COL_BTNINC] = GINT_TO_POINTER(TRUE);
11310a9064fbSMasahiro Yamada break;
11320a9064fbSMasahiro Yamada case yes:
11330a9064fbSMasahiro Yamada row[COL_YES] = g_strdup("Y");
11340a9064fbSMasahiro Yamada row[COL_VALUE] = g_strdup("Y");
11350a9064fbSMasahiro Yamada row[COL_BTNACT] = GINT_TO_POINTER(TRUE);
11360a9064fbSMasahiro Yamada row[COL_BTNINC] = GINT_TO_POINTER(FALSE);
11370a9064fbSMasahiro Yamada break;
11380a9064fbSMasahiro Yamada }
11390a9064fbSMasahiro Yamada
11400a9064fbSMasahiro Yamada if (val != no && sym_tristate_within_range(sym, no))
11410a9064fbSMasahiro Yamada row[COL_NO] = g_strdup("_");
11420a9064fbSMasahiro Yamada if (val != mod && sym_tristate_within_range(sym, mod))
11430a9064fbSMasahiro Yamada row[COL_MOD] = g_strdup("_");
11440a9064fbSMasahiro Yamada if (val != yes && sym_tristate_within_range(sym, yes))
11450a9064fbSMasahiro Yamada row[COL_YES] = g_strdup("_");
11460a9064fbSMasahiro Yamada break;
11470a9064fbSMasahiro Yamada case S_INT:
11480a9064fbSMasahiro Yamada case S_HEX:
11490a9064fbSMasahiro Yamada case S_STRING:
11500a9064fbSMasahiro Yamada def = sym_get_string_value(sym);
11510a9064fbSMasahiro Yamada row[COL_VALUE] = g_strdup(def);
11520a9064fbSMasahiro Yamada row[COL_EDIT] = GINT_TO_POINTER(TRUE);
11530a9064fbSMasahiro Yamada row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
11540a9064fbSMasahiro Yamada break;
11550a9064fbSMasahiro Yamada }
11560a9064fbSMasahiro Yamada
11570a9064fbSMasahiro Yamada return row;
11580a9064fbSMasahiro Yamada }
11590a9064fbSMasahiro Yamada
11600a9064fbSMasahiro Yamada
11610a9064fbSMasahiro Yamada /* Set the node content with a row of strings */
set_node(GtkTreeIter * node,struct menu * menu,gchar ** row)11620a9064fbSMasahiro Yamada static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row)
11630a9064fbSMasahiro Yamada {
11640a9064fbSMasahiro Yamada GdkColor color;
11650a9064fbSMasahiro Yamada gboolean success;
11660a9064fbSMasahiro Yamada GdkPixbuf *pix;
11670a9064fbSMasahiro Yamada
11680a9064fbSMasahiro Yamada pix = gdk_pixbuf_new_from_xpm_data((const char **)
11690a9064fbSMasahiro Yamada row[COL_PIXBUF]);
11700a9064fbSMasahiro Yamada
11710a9064fbSMasahiro Yamada gdk_color_parse(row[COL_COLOR], &color);
11720a9064fbSMasahiro Yamada gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1,
11730a9064fbSMasahiro Yamada FALSE, FALSE, &success);
11740a9064fbSMasahiro Yamada
11750a9064fbSMasahiro Yamada gtk_tree_store_set(tree, node,
11760a9064fbSMasahiro Yamada COL_OPTION, row[COL_OPTION],
11770a9064fbSMasahiro Yamada COL_NAME, row[COL_NAME],
11780a9064fbSMasahiro Yamada COL_NO, row[COL_NO],
11790a9064fbSMasahiro Yamada COL_MOD, row[COL_MOD],
11800a9064fbSMasahiro Yamada COL_YES, row[COL_YES],
11810a9064fbSMasahiro Yamada COL_VALUE, row[COL_VALUE],
11820a9064fbSMasahiro Yamada COL_MENU, (gpointer) menu,
11830a9064fbSMasahiro Yamada COL_COLOR, &color,
11840a9064fbSMasahiro Yamada COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]),
11850a9064fbSMasahiro Yamada COL_PIXBUF, pix,
11860a9064fbSMasahiro Yamada COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]),
11870a9064fbSMasahiro Yamada COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]),
11880a9064fbSMasahiro Yamada COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]),
11890a9064fbSMasahiro Yamada COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]),
11900a9064fbSMasahiro Yamada COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]),
11910a9064fbSMasahiro Yamada -1);
11920a9064fbSMasahiro Yamada
11930a9064fbSMasahiro Yamada g_object_unref(pix);
11940a9064fbSMasahiro Yamada }
11950a9064fbSMasahiro Yamada
11960a9064fbSMasahiro Yamada
11970a9064fbSMasahiro Yamada /* Add a node to the tree */
place_node(struct menu * menu,char ** row)11980a9064fbSMasahiro Yamada static void place_node(struct menu *menu, char **row)
11990a9064fbSMasahiro Yamada {
12000a9064fbSMasahiro Yamada GtkTreeIter *parent = parents[indent - 1];
12010a9064fbSMasahiro Yamada GtkTreeIter *node = parents[indent];
12020a9064fbSMasahiro Yamada
12030a9064fbSMasahiro Yamada gtk_tree_store_append(tree, node, parent);
12040a9064fbSMasahiro Yamada set_node(node, menu, row);
12050a9064fbSMasahiro Yamada }
12060a9064fbSMasahiro Yamada
12070a9064fbSMasahiro Yamada
12080a9064fbSMasahiro Yamada /* Find a node in the GTK+ tree */
12090a9064fbSMasahiro Yamada static GtkTreeIter found;
12100a9064fbSMasahiro Yamada
12110a9064fbSMasahiro Yamada /*
12120a9064fbSMasahiro Yamada * Find a menu in the GtkTree starting at parent.
12130a9064fbSMasahiro Yamada */
gtktree_iter_find_node(GtkTreeIter * parent,struct menu * tofind)12140a9064fbSMasahiro Yamada GtkTreeIter *gtktree_iter_find_node(GtkTreeIter * parent,
12150a9064fbSMasahiro Yamada struct menu *tofind)
12160a9064fbSMasahiro Yamada {
12170a9064fbSMasahiro Yamada GtkTreeIter iter;
12180a9064fbSMasahiro Yamada GtkTreeIter *child = &iter;
12190a9064fbSMasahiro Yamada gboolean valid;
12200a9064fbSMasahiro Yamada GtkTreeIter *ret;
12210a9064fbSMasahiro Yamada
12220a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_children(model2, child, parent);
12230a9064fbSMasahiro Yamada while (valid) {
12240a9064fbSMasahiro Yamada struct menu *menu;
12250a9064fbSMasahiro Yamada
12260a9064fbSMasahiro Yamada gtk_tree_model_get(model2, child, 6, &menu, -1);
12270a9064fbSMasahiro Yamada
12280a9064fbSMasahiro Yamada if (menu == tofind) {
12290a9064fbSMasahiro Yamada memcpy(&found, child, sizeof(GtkTreeIter));
12300a9064fbSMasahiro Yamada return &found;
12310a9064fbSMasahiro Yamada }
12320a9064fbSMasahiro Yamada
12330a9064fbSMasahiro Yamada ret = gtktree_iter_find_node(child, tofind);
12340a9064fbSMasahiro Yamada if (ret)
12350a9064fbSMasahiro Yamada return ret;
12360a9064fbSMasahiro Yamada
12370a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_next(model2, child);
12380a9064fbSMasahiro Yamada }
12390a9064fbSMasahiro Yamada
12400a9064fbSMasahiro Yamada return NULL;
12410a9064fbSMasahiro Yamada }
12420a9064fbSMasahiro Yamada
12430a9064fbSMasahiro Yamada
12440a9064fbSMasahiro Yamada /*
12450a9064fbSMasahiro Yamada * Update the tree by adding/removing entries
12460a9064fbSMasahiro Yamada * Does not change other nodes
12470a9064fbSMasahiro Yamada */
update_tree(struct menu * src,GtkTreeIter * dst)12480a9064fbSMasahiro Yamada static void update_tree(struct menu *src, GtkTreeIter * dst)
12490a9064fbSMasahiro Yamada {
12500a9064fbSMasahiro Yamada struct menu *child1;
12510a9064fbSMasahiro Yamada GtkTreeIter iter, tmp;
12520a9064fbSMasahiro Yamada GtkTreeIter *child2 = &iter;
12530a9064fbSMasahiro Yamada gboolean valid;
12540a9064fbSMasahiro Yamada GtkTreeIter *sibling;
12550a9064fbSMasahiro Yamada struct symbol *sym;
12560a9064fbSMasahiro Yamada struct menu *menu1, *menu2;
12570a9064fbSMasahiro Yamada
12580a9064fbSMasahiro Yamada if (src == &rootmenu)
12590a9064fbSMasahiro Yamada indent = 1;
12600a9064fbSMasahiro Yamada
12610a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_children(model2, child2, dst);
12620a9064fbSMasahiro Yamada for (child1 = src->list; child1; child1 = child1->next) {
12630a9064fbSMasahiro Yamada
12640a9064fbSMasahiro Yamada sym = child1->sym;
12650a9064fbSMasahiro Yamada
12660a9064fbSMasahiro Yamada reparse:
12670a9064fbSMasahiro Yamada menu1 = child1;
12680a9064fbSMasahiro Yamada if (valid)
12690a9064fbSMasahiro Yamada gtk_tree_model_get(model2, child2, COL_MENU,
12700a9064fbSMasahiro Yamada &menu2, -1);
12710a9064fbSMasahiro Yamada else
12720a9064fbSMasahiro Yamada menu2 = NULL; // force adding of a first child
12730a9064fbSMasahiro Yamada
12740a9064fbSMasahiro Yamada #ifdef DEBUG
12750a9064fbSMasahiro Yamada printf("%*c%s | %s\n", indent, ' ',
12760a9064fbSMasahiro Yamada menu1 ? menu_get_prompt(menu1) : "nil",
12770a9064fbSMasahiro Yamada menu2 ? menu_get_prompt(menu2) : "nil");
12780a9064fbSMasahiro Yamada #endif
12790a9064fbSMasahiro Yamada
12800a9064fbSMasahiro Yamada if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
12810a9064fbSMasahiro Yamada (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) ||
12820a9064fbSMasahiro Yamada (opt_mode == OPT_ALL && !menu_get_prompt(child1))) {
12830a9064fbSMasahiro Yamada
12840a9064fbSMasahiro Yamada /* remove node */
12850a9064fbSMasahiro Yamada if (gtktree_iter_find_node(dst, menu1) != NULL) {
12860a9064fbSMasahiro Yamada memcpy(&tmp, child2, sizeof(GtkTreeIter));
12870a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_next(model2,
12880a9064fbSMasahiro Yamada child2);
12890a9064fbSMasahiro Yamada gtk_tree_store_remove(tree2, &tmp);
12900a9064fbSMasahiro Yamada if (!valid)
12910a9064fbSMasahiro Yamada return; /* next parent */
12920a9064fbSMasahiro Yamada else
12930a9064fbSMasahiro Yamada goto reparse; /* next child */
12940a9064fbSMasahiro Yamada } else
12950a9064fbSMasahiro Yamada continue;
12960a9064fbSMasahiro Yamada }
12970a9064fbSMasahiro Yamada
12980a9064fbSMasahiro Yamada if (menu1 != menu2) {
12990a9064fbSMasahiro Yamada if (gtktree_iter_find_node(dst, menu1) == NULL) { // add node
13000a9064fbSMasahiro Yamada if (!valid && !menu2)
13010a9064fbSMasahiro Yamada sibling = NULL;
13020a9064fbSMasahiro Yamada else
13030a9064fbSMasahiro Yamada sibling = child2;
13040a9064fbSMasahiro Yamada gtk_tree_store_insert_before(tree2,
13050a9064fbSMasahiro Yamada child2,
13060a9064fbSMasahiro Yamada dst, sibling);
13070a9064fbSMasahiro Yamada set_node(child2, menu1, fill_row(menu1));
13080a9064fbSMasahiro Yamada if (menu2 == NULL)
13090a9064fbSMasahiro Yamada valid = TRUE;
13100a9064fbSMasahiro Yamada } else { // remove node
13110a9064fbSMasahiro Yamada memcpy(&tmp, child2, sizeof(GtkTreeIter));
13120a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_next(model2,
13130a9064fbSMasahiro Yamada child2);
13140a9064fbSMasahiro Yamada gtk_tree_store_remove(tree2, &tmp);
13150a9064fbSMasahiro Yamada if (!valid)
13160a9064fbSMasahiro Yamada return; // next parent
13170a9064fbSMasahiro Yamada else
13180a9064fbSMasahiro Yamada goto reparse; // next child
13190a9064fbSMasahiro Yamada }
13200a9064fbSMasahiro Yamada } else if (sym && (sym->flags & SYMBOL_CHANGED)) {
13210a9064fbSMasahiro Yamada set_node(child2, menu1, fill_row(menu1));
13220a9064fbSMasahiro Yamada }
13230a9064fbSMasahiro Yamada
13240a9064fbSMasahiro Yamada indent++;
13250a9064fbSMasahiro Yamada update_tree(child1, child2);
13260a9064fbSMasahiro Yamada indent--;
13270a9064fbSMasahiro Yamada
13280a9064fbSMasahiro Yamada valid = gtk_tree_model_iter_next(model2, child2);
13290a9064fbSMasahiro Yamada }
13300a9064fbSMasahiro Yamada }
13310a9064fbSMasahiro Yamada
13320a9064fbSMasahiro Yamada
13330a9064fbSMasahiro Yamada /* Display the whole tree (single/split/full view) */
display_tree(struct menu * menu)13340a9064fbSMasahiro Yamada static void display_tree(struct menu *menu)
13350a9064fbSMasahiro Yamada {
13360a9064fbSMasahiro Yamada struct symbol *sym;
13370a9064fbSMasahiro Yamada struct property *prop;
13380a9064fbSMasahiro Yamada struct menu *child;
13390a9064fbSMasahiro Yamada enum prop_type ptype;
13400a9064fbSMasahiro Yamada
13410a9064fbSMasahiro Yamada if (menu == &rootmenu) {
13420a9064fbSMasahiro Yamada indent = 1;
13430a9064fbSMasahiro Yamada current = &rootmenu;
13440a9064fbSMasahiro Yamada }
13450a9064fbSMasahiro Yamada
13460a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) {
13470a9064fbSMasahiro Yamada prop = child->prompt;
13480a9064fbSMasahiro Yamada sym = child->sym;
13490a9064fbSMasahiro Yamada ptype = prop ? prop->type : P_UNKNOWN;
13500a9064fbSMasahiro Yamada
13510a9064fbSMasahiro Yamada if (sym)
13520a9064fbSMasahiro Yamada sym->flags &= ~SYMBOL_CHANGED;
13530a9064fbSMasahiro Yamada
13540a9064fbSMasahiro Yamada if ((view_mode == SPLIT_VIEW)
13550a9064fbSMasahiro Yamada && !(child->flags & MENU_ROOT) && (tree == tree1))
13560a9064fbSMasahiro Yamada continue;
13570a9064fbSMasahiro Yamada
13580a9064fbSMasahiro Yamada if ((view_mode == SPLIT_VIEW) && (child->flags & MENU_ROOT)
13590a9064fbSMasahiro Yamada && (tree == tree2))
13600a9064fbSMasahiro Yamada continue;
13610a9064fbSMasahiro Yamada
13620a9064fbSMasahiro Yamada if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
13630a9064fbSMasahiro Yamada (opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
13640a9064fbSMasahiro Yamada (opt_mode == OPT_ALL && menu_get_prompt(child)))
13650a9064fbSMasahiro Yamada place_node(child, fill_row(child));
13660a9064fbSMasahiro Yamada #ifdef DEBUG
13670a9064fbSMasahiro Yamada printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
13680a9064fbSMasahiro Yamada printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
13690a9064fbSMasahiro Yamada printf("%s", prop_get_type_name(ptype));
13700a9064fbSMasahiro Yamada printf(" | ");
13710a9064fbSMasahiro Yamada if (sym) {
13720a9064fbSMasahiro Yamada printf("%s", sym_type_name(sym->type));
13730a9064fbSMasahiro Yamada printf(" | ");
13740a9064fbSMasahiro Yamada printf("%s", dbg_sym_flags(sym->flags));
13750a9064fbSMasahiro Yamada printf("\n");
13760a9064fbSMasahiro Yamada } else
13770a9064fbSMasahiro Yamada printf("\n");
13780a9064fbSMasahiro Yamada #endif
13790a9064fbSMasahiro Yamada if ((view_mode != FULL_VIEW) && (ptype == P_MENU)
13800a9064fbSMasahiro Yamada && (tree == tree2))
13810a9064fbSMasahiro Yamada continue;
13820a9064fbSMasahiro Yamada /*
13830a9064fbSMasahiro Yamada if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT))
13840a9064fbSMasahiro Yamada || (view_mode == FULL_VIEW)
13850a9064fbSMasahiro Yamada || (view_mode == SPLIT_VIEW))*/
13860a9064fbSMasahiro Yamada
13870a9064fbSMasahiro Yamada /* Change paned position if the view is not in 'split mode' */
13880a9064fbSMasahiro Yamada if (view_mode == SINGLE_VIEW || view_mode == FULL_VIEW) {
13890a9064fbSMasahiro Yamada gtk_paned_set_position(GTK_PANED(hpaned), 0);
13900a9064fbSMasahiro Yamada }
13910a9064fbSMasahiro Yamada
13920a9064fbSMasahiro Yamada if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT))
13930a9064fbSMasahiro Yamada || (view_mode == FULL_VIEW)
13940a9064fbSMasahiro Yamada || (view_mode == SPLIT_VIEW)) {
13950a9064fbSMasahiro Yamada indent++;
13960a9064fbSMasahiro Yamada display_tree(child);
13970a9064fbSMasahiro Yamada indent--;
13980a9064fbSMasahiro Yamada }
13990a9064fbSMasahiro Yamada }
14000a9064fbSMasahiro Yamada }
14010a9064fbSMasahiro Yamada
14020a9064fbSMasahiro Yamada /* Display a part of the tree starting at current node (single/split view) */
display_tree_part(void)14030a9064fbSMasahiro Yamada static void display_tree_part(void)
14040a9064fbSMasahiro Yamada {
14050a9064fbSMasahiro Yamada if (tree2)
14060a9064fbSMasahiro Yamada gtk_tree_store_clear(tree2);
14070a9064fbSMasahiro Yamada if (view_mode == SINGLE_VIEW)
14080a9064fbSMasahiro Yamada display_tree(current);
14090a9064fbSMasahiro Yamada else if (view_mode == SPLIT_VIEW)
14100a9064fbSMasahiro Yamada display_tree(browsed);
14110a9064fbSMasahiro Yamada gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));
14120a9064fbSMasahiro Yamada }
14130a9064fbSMasahiro Yamada
14140a9064fbSMasahiro Yamada /* Display the list in the left frame (split view) */
display_list(void)14150a9064fbSMasahiro Yamada static void display_list(void)
14160a9064fbSMasahiro Yamada {
14170a9064fbSMasahiro Yamada if (tree1)
14180a9064fbSMasahiro Yamada gtk_tree_store_clear(tree1);
14190a9064fbSMasahiro Yamada
14200a9064fbSMasahiro Yamada tree = tree1;
14210a9064fbSMasahiro Yamada display_tree(&rootmenu);
14220a9064fbSMasahiro Yamada gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w));
14230a9064fbSMasahiro Yamada tree = tree2;
14240a9064fbSMasahiro Yamada }
14250a9064fbSMasahiro Yamada
fixup_rootmenu(struct menu * menu)14260a9064fbSMasahiro Yamada void fixup_rootmenu(struct menu *menu)
14270a9064fbSMasahiro Yamada {
14280a9064fbSMasahiro Yamada struct menu *child;
14290a9064fbSMasahiro Yamada static int menu_cnt = 0;
14300a9064fbSMasahiro Yamada
14310a9064fbSMasahiro Yamada menu->flags |= MENU_ROOT;
14320a9064fbSMasahiro Yamada for (child = menu->list; child; child = child->next) {
14330a9064fbSMasahiro Yamada if (child->prompt && child->prompt->type == P_MENU) {
14340a9064fbSMasahiro Yamada menu_cnt++;
14350a9064fbSMasahiro Yamada fixup_rootmenu(child);
14360a9064fbSMasahiro Yamada menu_cnt--;
14370a9064fbSMasahiro Yamada } else if (!menu_cnt)
14380a9064fbSMasahiro Yamada fixup_rootmenu(child);
14390a9064fbSMasahiro Yamada }
14400a9064fbSMasahiro Yamada }
14410a9064fbSMasahiro Yamada
14420a9064fbSMasahiro Yamada
14430a9064fbSMasahiro Yamada /* Main */
main(int ac,char * av[])14440a9064fbSMasahiro Yamada int main(int ac, char *av[])
14450a9064fbSMasahiro Yamada {
14460a9064fbSMasahiro Yamada const char *name;
14470a9064fbSMasahiro Yamada char *env;
14480a9064fbSMasahiro Yamada gchar *glade_file;
14490a9064fbSMasahiro Yamada
14500a9064fbSMasahiro Yamada bindtextdomain(PACKAGE, LOCALEDIR);
14510a9064fbSMasahiro Yamada bind_textdomain_codeset(PACKAGE, "UTF-8");
14520a9064fbSMasahiro Yamada textdomain(PACKAGE);
14530a9064fbSMasahiro Yamada
14540a9064fbSMasahiro Yamada /* GTK stuffs */
14550a9064fbSMasahiro Yamada gtk_set_locale();
14560a9064fbSMasahiro Yamada gtk_init(&ac, &av);
14570a9064fbSMasahiro Yamada glade_init();
14580a9064fbSMasahiro Yamada
14590a9064fbSMasahiro Yamada //add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
14600a9064fbSMasahiro Yamada //add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");
14610a9064fbSMasahiro Yamada
14620a9064fbSMasahiro Yamada /* Determine GUI path */
14630a9064fbSMasahiro Yamada env = getenv(SRCTREE);
14640a9064fbSMasahiro Yamada if (env)
14650a9064fbSMasahiro Yamada glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL);
14660a9064fbSMasahiro Yamada else if (av[0][0] == '/')
14670a9064fbSMasahiro Yamada glade_file = g_strconcat(av[0], ".glade", NULL);
14680a9064fbSMasahiro Yamada else
14690a9064fbSMasahiro Yamada glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL);
14700a9064fbSMasahiro Yamada
14710a9064fbSMasahiro Yamada /* Conf stuffs */
14720a9064fbSMasahiro Yamada if (ac > 1 && av[1][0] == '-') {
14730a9064fbSMasahiro Yamada switch (av[1][1]) {
14740a9064fbSMasahiro Yamada case 'a':
14750a9064fbSMasahiro Yamada //showAll = 1;
14760a9064fbSMasahiro Yamada break;
1477*9b5f0b1dSMasahiro Yamada case 's':
1478*9b5f0b1dSMasahiro Yamada conf_set_message_callback(NULL);
1479*9b5f0b1dSMasahiro Yamada break;
14800a9064fbSMasahiro Yamada case 'h':
14810a9064fbSMasahiro Yamada case '?':
1482*9b5f0b1dSMasahiro Yamada printf("%s [-s] <config>\n", av[0]);
14830a9064fbSMasahiro Yamada exit(0);
14840a9064fbSMasahiro Yamada }
14850a9064fbSMasahiro Yamada name = av[2];
14860a9064fbSMasahiro Yamada } else
14870a9064fbSMasahiro Yamada name = av[1];
14880a9064fbSMasahiro Yamada
14890a9064fbSMasahiro Yamada conf_parse(name);
14900a9064fbSMasahiro Yamada fixup_rootmenu(&rootmenu);
14910a9064fbSMasahiro Yamada conf_read(NULL);
14920a9064fbSMasahiro Yamada
14930a9064fbSMasahiro Yamada /* Load the interface and connect signals */
14940a9064fbSMasahiro Yamada init_main_window(glade_file);
14950a9064fbSMasahiro Yamada init_tree_model();
14960a9064fbSMasahiro Yamada init_left_tree();
14970a9064fbSMasahiro Yamada init_right_tree();
14980a9064fbSMasahiro Yamada
14990a9064fbSMasahiro Yamada switch (view_mode) {
15000a9064fbSMasahiro Yamada case SINGLE_VIEW:
15010a9064fbSMasahiro Yamada display_tree_part();
15020a9064fbSMasahiro Yamada break;
15030a9064fbSMasahiro Yamada case SPLIT_VIEW:
15040a9064fbSMasahiro Yamada display_list();
15050a9064fbSMasahiro Yamada break;
15060a9064fbSMasahiro Yamada case FULL_VIEW:
15070a9064fbSMasahiro Yamada display_tree(&rootmenu);
15080a9064fbSMasahiro Yamada break;
15090a9064fbSMasahiro Yamada }
15100a9064fbSMasahiro Yamada
15110a9064fbSMasahiro Yamada gtk_main();
15120a9064fbSMasahiro Yamada
15130a9064fbSMasahiro Yamada return 0;
15140a9064fbSMasahiro Yamada }
15150a9064fbSMasahiro Yamada
conf_changed(void)15160a9064fbSMasahiro Yamada static void conf_changed(void)
15170a9064fbSMasahiro Yamada {
15180a9064fbSMasahiro Yamada bool changed = conf_get_changed();
15190a9064fbSMasahiro Yamada gtk_widget_set_sensitive(save_btn, changed);
15200a9064fbSMasahiro Yamada gtk_widget_set_sensitive(save_menu_item, changed);
15210a9064fbSMasahiro Yamada }
1522