summary refs log tree commit diff stats
Commit message (Collapse)AuthorAgeFilesLines
* Implement :pwd commandAmin Bandali2019-05-192-0/+28
|
* worker/types/worker: remove mutexSimon Ser2019-05-191-36/+21
| | | | | | | | | | Worker.callbacks contains two types of callbacks: some are action callbacks, some are message callbacks. Each of those is access from one side of the communication channel (UI goroutine vs. worker goroutine). Instead of using a channel, we can use two different maps for each kind. This simplifies the code and also ensures we don't call an action callback instead of a message callback (or the other way around).
* worker/types/worker: make ID allocation atomicSimon Ser2019-05-192-10/+11
| | | | | | | | Message IDs are allocated for both messages from UI to workers and the other way around. Hence, the global nextId variable is accessed from multiple goroutines. Instead, use atomic to access the global counter.
* worker/types/worker: set ID before sending messageSimon Ser2019-05-191-3/+9
| | | | | The previous code set the message ID after sending it, which could result in the receiver reading the ID before it's set.
* lib/ui/ui: use atomic instead of channelSimon Ser2019-05-191-26/+21
| | | | | | | | | This makes it so an atomic `invalid` value is used instead of an unbuffered channel. When many invalidations kick in, a lot of values were sent to the channel. (Since OnInvalidate's callback can be run in any goroutine, we need to be careful about races here.)
* Update internal state and draw from the same goroutineSimon Ser2019-05-197-51/+32
| | | | | | | | | | | | | | | | | | | | | | | | | This commit introduces a new Aerc.Tick function that should be called to refresh the internal state. This in turn makes each AccountView process worker events. The UI goroutine repeatedly refreshes the internal state before drawing a new frame. The reason for this is that many worker messages may need to be processed for a single frame, and drawing the UI is far slower than refreshing the internal state. This has been confirmed in my testing (calling Aerc.Tick only once per frame results in a slower display). Many synchronization code has been removed. We can now write widgets without having to care so much about races. The remaining sync users are: - widgets/spinner: the spinner value is updated from inside an internal goroutine - lib/ui/invalidatable: Invalidate may be called from any goroutine - lib/ui/grid: same - lib/ui/ui: an internal goroutine needs read access to UI.exit - worker/types/worker: Worker.callbacks is used for both worker and UI callbacks The exact goroutine requirements for Drawable have been documented.
* Update go-imap and go-imap-idleSimon Ser2019-05-192-19/+16
| | | | | | This fixes a race condition in go-imap-idle. See [1]. [1]: https://github.com/emersion/go-imap-idle/commit/2704abd7050ed7f2143753554ee23affdf847bd9
* widgets/terminal: fix damage race conditionSimon Ser2019-05-191-1/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Terminal.damage is accessed when drawing and when invalidating the widget. For this reason we need to protect it with a mutex. This seems to fix various damage issues I've been experiencing (where some regions of the terminal weren't correctly repainted). Race detector trace: Read at 0x00c0000c6670 by main goroutine: git.sr.ht/~sircmpwn/aerc/widgets.(*Terminal).Draw() /home/simon/src/aerc/widgets/terminal.go:292 +0x191 git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/widgets.(*MessageViewer).Draw() /home/simon/src/aerc/widgets/msgviewer.go:231 +0x253 git.sr.ht/~sircmpwn/aerc/lib/ui.(*TabContent).Draw() /home/simon/src/aerc/lib/ui/tab.go:124 +0x12e git.sr.ht/~sircmpwn/aerc/lib/ui.(*Grid).Draw() /home/simon/src/aerc/lib/ui/grid.go:117 +0x575 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Draw() /home/simon/src/aerc/widgets/aerc.go:95 +0x5a git.sr.ht/~sircmpwn/aerc/lib/ui.(*UI).Tick() /home/simon/src/aerc/lib/ui/ui.go:93 +0x1dd main.main() /home/simon/src/aerc/aerc.go:105 +0x539 Previous write at 0x00c0000c6670 by goroutine 37: git.sr.ht/~sircmpwn/aerc/widgets.(*Terminal).onDamage-fm() /home/simon/src/aerc/widgets/terminal.go:429 +0x131 git.sr.ht/~sircmpwn/go-libvterm._go_handle_damage() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:481 +0xf9 git.sr.ht/~sircmpwn/go-libvterm._cgoexpwrap_5e22200b58b7__go_handle_damage() _cgo_gotypes.go:731 +0x58 runtime.call32() /usr/lib/go/src/runtime/asm_amd64.s:519 +0x3a git.sr.ht/~sircmpwn/go-libvterm.(*VTerm).Write.func1() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:329 +0x9d git.sr.ht/~sircmpwn/go-libvterm.(*VTerm).Write() /home/simon/go/pkg/mod/git.sr.ht/~sircmpwn/go-libvterm@v0.0.0-20190421201021-3184f6f13687/vterm.go:329 +0x7f git.sr.ht/~sircmpwn/aerc/widgets.NewTerminal.func1() /home/simon/src/aerc/widgets/terminal.go:131 +0x18c Goroutine 37 (running) created at: git.sr.ht/~sircmpwn/aerc/widgets.NewTerminal() /home/simon/src/aerc/widgets/terminal.go:121 +0x23f git.sr.ht/~sircmpwn/aerc/widgets.NewMessageViewer() /home/simon/src/aerc/widgets/msgviewer.go:147 +0xfbe git.sr.ht/~sircmpwn/aerc/commands/account.ViewMessage() /home/simon/src/aerc/commands/account/view-message.go:26 +0x4a4 git.sr.ht/~sircmpwn/aerc/commands.(*Commands).ExecuteCommand() /home/simon/src/aerc/commands/commands.go:47 +0x1f0 main.main.func1() /home/simon/src/aerc/aerc.go:76 +0x205 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).BeginExCommand.func1() /home/simon/src/aerc/widgets/aerc.go:262 +0x89 git.sr.ht/~sircmpwn/aerc/widgets.(*ExLine).Event() /home/simon/src/aerc/widgets/exline.go:47 +0x222 git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Event() /home/simon/src/aerc/widgets/aerc.go:133 +0x83c git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).simulate() /home/simon/src/aerc/widgets/aerc.go:126 +0x12a git.sr.ht/~sircmpwn/aerc/widgets.(*Aerc).Event() /home/simon/src/aerc/widgets/aerc.go:148 +0x766 git.sr.ht/~sircmpwn/aerc/lib/ui.(*UI).Tick() /home/simon/src/aerc/lib/ui/ui.go:86 +0x11b main.main() /home/simon/src/aerc/aerc.go:105 +0x539
* Fix scdoc & gofmt issuesDrew DeVault2019-05-188-35/+29
|
* Implement loading passwords from external commandsGalen Abell2019-05-184-8/+94
| | | | * Resolves #80
* s/aerc2/aerc/gDrew DeVault2019-05-1747-76/+76
|
* Document dependenciesDrew DeVault2019-05-171-0/+6
|
* Install filters to /usr/share/aerc/filtersDrew DeVault2019-05-172-4/+12
|
* Add install target to MakefileDrew DeVault2019-05-171-2/+12
|
* Add man pagesDrew DeVault2019-05-177-2/+554
|
* Remove unimplemented color configurationDrew DeVault2019-05-173-45/+3
| | | | Will probably end up doing this differently anyway
* Implement ui.empty-message config optionDrew DeVault2019-05-173-18/+1
| | | | | Also removes some options that aren't going to be supported any time soon.
* Remove debug loggingDrew DeVault2019-05-171-1/+0
|
* Refactor STARTTLS to prevent downgrade attacksDrew DeVault2019-05-171-23/+27
|
* Fix date header on outgoing emailsDrew DeVault2019-05-171-1/+1
|
* s/Sent/Message sent/Drew DeVault2019-05-161-2/+2
|
* Abort if accounts.conf is world readableReto Brunner2019-05-162-4/+31
| | | | Fixes #32
* Revert "Abort if accounts.conf is world readable"Drew DeVault2019-05-162-30/+4
| | | | This reverts commit a755608ef9d5893b68dc4c774bbda06503481552.
* Revert "s/aerc.conf/address.conf/ in permission check"Drew DeVault2019-05-161-1/+1
| | | | This reverts commit 66ba099ca0bfa83cd050050d92663ec45da20141.
* s/aerc.conf/address.conf/ in permission checkCole Helbling2019-05-161-1/+1
| | | | | Small typo in a recent commit: should abort if accounts.conf is world readable, not aerc.conf.
* Fix issues with OOB uidsDrew DeVault2019-05-161-3/+3
|
* Abort if accounts.conf is world readableReto Brunner2019-05-162-4/+30
| | | | Fixes #32
* Improve reply-all recipient enumeration strategyDrew DeVault2019-05-161-0/+16
|
* Decode email when reading it for quotingDrew DeVault2019-05-162-2/+26
|
* Change default bindings for repliesDrew DeVault2019-05-161-4/+4
|
* Don't prefix Re: if prefix already presentDrew DeVault2019-05-161-1/+6
|
* Change default reply keybindingsDrew DeVault2019-05-161-8/+8
|
* Implement :reply -q and :reply -aDrew DeVault2019-05-164-19/+73
|
* Implement (basic form) of :replyDrew DeVault2019-05-166-7/+139
|
* Let caller pass in custom headers to composeDrew DeVault2019-05-163-8/+38
|
* Copy sent emails to the Sent folderDrew DeVault2019-05-1511-20/+132
| | | | Or rather, to a user-specified folder
* Fix default bindings for quit and editDrew DeVault2019-05-141-1/+4
|
* Move ! bind to [messages]Drew DeVault2019-05-141-1/+1
|
* Add (non-functional) reply commands to bindingsDrew DeVault2019-05-141-2/+9
|
* Add ! to default keybindingsDrew DeVault2019-05-141-0/+1
|
* Implement move, mv commandsDrew DeVault2019-05-143-6/+65
|
* Force INBOX to be included in dirlistDrew DeVault2019-05-141-0/+11
|
* Implement :copy (aka :cp)Drew DeVault2019-05-147-3/+101
|
* Implement abort commandCole Helbling2019-05-141-0/+23
| | | | | This allows the user to close the compose tab without sending their current composition.
* Update tab name as subject changesDrew DeVault2019-05-145-10/+40
| | | | Also moves truncation to the tab widget
* Add $EDITOR, internal config for composeDrew DeVault2019-05-144-6/+30
|
* Add IRC link to README.mdDrew DeVault2019-05-141-0/+2
|
* Remove tab before going asyncDrew DeVault2019-05-141-1/+1
| | | | To prevent repeated attempts to send
* Add distinct keybindings for each compose viewDrew DeVault2019-05-146-14/+51
|
* Send emails asyncronouslyDrew DeVault2019-05-141-47/+73
|