| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
| |
Fix contextual sort. Pass a folder-specific sort criteria to the message
store when it is created. Before, the message store would receive the
sort criteria from the UI config of the currently selected directory (if
any was selected at all).
Fixes: https://todo.sr.ht/~rjarry/aerc/121
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Some distro packages install binaries in /usr/bin that clash with some
of aerc's builtin filters (for example, colorize and wrap). The issue is
that aerc filters dir (usually /usr/libexec/aerc/filters) is *after*
/usr/bin, making the builtin filters not accessible when these distro
packages are installed.
Since this mostly concerns colorize and wrap, move $LIBEXEC/aerc/filters
at the beginning of the exec PATH when running filter commands. If the
intent is **really** to execute /usr/bin/colorize or /usr/bin/html, then
their absolute paths should be used.
Link: https://archlinux.org/packages/extra/x86_64/talkfilters/
Link: https://tracker.debian.org/pkg/colorize
Signed-off-by: Robin Jarry <robin@jarry.cc>
Reviewed-by: Tristan Partin <tristan@partin.io>
|
|
|
|
|
|
|
|
| |
Add AERC_ACCOUNT and AERC_FOLDER to the environment of the mail-received
hook command.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Reviewed-by: Tristan Partin <tristan@partin.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Do not rely on MessageList.Draw only to fetch missing headers. In Draw,
report the current scroll offset and length to the message store and use
them to determine if a new message UID should be candidate for fetching
headers.
This allows the mail-received hook to work even when the message list is
not focused.
Fixes: https://todo.sr.ht/~rjarry/aerc/147
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Tristan Partin <tristan@partin.io>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Attach a file from templates. Add a split template function.
{{- .Attach "LICENSE" -}}
or
{{range (exec "find ./doc -type f -name *.scd" "" | split "\n") -}}
{{with . }}
{{- $.Attach . -}}
{{- end}}
{{- end}}
Fixes: https://todo.sr.ht/~rjarry/aerc/109
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Display the warning that the password is stored in plaintext after the
focus of the password input field is lost.
The current behavior of showing the warning after the first character is
entered is ackward and confusing.
It also eliminates the need to debounce the warning when a password is
pasted.
Reported-by: Brad <super1337@posteo.net>
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Some text editors save changes in a temp file before moving it over to
the destination instead of rewriting the original file in place. This
protects against all sorts of corruption, like writing partial files in
disk-full scenarios for example. When this is the case, aerc's open file
descriptor points to a different file, one that was never written to by
the editor.
For text editors that *do* overwrite the file (i.e. the same filesystem
inode id), depending on timing, kernel version, operating system,
filesystem options, caching, etc. Reading from aerc's file descriptor
after the text editor has modified the same file on disk may not return
the updated data. This behaviour can be easily observed with the
following C program:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void) {
int fd;
ssize_t n;
char buf[BUFSIZ];
unlink("test.txt");
fd = open("test.txt", O_CREAT|O_RDWR, 0644);
write(fd, "Bonjour\n", strlen("Bonjour\n"));
fsync(fd);
lseek(fd, 0, SEEK_SET);
n = read(fd, buf, sizeof(buf));
buf[n] = '\0';
printf("before: %s\n", buf);
system("vim test.txt");
lseek(fd, 0, SEEK_SET);
n = read(fd, buf, sizeof(buf));
buf[n] = '\0';
printf("after: %s\n", buf);
return 0;
}
Most of the time, before and after texts will be identical even if you
modified the test.txt file contents in the editor.
The only reliable way to ensure to read the latest contents from the
disk is to close and reopen the file after the text editor has exited.
Do exactly that in termClosed before anything else.
Fixes: 801caf812377 ("compose: factorize body read in a method")
Fixes: https://todo.sr.ht/~rjarry/aerc/184
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Ronald Evers <ronald@ch10.nl>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Running `:header Hello` causes a panic:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xa09328]
goroutine 1 [running]:
git.sr.ht/~rjarry/aerc/widgets.(*Composer).AddEditor
git.sr.ht/~rjarry/aerc/widgets/compose.go:1302
git.sr.ht/~rjarry/aerc/commands/compose.Header.Execute
git.sr.ht/~rjarry/aerc/commands/compose/header.go:83
git.sr.ht/~rjarry/aerc/commands.(*Commands).ExecuteCommand
git.sr.ht/~rjarry/aerc/commands/commands.go:133
main.execCommand
git.sr.ht/~rjarry/aerc/main.go:71
This is because addEditor() converts the header name to lowercase before
updating the c.editors map. After this, c.editors[header] (with `header`
containing uppercase letters) returns nil causes a nil pointer access.
This is a side effect of splitting AddEditor into public and private
functions.
focusEditor also converts the argument to lowercase. Fix and simplify
this. Only call focusEditor with whatever the user provided.
Fixes: 11e5390fa0ac ("compose: implement embedded headers in editor")
Reported-by: Koni Marti <koni.marti@gmail.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Acked-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
| |
Allow removing headers from the compose window when edit-headers=false
(the default) with :header -d <name>.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Acked-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
Allow putting signatures in the templates. Do not add a duplicate
signature during :recall and :recover.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
Add -e|-E flags to all compose commands to allow switching between
edit-headers = true/false without restarting aerc.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
Implement embedded header mode in the composer widget. To activate it,
use set [compose].edit-headers=true in aerc.conf.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
.eml files are universally formatted with DOS line-endings, per RFC5322.
Make sure to replace line endings with CRLF before sending the message.
Always present CRLF files to the text editor. If the editor forces LF
line endings, convert them back to CRLF.
Text editors (vim and nvim at least) detect the .eml extension and force
dos line endings. Emacs seems not to care and will use whatever line
endings are present in the file. Kakoune seems to force unix line
endings and does not care about the contents of the file.
Notes:
* add explicit calls to Truncate() to ensure any trailing content is
stripped from the file when overwriting with shorter content.
* NewCRLFReader cannot be reused since we need buffered and unbuffered
versions of it (for GetBody and {Set,append}Contents, respectively).
Link: https://datatracker.ietf.org/doc/html/rfc5322
Link: https://github.com/vim/vim/blob/v8.2.3583/runtime/ftplugin/mail.vim#L29-L35
Link: https://github.com/neovim/neovim/blob/v0.6.0/runtime/ftplugin/mail.vim#L29-L35
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
On error, return to the caller instead of logging a warning and trying
to continue.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In preparation for allowing headers in the text editor, put code related
to reading the email body in a method and use it where needed.
Never close the email temp file, always keep it opened in read-write
mode. This will be also required to update embedded header values when
running :edit after modifying email headers from the compose::review
screen.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a parameter for the initial value of the body to be inserted
*before* the signature when composing a message.
Make AppendContents and SetContents private methods to ensure there is
no other way to change the composer contents from the outside after
creation.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
Add a style for folded threads. Use msglist_thread_folded in the
stylesheet like "msglist_thread_folded.dim = true"
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Tested-by: inwit <inwit@sindominio.net>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add the number of threads and a flag to indicated folded threads to the
template data. Use {{.ThreadCount}} and {{.ThreadFolded}} in template
expression for the message list.
column-subject = {{.ThreadPrefix}}{{if .ThreadFolded}}[{{.ThreadCount}}] {{end}}{{.Subject}}
Update default configuration accordingly.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: inwit <inwit@sindominio.net>
|
|
|
|
|
|
|
|
|
|
|
| |
Simplifies the rendering of threads by removing a thread specific loop
and just add the relevent threading information. Since the uids are
ordered based on the thread structure already by the threadbuilder, it
is not necessary to loop over the threads slice.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Tested-by: inwit <inwit@sindominio.net>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The wizard constructs an AccountConfig object by hand without
initializing default values. This causes a crash when replying to an
email (rr) just after completing the account creation:
~/.config/aerc/aerc.conf not found, installing the system default~/.config/aerc/binds.conf not found, installing the system defaultpanic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x90 pc=0x5d1550]
...
regexp.(*Regexp).doExecute(0x7fc1089aa108?, {0x0?, 0x0?}, {0x0?, 0x0?, 0xc000fe5408?}, {0xc000698120?, 0x10?}, 0xad3a40?, 0x2, ...)
regexp/exec.go:527 +0x90
regexp.(*Regexp).FindString(0x44e372?, {0xc000698120, 0x27})
regexp/regexp.go:852 +0x6c
git.sr.ht/~rjarry/aerc/commands/msg.trimLocalizedRe({0xc000698120, 0x27}, 0xc00003e420?)
git.sr.ht/~rjarry/aerc/commands/msg/reply.go:332 +0x36
git.sr.ht/~rjarry/aerc/commands/msg.reply.Execute({}, 0xc0002ba180, {0xc0002f8800?, 0x2, 0x2})
git.sr.ht/~rjarry/aerc/commands/msg/reply.go:157 +0x765
...
Extract the account parsing and initialization into a function. Reuse
that function in both accounts.conf parsing and the wizard.
Fixes: 40cc540357d9 ("reply: allow to override localized Re regexp in configuration")
Reported-by: Mechiel Lukkien <mechiel@ueber.net>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Andrew Yu <andrew@andrewyu.org>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When selecting a message part that has no filter configured, aerc uses
very high CPU.
This is due to a recursive UI invalidation. PartViewer.Draw() calls
newNoFilterConfigured which calls ui.Grid.AddChild which in turn calls
ui.Invalidate() which causes the whole UI to be redrawn.
Call newNoFilterConfigured only once when creating a new part viewer
(only when there is no filter command).
Reported-by: Willow Barraco <contact@willowbarraco.fr>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Willow Barraco <contact@willowbarraco.fr>
|
|
|
|
|
|
|
|
|
|
| |
Remember selected folder and message when reconnecting. This is mostly
useful for the imap backend when logouts or reconnects happen a lot.
Fixes: https://todo.sr.ht/~rjarry/aerc/159
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
Tested-by: inwit <inwit@sindominio.net>
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a Context field to requests which we may want to cancel when
changing directories.
Add a Cancelled meta-message to inform the UI that a request was
cancelled (as opposed to Done or Error). Delete callbacks when a request
is Cancelled.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Most, if not all, requests to the worker that may need cancellation are
sent by the msgstore. These requests are typically only relevant when
the msgstore is the selected one. Pass a context from the dirlister to
the msgstore when it is selected. This context will be passed in future
commits to worker requests. The context is cancelled when a new
directory is selected.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a correct message store entry to the DirStore for newly created
directories. This is currently not done, so the directory name does
either not show up in the directory list or contains a nil message
store. Either way, such a directory cannot be used in the current
session and aerc needs to be restarted/reconnected. This affects the
:mkdir and :archive commands (archive when a new directory is created).
To reproduce on imap: create a new directory (:mkdir testdir), try to
move a message into it (:move testdir). It will not show up because
there is not message store.
Fixes: 8ced001d ("listDirectories: refactor listdirectories handling")
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add a new `-A` option to `:save` that works in the same manner as `-a`,
but saves all the named parts of an email, not just attachments.
The reason is that I have an email with this structure:
multipart/related
multipart/alternative
text/plain
text/html
image/png (image001.png)
image/png (image002.png)
image/png (image003.png)
text/plain (env.txt)
Where the `env.txt` is a "real" attachment, while the images are just a
part of the HTML version of the email. However, in this particular email
it was important to see them which can't be done with text UI and
opening the HTML part with the browser also didn't work. Saving them to
a temorary folder did the job and this can be useful in other scenarios.
So before the patch we could do `:save -ap /some/path` and get just the
`env.txt` saved there.
After the patch we could also do `:save -Ap /some/path` and get all the
images and the text file saved into the folder.
Signed-off-by: Vitaly Ovchinnikov <v@postbox.nz>
Tested-by: Moritz Poldrack <moritz@poldrack.dev>
|
|
|
|
|
|
|
|
|
|
| |
When the editor crashes, or the user forces it to exit with an error
code, it is safe to assume that they can't (if the command failed) or
don't want to (if :cq'd) continue composing a meaningful message.
Suggested-by: tristan957
Signed-off-by: Moritz Poldrack <git@moritz.sh>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
There are several ways the ui message channel can fill up leading to
deadlocks.
1) Invalidate() changes the value of uiState to DIRTY. The following
call sequence:
QueueRedraw()
Invalidate()
QueueRedraw()
Leads to multiple nil messages being queued in the message channel
whereas one could assume that the second QueueRedraw() would do
nothing. This is caused by the tri-state nature of uiState.
2) We use the same channel to convey state change, keyboard events and
redraw requests. Since a keyboard event almost always triggers
a redraw, we end up trying to append a redraw message in the same
goroutine that reads from the channel. This triggers a deadlock when
there are more than 50 pending messages.
Solve the issue by using multiple channels, one per type of message that
needs to be sent to the main ui thread.
Remove QueueRedraw() and merge its functionality in Invalidate(). Only
use a DIRTY/CLEAN state to determine if something needs to be queued in
the redraw channel.
Use a channel for quitting instead of an atomic. Restructure some code
functions to have a cleaner API.
Use a for loop in the main thread and select from all channels.
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Koni Marti <koni.marti@gmail.com>
Tested-by: Maarten van Gompel <proycon@anaproy.nl>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Use the template interface consistently. Before, we have exported the
state.TemplateData struct and used it in most places instead of the
models.TemplateData interface. This lead to some inconsistencies, i.e.
Role() has been defined on the exported struct but not on the interface.
Unexport the state.TemplateData struct, add a DataSetter interface to
set the data needed for the template data and call the Data() method
which returns a models.TemplateData interface when the template data is
needed.
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Tim Culverhouse <tim@timculverhouse.com>
|
|
|
|
|
|
|
|
| |
I had applied v2 instead of v4... It is time to automate these things
a bit better.
Fixes: 6e038c7fd510 ("dirtree: modify drawing of the dirtree")
Signed-off-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
| |
Clear the message list when a virtual node is selected. Add a
VirtualNodeCallback to the Dirlist interface.
Reported-by: Tim Culverhouse <tim@timculverhouse.com>
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
| |
Since aercs embedded terminal now behaves correctly, a messages contents
are at the bottom of the pager by default, this has already sparked
confusion as this is uncommon and not matching previous behaviour.
Thanks: Stacy Harper <contact@stacyharper.net>
Suggested-by: Tim Culverhouse <tim@timculverhouse.com>
Signed-off-by: Moritz Poldrack <git@moritz.sh>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
| |
To accommodate servers that use a delimiter other than "/" ("." being a
common alternative), the delimiter is fetched from the server when
connecting.
Signed-off-by: Moritz Poldrack <git@moritz.sh>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
| |
Ask user whether they want to abort before sending if the subject header
is empty and they have enabled the warn-empty-subject config option.
Signed-off-by: Jason Cox <me@jasoncarloscox.com>
Acked-by: Tim Culverhouse <tim@timculverhouse.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Improve command completion by supporting option flags and option
arguments completion. Option completion is activated when the command
implements the OptionsProvider interface. Implementing the
OptionCompleter allows the completion of individual option arguments.
The completion interfaces harmonizes the completion behavior in aerc,
makes the completion code clearer and simplifies the completion
functionality.
With this patch, the Complete method on commands will only have to deal
with the actual completion, i.e. paths, folders, etc and not worry about
options. To remove all options and its mandatory arguments from args,
use commands.Operands().
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Update the dirtree drawing structure to be a bit more compact. The
dirtree is drawn with one column left for a flag, which indicates if a
parent is collapsed or expanded. Only draw the "flag" when the parent is
collapsed. Change the flag to a '+' character to match common UI
patterns of expanding lists having a '+' box.
Don't draw the '>' character in the dirtree. This character is nice in
the threaded message view, but clutters up the dirtree. I know this is a
matter of preference, but this approach is similar to most other UI tree
view and gives the dirtree an extra column of space.
The original dirtree looks like this:
┌Inbox
├─>Sub
└─>Sub
And collapsed:
-Inbox
This patch changes it to:
Inbox
├─Sub
└─Sub
And collapsed:
+Inbox
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Moritz Poldrack <moritz@poldrack.dev>
|
|
|
|
|
|
|
|
|
|
| |
Only strip the leading whitespace when a delimiter needs to be
prepended.
Fixes: bba715975690 ("compose: only add delimiter when a signature is defined")
Reported-by: Jason Cox <dev@jasoncarloscox.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Acked-by: Jason Cox <dev@jasoncarloscox.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A panic occurs when a terminal is launched with a command that fails:
:term blabla
The underlying terminal does not need to be closed if the command failed
to start: all resources are cleaned up upon failure to start already.
Don't attempt to close terminal if the command didn't start.
With the above fix in place, the tab will linger around until a redraw
occurs, as there is nothing queuing a redraw on this behavior. Add a
QueueRedraw in the tabs.Remove method to clean up the tabbar.
The issue in tcell-term that causes this panic has been address there as
well, released as 0.7.1. Update aerc's version.
Reported-by: Koni Marti <koni.marti@gmail.com>
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Tested-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
| |
Add config options for setting the TERM environment variable used in
tcell-term and for enabling or disabling OSC8 escape sequence output.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry<robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Upgrade tcell-term to latest release.
This is a complete rewrite of tcell-term, and includes many minor bug
fixes and overall improvements. Notably:
- Improved parsing
- One fewer goroutine
- Improved API
- Improved redraw messaging
- Improved key support
- Improved mouse support
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry<robin@jarry.cc>
|
|
|
|
|
|
|
|
|
| |
Add template parameter to the mailto query and set the
config.Template.NewMessage template file as default.
Fixes: https://todo.sr.ht/~rjarry/aerc/145
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry<robin@jarry.cc>
|
|
|
|
|
|
|
|
|
| |
Add .Role as a template field for use in distinguishing between
mailboxes with a given IANA role, or custom role defined by aerc
("query" for notmuch queries, for example).
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry<robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
| |
Store the Directory RUE counts on the Directory data model. Use
DirectoryInfo messages to update the Directory model. Access Directories
via the dirlist instead of via the msgstore. Remove unused fields on
DirectoryInfo, all backends now give accurate counts.
Move refetch logic into dirlist
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry<robin@jarry.cc>
|
|
|
|
|
|
|
|
| |
Use the dirstore to store models.Directory data structures. This will be
used in subsequent commits for accessing directory data.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
ListDirectories is called when connecting, reconnecting, and
creation/deletion of a directory. The code is not in the same style as
other areas of aerc. Refactor to match coding style of the rest of aerc
by creating an Update function which handles necessary updates in the
dirlist. This style does not use a callback, making it clearer what is
happening in the message flow, and operates similar to how the msgstore
receives updates.
Use a map in the dirstore to reduce duplicate storage of directory
names. Directly add or remove directories from the map when created /
deleted to prevent a new ListDirectories message, and a flash of the UI.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Create msgstores when a types.Directory message is received. This
removes a quirk from the IMAP worker that msgstores are created on the
first DirectoryInfo, and updated on the second. This path requires three
messages in order to get an updated message store. By creating from
types.Directory, we ensure that any subsequent DirectoryInfo can be
routed to a msgstore.
Remove the field DirInfo from the msgstore initializer, it isn't needed
at initialization and isn't available with this refactor.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fetching the message list is done in a convoluted way. The UI receives a
DirectoryInfo message, which creates a message store. It then receives a
second DirectoryInfo (an oddity from the IMAP worker), and this
DirectoryInfo is passed to the message store which then requests a fetch
of the message list via store.Sort.
Use the OpenDirectory done response to tell the message store to fetch
messages. This makes the code easier to follow, and does not rely on
quirks from the IMAP worker.
Signed-off-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Robin Jarry <robin@jarry.cc>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Another attempt at fixing the high CPU usage when terminal tabs are
running interactive tui applications and the message list tab is
selected.
There are cases where a terminal widget can be visible but not focused
(composer, message viewer, attachment selector, etc.). Define a new
Visible interface with a single Show() method. Call that method when
changing tabs to make sure that terminal widget content events only
trigger redraws when they are visible.
Fixes: 382aea4a9426 ("terminal: avoid high cpu usage when not focused")
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
| |
Avoid negative offsets and limit height to the parent context height.
Fixes: https://todo.sr.ht/~rjarry/aerc/142
Reported-by: Akspecs <akspecs@gmail.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Koni Marti <koni.marti@gmail.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When running dynamic tui applications (such as btop, htop, etc.) in the
embedded :terminal and focusing an account tab, every tui application
change triggers a full redraw of the whole window. When the message list
is focused, this leads to high cpu usage because of the computationally
intensive templates parsing and ansi sequence handling.
Only redraw when the terminal is focused. Do not use tcell Watch and
Unwatch functions since these completely disable all widget updates,
including title changes and terminal close events.
Reported-by: John Mcenroy <handplanet@outlook.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: John Mcenroy <handplanet@outlook.com>
|