📄 gconf.c
字号:
result = gtk_dialog_run(GTK_DIALOG(dialog)); switch (result) { case GTK_RESPONSE_YES: on_save1_activate(NULL, NULL); return FALSE; case GTK_RESPONSE_NO: return FALSE; case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: default: gtk_widget_destroy(dialog); return TRUE; } return FALSE;}void on_window1_destroy(GtkObject * object, gpointer user_data){ gtk_main_quit();}voidon_window1_size_request(GtkWidget * widget, GtkRequisition * requisition, gpointer user_data){ static gint old_h; gint w, h; if (widget->window == NULL) gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); else gdk_window_get_size(widget->window, &w, &h); if (h == old_h) return; old_h = h; gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3);}/* Menu & Toolbar Callbacks */static voidload_filename(GtkFileSelection * file_selector, gpointer user_data){ const gchar *fn; fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION (user_data)); if (conf_read(fn)) text_insert_msg(_("Error"), _("Unable to load configuration !")); else display_tree(&rootmenu);}void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkWidget *fs; fs = gtk_file_selection_new(_("Load file...")); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(load_filename), (gpointer) fs); g_signal_connect_swapped(GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer) fs); g_signal_connect_swapped(GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer) fs); gtk_widget_show(fs);}void on_save1_activate(GtkMenuItem * menuitem, gpointer user_data){ if (conf_write(NULL)) text_insert_msg(_("Error"), _("Unable to save configuration !")); config_changed = FALSE;}static voidstore_filename(GtkFileSelection * file_selector, gpointer user_data){ const gchar *fn; fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION (user_data)); if (conf_write(fn)) text_insert_msg(_("Error"), _("Unable to save configuration !")); gtk_widget_destroy(GTK_WIDGET(user_data));}void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkWidget *fs; fs = gtk_file_selection_new(_("Save file as...")); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(store_filename), (gpointer) fs); g_signal_connect_swapped(GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer) fs); g_signal_connect_swapped(GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), (gpointer) fs); gtk_widget_show(fs);}void on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data){ if (!on_window1_delete_event(NULL, NULL, NULL)) gtk_widget_destroy(GTK_WIDGET(main_wnd));}void on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkTreeViewColumn *col; show_name = GTK_CHECK_MENU_ITEM(menuitem)->active; col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME); if (col) gtk_tree_view_column_set_visible(col, show_name);}void on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkTreeViewColumn *col; show_range = GTK_CHECK_MENU_ITEM(menuitem)->active; col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO); if (col) gtk_tree_view_column_set_visible(col, show_range); col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_MOD); if (col) gtk_tree_view_column_set_visible(col, show_range); col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_YES); if (col) gtk_tree_view_column_set_visible(col, show_range);}void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkTreeViewColumn *col; show_value = GTK_CHECK_MENU_ITEM(menuitem)->active; col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE); if (col) gtk_tree_view_column_set_visible(col, show_value);}voidon_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data){ show_all = GTK_CHECK_MENU_ITEM(menuitem)->active; gtk_tree_store_clear(tree2); display_tree(&rootmenu); // instead of update_tree to speed-up}voidon_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data){ show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active; update_tree(&rootmenu, NULL);}void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkWidget *dialog; const gchar *intro_text = _( "Welcome to gkc, the GTK+ graphical busybox configuration tool\n" "for Linux.\n" "For each option, a blank box indicates the feature is disabled, a\n" "check indicates it is enabled, and a dot indicates that it is to\n" "be compiled as a module. Clicking on the box will cycle through the three states.\n" "\n" "If you do not see an option (e.g., a device driver) that you\n" "believe should be present, try turning on Show All Options\n" "under the Options menu.\n" "Although there is no cross reference yet to help you figure out\n" "what other options must be enabled to support the option you\n" "are interested in, you can still view the help of a grayed-out\n" "option.\n" "\n" "Toggling Show Debug Info under the Options menu will show\n" "the dependencies, which you can then match by examining other options."); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, intro_text); g_signal_connect_swapped(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog)); gtk_widget_show_all(dialog);}void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkWidget *dialog; const gchar *about_text = _("gkc is copyright (c) 2002 Romain Lievin <roms@lpg.ticalc.org>.\n" "Based on the source code from Roman Zippel.\n"); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, about_text); g_signal_connect_swapped(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog)); gtk_widget_show_all(dialog);}void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data){ GtkWidget *dialog; const gchar *license_text = _("gkc is released under the terms of the GNU GPL v2.\n" "For more information, please see the source code or\n" "visit http://www.fsf.org/licenses/licenses.html\n"); dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, license_text); g_signal_connect_swapped(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog)); gtk_widget_show_all(dialog);}void on_back_clicked(GtkButton * button, gpointer user_data){ enum prop_type ptype; current = current->parent; ptype = current->prompt ? current->prompt->type : P_UNKNOWN; if (ptype != P_MENU) current = current->parent; display_tree_part(); if (current == &rootmenu) gtk_widget_set_sensitive(back_btn, FALSE);}void on_load_clicked(GtkButton * button, gpointer user_data){ on_load1_activate(NULL, user_data);}void on_save_clicked(GtkButton * button, gpointer user_data){ on_save1_activate(NULL, user_data);}void on_single_clicked(GtkButton * button, gpointer user_data){ view_mode = SINGLE_VIEW; gtk_paned_set_position(GTK_PANED(hpaned), 0); gtk_widget_hide(tree1_w); current = &rootmenu; display_tree_part();}void on_split_clicked(GtkButton * button, gpointer user_data){ gint w, h; view_mode = SPLIT_VIEW; gtk_widget_show(tree1_w); gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); gtk_paned_set_position(GTK_PANED(hpaned), w / 2); if (tree2) gtk_tree_store_clear(tree2); display_list(); /* Disable back btn, like in full mode. */ gtk_widget_set_sensitive(back_btn, FALSE);}void on_full_clicked(GtkButton * button, gpointer user_data){ view_mode = FULL_VIEW; gtk_paned_set_position(GTK_PANED(hpaned), 0); gtk_widget_hide(tree1_w); if (tree2) gtk_tree_store_clear(tree2); display_tree(&rootmenu); gtk_widget_set_sensitive(back_btn, FALSE);}void on_collapse_clicked(GtkButton * button, gpointer user_data){ gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w));}void on_expand_clicked(GtkButton * button, gpointer user_data){ gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w));}/* CTree Callbacks *//* Change hex/int/string value in the cell */static void renderer_edited(GtkCellRendererText * cell, const gchar * path_string, const gchar * new_text, gpointer user_data){ GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; const char *old_def, *new_def; struct menu *menu; struct symbol *sym; if (!gtk_tree_model_get_iter(model2, &iter, path)) return; gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); sym = menu->sym; gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1); new_def = new_text; sym_set_string_value(sym, new_def); config_changed = TRUE; update_tree(&rootmenu, NULL); gtk_tree_path_free(path);}/* Change the value of a symbol and update the tree */static void change_sym_value(struct menu *menu, gint col){ struct symbol *sym = menu->sym; tristate oldval, newval; if (!sym) return; if (col == COL_NO) newval = no; else if (col == COL_MOD) newval = mod; else if (col == COL_YES) newval = yes; else return; switch (sym_get_type(sym)) { case S_BOOLEAN: case S_TRISTATE: oldval = sym_get_tristate_value(sym); if (!sym_tristate_within_range(sym, newval)) newval = yes; sym_set_tristate_value(sym, newval); config_changed = TRUE; if (view_mode == FULL_VIEW) update_tree(&rootmenu, NULL); else if (view_mode == SPLIT_VIEW) { update_tree(browsed, NULL); display_list(); } else if (view_mode == SINGLE_VIEW) display_tree_part(); //fixme: keep exp/coll break; case S_INT: case S_HEX: case S_STRING: default: break; }}static void toggle_sym_value(struct menu *menu){ if (!menu->sym) return; sym_toggle_tristate_value(menu->sym); if (view_mode == FULL_VIEW) update_tree(&rootmenu, NULL); else if (view_mode == SPLIT_VIEW) { update_tree(browsed, NULL); display_list(); } else if (view_mode == SINGLE_VIEW) display_tree_part(); //fixme: keep exp/coll}static void renderer_toggled(GtkCellRendererToggle * cell, gchar * path_string, gpointer user_data){ GtkTreePath *path, *sel_path = NULL; GtkTreeIter iter, sel_iter; GtkTreeSelection *sel; struct menu *menu; path = gtk_tree_path_new_from_string(path_string); if (!gtk_tree_model_get_iter(model2, &iter, path)) return; sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree2_w)); if (gtk_tree_selection_get_selected(sel, NULL, &sel_iter)) sel_path = gtk_tree_model_get_path(model2, &sel_iter); if (!sel_path) goto out1; if (gtk_tree_path_compare(path, sel_path)) goto out2; gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); toggle_sym_value(menu); out2: gtk_tree_path_free(sel_path); out1: gtk_tree_path_free(path);}static gint column2index(GtkTreeViewColumn * column){ gint i; for (i = 0; i < COL_NUMBER; i++) { GtkTreeViewColumn *col; col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), i); if (col == column) return i; } return -1;}/* User click: update choice (full) or goes down (single) */gbooleanon_treeview2_button_press_event(GtkWidget * widget, GdkEventButton * event, gpointer user_data){ GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; struct menu *menu; gint col;#if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK gint tx = (gint) event->x; gint ty = (gint) event->y; gint cx, cy; gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, &cy);#else gtk_tree_view_get_cursor(view, &path, &column);#endif if (path == NULL) return FALSE; if (!gtk_tree_model_get_iter(model2, &iter, path)) return FALSE; gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); col = column2index(column); if (event->type == GDK_2BUTTON_PRESS) { enum prop_type ptype; ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) { // goes down into menu current = menu; display_tree_part(); gtk_widget_set_sensitive(back_btn, TRUE); } else if ((col == COL_OPTION)) { toggle_sym_value(menu); gtk_tree_view_expand_row(view, path, TRUE); } } else { if (col == COL_VALUE) { toggle_sym_value(menu); gtk_tree_view_expand_row(view, path, TRUE); } else if (col == COL_NO || col == COL_MOD || col == COL_YES) { change_sym_value(menu, col); gtk_tree_view_expand_row(view, path, TRUE); } } return FALSE;}/* Key pressed: update choice */gbooleanon_treeview2_key_press_event(GtkWidget * widget, GdkEventKey * event, gpointer user_data){ GtkTreeView *view = GTK_TREE_VIEW(widget); GtkTreePath *path; GtkTreeViewColumn *column; GtkTreeIter iter; struct menu *menu; gint col; gtk_tree_view_get_cursor(view, &path, &column); if (path == NULL) return FALSE; if (event->keyval == GDK_space) { if (gtk_tree_view_row_expanded(view, path)) gtk_tree_view_collapse_row(view, path); else gtk_tree_view_expand_row(view, path, FALSE); return TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -