aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/composewindow.cpp8
-rw-r--r--src/composewindow.h14
-rw-r--r--src/mainwindow.cpp18
3 files changed, 40 insertions, 0 deletions
diff --git a/src/composewindow.cpp b/src/composewindow.cpp
index 218edef..59228ba 100644
--- a/src/composewindow.cpp
+++ b/src/composewindow.cpp
@@ -1616,6 +1616,14 @@ void ComposeWindow::send()
if (!filed.ok()) {
sentCopyFailed = true;
sentCopyError = filed.error;
+ } else {
+ // Item 192. The Sent view queries the INDEX, so a file
+ // notmuch has not seen is invisible there until the next
+ // sync. The path was previously discarded, which is why a
+ // message just sent did not appear: measured as 65 files
+ // against 64 indexed. Only on the success branch, since
+ // indexing a path that was never written leaves a ghost.
+ emit sentCopyFiled(filed.path);
}
}
diff --git a/src/composewindow.h b/src/composewindow.h
index 87b105a..09b47de 100644
--- a/src/composewindow.h
+++ b/src/composewindow.h
@@ -190,6 +190,20 @@ signals:
/// \p path is the file that was removed, absolute.
void draftRemoved(const QString &path);
+ /// The sent copy was filed, so it must be indexed at once.
+ ///
+ /// Item 192. The Sent view is a `path:` query over the INDEX rather than a
+ /// directory listing, so a correctly written file notmuch has never seen
+ /// is invisible there until the next `notmuch new`, which is a cron tick
+ /// away. This is item 158's rule for drafts applied to the other half of
+ /// the send: that half already emits draftRemoved() so the draft's entry
+ /// goes, while nothing added the sent copy's.
+ ///
+ /// \p path is the file just written, absolute. Emitted ONLY when the write
+ /// succeeded: announcing a path that was never written would put a ghost
+ /// in the index.
+ void sentCopyFiled(const QString &path);
+
/// A send succeeded, and the message it answers should record that.
///
/// Item 68. \p sourceMessageId is the Message-ID of the message replied to
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 6c6bc23..abc7875 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1277,6 +1277,24 @@ void MainWindow::openComposer(const ComposeContext &context)
connect(composer, &ComposeWindow::draftRemoved, m_worker,
&NotmuchWorker::removeIndexedFile);
+ // And the sent copy must be indexed at once, for the same reason a draft
+ // is (item 192): the Sent view is a path query over the index, so a file
+ // notmuch has not seen is invisible there until the next sync. This half
+ // was missing while the draft REMOVAL above was already wired.
+ //
+ // indexDraftFile despite the name: it calls notmuch_database_index_file
+ // and applies nothing draft-specific, and its previousPath defaults to
+ // empty, which is exactly right for a sent copy that replaces nothing.
+ // A lambda rather than a direct slot connection, because indexDraftFile
+ // takes two arguments and the signal carries one; a default argument does
+ // not fill the gap across a connect(). The lambda's context object is
+ // m_worker, so it RUNS ON THE WORKER'S THREAD: notmuch never touches the
+ // GUI thread, which is the boundary the whole design rests on.
+ connect(composer, &ComposeWindow::sentCopyFiled, m_worker,
+ [this](const QString &path) {
+ m_worker->indexDraftFile(path);
+ });
+
// Item 68. The R and P Maildir flags, on the message the send answered.
//
// sendMessageTagChange, NOT tagSelected: this deliberately does not go on