void fileExternallyModified(bool modified) const;
/// Block notifications of external modifications
- FileMonitorBlocker blockFileMonitor() { return file_monitor_->block(10); }
+ FileMonitorBlocker blockFileMonitor() { return file_monitor_->block(); }
private:
/// So we can force access via the accessors.
void Buffer::Impl::fileExternallyModified(bool modified) const
{
- if (modified)
+ if (modified) {
+ // prevent false positives, because FileMonitorBlocker is not enough on
+ // OSX.
+ if (filename.exists() && checksum_ == filename.checksum()) {
+ LYXERR(Debug::FILES, "External modification but "
+ "checksum unchanged: " << filename);
+ return;
+ }
lyx_clean = bak_clean = false;
+ }
externally_modified_ = modified;
if (wa_)
wa_->updateTitles();
/// absolute path being tracked
std::string const & filename() { return monitor_->filename(); }
/// Creates a guard that blocks notifications. Copyable. Notifications from
- /// this monitor are blocked as long as there are copies around.
+ /// this monitor are blocked as long as there are copies of the
+ /// FileMonitorBlocker around.
/// \param delay is the amount waited in ms after expiration of the guard
- /// before reconnecting. This delay thing is to deal with asynchronous
- /// notifications in a not so elegant fashion. But it can also be used to
- /// slow down incoming events.
+ /// before reconnecting. It can be used to slow down incoming events
+ /// accordingly. A value of 0 is still made asynchronous, because of the
+ /// fundamentally asynchronous nature of QFileSystemWatcher. To catch one's
+ /// own file operations, a value of 0 for delay is sufficient with the
+ /// inotify backend (e.g. Linux); for OSX (kqueue), a value of 100ms is
+ /// unsufficient and more tests need to be done in combination with
+ /// flushing/syncing to disk in order to understand how to catch one's own
+ /// operations reliably. No feedback from Windows yet. See
+ /// <https://www.mail-archive.com/lyx-devel@lists.lyx.org/msg200252.html>.
FileMonitorBlocker block(int delay = 0);
/// Make sure the good file is being monitored, after e.g. a move or a
/// deletion. See <https://bugreports.qt.io/browse/QTBUG-46483>. This is