📄 preferences.c
字号:
thumb_max_width_c = thumb_max_width; thumb_max_height_c = thumb_max_height; }}static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *text){ GtkWidget *combo; gint current; gint last_w, last_h; gint i; gint c; thumb_max_width_c = thumb_max_width; thumb_max_height_c = thumb_max_height; pref_table_label(table, column, row, text, 0.0); combo = gtk_combo_box_new_text(); last_w = last_h = 0; current = -1; i = 0; c = TRUE; while (c) { gint w, h; w = thumb_size_list[i].w; h = thumb_size_list[i].h; if ( w > 0 && h > 0) { gchar *buf; buf = g_strdup_printf("%d x %d", w, h); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf); g_free(buf); if (w == thumb_max_width && h == thumb_max_height) current = i; last_w = w; last_h = h; } else { c = FALSE; } i++; } if (current == -1) { gchar *buf; buf = g_strdup_printf("%s %d x %d", _("Custom"), thumb_max_width, thumb_max_height); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf); g_free(buf); current = i - 1; } gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current); g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(thumb_size_menu_cb), NULL); gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1, GTK_EXPAND | GTK_FILL, FALSE, 0, 0); gtk_widget_show(combo);}static void filter_store_populate(void){ GList *work; if (!filter_store) return; gtk_list_store_clear(filter_store); work = filter_get_list(); while (work) { FilterEntry *fe; GtkTreeIter iter; fe = work->data; work = work->next; gtk_list_store_append(filter_store, &iter); gtk_list_store_set(filter_store, &iter, 0, fe, -1); }}static void filter_store_ext_edit_cb(GtkCellRendererText *cell, gchar *path_str, gchar *new_text, gpointer data){ GtkWidget *model = data; FilterEntry *fe = data; GtkTreePath *tpath; GtkTreeIter iter; if (!new_text || strlen(new_text) < 1) return; tpath = gtk_tree_path_new_from_string(path_str); gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); g_free(fe->extensions); fe->extensions = g_strdup(new_text); gtk_tree_path_free(tpath); filter_rebuild();}static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str, gchar *new_text, gpointer data){ GtkWidget *model = data; FilterEntry *fe; GtkTreePath *tpath; GtkTreeIter iter; if (!new_text || strlen(new_text) < 1) return; tpath = gtk_tree_path_new_from_string(path_str); gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); g_free(fe->description); fe->description = g_strdup(new_text); gtk_tree_path_free(tpath);}static void filter_store_enable_cb(GtkCellRendererToggle *renderer, gchar *path_str, gpointer data){ GtkWidget *model = data; FilterEntry *fe; GtkTreePath *tpath; GtkTreeIter iter; tpath = gtk_tree_path_new_from_string(path_str); gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath); gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1); fe->enabled = !fe->enabled; gtk_tree_path_free(tpath); filter_rebuild();}static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data){ FilterEntry *fe; gtk_tree_model_get(tree_model, iter, 0, &fe, -1); switch(GPOINTER_TO_INT(data)) { case FE_ENABLE: g_object_set(GTK_CELL_RENDERER(cell), "active", fe->enabled, NULL); break; case FE_EXTENSION: g_object_set(GTK_CELL_RENDERER(cell), "text", fe->extensions, NULL); break; case FE_DESCRIPTION: g_object_set(GTK_CELL_RENDERER(cell), "text", fe->description, NULL); break; }}static void filter_add_cb(GtkWidget *widget, gpointer data){ filter_add_unique("description", ".new", TRUE); filter_store_populate(); /* FIXME: implement the scroll to/select row stuff for tree view */}static void filter_remove_cb(GtkWidget *widget, gpointer data){ GtkWidget *filter_view = data; GtkTreeSelection *selection; GtkTreeIter iter; FilterEntry *fe; if (!filter_store) return; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view)); if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return; gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1); if (!fe) return; filter_remove_entry(fe); filter_rebuild(); filter_store_populate();}static void filter_default_ok_cb(GenericDialog *gd, gpointer data){ filter_reset(); filter_add_defaults(); filter_rebuild(); filter_store_populate();}static void dummy_cancel_cb(GenericDialog *gd, gpointer data){ /* no op, only so cancel button appears */}static void filter_default_cb(GtkWidget *widget, gpointer data){ GenericDialog *gd; gd = generic_dialog_new(_("Reset filters"), "GQview", "reset_filter", widget, TRUE, dummy_cancel_cb, NULL); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"), _("This will reset the file filters to the defaults.\nContinue?")); generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE); gtk_widget_show(gd->dialog);}static void filter_disable_cb(GtkWidget* widget, gpointer data){ GtkWidget *frame = data; gtk_widget_set_sensitive(frame, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));}static void editor_default_ok_cb(GenericDialog *gd, gpointer data){ gint i; editor_reset_defaults(); if (!configwindow) return; for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++) { gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]), (editor_name[i]) ? editor_name[i] : ""); gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), (editor_command[i]) ? editor_command[i] : ""); }}static void editor_default_cb(GtkWidget *widget, gpointer data){ GenericDialog *gd; gd = generic_dialog_new(_("Reset editors"), "GQview", "reset_filter", widget, TRUE, dummy_cancel_cb, NULL); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"), _("This will reset the edit commands to the defaults.\nContinue?")); generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, editor_default_ok_cb, TRUE); gtk_widget_show(gd->dialog);}static void editor_help_cb(GtkWidget *widget, gpointer data){ help_window_show("editors");}static void safe_delete_view_cb(GtkWidget* widget, gpointer data){ layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));}static void safe_delete_clear_ok_cb(GenericDialog *gd, gpointer data){ file_util_trash_clear();}static void safe_delete_clear_cb(GtkWidget* widget, gpointer data){ GenericDialog *gd; GtkWidget *entry; gd = generic_dialog_new(_("Clear trash"), "GQview", "clear_trash", widget, TRUE, dummy_cancel_cb, NULL); generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"), _("This will remove the trash contents.")); generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE); entry = gtk_entry_new(); GTK_WIDGET_UNSET_FLAGS(entry, GTK_CAN_FOCUS); gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE); if (safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), safe_delete_path); gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0); gtk_widget_show(entry); gtk_widget_show(gd->dialog);}static void config_window_create(void){ GtkWidget *win_vbox; GtkWidget *hbox; GtkWidget *notebook; GtkWidget *frame; GtkWidget *label; GtkWidget *vbox; GtkWidget *group; GtkWidget *subgroup; GtkWidget *button; GtkWidget *tabcomp; GtkWidget *ct_button; GtkWidget *table; GtkWidget *spin; GtkWidget *scrolled; GtkWidget *viewport; GtkWidget *filter_view; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreeViewColumn *column; gint i; configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG); g_signal_connect(G_OBJECT (configwindow), "delete_event", G_CALLBACK(config_window_delete), NULL); gtk_window_set_resizable(GTK_WINDOW(configwindow), FALSE); gtk_window_set_title(GTK_WINDOW(configwindow), _("GQview Preferences")); gtk_window_set_wmclass(GTK_WINDOW(configwindow), "config", "GQview"); gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER); window_set_icon(configwindow, (const gchar **)config_xpm, NULL); win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE); gtk_container_add(GTK_CONTAINER(configwindow), win_vbox); gtk_widget_show(win_vbox); hbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP); gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE, G_CALLBACK(config_window_ok_cb), NULL); gtk_container_add(GTK_CONTAINER(hbox), button); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_grab_default(button); gtk_widget_show(button); ct_button = button; button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE, G_CALLBACK(config_window_apply_cb), NULL); gtk_container_add(GTK_CONTAINER(hbox), button); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_show(button); button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE, G_CALLBACK(config_window_close_cb), NULL); gtk_container_add(GTK_CONTAINER(hbox), button); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_show(button); if (!generic_dialog_get_alternative_button_order(configwindow)) { gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1); } notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0); /* general options tab */ vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); gtk_widget_show(vbox); label = gtk_label_new(_("General")); gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label); group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL); button = pref_checkbox_new_int(group, _("Change to folder:"), startup_path_enable, &startup_path_enable_c); hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE); pref_checkbox_link_sensitivity(button, hbox); tabcomp = tab_completion_new(&startup_path_entry, startup_path, NULL, NULL); tab_completion_add_select_button(startup_path_entry, NULL, TRUE); gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0); gtk_widget_show(tabcomp); button = pref_button_new(hbox, NULL, _("Use current"), FALSE, G_CALLBACK(startup_path_set_current), NULL); group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL); table = pref_table_new(group, 2, 2, FALSE, FALSE); add_thumb_size_menu(table, 0, 0, _("Size:")); add_quality_menu(table, 0, 1, _("Quality:"), thumbnail_quality, &thumbnail_quality_c); ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"), enable_thumb_caching, &enable_thumb_caching_c); subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); pref_checkbox_link_sensitivity(ct_button, subgroup); button = pref_checkbox_new_int(subgroup, _("Use shared thumbnail cache"), thumbnail_spec_standard, &thumbnail_spec_standard_c); subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP); pref_checkbox_link_sensitivity_swap(button, subgroup); pref_checkbox_new_int(subgroup, _("Cache thumbnails into .thumbnails"), enable_thumb_dirs, &enable_thumb_dirs_c);#if 0 pref_checkbox_new_int(subgroup, _("Use xvpics thumbnails when found (read only)"), use_xvpics_thumbnails, &use_xvpics_thumbnails_c);#endif pref_checkbox_new_int(group, _("Faster jpeg thumbnailing (may reduce quality)"), thumbnail_fast, &thumbnail_fast_c); group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL); slideshow_delay_c = slideshow_delay; spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"), SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1, slideshow_delay ? (double)slideshow_delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0, G_CALLBACK(slideshow_delay_cb), NULL); gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS); pref_checkbox_new_int(group, _("Random"), slideshow_random, &slideshow_random_c); pref_checkbox_new_int(group, _("Repeat"), slideshow_repeat, &slideshow_repeat_c); /* image tab */ vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER); gtk_widget_show(vbox); label = gtk_label_new(_("Image")); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label); group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL);#if 0 add_dither_menu(dither_quality, &dither_quality_c, _("Dithering method:"), group);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -