📄 xo-callbacks.c
字号:
#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <math.h>#include <string.h>#include <gtk/gtk.h>#include <libgnomecanvas/libgnomecanvas.h>#include <time.h>#include <libgnomeprintui/gnome-print-dialog.h>#include <glib/gstdio.h>#include "xournal.h"#include "xo-callbacks.h"#include "xo-interface.h"#include "xo-support.h"#include "xo-misc.h"#include "xo-file.h"#include "xo-paint.h"#include "xo-print.h"voidon_fileNew_activate (GtkMenuItem *menuitem, gpointer user_data){ end_text(); reset_focus(); if (close_journal()) { new_journal(); ui.zoom = ui.startup_zoom; update_page_stuff(); gtk_adjustment_set_value(gtk_layout_get_vadjustment(GTK_LAYOUT(canvas)), 0); gnome_canvas_set_pixels_per_unit(canvas, ui.zoom); }}voidon_fileNewBackground_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *dialog, *attach_opt; GtkFileFilter *filt_all, *filt_pdf; char *filename; int file_domain; gboolean success; end_text(); reset_focus(); if (!ok_to_close()) return; // user aborted on save confirmation dialog = gtk_file_chooser_dialog_new("Open PDF", GTK_WINDOW (winMain), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); filt_all = gtk_file_filter_new(); gtk_file_filter_set_name(filt_all, "All files"); gtk_file_filter_add_pattern(filt_all, "*"); filt_pdf = gtk_file_filter_new(); gtk_file_filter_set_name(filt_pdf, "PDF files"); gtk_file_filter_add_pattern(filt_pdf, "*.pdf"); gtk_file_filter_add_pattern(filt_pdf, "*.PDF"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_pdf); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_all); if (ui.default_path!=NULL) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path); attach_opt = gtk_check_button_new_with_label("Attach file to the journal"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(attach_opt), FALSE); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER (dialog), attach_opt); if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy(dialog); return; } filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(attach_opt))) file_domain = DOMAIN_ATTACH; else file_domain = DOMAIN_ABSOLUTE; gtk_widget_destroy(dialog); set_cursor_busy(TRUE); ui.saved = TRUE; // force close_journal to work close_journal(); while (bgpdf.status != STATUS_NOT_INIT) { // waiting for pdf processes to finish dying gtk_main_iteration(); } new_journal(); ui.zoom = ui.startup_zoom; gnome_canvas_set_pixels_per_unit(canvas, ui.zoom); update_page_stuff(); success = init_bgpdf(filename, TRUE, file_domain); set_cursor_busy(FALSE); if (success) { g_free(filename); return; } /* open failed */ dialog = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error opening file '%s'", filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(filename);}voidon_fileOpen_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *dialog; GtkFileFilter *filt_all, *filt_xoj; char *filename; gboolean success; end_text(); reset_focus(); if (!ok_to_close()) return; // user aborted on save confirmation dialog = gtk_file_chooser_dialog_new("Open Journal", GTK_WINDOW (winMain), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); filt_all = gtk_file_filter_new(); gtk_file_filter_set_name(filt_all, "All files"); gtk_file_filter_add_pattern(filt_all, "*"); filt_xoj = gtk_file_filter_new(); gtk_file_filter_set_name(filt_xoj, "Xournal files"); gtk_file_filter_add_pattern(filt_xoj, "*.xoj"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_xoj); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_all); if (ui.default_path!=NULL) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path); if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy(dialog); return; } filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_widget_destroy(dialog); set_cursor_busy(TRUE); success = open_journal(filename); set_cursor_busy(FALSE); if (success) { g_free(filename); return; } /* open failed */ dialog = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error opening file '%s'", filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(filename);}voidon_fileSave_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *dialog; end_text(); reset_focus(); if (ui.filename == NULL) { on_fileSaveAs_activate(menuitem, user_data); return; } set_cursor_busy(TRUE); if (save_journal(ui.filename)) { // success set_cursor_busy(FALSE); ui.saved = TRUE; return; } set_cursor_busy(FALSE); /* save failed */ dialog = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error saving file '%s'", ui.filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog);}voidon_fileSaveAs_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *dialog, *warning_dialog; GtkFileFilter *filt_all, *filt_xoj; char *filename; char stime[30]; time_t curtime; gboolean warn; struct stat stat_buf; end_text(); reset_focus(); dialog = gtk_file_chooser_dialog_new("Save Journal", GTK_WINDOW (winMain), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); if (ui.filename!=NULL) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER (dialog), ui.filename); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), g_basename(ui.filename)); } else if (bgpdf.status!=STATUS_NOT_INIT && bgpdf.file_domain == DOMAIN_ABSOLUTE && bgpdf.filename != NULL) { filename = g_strdup_printf("%s.xoj", bgpdf.filename->s); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER (dialog), filename); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), g_basename(filename)); g_free(filename); } else { curtime = time(NULL); strftime(stime, 30, "%F-Note-%H-%M.xoj", localtime(&curtime)); if (ui.default_path!=NULL) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), stime); } filt_all = gtk_file_filter_new(); gtk_file_filter_set_name(filt_all, "All files"); gtk_file_filter_add_pattern(filt_all, "*"); filt_xoj = gtk_file_filter_new(); gtk_file_filter_set_name(filt_xoj, "Xournal files"); gtk_file_filter_add_pattern(filt_xoj, "*.xoj"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_xoj); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_all); // somehow this doesn't seem to be set by default gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); do { if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy(dialog); return; } filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); warn = g_file_test (filename, G_FILE_TEST_EXISTS); if (warn) { // ok to overwrite an empty file if (!g_stat(filename, &stat_buf)) if (stat_buf.st_size == 0) warn=FALSE; } if (warn && ui.filename!=NULL) { // ok to overwrite oneself if (ui.filename[0]=='/' && !strcmp(ui.filename, filename)) warn=FALSE; if (ui.filename[0]!='/' && g_str_has_suffix(filename, ui.filename)) warn=FALSE; } if (warn) { warning_dialog = gtk_message_dialog_new(GTK_WINDOW(winMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Should the file %s be overwritten?", filename); if (gtk_dialog_run(GTK_DIALOG(warning_dialog)) == GTK_RESPONSE_YES) warn = FALSE; gtk_widget_destroy(warning_dialog); } } while (warn); gtk_widget_destroy(dialog); set_cursor_busy(TRUE); if (save_journal(filename)) { // success ui.saved = TRUE; set_cursor_busy(FALSE); update_file_name(filename); return; } set_cursor_busy(FALSE); /* save failed */ dialog = gtk_message_dialog_new(GTK_WINDOW (winMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Error saving file '%s'", filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(filename);}voidon_filePrintOptions_activate (GtkMenuItem *menuitem, gpointer user_data){}voidon_filePrint_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *printDialog, *preview; GnomePrintJob *gpj; int fromPage, toPage; int response; char *in_fn; guchar *s; GnomePrintConfig *config = gnome_print_config_default(); end_text(); reset_focus(); if (ui.filename!=NULL) { if (g_str_has_suffix(ui.filename, ".xoj")) { in_fn = g_strdup(ui.filename); g_strlcpy(g_strrstr(in_fn, "xoj"), "pdf", 4); } else in_fn = g_strdup_printf("%s.pdf", ui.filename); gnome_print_config_set(config, (guchar *)"Printer", (guchar *)"PDF"); gnome_print_config_set(config, (guchar *)GNOME_PRINT_KEY_OUTPUT_FILENAME, (guchar *)in_fn); gnome_print_config_set(config, (guchar *)"Settings.Transport.Backend.FileName", (guchar *)in_fn); g_strlcpy(g_strrstr(in_fn, "pdf"), "ps", 3); gnome_print_config_set(config, (guchar *)"Printer", (guchar *)"GENERIC"); gnome_print_config_set (config, (guchar *)GNOME_PRINT_KEY_OUTPUT_FILENAME, (guchar *)in_fn); s = gnome_print_config_get(config, (guchar *)"Settings.Transport.Backend.FileName"); if (s != NULL) { g_free(s); gnome_print_config_set(config, (guchar *)"Settings.Transport.Backend.FileName", (guchar *)in_fn); } g_free(in_fn); } gpj = gnome_print_job_new(config); /* was NULL */ gnome_print_config_unref(config);/* end */ printDialog = gnome_print_dialog_new(gpj, (guchar *)"Print", GNOME_PRINT_DIALOG_RANGE); gnome_print_dialog_construct_range_page(GNOME_PRINT_DIALOG(printDialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_RANGE, 1, journal.npages, (guchar *)"Current page", (guchar *)"Pages"); /* don't have "Current page" as option, else it becomes the default!! */ gtk_dialog_set_response_sensitive(GTK_DIALOG(printDialog), GNOME_PRINT_DIALOG_RESPONSE_PREVIEW, FALSE); /* the print-job-preview "feature" is completely, hopelessly broken */ response = gtk_dialog_run(GTK_DIALOG(printDialog)); if (response <= 0) { gtk_widget_destroy(printDialog); return; }/* if (response == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW) { print_job_render(gpj, 0, journal.npages-1); gtk_widget_destroy(printDialog); preview = gnome_print_job_preview_new(gpj, (guchar *)"Preview"); try_fix_print_preview_ui(preview); gtk_window_set_modal(GTK_WINDOW(preview), TRUE); gtk_widget_show_all(preview); }*/ if (response == GNOME_PRINT_DIALOG_RESPONSE_PRINT) { switch(gnome_print_dialog_get_range(GNOME_PRINT_DIALOG(printDialog))) { case GNOME_PRINT_RANGE_RANGE: gnome_print_dialog_get_range_page(GNOME_PRINT_DIALOG(printDialog), &fromPage, &toPage); fromPage--; toPage--; break; default: fromPage = 0; toPage = journal.npages-1; } gtk_widget_destroy(printDialog); print_job_render(gpj, fromPage, toPage); }}voidon_filePrintPDF_activate (GtkMenuItem *menuitem, gpointer user_data){ GtkWidget *dialog, *warning_dialog; GtkFileFilter *filt_all, *filt_pdf; char *filename, *in_fn; char stime[30]; time_t curtime; int response; gboolean warn; end_text(); reset_focus(); dialog = gtk_file_chooser_dialog_new("Export to PDF", GTK_WINDOW (winMain), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); if (ui.filename!=NULL) { if (g_str_has_suffix(ui.filename, ".xoj")) { in_fn = g_strdup(ui.filename); g_strlcpy(g_strrstr(in_fn, "xoj"), "pdf", 4); } else in_fn = g_strdup_printf("%s.pdf", ui.filename); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER (dialog), in_fn); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), g_basename(in_fn)); } else { curtime = time(NULL); strftime(stime, 30, "%F-Note-%H-%M.pdf", localtime(&curtime)); if (ui.default_path!=NULL) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), ui.default_path); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (dialog), stime); in_fn = NULL; } filt_all = gtk_file_filter_new(); gtk_file_filter_set_name(filt_all, "All files"); gtk_file_filter_add_pattern(filt_all, "*"); filt_pdf = gtk_file_filter_new(); gtk_file_filter_set_name(filt_pdf, "PDF files"); gtk_file_filter_add_pattern(filt_pdf, "*.pdf"); gtk_file_filter_add_pattern(filt_pdf, "*.PDF"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_pdf); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_all);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -