aboutsummaryrefslogtreecommitdiff
path: root/widgets
AgeCommit message (Collapse)Author
2019-05-14Implement :copy (aka :cp)Drew DeVault
2019-05-14Update tab name as subject changesDrew DeVault
Also moves truncation to the tab widget
2019-05-14Add $EDITOR, internal config for composeDrew DeVault
2019-05-14Add distinct keybindings for each compose viewDrew DeVault
2019-05-14Implement sending emails /o/Drew DeVault
2019-05-14Add :send-message, prepares & writes email to /tmpDrew DeVault
2019-05-13Handle external message deletionsDrew DeVault
2019-05-13Handle incoming emails gracefullyDrew DeVault
2019-05-13Spec out review message screenDrew DeVault
2019-05-13Populate "From" header from config for new emailsDrew DeVault
2019-05-12Implement :{next,prev}-field in compose viewDrew DeVault
2019-05-12Expand compose focus handling a bitDrew DeVault
2019-05-12Add initial compose widgetDrew DeVault
2019-05-11"Press any key to close" for completed processesDrew DeVault
2019-05-11Refactor ctx stashing out of exlineDrew DeVault
2019-05-11Split ex line text handling into dedicated widgetDrew DeVault
2019-04-29lib/msgstore: protect with a mutexSimon Ser
MessageStore has a lot of exported fields that can be read from the outside. Each read must be protected, because a call from Update could happen at any time.
2019-04-29widgets/msglist: fix MessageList.store raceSimon Ser
This field could be written to in the middle of a Draw call, which reads it multiple times. Use an atomic variable instead.
2019-04-27lib/ui: introduce InvalidatableSimon Ser
Many Drawable implementations have their own Invalidate and OnInvalidate functions, with an unexported onInvalidate field. However OnInvalidate and Invalidate are usually not called in the same goroutine. This results in a race on this field, e.g.: Read at 0x00c000094748 by goroutine 7: git.sr.ht/~sircmpwn/aerc2/widgets.NewDirectoryList.func1() /home/simon/src/aerc2/widgets/dirlist.go:85 +0x56 git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start.func1() /home/simon/src/aerc2/widgets/spinner.go:93 +0x1bb Previous write at 0x00c000094748 by main goroutine: [failed to restore the stack] Goroutine 7 (running) created at: git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start() /home/simon/src/aerc2/widgets/spinner.go:46 +0x8f git.sr.ht/~sircmpwn/aerc2/widgets.NewDirectoryList() /home/simon/src/aerc2/widgets/dirlist.go:37 +0x286 git.sr.ht/~sircmpwn/aerc2/widgets.NewAccountView() /home/simon/src/aerc2/widgets/account.go:50 +0x5ca git.sr.ht/~sircmpwn/aerc2/widgets.NewAerc() /home/simon/src/aerc2/widgets/aerc.go:60 +0x800 main.main() /home/simon/src/aerc2/aerc.go:65 +0x33e To fix this, introduce a new type, Invalidatable, which protects the field. Unfortunately the Drawable must be passed to the callback function in Invalidate, so we still need to re-implement this in each Invalidatable user.
2019-04-27widgets/spinner: fix Spinner.frame raceSimon Ser
It's accessed by the goroutine which increments it and the goroutine that draws the widget at the same time. Use atomic instead. Write at 0x00c00000ebc0 by goroutine 7: git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start.func1() /home/simon/src/aerc2/widgets/spinner.go:50 +0x169 Previous read at 0x00c00000ebc0 by main goroutine: [failed to restore the stack] Goroutine 7 (running) created at: git.sr.ht/~sircmpwn/aerc2/widgets.(*Spinner).Start() /home/simon/src/aerc2/widgets/spinner.go:44 +0x8b git.sr.ht/~sircmpwn/aerc2/widgets.NewDirectoryList() /home/simon/src/aerc2/widgets/dirlist.go:37 +0x286 git.sr.ht/~sircmpwn/aerc2/widgets.NewAccountView() /home/simon/src/aerc2/widgets/account.go:50 +0x5ca git.sr.ht/~sircmpwn/aerc2/widgets.NewAerc() /home/simon/src/aerc2/widgets/aerc.go:60 +0x800 main.main() /home/simon/src/aerc2/aerc.go:65 +0x33e
2019-04-15Re-render terminal on invalidateDrew DeVault
2019-04-10Fix segfault on :view-message for unloaded messageTom Lebreux
This also fixes segfault on :view-message on empty directory Signed-off-by: Tom Lebreux <tomlebreux@cock.li>
2019-04-07Lowercase MIME types while matching filtersGokberk Yaltirakli
2019-04-05Clear damage on each terminal.Draw callDrew DeVault
2019-04-05Fix wrong row due to typoTom Lebreux
Signed-off-by: Tom Lebreux <tomlebreux@cock.li>
2019-04-05Fix infinite loop on empty DirectoryContentsTom Lebreux
When changing to an empty directory, ml.selected is 0, and the length of ml.store.Uids is 0. The loop condition is always true so we have an infinite loop causing 100% CPU usage and prevents us to change to other directories. Signed-off-by: Tom Lebreux <tomlebreux@cock.li>
2019-04-04Show (no messages) for empty foldersDrew DeVault
2019-03-31Remove extra debug statementDrew DeVault
2019-03-31Use shell to execute filters, fix non-determinismDrew DeVault
2019-03-31Implement header-regex-match filtersDrew DeVault
2019-03-31Improve error handling in message viewerDrew DeVault
Still not great but at least it tells you when something went wrong
2019-03-31Add basic filter implementationDrew DeVault
2019-03-31Decode messages before rendering themDrew DeVault
2019-03-31Make message viewer real, part twoDrew DeVault
2019-03-31Make the message viewer real, part oneDrew DeVault
2019-03-30Add message view commands, :closeDrew DeVault
2019-03-30Minor refactoring to header viewDrew DeVault
2019-03-30Fix crash on command not foundDrew DeVault
2019-03-30Use bold instead of inverted for header namesDrew DeVault
2019-03-30Add multipart selector mockup to msgviewerDrew DeVault
2019-03-30Add basic message viewer mockupDrew DeVault
2019-03-30Correct color of error messagesDrew DeVault
2019-03-30Use tcell.Style.Reverse instead of black on whiteDrew DeVault
2019-03-30Implement :pipeDrew DeVault
2019-03-30Show deleted emails pending server ack in greyDrew DeVault
TODO: Don't let the user select or interact with deleted messages
2019-03-29Add body fetching support codeDrew DeVault
2019-03-21Expire status errors on inputDrew DeVault
2019-03-21term: don't mess with cursor when unfocusedDrew DeVault
2019-03-21Enable alt screen on built-in terminalDrew DeVault
2019-03-21Make terminal closure thread safeDrew DeVault