]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
* There are cases where updateLabels is not called because no
[lyx.git] / src / Buffer.cpp
index 2c44c7f3c3e415529b220b461fe17418e914823a..83c182a99c66245abfa574b51dd3e5f986fab5e6 100644 (file)
 #include "support/types.h"
 #include "support/FileZipListDir.h"
 
-#if !defined (HAVE_FORK)
-# define fork() -1
-#endif
-
 #include <boost/bind.hpp>
 #include <boost/shared_ptr.hpp>
 
@@ -118,7 +114,7 @@ namespace os = support::os;
 
 namespace {
 
-int const LYX_FORMAT = 313; // Richard Heck: conversion of module representations
+int const LYX_FORMAT = 314; // Uwe Stöhr: scrlttr2 for serial letters
 
 } // namespace anon
 
@@ -1132,9 +1128,15 @@ void Buffer::writeLaTeXSource(odocstream & os,
        
        LYXERR(Debug::INFO, "preamble finished, now the body.");
 
+       // load children, if not already done. 
+       // This includes an updateMacro() call.
+       // Don't move this behind the parent_buffer=0 code below,
+       // because then the macros will not get the right "redefinition"
+       // flag as they don't see the parent macros which are output before.
+       loadChildDocuments();
+
        // fold macros if possible, still with parent buffer as the
        // macros will be put in the prefix anyway.
-       updateMacros();
        updateMacroInstances();
 
        // if we are doing a real file with body, even if this is the
@@ -1149,10 +1151,8 @@ void Buffer::writeLaTeXSource(odocstream & os,
                d->parent_buffer = 0;
        }
 
-       loadChildDocuments();
-
        // the real stuff
-       latexParagraphs(*this, paragraphs(), os, d->texrow, runparams);
+       latexParagraphs(*this, text(), os, d->texrow, runparams);
 
        // Restore the parenthood if needed
        if (output_preamble) {
@@ -2080,7 +2080,7 @@ void Buffer::writeParentMacros(odocstream & os) const
                MacroData const * data = 
                d->parent_buffer->getMacro(*it, *this, false);
                if (data)
-                       data->write(os, true);          
+                       data->write(os, true);  
        }
 }
 
@@ -2160,7 +2160,7 @@ void Buffer::getSourceCode(odocstream & os, pit_type par_begin,
                d->texrow.newline();
                // output paragraphs
                if (isLatex()) {
-                       latexParagraphs(*this, paragraphs(), os, d->texrow, runparams);
+                       latexParagraphs(*this, text(), os, d->texrow, runparams);
                } else {
                        // DocBook
                        docbookParagraphs(paragraphs(), *this, os, runparams);
@@ -2264,52 +2264,44 @@ private:
 };
 
 
-#if !defined (HAVE_FORK)
-# define fork() -1
-#endif
-
 int AutoSaveBuffer::generateChild()
 {
        // tmp_ret will be located (usually) in /tmp
        // will that be a problem?
+       // Note that this calls ForkedCalls::fork(), so it's
+       // ok cross-platform.
        pid_t const pid = fork();
        // If you want to debug the autosave
        // you should set pid to -1, and comment out the fork.
-       if (pid == 0 || pid == -1) {
-               // pid = -1 signifies that lyx was unable
-               // to fork. But we will do the save
-               // anyway.
-               bool failed = false;
-
-               FileName const tmp_ret = FileName::tempName("lyxauto");
-               if (!tmp_ret.empty()) {
-                       buffer_.writeFile(tmp_ret);
-                       // assume successful write of tmp_ret
-                       if (!tmp_ret.moveTo(fname_)) {
-                               failed = true;
-                               // most likely couldn't move between
-                               // filesystems unless write of tmp_ret
-                               // failed so remove tmp file (if it
-                               // exists)
-                               tmp_ret.removeFile();
-                       }
-               } else {
+       if (pid != 0 && pid != -1)
+               return pid;
+
+       // pid = -1 signifies that lyx was unable
+       // to fork. But we will do the save
+       // anyway.
+       bool failed = false;
+       FileName const tmp_ret = FileName::tempName("lyxauto");
+       if (!tmp_ret.empty()) {
+               buffer_.writeFile(tmp_ret);
+               // assume successful write of tmp_ret
+               if (!tmp_ret.moveTo(fname_))
                        failed = true;
-               }
-
-               if (failed) {
-                       // failed to write/rename tmp_ret so try writing direct
-                       if (!buffer_.writeFile(fname_)) {
-                               // It is dangerous to do this in the child,
-                               // but safe in the parent, so...
-                               if (pid == -1) // emit message signal.
-                                       buffer_.message(_("Autosave failed!"));
-                       }
-               }
-               if (pid == 0) { // we are the child so...
-                       _exit(0);
+       } else
+               failed = true;
+
+       if (failed) {
+               // failed to write/rename tmp_ret so try writing direct
+               if (!buffer_.writeFile(fname_)) {
+                       // It is dangerous to do this in the child,
+                       // but safe in the parent, so...
+                       if (pid == -1) // emit message signal.
+                               buffer_.message(_("Autosave failed!"));
                }
        }
+
+       if (pid == 0) // we are the child so...
+               _exit(0);
+
        return pid;
 }
 
@@ -2477,40 +2469,40 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir,
        if (!success)
                return false;
 
-       if (put_in_tempdir)
+       if (put_in_tempdir) {
                result_file = tmp_result_file.absFilename();
-       else {
-               result_file = changeExtension(absFileName(), ext);
-               // We need to copy referenced files (e. g. included graphics
-               // if format == "dvi") to the result dir.
-               vector<ExportedFile> const files =
-                       runparams.exportdata->externalFiles(format);
-               string const dest = onlyPath(result_file);
-               CopyStatus status = SUCCESS;
-               for (vector<ExportedFile>::const_iterator it = files.begin();
-                               it != files.end() && status != CANCEL; ++it) {
-                       string const fmt =
-                               formats.getFormatFromFile(it->sourceName);
-                       status = copyFile(fmt, it->sourceName,
-                                         makeAbsPath(it->exportName, dest),
-                                         it->exportName, status == FORCE);
-               }
-               if (status == CANCEL) {
-                       message(_("Document export cancelled."));
-               } else if (tmp_result_file.exists()) {
-                       // Finally copy the main file
-                       status = copyFile(format, tmp_result_file,
-                                         FileName(result_file), result_file,
-                                         status == FORCE);
-                       message(bformat(_("Document exported as %1$s "
-                                                              "to file `%2$s'"),
-                                               formats.prettyName(format),
-                                               makeDisplayPath(result_file)));
-               } else {
-                       // This must be a dummy converter like fax (bug 1888)
-                       message(bformat(_("Document exported as %1$s"),
-                                               formats.prettyName(format)));
-               }
+               return true;
+       }
+
+       result_file = changeExtension(absFileName(), ext);
+       // We need to copy referenced files (e. g. included graphics
+       // if format == "dvi") to the result dir.
+       vector<ExportedFile> const files =
+               runparams.exportdata->externalFiles(format);
+       string const dest = onlyPath(result_file);
+       CopyStatus status = SUCCESS;
+       for (vector<ExportedFile>::const_iterator it = files.begin();
+               it != files.end() && status != CANCEL; ++it) {
+               string const fmt = formats.getFormatFromFile(it->sourceName);
+               status = copyFile(fmt, it->sourceName,
+                       makeAbsPath(it->exportName, dest),
+                       it->exportName, status == FORCE);
+       }
+       if (status == CANCEL) {
+               message(_("Document export cancelled."));
+       } else if (tmp_result_file.exists()) {
+               // Finally copy the main file
+               status = copyFile(format, tmp_result_file,
+                       FileName(result_file), result_file,
+                       status == FORCE);
+               message(bformat(_("Document exported as %1$s "
+                       "to file `%2$s'"),
+                       formats.prettyName(format),
+                       makeDisplayPath(result_file)));
+       } else {
+               // This must be a dummy converter like fax (bug 1888)
+               message(bformat(_("Document exported as %1$s"),
+                       formats.prettyName(format)));
        }
 
        return true;