]> git.donarmstrong.com Git - xournal.git/blobdiff - src/xo-file.c
add Dutch translation
[xournal.git] / src / xo-file.c
index 00075f4e51329f9c2bb430aeceb41113d6ba8b38..fd797110d5e550dd29ca69ea9762fcdc432fb52e 100644 (file)
 #include <libgnomecanvas/libgnomecanvas.h>
 #include <zlib.h>
 #include <math.h>
-#include <gdk/gdkx.h>
-#include <X11/Xlib.h>
 #include <locale.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <poppler/glib/poppler.h>
 
+#ifndef WIN32
+ #include <gdk/gdkx.h>
+ #include <X11/Xlib.h>
+#endif
+
 #include "xournal.h"
 #include "xo-interface.h"
 #include "xo-support.h"
@@ -83,7 +86,7 @@ gboolean save_journal(const char *filename)
   GList *pagelist, *layerlist, *itemlist, *list;
   GtkWidget *dialog;
   
-  f = gzopen(filename, "w");
+  f = gzopen(filename, "wb");
   if (f==NULL) return FALSE;
   chk_attach_names();
 
@@ -143,7 +146,7 @@ gboolean save_journal(const char *filename)
           success = FALSE;
           if (bgpdf.status != STATUS_NOT_INIT && bgpdf.file_contents != NULL)
           {
-            tmpf = fopen(tmpfn, "w");
+            tmpf = fopen(tmpfn, "wb");
             if (tmpf != NULL && fwrite(bgpdf.file_contents, 1, bgpdf.file_length, tmpf) == bgpdf.file_length)
               success = TRUE;
             fclose(tmpf);
@@ -196,7 +199,9 @@ gboolean save_journal(const char *filename)
           else
             gzprintf(f, "#%08x", item->brush.color_rgba);
           tmpstr = g_markup_escape_text(item->text, -1);
-          gzprintf(f, "\">%s</text>\n", tmpstr);
+          gzputs(f, "\">");
+          gzputs(f, tmpstr); // gzprintf() can't handle > 4095 bytes
+          gzputs(f, "</text>\n");
           g_free(tmpstr);
         }
       }
@@ -665,7 +670,10 @@ gboolean user_wants_second_chance(char **filename)
   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);
-
+#ifdef FILE_DIALOG_SIZE_BUGFIX
+  gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 400);
+#endif
+  
   filt_all = gtk_file_filter_new();
   gtk_file_filter_set_name(filt_all, _("All files"));
   gtk_file_filter_add_pattern(filt_all, "*");
@@ -675,6 +683,8 @@ 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 (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 FALSE;
@@ -697,11 +707,25 @@ gboolean open_journal(char *filename)
   gzFile f;
   char buffer[1000];
   int len;
-  gchar *tmpfn;
+  gchar *tmpfn, *tmpfn2, *p, *q;
   gboolean maybe_pdf;
   
-  f = gzopen(filename, "r");
+  tmpfn = g_strdup_printf("%s.xoj", filename);
+  if (ui.autoload_pdf_xoj && g_file_test(tmpfn, G_FILE_TEST_EXISTS) &&
+      (g_str_has_suffix(filename, ".pdf") || g_str_has_suffix(filename, ".PDF")))
+  {
+    valid = open_journal(tmpfn);
+    g_free(tmpfn);
+    return valid;
+  }
+  g_free(tmpfn);
+
+  f = gzopen(filename, "rb");
   if (f==NULL) return FALSE;
+  if (filename[0]=='/') {
+    if (ui.default_path != NULL) g_free(ui.default_path);
+    ui.default_path = g_path_get_dirname(filename);
+  }
   
   context = g_markup_parse_context_new(&parser, 0, NULL, NULL);
   valid = TRUE;
@@ -756,7 +780,21 @@ gboolean open_journal(char *filename)
     else
       tmpfn = g_strdup(tmpBg_pdf->filename->s);
     valid = init_bgpdf(tmpfn, FALSE, tmpBg_pdf->file_domain);
-    // in case the file name became invalid
+    // if file name is invalid: first try in xoj file's directory
+    if (!valid && tmpBg_pdf->file_domain != DOMAIN_ATTACH) {
+      p = g_path_get_dirname(filename);
+      q = g_path_get_basename(tmpfn);
+      tmpfn2 = g_strdup_printf("%s/%s", p, q);
+      g_free(p); g_free(q);
+      valid = init_bgpdf(tmpfn2, FALSE, tmpBg_pdf->file_domain);
+      if (valid) {  // change the file name...
+        printf("substituting %s -> %s\n", tmpfn, tmpfn2);
+        g_free(tmpBg_pdf->filename->s);
+        tmpBg_pdf->filename->s = tmpfn2;
+      }
+      else g_free(tmpfn2);
+    }
+    // if file name is invalid: next prompt user
     if (!valid && tmpBg_pdf->file_domain != DOMAIN_ATTACH)
       if (user_wants_second_chance(&tmpfn)) {
         valid = init_bgpdf(tmpfn, FALSE, tmpBg_pdf->file_domain);
@@ -831,7 +869,7 @@ GList *attempt_load_gv_bg(char *filename)
   char *pipename;
   int buflen, remnlen, file_pageno;
   
-  f = fopen(filename, "r");
+  f = fopen(filename, "rb");
   if (f == NULL) return NULL;
   buf = g_malloc(BUFSIZE); // a reasonable buffer size
   if (fread(buf, 1, 4, f) !=4 ||
@@ -843,7 +881,7 @@ GList *attempt_load_gv_bg(char *filename)
   
   fclose(f);
   pipename = g_strdup_printf(GS_CMDLINE, (double)GS_BITMAP_DPI, filename);
-  gs_pipe = popen(pipename, "r");
+  gs_pipe = popen(pipename, "rb");
   g_free(pipename);
   
   bg_list = NULL;
@@ -889,6 +927,7 @@ GList *attempt_load_gv_bg(char *filename)
 
 struct Background *attempt_screenshot_bg(void)
 {
+#ifndef WIN32
   struct Background *bg;
   GdkPixbuf *pix;
   XEvent x_event;
@@ -925,6 +964,10 @@ struct Background *attempt_screenshot_bg(void)
   bg->filename = new_refstring(NULL);
   bg->file_domain = DOMAIN_ATTACH;
   return bg;
+#else
+  // not implemented under WIN32
+  return FALSE;
+#endif
 }
 
 /************** pdf annotation ***************/
@@ -1012,13 +1055,13 @@ gboolean bgpdf_scheduler_callback(gpointer data)
 
 /* make a request */
 
-void add_bgpdf_request(int pageno, double zoom)
+gboolean add_bgpdf_request(int pageno, double zoom)
 {
   struct BgPdfRequest *req, *cmp_req;
   GList *list;
-  
+
   if (bgpdf.status == STATUS_NOT_INIT)
-    return; // don't accept requests
+    return FALSE; // don't accept requests
   req = g_new(struct BgPdfRequest, 1);
   req->pageno = pageno;
   req->dpi = 72*zoom;
@@ -1034,6 +1077,7 @@ void add_bgpdf_request(int pageno, double zoom)
   // make the request
   bgpdf.requests = g_list_append(bgpdf.requests, req);
   if (!bgpdf.pid) bgpdf.pid = g_idle_add(bgpdf_scheduler_callback, NULL);
+  return TRUE;
 }
 
 /* shutdown the PDF reader */
@@ -1082,6 +1126,7 @@ gboolean init_bgpdf(char *pdfname, gboolean create_pages, int file_domain)
   struct Page *pg;
   PopplerPage *pdfpage;
   gdouble width, height;
+  gchar *uri;
   
   if (bgpdf.status != STATUS_NOT_INIT) return FALSE;
   
@@ -1101,8 +1146,17 @@ gboolean init_bgpdf(char *pdfname, gboolean create_pages, int file_domain)
   bgpdf.pid = 0;
   bgpdf.has_failed = FALSE;
 
-  bgpdf.document = poppler_document_new_from_data(bgpdf.file_contents, bgpdf.file_length, NULL, NULL);
-  if (bgpdf.document == NULL) shutdown_bgpdf();
+/* poppler_document_new_from_data() starts at 0.6.1, but we want to
+   be compatible with poppler 0.5.4 = latest in CentOS as of sept 2009 */
+  uri = g_filename_to_uri(pdfname, NULL, NULL);
+  if (!uri) uri = g_strdup_printf("file://%s", pdfname);
+  bgpdf.document = poppler_document_new_from_file(uri, NULL, NULL);
+  g_free(uri);
+/*    with poppler 0.6.1 or later, can replace the above 4 lines by:
+  bgpdf.document = poppler_document_new_from_data(bgpdf.file_contents, 
+                          bgpdf.file_length, NULL, NULL);
+*/
+  if (bgpdf.document == NULL) { shutdown_bgpdf(); return FALSE; }
   
   if (pdfname[0]=='/' && ui.filename == NULL) {
     if (ui.default_path!=NULL) g_free(ui.default_path);
@@ -1300,6 +1354,7 @@ void init_config_default(void)
   ui.width_minimum_multiplier = 0.0;
   ui.width_maximum_multiplier = 1.25;
   ui.button_switch_mapping = FALSE;
+  ui.autoload_pdf_xoj = FALSE;
   
   // the default UI vertical order
   ui.vertical_order[0][0] = 1; 
@@ -1432,6 +1487,9 @@ void save_config_to_file(void)
   update_keyval("general", "buttons_switch_mappings",
     _(" buttons 2 and 3 switch mappings instead of drawing (useful for some tablets) (true/false)"),
     g_strdup(ui.button_switch_mapping?"true":"false"));
+  update_keyval("general", "autoload_pdf_xoj",
+    _(" automatically load filename.pdf.xoj instead of filename.pdf (true/false)"),
+    g_strdup(ui.autoload_pdf_xoj?"true":"false"));
   update_keyval("general", "default_path",
     _(" default path for open/save (leave blank for current directory)"),
     g_strdup((ui.default_path!=NULL)?ui.default_path:""));
@@ -1815,6 +1873,7 @@ void load_config_from_file(void)
   parse_keyval_boolean("general", "discard_corepointer", &ui.discard_corepointer);
   parse_keyval_boolean("general", "use_erasertip", &ui.use_erasertip);
   parse_keyval_boolean("general", "buttons_switch_mappings", &ui.button_switch_mapping);
+  parse_keyval_boolean("general", "autoload_pdf_xoj", &ui.autoload_pdf_xoj);
   parse_keyval_string("general", "default_path", &ui.default_path);
   parse_keyval_boolean("general", "pressure_sensitivity", &ui.pressure_sensitivity);
   parse_keyval_float("general", "width_minimum_multiplier", &ui.width_minimum_multiplier, 0., 10.);