Commit Graph

107 Commits

Author SHA1 Message Date
Simon Ser a275f65848 lib/msgstore: protect with a mutex
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-29 09:49:48 -04:00
Simon Ser f1698a337e widgets/msglist: fix MessageList.store race
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-29 09:49:39 -04:00
Simon Ser 5685a17674 lib/ui: introduce Invalidatable
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-27 14:30:28 -04:00
Simon Ser 2159eb876e widgets/spinner: fix Spinner.frame race
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-27 11:42:12 -04:00
Drew DeVault 2925bdfd6c Re-render terminal on invalidate 2019-04-15 16:07:05 -04:00
Tom Lebreux 3cd0d5bc28 Fix segfault on :view-message for unloaded message
This also fixes segfault on :view-message on empty directory

Signed-off-by: Tom Lebreux <tomlebreux@cock.li>
2019-04-10 15:40:06 -04:00
Gokberk Yaltirakli ec09ec8b0e Lowercase MIME types while matching filters 2019-04-07 14:12:19 -04:00
Drew DeVault 4bc8ea34bc Clear damage on each terminal.Draw call 2019-04-05 20:11:31 -04:00
Tom Lebreux 399d014bff Fix wrong row due to typo
Signed-off-by: Tom Lebreux <tomlebreux@cock.li>
2019-04-05 20:10:28 -04:00
Tom Lebreux 41212a717e Fix infinite loop on empty DirectoryContents
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-05 15:24:00 -04:00
Drew DeVault 8a42dfc87c Show (no messages) for empty folders 2019-04-04 14:25:51 -04:00
Drew DeVault 315cdf308a Remove extra debug statement 2019-03-31 15:21:33 -04:00
Drew DeVault 36419d85aa Use shell to execute filters, fix non-determinism 2019-03-31 15:21:04 -04:00
Drew DeVault 8e5ed2a161 Implement header-regex-match filters 2019-03-31 14:42:18 -04:00
Drew DeVault f9262e4b06 Improve error handling in message viewer
Still not great but at least it tells you when something went wrong
2019-03-31 14:32:26 -04:00
Drew DeVault bbdf9df75e Add basic filter implementation 2019-03-31 14:24:53 -04:00
Drew DeVault 711d22891b Decode messages before rendering them 2019-03-31 13:36:37 -04:00
Drew DeVault 0abafa60e1 Make message viewer real, part two 2019-03-31 12:35:51 -04:00
Drew DeVault 27b25174e2 Make the message viewer real, part one 2019-03-31 12:14:37 -04:00
Drew DeVault 5d0402aeea Add message view commands, :close 2019-03-30 21:45:41 -04:00
Drew DeVault 4bdc0f3715 Minor refactoring to header view 2019-03-30 16:50:14 -04:00
Drew DeVault fd27a2baf6 Fix crash on command not found 2019-03-30 16:29:52 -04:00
Drew DeVault 78db7ccafa Use bold instead of inverted for header names 2019-03-30 15:59:42 -04:00
Drew DeVault 337dd18c9c Add multipart selector mockup to msgviewer 2019-03-30 15:55:21 -04:00
Drew DeVault fa04a1e036 Add basic message viewer mockup 2019-03-30 14:12:04 -04:00
Drew DeVault 2958579ee7 Correct color of error messages 2019-03-30 13:05:00 -04:00
Drew DeVault 84965d680c Use tcell.Style.Reverse instead of black on white 2019-03-30 12:59:18 -04:00
Drew DeVault 700dea23fa Implement :pipe 2019-03-30 11:58:24 -04:00
Drew DeVault 4465646fed Show deleted emails pending server ack in grey
TODO: Don't let the user select or interact with deleted messages
2019-03-30 10:41:12 -04:00
Drew DeVault 77ede6eb5a Add body fetching support code 2019-03-29 22:36:15 -04:00
Drew DeVault e591221509 Expire status errors on input 2019-03-21 21:34:12 -04:00
Drew DeVault a602891768 term: don't mess with cursor when unfocused 2019-03-21 21:28:51 -04:00
Drew DeVault 960d11c4bc Enable alt screen on built-in terminal 2019-03-21 21:24:23 -04:00
Drew DeVault 15b856abcc Make terminal closure thread safe 2019-03-21 21:23:30 -04:00
Drew DeVault be2918a616 Use GetCursorPos instead of stored position 2019-03-21 21:19:34 -04:00
Drew DeVault d97cdde38d Skip writes if term is closed 2019-03-21 21:07:49 -04:00
Drew DeVault 0b26241b42 Improve cursor handling in embedded terminal 2019-03-21 21:00:03 -04:00
Drew DeVault 55ad16bb70 Fix cursor handling in embedded terminal 2019-03-21 19:56:47 -04:00
Drew DeVault 28f393bdbd Forward key events to child terminal 2019-03-21 19:50:54 -04:00
Drew DeVault 699f1cf7a6 Use : for keybindings even when ex is overridden 2019-03-21 17:49:59 -04:00
Drew DeVault 6d01332b55 Rig up terminal keybinding group 2019-03-21 17:44:44 -04:00
Drew DeVault 4130956b4c Use user's configured ex key 2019-03-21 17:40:50 -04:00
Drew DeVault f5bf4a9324 Add context-specific keybindings 2019-03-21 17:37:19 -04:00
Drew DeVault 312a53e5ff Implement :delete-message 2019-03-20 23:23:38 -04:00
Drew DeVault f3d3e0ed4f moar colors 2019-03-17 18:06:15 -04:00
Drew DeVault c0146efaae Fix scrolling issues on :select-message 2019-03-17 17:51:14 -04:00
Drew DeVault 9ff815bb13 s/:term-close/:close/g 2019-03-17 17:45:44 -04:00
Drew DeVault 60b17c473a Wrap Terminal in TermHost 2019-03-17 17:39:49 -04:00
Drew DeVault dee0f8938b Add :term-close 2019-03-17 17:23:53 -04:00
Drew DeVault 16c3f0a893 Handle terminal title, login shell 2019-03-17 17:08:54 -04:00