aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
Commit message (Collapse)AuthorAgeFilesLines
* widgets/terminal: Only call vterm.ScreenCell.Attrs once in styleFromCellClayton Craft2021-04-131-6/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fixes a substantial performance issue when scrolling emails with long/complicated contents, where scrolling down a single line can take something like hundreds of ms before the screen is updated to reflect the scroll. It's really bad if the email has lots of columns, e.g. like if it's an html email that was passed through a filter (w3m, etc) to render it. Using pprof, I found that the multiple calls to vterm.ScreenCell.Attrs() in styleFromCell were really really expensive. This patch replaces them with a single call. Here's a before and after with a simple, but very manual test of opening a large email with contents that went through a w3m filter and continuously scrolling up and down over and over for ~30 seconds: *** Before: ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- 28.25s 100% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.PartSwitcher.Draw 0 0% 99.94% 28.25s 82.31% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.PartViewer.Draw 28.25s 100% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.Terminal.Draw ----------------------------------------------------------+------------- 28.25s 100% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.PartViewer.Draw 0 0% 99.94% 28.25s 82.31% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.Terminal.Draw 19.23s 68.07% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.Terminal.styleFromCell 6.04s 21.38% | github.x2ecom..z2fddevault..z2fgo..z2dlibvterm.Screen.GetCellAt 1.38s 4.88% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2flib..z2fui.Context.Printf 0.62s 2.19% | runtime.mapassign 0.43s 1.52% | runtime.mapaccess2 0.20s 0.71% | runtime.newobject 0.19s 0.67% | runtime.callers (inline) 0.07s 0.25% | runtime.makeslice 0.07s 0.25% | runtime.mallocgc ----------------------------------------------------------+------------- 19.23s 100% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.Terminal.Draw 0 0% 99.94% 19.23s 56.03% | git.x2esr.x2eht..z2f..z7esircmpwn..z2faerc..z2fwidgets.Terminal.styleFromCell 19.21s 99.90% | github.x2ecom..z2fddevault..z2fgo..z2dlibvterm.ScreenCell.Attrs *** After: ----------------------------------------------------------+------------- flat flat% sum% cum cum% calls calls% + context ----------------------------------------------------------+------------- 0.31s 100% | git.x2esr.x2eht/~sircmpwn/aerc/widgets.Terminal.Draw 0 0% 99.87% 0.31s 1.33% | github.x2ecom/ddevault/go-libvterm.NewPos 0.25s 80.65% | runtime.callers (inline) 0.04s 12.90% | runtime.gomcache (inline) ----------------------------------------------------------+------------- 8.40s 100% | github.x2ecom/ddevault/go-libvterm.Screen.GetCellAt 0 0% 99.87% 8.40s 36.11% | github.x2ecom/ddevault/go-libvterm.Screen.GetCell 7.14s 85.00% | github.x2ecom/ddevault/go-libvterm._cgoCheckPointer 0.54s 6.43% | runtime.callers (inline) 0.35s 4.17% | runtime.exitsyscall 0.11s 1.31% | runtime.deferprocStack 0.07s 0.83% | doentersyscall 0.07s 0.83% | runtime.getg 0.05s 0.6% | runtime.casgstatus 0.03s 0.36% | _init 0.03s 0.36% | runtime.gomcache (inline) ----------------------------------------------------------+------------- 8.46s 100% | git.x2esr.x2eht/~sircmpwn/aerc/widgets.Terminal.Draw 0 0% 99.87% 8.46s 36.37% | github.x2ecom/ddevault/go-libvterm.Screen.GetCellAt 8.40s 99.29% | github.x2ecom/ddevault/go-libvterm.Screen.GetCell 0.06s 0.71% | runtime.callers (inline) ----------------------------------------------------------+------------- 0.31s 100% | git.x2esr.x2eht/~sircmpwn/aerc/widgets.Terminal.styleFromCell 0 0% 99.87% 0.31s 1.33% | github.x2ecom/ddevault/go-libvterm.ScreenCell.Attrs )
* terminal: Add support for Shift+TabAlexey Yerin2021-02-071-0/+1
|
* Get rid of the aerc.PushError(" " + $string) idiomReto Brunner2021-01-302-7/+7
| | | | The individual callers should not be responsible for padding
* compose: apply default style to header separatorEyal Sawady2021-01-141-3/+3
|
* trim <> from messageIDs when handling mailto linksReto Brunner2021-01-121-0/+6
| | | | Co-authored-by: James Walmsley <james@fullfat-fs.co.uk>
* Apply dirlist style to unselected directoriesEyal Sawady2021-01-121-1/+1
|
* Reapply 'Fix nil pointer deref on Envelope'Shaw Vrana2021-01-031-3/+6
| | | | | | The commit bf16ccde484ce3b6d2a4b843e7ebc04a9b2a957d appears to have been unintentionally dropped by commit 905cb9dfd3ef197bb4b59039a1be76ce2c8e3099 (Implement style configuration).
* add italics supporty0ast2020-12-241-0/+3
| | | | | | Fixes: https://todo.sr.ht/~sircmpwn/aerc2/416 Co-authored-by: JD <john1doe@ya.ru>
* update tcell to v2 and enable TrueColor supporty0ast2020-12-1813-15/+15
| | | | | | | | | Also update to the tcell v2 PaletteColor api, which should keep the chosen theme of the user intact. Note, that if $TRUECOLOR is defined and a truecolor given, aerc will now stop clipping the value to one of the theme colors. Generally this is desired behaviour though.
* Use extensions for querying the mime type of attachmentsReto Brunner2020-12-151-8/+16
| | | | | This gets rid of the issue that lots of things are detected as zip files, even though they are a more specialized format (say office files)
* fix mailto parsingReto Brunner2020-11-281-1/+5
|
* compose: use a proper header instead of a string mapReto Brunner2020-11-142-135/+189
| | | | | | | | | | | | | Prior to this commit, the composer was based on a map[string]string. While this approach was very versatile, it lead to a constant encoding / decoding of addresses and other headers. This commit switches to a different model, where the composer is based on a header. Commands which want to interact with it can simply set some defaults they would like to have. Users can overwrite them however they like. In order to get access to the functions generating / getting the msgid go-message was upgraded.
* rename header to heditorsReto Brunner2020-11-141-6/+6
|
* Apply relevant msglist styles in orderChris Vittal2020-11-011-13/+14
| | | | | | | | | | | | | | | | | | Allow styles to be layered over a base style. The list of styles to apply is layered over the base style in order, such that if the layer does not differ from the base it is not used. The order that these styles are applied in is, from first to last: msglist_default msglist_unread msglist_read (exclusive with unread, so technically the same level) msglist_flagged msglist_deleted msglist_marked So, msglist_marked style dominates. This fixes an issue where the msglist_deleted style was not being applied.
* refactor ParseMessageFormat to use a ctx objectReto Brunner2020-10-141-3/+8
|
* dirlist: fix empty row if dir is addedReto Brunner2020-09-081-0/+6
| | | | | | There is a window where a new dir entry isn't yet in the dirlist.dir. dirlist.ensureScroll however expected to always find a valid index. Add a check so that we don't try to scroll to a -1 index.
* Make mimetype check consistent across casesy0ast2020-09-071-1/+1
|
* correctly apply msglist_read colory0ast2020-09-011-1/+4
|
* base models.Address on the mail.Address typeReto Brunner2020-08-201-7/+8
| | | | | | | | | | | | This allows us to hook into the std libs implementation of parsing related stuff. For this, we need to get rid of the distinction between a mailbox and a host to just a single "address" field. However this is already the common case. All but one users immediately concatenated the mbox/domain to a single address. So this in effects makes it simpler for most cases and we simply do the transformation in the special case.
* Add support for :rmdirARaspiK2020-08-191-0/+2
| | | | | | | | | | | | | | | | | | | | | The `:rmdir` command removes the current directory (`-f` is required if the directory is not empty). This is not supported on the notmuch backend. An issue with the maildir backend is that some sync programs (e.g. offlineimap) may recover the directory after it is deleted. They need to specifically be configured to accept deletions, or special commands need to be executed (e.g. `offlineimap --delete-folder`) to properly delete folders. A danger of using this on the IMAP backend is that it is possible for a new message to be added to the directory and for aerc to not show it immediately (due to a slow connection) - using `:rmdir` at this moment (with `-f` if the directory already contains messages) would delete the directory and the new message that just arrived (and all other contents). This is documented in aerc(1) so that users are aware of possible risks.
* show error if account view creation failsReto Brunner2020-08-103-8/+39
| | | | | | | | This can happen for example if aerc is compiled without notmuch support but the notmuch worker is requested. Pushing a status message isn't good enough, as this gets overridden pretty quickly if one has multiple accounts configured. So we show a fullscreen error instead.
* Rename selecter to selectorKalyan Sriram2020-08-062-21/+21
|
* Implement style configuration.Kalyan Sriram2020-08-0614-193/+288
| | | | | | Introduce the ability to configure stylesets, allowing customization of aerc's look (color scheme, font weight, etc). Default styleset is installed to /path/to/aerc/stylesets/default.
* Revert "Implement style configuration."Reto Brunner2020-07-3014-288/+193
| | | | This reverts commit 1ff687ca2b0821c2cacc1fa725abb3302d2af9da.
* Revert "Rename selecter to selector"Reto Brunner2020-07-302-21/+21
| | | | This reverts commit 2c244222d508a32d3f5ba600944a46b6fdea1a10.
* Rename selecter to selectorKalyan Sriram2020-07-302-21/+21
|
* Implement style configuration.Kalyan Sriram2020-07-3014-193/+288
| | | | | | Introduce the ability to configure stylesets, allowing customization of aerc's look (color scheme, font weight, etc). Default styleset is installed to /path/to/aerc/stylesets/default.
* msgviewer: set max line length to 1 GBReto Brunner2020-07-301-0/+8
| | | | | | | | some people send around huge html without any newline in between. This did overflow the default 64KB buffer of bufio.Scanner. If something can't fit in a GB there's no hope left Also, ignoring errors is bad mkey
* msgviewer: simplify attemptCopyReto Brunner2020-07-301-66/+80
| | | | | No functional changes, simply extract more complex stuff into sub functions to help readability.
* Remove hard coded bodystruct path everywhereReto Brunner2020-07-271-1/+1
| | | | | | | Aerc usually used the path []int{1} if it didn't know what the proper path is. However this only works for multipart messages and breaks if it isn't one. This patch removes all the hard coding and extracts the necessary helpers to lib.
* Use PushStatus instead of SetStatus where it makes senseHeiko Carrasco2020-07-091-2/+1
|
* status: invalidate when neededReto Brunner2020-07-051-0/+1
| | | | | In order for the message to actually show up we need to invalidate after setting the status stack.
* Add a 'folders-exclude' optionARaspiK2020-07-021-14/+31
| | | | | | | | Added a 'folders-exclude' option that allows removing selected folders from the directory list sidebar. My motivating example was that removing a single folder from the list using Golang regexes seemed pretty hard, so this is a better way to do it. The excluded folders list is included in the man page.
* Fix nil pointer deref on EnvelopeAndrew Jeffery2020-07-021-3/+7
| | | | | The Envelope was nil but being deref'ed for the Subject. This was experienced when switching tabs on IMAP.
* Add scrollbarJeffas2020-06-091-3/+37
| | | | | This transplants the logic for drawing the scrollbar from dirlist and the completion popover and adds it to the msglist.
* Rework msglist scrollingJeffas2020-06-091-14/+30
| | | | | | | | | | | | This changes the scrolling to be done on the draw, when the height is updated, ensuring that the selected item is kept on screen during resizing. Also, this ensures that messages will fill the screen when resizing the window, for instance, shrinking and then growing drags down more messages if possible. This is a transplant of the dirlist scrolling logic.
* Add dirlist scrollbarJeffas2020-06-091-2/+36
| | | | | | This mimics the scrollbar implementation from the completion popover. Only showing it when necessary and adapting the dirlist strings appropriately.
* Make grid sizes dynamicJeffas2020-06-095-99/+96
| | | | | | | | | The grid used static sizes which meant that changing settings didn't have an effect on elements of the ui, notably the sidebar width. This patch makes the `Size` parameter of a cell a function which returns the `int`, allowing for dynamic sizes. A `Const` function is also included for ease of use for static sizes.
* Add dirlist scrollingJeffas2020-06-091-3/+35
| | | | Should fix #402
* Revert "Add Style configuration"Drew DeVault2020-05-2814-295/+195
| | | | This reverts commit 0f78f06610c0e8887aba2ae50e99b86477a384b3.
* Revert "Remove duration from the status methods"Drew DeVault2020-05-286-20/+28
| | | | This reverts commit f06d683688e3d2139b14f67b7e349089e7200bf4.
* Remove duration from the status methodsReto Brunner2020-05-276-28/+20
| | | | We always set 10 seconds anyhow, might as well do that without repeating ourselfs.
* Add Style configurationReto Brunner2020-05-2714-195/+295
| | | | | | | | | | The following functionalities are added to configure aerc ui styles. - Read stylesets from file with very basic fnmatch wildcard matching - Add default styleset - Support different stylesets as part of UiConfig allowing contextual styles. - Move widgets/ui elements to use the stylesets. - Add configuration manual for the styleset
* Set AnsweredFlag on successful replySrivathsan Murali2020-05-251-0/+9
|
* aerc: Refactor getpasswd dialogRay Ganardi2020-05-252-40/+56
| | | | | | Previously there's a hack for showing and hiding the dialog. Change it to use channels to emulate async/await
* feat(pgp): Show error message from pgpRay Ganardi2020-05-251-1/+4
| | | | | The error wasn't shown, making errors like wrong password being ignored and the password is prompted again.
* feat(pgp): Add <ESC> to cancel password promptRay Ganardi2020-05-252-10/+19
| | | | Previously there was no way to cancel the password prompt.
* pgp: fail gracefully from email decryptionRay Ganardi2020-05-251-1/+5
| | | | | Aerc panics when there's an error on email decryption. Instead, an error message should be shown.
* FetchBodyPart doesn't need the parent body structureReto Brunner2020-05-171-2/+1
|
* Change MarkedMessages to return uidsReto Brunner2020-05-113-5/+5
| | | | | | | | | Especially if one tries to interact with all marked messages there could be the case that not all headers are fetched yet, hence the messageInfo is still nil. This segfaults a lot of commands which in principle only need the uid to complete. If we switch to uids, this issue can be alleviated for those commands.