about summary refs log tree commit diff stats
path: root/worker/maildir
diff options
context:
space:
mode:
Diffstat (limited to 'worker/maildir')
-rw-r--r--worker/maildir/worker.go71
1 files changed, 55 insertions, 16 deletions
diff --git a/worker/maildir/worker.go b/worker/maildir/worker.go
index 3e59da6..597e0d2 100644
--- a/worker/maildir/worker.go
+++ b/worker/maildir/worker.go
@@ -23,10 +23,11 @@ var errUnsupported = fmt.Errorf("unsupported command")
 
 // A Worker handles interfacing between aerc's UI and a group of maildirs.
 type Worker struct {
-	c        *Container
-	selected *maildir.Dir
-	worker   *types.Worker
-	watcher  *fsnotify.Watcher
+	c            *Container
+	selected     *maildir.Dir
+	selectedName string
+	worker       *types.Worker
+	watcher      *fsnotify.Watcher
 }
 
 // NewWorker creates a new maildir worker with the provided worker.
@@ -75,7 +76,7 @@ func (w *Worker) handleFSEvent(ev fsnotify.Event) {
 	if w.selected == nil {
 		return
 	}
-	_, err := w.selected.Unseen()
+	newUnseen, err := w.selected.Unseen()
 	if err != nil {
 		w.worker.Logger.Printf("could not move new to cur : %v", err)
 		return
@@ -88,6 +89,11 @@ func (w *Worker) handleFSEvent(ev fsnotify.Event) {
 	w.worker.PostMessage(&types.DirectoryContents{
 		Uids: uids,
 	}, nil)
+	dirInfo := w.getDirectoryInfo()
+	dirInfo.Recent = len(newUnseen)
+	w.worker.PostMessage(&types.DirectoryInfo{
+		Info: dirInfo,
+	}, nil)
 }
 
 func (w *Worker) done(msg types.WorkerMessage) {
@@ -101,6 +107,48 @@ func (w *Worker) err(msg types.WorkerMessage, err error) {
 	}, nil)
 }
 
+func (w *Worker) getDirectoryInfo() *models.DirectoryInfo {
+	dirInfo := &models.DirectoryInfo{
+		Name:     w.selectedName,
+		Flags:    []string{},
+		ReadOnly: false,
+		// total messages
+		Exists: 0,
+		// new messages since mailbox was last opened
+		Recent: 0,
+		// total unread
+		Unseen: 0,
+	}
+	uids, err := w.c.UIDs(*w.selected)
+	if err != nil {
+		w.worker.Logger.Printf("could not get uids: %v", err)
+		return dirInfo
+	}
+	dirInfo.Exists = len(uids)
+	for _, uid := range uids {
+		message, err := w.c.Message(*w.selected, uid)
+		if err != nil {
+			w.worker.Logger.Printf("could not get message: %v", err)
+			continue
+		}
+		flags, err := message.Flags()
+		if err != nil {
+			w.worker.Logger.Printf("could not get flags: %v", err)
+			continue
+		}
+		seen := false
+		for _, flag := range flags {
+			if flag == maildir.FlagSeen {
+				seen = true
+			}
+		}
+		if !seen {
+			dirInfo.Unseen++
+		}
+	}
+	return dirInfo
+}
+
 func (w *Worker) handleMessage(msg types.WorkerMessage) error {
 	switch msg := msg.(type) {
 	case *types.Unsupported:
@@ -195,6 +243,7 @@ func (w *Worker) handleOpenDirectory(msg *types.OpenDirectory) error {
 		return err
 	}
 	w.selected = &dir
+	w.selectedName = msg.Directory
 
 	// add watch path
 	newDir := filepath.Join(string(*w.selected), "new")
@@ -208,17 +257,7 @@ func (w *Worker) handleOpenDirectory(msg *types.OpenDirectory) error {
 
 	// TODO: why does this need to be sent twice??
 	info := &types.DirectoryInfo{
-		Info: &models.DirectoryInfo{
-			Name:     msg.Directory,
-			Flags:    []string{},
-			ReadOnly: false,
-			// total messages
-			Exists: 0,
-			// new messages since mailbox was last opened
-			Recent: 0,
-			// total unread
-			Unseen: 0,
-		},
+		Info: w.getDirectoryInfo(),
 	}
 	w.worker.PostMessage(info, nil)
 	w.worker.PostMessage(info, nil)