diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msgstore.go | 19 | ||||
-rw-r--r-- | lib/ui/interfaces.go | 9 | ||||
-rw-r--r-- | lib/ui/ui.go | 2 |
3 files changed, 7 insertions, 23 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go index fbffa0a..827d7cb 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -2,7 +2,6 @@ package lib import ( "io" - "sync" "time" "github.com/emersion/go-imap" @@ -12,8 +11,6 @@ import ( // Accesses to fields must be guarded by MessageStore.Lock/Unlock type MessageStore struct { - sync.Mutex - Deleted map[uint32]interface{} DirInfo types.DirectoryInfo Messages map[uint32]*types.MessageInfo @@ -49,9 +46,6 @@ func NewMessageStore(worker *types.Worker, func (store *MessageStore) FetchHeaders(uids []uint32, cb func(*types.MessageInfo)) { - store.Lock() - defer store.Unlock() - // TODO: this could be optimized by pre-allocating toFetch and trimming it // at the end. In practice we expect to get most messages back in one frame. var toFetch imap.SeqSet @@ -74,9 +68,6 @@ func (store *MessageStore) FetchHeaders(uids []uint32, } func (store *MessageStore) FetchFull(uids []uint32, cb func(io.Reader)) { - store.Lock() - defer store.Unlock() - // TODO: this could be optimized by pre-allocating toFetch and trimming it // at the end. In practice we expect to get most messages back in one frame. var toFetch imap.SeqSet @@ -134,8 +125,6 @@ func merge(to *types.MessageInfo, from *types.MessageInfo) { } func (store *MessageStore) Update(msg types.WorkerMessage) { - store.Lock() - update := false switch msg := msg.(type) { case *types.DirectoryInfo: @@ -201,8 +190,6 @@ func (store *MessageStore) Update(msg types.WorkerMessage) { update = true } - store.Unlock() - if update { store.update() } @@ -220,7 +207,6 @@ func (store *MessageStore) update() { func (store *MessageStore) Delete(uids []uint32, cb func(msg types.WorkerMessage)) { - store.Lock() var set imap.SeqSet for _, uid := range uids { @@ -228,8 +214,6 @@ func (store *MessageStore) Delete(uids []uint32, store.Deleted[uid] = nil } - store.Unlock() - store.worker.PostAction(&types.DeleteMessages{Uids: set}, cb) store.update() } @@ -249,7 +233,6 @@ func (store *MessageStore) Copy(uids []uint32, dest string, func (store *MessageStore) Move(uids []uint32, dest string, cb func(msg types.WorkerMessage)) { - store.Lock() var set imap.SeqSet for _, uid := range uids { @@ -257,8 +240,6 @@ func (store *MessageStore) Move(uids []uint32, dest string, store.Deleted[uid] = nil } - store.Unlock() - store.worker.PostAction(&types.CopyMessages{ Destination: dest, Uids: set, diff --git a/lib/ui/interfaces.go b/lib/ui/interfaces.go index d27afe2..0cdffc1 100644 --- a/lib/ui/interfaces.go +++ b/lib/ui/interfaces.go @@ -4,12 +4,15 @@ import ( "github.com/gdamore/tcell" ) +// Drawable is a UI component that can draw. Unless specified, all methods must +// only be called from a single goroutine, the UI goroutine. type Drawable interface { - // Called when this renderable should draw itself + // Called when this renderable should draw itself. Draw(ctx *Context) - // Specifies a function to call when this cell needs to be redrawn + // Specifies a function to call when this cell needs to be redrawn. The + // callback may be called in any goroutine. OnInvalidate(callback func(d Drawable)) - // Invalidates the drawable + // Invalidates the drawable. This can be called from any goroutine. Invalidate() } diff --git a/lib/ui/ui.go b/lib/ui/ui.go index 9d9a5da..91a26da 100644 --- a/lib/ui/ui.go +++ b/lib/ui/ui.go @@ -10,7 +10,7 @@ import ( type UI struct { Content DrawableInteractive - exit atomic.Value + exit atomic.Value // bool ctx *Context screen tcell.Screen |