aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/account.go2
-rw-r--r--widgets/dirlist.go42
-rw-r--r--worker/imap/list.go13
-rw-r--r--worker/imap/worker.go4
4 files changed, 48 insertions, 13 deletions
diff --git a/widgets/account.go b/widgets/account.go
index 72874b09..397cccde 100644
--- a/widgets/account.go
+++ b/widgets/account.go
@@ -141,7 +141,7 @@ func (acct *AccountView) connected(msg types.WorkerMessage) {
break
}
}
- if dir == "" {
+ if dir == "" && len(dirs) > 0 {
dir = dirs[0]
}
acct.dirlist.Select(dir)
diff --git a/widgets/dirlist.go b/widgets/dirlist.go
index 1240e562..d7c4874e 100644
--- a/widgets/dirlist.go
+++ b/widgets/dirlist.go
@@ -47,17 +47,6 @@ func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {
case *types.Directory:
dirs = append(dirs, msg.Name)
case *types.Done:
- // There is always an INBOX, RFC-guaranteed
- // However, for some reason Dovecot doesn't always send it.
- inbox := false
- for _, dir := range dirs {
- if dir == "INBOX" {
- inbox = true
- }
- }
- if !inbox {
- dirs = append(dirs, "INBOX")
- }
sort.Strings(dirs)
dirlist.dirs = dirs
dirlist.spinner.Stop()
@@ -78,6 +67,18 @@ func (dirlist *DirectoryList) Select(name string) {
dirlist.selecting = ""
case *types.Done:
dirlist.selected = dirlist.selecting
+ dirlist.filterDirsByFoldersConfig()
+ hasSelected := false
+ for _, d := range dirlist.dirs {
+ if d == dirlist.selected {
+ hasSelected = true
+ break
+ }
+ }
+ if !hasSelected && dirlist.selected != "" {
+ dirlist.dirs = append(dirlist.dirs, dirlist.selected)
+ }
+ sort.Strings(dirlist.dirs)
}
dirlist.Invalidate()
})
@@ -158,3 +159,22 @@ func (dirlist *DirectoryList) Next() {
func (dirlist *DirectoryList) Prev() {
dirlist.nextPrev(-1)
}
+
+// filterDirsByFoldersConfig filters a folders list to only contain folders
+// present in the account.folders config option
+func (dirlist *DirectoryList) filterDirsByFoldersConfig() {
+ // config option defaults to show all if unset
+ if len(dirlist.conf.Folders) == 0 {
+ return
+ }
+ var filtered []string
+ for _, folder := range dirlist.dirs {
+ for _, cfgfolder := range dirlist.conf.Folders {
+ if folder == cfgfolder {
+ filtered = append(filtered, folder)
+ break
+ }
+ }
+ }
+ dirlist.dirs = filtered
+}
diff --git a/worker/imap/list.go b/worker/imap/list.go
index 5e282ef7..552fb457 100644
--- a/worker/imap/list.go
+++ b/worker/imap/list.go
@@ -17,6 +17,19 @@ func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) {
// no need to pass this to handlers if it can't be opened
continue
}
+ if len(imapw.config.folders) > 0 {
+ // apply user filter
+ found := false
+ for _, folder := range imapw.config.folders {
+ if folder == mbox.Name || imapw.selected.Name == mbox.Name {
+ found = true
+ break
+ }
+ }
+ if !found {
+ continue
+ }
+ }
imapw.worker.PostMessage(&types.Directory{
Message: types.RespondTo(msg),
Name: mbox.Name,
diff --git a/worker/imap/worker.go b/worker/imap/worker.go
index d978755e..aa59c27d 100644
--- a/worker/imap/worker.go
+++ b/worker/imap/worker.go
@@ -7,7 +7,7 @@ import (
"strings"
"github.com/emersion/go-imap"
- "github.com/emersion/go-imap-idle"
+ idle "github.com/emersion/go-imap-idle"
"github.com/emersion/go-imap/client"
"git.sr.ht/~sircmpwn/aerc/worker/types"
@@ -26,6 +26,7 @@ type IMAPWorker struct {
insecure bool
addr string
user *url.Userinfo
+ folders []string
}
client *imapClient
@@ -75,6 +76,7 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error {
}
w.config.user = u.User
+ w.config.folders = msg.Config.Folders
case *types.Connect:
var (
c *client.Client