#include <math.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
+#include <locale.h>
#include "xournal.h"
#include "xo-interface.h"
f = gzopen(filename, "w");
if (f==NULL) return FALSE;
chk_attach_names();
+
+ setlocale(LC_NUMERIC, "C");
gzprintf(f, "<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<title>Xournal document - see http://math.mit.edu/~auroux/software/xournal/</title>\n"
tmpf = fopen(tmpfn, "w");
if (tmpf != NULL && fwrite(pdfbuf, 1, pdflen, tmpf) == pdflen)
success = TRUE;
+ g_free(pdfbuf);
fclose(tmpf);
}
if (!success) {
gzprintf(f, "</page>\n");
}
gzclose(f);
+ setlocale(LC_NUMERIC, "");
+
return TRUE;
}
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;
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;
}
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;
}
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;
}
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;
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");
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;
}
}
}
+// 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; i<MRU_SIZE; s[3]++, i++) {
+ ui.mrumenu[i] = GET_COMPONENT(s);
+ ui.mru[i] = NULL;
+ }
+ f = g_io_channel_new_file(ui.mrufile, "r", NULL);
+ if (f) status = G_IO_STATUS_NORMAL;
+ else status = G_IO_STATUS_ERROR;
+ i = 0;
+ while (status == G_IO_STATUS_NORMAL && i<MRU_SIZE) {
+ lfptr = 0;
+ status = g_io_channel_read_line(f, &str, NULL, &lfptr, NULL);
+ if (status == G_IO_STATUS_NORMAL && lfptr>0) {
+ 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<MRU_SIZE; i++) {
+ if (ui.mru[i]!=NULL) {
+ gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(ui.mrumenu[i]))),
+ g_basename(ui.mru[i]));
+ gtk_widget_show(ui.mrumenu[i]);
+ anyone = TRUE;
+ }
+ else gtk_widget_hide(ui.mrumenu[i]);
+ }
+ gtk_widget_set_sensitive(GET_COMPONENT("fileRecentFiles"), anyone);
+}
+
+void new_mru_entry(char *name)
+{
+ int i, j;
+
+ for (i=0;i<MRU_SIZE;i++)
+ if (ui.mru[i]!=NULL && !strcmp(ui.mru[i], name)) {
+ g_free(ui.mru[i]);
+ for (j=i+1; j<MRU_SIZE; j++) ui.mru[j-1] = ui.mru[j];
+ ui.mru[MRU_SIZE-1]=NULL;
+ }
+ if (ui.mru[MRU_SIZE-1]!=NULL) g_free(ui.mru[MRU_SIZE-1]);
+ for (j=MRU_SIZE-1; j>=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<MRU_SIZE;i++)
+ ui.mru[i-1] = ui.mru[i];
+ ui.mru[MRU_SIZE-1] = NULL;
+ update_mru_menu();
+}
+
+void save_mru_list(void)
+{
+ FILE *f;
+ int i;
+
+ f = fopen(ui.mrufile, "w");
+ if (f==NULL) return;
+ for (i=0; i<MRU_SIZE; i++)
+ if (ui.mru[i]!=NULL) fprintf(f, "%s\n", ui.mru[i]);
+ fclose(f);
+}