X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fxo-file.c;h=a241df396e81d7f4819d473c2bfd507fc7d7a05b;hb=7210dbf830593e28677e77e3cad980804ad4f66f;hp=23678eb09a6589c5fd285a31d37a38eb2dce4ec3;hpb=162ca4d7cb693f9348f0ea478e7cfdf3c79cad6d;p=xournal.git diff --git a/src/xo-file.c b/src/xo-file.c index 23678eb..a241df3 100644 --- a/src/xo-file.c +++ b/src/xo-file.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "xournal.h" #include "xo-interface.h" @@ -81,6 +82,8 @@ gboolean save_journal(const char *filename) f = gzopen(filename, "w"); if (f==NULL) return FALSE; chk_attach_names(); + + setlocale(LC_NUMERIC, "C"); gzprintf(f, "\n" "Xournal document - see http://math.mit.edu/~auroux/software/xournal/\n" @@ -138,6 +141,7 @@ gboolean save_journal(const char *filename) tmpf = fopen(tmpfn, "w"); if (tmpf != NULL && fwrite(pdfbuf, 1, pdflen, tmpf) == pdflen) success = TRUE; + g_free(pdfbuf); fclose(tmpf); } if (!success) { @@ -178,6 +182,8 @@ gboolean save_journal(const char *filename) gzprintf(f, "\n"); } gzclose(f); + setlocale(LC_NUMERIC, ""); + return TRUE; } @@ -200,6 +206,13 @@ gboolean close_journal(void) use new_journal() to reinitialize them */ } +// sanitize a string containing floats, in case it may have , instead of . + +void cleanup_numeric(char *s) +{ + while (*s!=0) { if (*s==',') *s='.'; s++; } +} + // the XML parser functions for open_journal() struct Journal tmpJournal; @@ -252,13 +265,15 @@ void xoj_parser_start_element(GMarkupParseContext *context, while (*attribute_names!=NULL) { if (!strcmp(*attribute_names, "width")) { if (has_attr & 1) *error = xoj_invalid(); - tmpPage->width = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpPage->width = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 1; } else if (!strcmp(*attribute_names, "height")) { if (has_attr & 2) *error = xoj_invalid(); - tmpPage->height = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpPage->height = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 2; } @@ -373,7 +388,7 @@ void xoj_parser_start_element(GMarkupParseContext *context, else if (!strcmp(*attribute_names, "pageno")) { if (tmpPage->bg->type != BG_PDF || (has_attr & 32)) { *error = xoj_invalid(); return; } - tmpPage->bg->file_page_seq = strtod(*attribute_values, &ptr); + tmpPage->bg->file_page_seq = strtol(*attribute_values, &ptr, 10); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 32; } @@ -414,7 +429,8 @@ void xoj_parser_start_element(GMarkupParseContext *context, while (*attribute_names!=NULL) { if (!strcmp(*attribute_names, "width")) { if (has_attr & 1) *error = xoj_invalid(); - tmpItem->brush.thickness = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpItem->brush.thickness = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 1; } @@ -495,11 +511,12 @@ void xoj_parser_text(GMarkupParseContext *context, element_name = g_markup_parse_context_get_element(context); if (element_name == NULL) return; if (!strcmp(element_name, "stroke")) { + cleanup_numeric((gchar *)text); ptr = text; n = 0; while (text_len > 0) { realloc_cur_path(n/2 + 1); - ui.cur_path.coords[n] = strtod(text, (char **)(&ptr)); + ui.cur_path.coords[n] = g_ascii_strtod(text, (char **)(&ptr)); if (ptr == text) break; text_len -= (ptr - text); text = ptr; @@ -526,7 +543,7 @@ gboolean user_wants_second_chance(char **filename) if (response != GTK_RESPONSE_YES) return FALSE; 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_ACCEPT, NULL); + GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); filt_all = gtk_file_filter_new(); gtk_file_filter_set_name(filt_all, "All files"); @@ -537,7 +554,7 @@ gboolean user_wants_second_chance(char **filename) gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_pdf); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (dialog), filt_all); - if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_ACCEPT) { + if (gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy(dialog); return FALSE; } @@ -560,6 +577,7 @@ gboolean open_journal(char *filename) char buffer[1000]; int len; gchar *tmpfn; + gboolean maybe_pdf; f = gzopen(filename, "r"); if (f==NULL) return FALSE; @@ -575,10 +593,14 @@ gboolean open_journal(char *filename) tmpFilename = filename; error = NULL; tmpBg_pdf = NULL; + maybe_pdf = TRUE; while (valid && !gzeof(f)) { len = gzread(f, buffer, 1000); if (len<0) valid = FALSE; + if (maybe_pdf && len>=4 && !strncmp(buffer, "%PDF", 4)) + { valid = FALSE; break; } // most likely pdf + else maybe_pdf = FALSE; if (len<=0) break; valid = g_markup_parse_context_parse(context, buffer, len, &error); } @@ -586,9 +608,19 @@ gboolean open_journal(char *filename) if (valid) valid = g_markup_parse_context_end_parse(context, &error); if (tmpJournal.npages == 0) valid = FALSE; g_markup_parse_context_free(context); + if (!valid) { delete_journal(&tmpJournal); - return FALSE; + if (!maybe_pdf) return FALSE; + // essentially same as on_fileNewBackground from here on + ui.saved = TRUE; + close_journal(); + while (bgpdf.status != STATUS_NOT_INIT) gtk_main_iteration(); + new_journal(); + ui.zoom = DEFAULT_ZOOM; + gnome_canvas_set_pixels_per_unit(canvas, ui.zoom); + update_page_stuff(); + return init_bgpdf(filename, TRUE, DOMAIN_ABSOLUTE); } ui.saved = TRUE; // force close_journal() to do its job @@ -631,7 +663,7 @@ gboolean open_journal(char *filename) ui.cur_layer = (struct Layer *)(g_list_last(ui.cur_page->layers)->data); ui.saved = TRUE; ui.zoom = DEFAULT_ZOOM; - update_file_name(filename); + update_file_name(g_strdup(filename)); gnome_canvas_set_pixels_per_unit(canvas, ui.zoom); make_canvas_items(); update_page_stuff(); @@ -781,8 +813,11 @@ struct Background *attempt_screenshot_bg(void) void end_bgpdf_shutdown(void) { if (bgpdf.tmpdir!=NULL) { - g_unlink(bgpdf.tmpfile_copy); - g_free(bgpdf.tmpfile_copy); + if (bgpdf.tmpfile_copy!=NULL) { + g_unlink(bgpdf.tmpfile_copy); + g_free(bgpdf.tmpfile_copy); + bgpdf.tmpfile_copy = NULL; + } g_rmdir(bgpdf.tmpdir); g_free(bgpdf.tmpdir); bgpdf.tmpdir = NULL; @@ -1006,16 +1041,18 @@ gboolean init_bgpdf(char *pdfname, gboolean create_pages, int file_domain) gsize filelen; if (bgpdf.status != STATUS_NOT_INIT) return FALSE; + bgpdf.tmpfile_copy = NULL; bgpdf.tmpdir = mkdtemp(g_strdup(TMPDIR_TEMPLATE)); if (!bgpdf.tmpdir) return FALSE; // make a local copy and check if it's a PDF - if (!g_file_get_contents(pdfname, &filebuf, &filelen, NULL)) return FALSE; + if (!g_file_get_contents(pdfname, &filebuf, &filelen, NULL)) + { end_bgpdf_shutdown(); return FALSE; } if (filelen < 4 || strncmp(filebuf, "%PDF", 4)) - { g_free(filebuf); return FALSE; } + { g_free(filebuf); end_bgpdf_shutdown(); return FALSE; } bgpdf.tmpfile_copy = g_strdup_printf("%s/bg.pdf", bgpdf.tmpdir); f = fopen(bgpdf.tmpfile_copy, "w"); if (f == NULL || fwrite(filebuf, 1, filelen, f) != filelen) - { g_free(filebuf); return FALSE; } + { g_free(filebuf); end_bgpdf_shutdown(); return FALSE; } fclose(f); g_free(filebuf); bgpdf.status = STATUS_IDLE; @@ -1087,3 +1124,93 @@ void bgpdf_update_bg(int pageno, struct BgPdfPage *bgpg) } } +// initialize the recent files list +void init_mru(void) +{ + int i; + gsize lfptr; + char s[5]; + GIOChannel *f; + gchar *str; + GIOStatus status; + + g_strlcpy(s, "mru0", 5); + for (s[3]='0', i=0; i0) { + str[lfptr] = 0; + ui.mru[i] = str; + i++; + } + } + if (f) { + g_io_channel_shutdown(f, FALSE, NULL); + g_io_channel_unref(f); + } + update_mru_menu(); +} + +void update_mru_menu(void) +{ + int i; + gboolean anyone = FALSE; + + for (i=0; i=1; j--) ui.mru[j] = ui.mru[j-1]; + ui.mru[0] = g_strdup(name); + update_mru_menu(); +} + +void delete_mru_entry(int which) +{ + int i; + + if (ui.mru[which]!=NULL) g_free(ui.mru[which]); + for (i=which+1;i