aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* doc: clarify layered styles render priorityRobin Jarry2023-04-101-0/+43
| | | | | | | | | With all the new different options, the behaviour can be confusing. Add explicit rules and examples to avoid ambiguities. Reported-by: skejg <grolleman@zoho.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Inwit <inwit@sindominio.net>
* terminal: avoid high cpu usage when not focusedRobin Jarry2023-04-041-1/+3
| | | | | | | | | | | | | | | | 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>
* stylesets: fix *.selected parsingRobin Jarry2023-04-021-1/+1
| | | | | | | | | | | | | | | | | | | The stylesets are parsed in two passes. The first pass skips the .selected keys and updates the attributes and colors of both the objects and selected maps. The second pass is supposed to only update the selected map of the pointed style objects. The boolean logic was incorrect, the .selected styles were applied on normal objects as well which led to confusing behaviour most specifically when using *.selected.toggle=true. Properly parse .selected elements. Fixes: 47675e80850d ("config: rework styleset parsing") Reported-by: John Mcenroy <handplanet@outlook.com> Reported-by: Kirill Chibisov <contact@kchibisov.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Kirill Chibisov <contact@kchibisov.com>
* colorize: make url parsing more robustRobin Jarry2023-04-023-25/+84
| | | | | | | | | | | | | | | | | | Reuse the URL parsing algorithm from foot. Basically, it involves recording the opening [, (, < and take into account their closing counterparts. If a closing character is encountered with no matching opening one, assume the URL ends. This allows handling markdown link syntax such as: [http://foobaz.org/xxx](http://foobaz.org/xxx) Avoid coloring bare URL protocols such as http:// or https:// Update test vector to handle more corner cases. Link: https://codeberg.org/dnkl/foot/src/tag/1.13.1/url-mode.c#L331-L471 Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Kirill Chibisov <contact@kchibisov.com>
* accounts: warn for starttls deprecation only onceRobin Jarry2023-04-021-1/+3
| | | | | | | | | | | | | | If the user has several accounts with smtp-starttls=yes set, they will be warned multiple times for each account. This is confusing and may let the user believe that aerc is stuck because closing the dialog seems to have no effect. Only warn once. Fixes: c09b17a930cc ("smtp: replace smtp-starttls with schema option") Reported-by: Inwit <inwit@sindominio.net> Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Moritz Poldrack <moritz@poldrack.dev>
* hooks: add aerc-shutdownMoritz Poldrack2023-04-016-1/+45
| | | | | | | | | | Add a hook to run when aerc shuts down. The environment is supplemented with the duration aerc was alive for. References: https://todo.sr.ht/~rjarry/aerc/136 Signed-off-by: Moritz Poldrack <git@moritz.sh> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* hooks: add aerc-startup hookMoritz Poldrack2023-04-016-1/+53
| | | | | | | | | | | Add a hook to run when aerc starts up. The environment is supplemented with aerc version and the path to its binary. References: https://todo.sr.ht/~rjarry/aerc/136 References: https://todo.sr.ht/~rjarry/aerc/139 Signed-off-by: Moritz Poldrack <git@moritz.sh> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* config: replace triggers with hooksMoritz Poldrack2023-04-0111-90/+143
| | | | | | | | | | | | | Deprecate triggers and replace them with hooks. Now that aerc supports running arbitrary ex commands over IPC, it is possible to run internal aerc commands *and* shell commands via external shell scripts. Hooks only allow running shell commands. Hooks info is passed via environment variables. Implements: https://todo.sr.ht/~rjarry/aerc/136 Signed-off-by: Moritz Poldrack <git@moritz.sh> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* tabs: make sure to close tab contentRobin Jarry2023-04-0117-44/+43
| | | | | | | | Rework how tabs are closed. Change the aerc.RemoveTab and aerc.ReplaceTab functions to accept a new boolean argument. If true, make sure to close the tab content. Signed-off-by: Robin Jarry <robin@jarry.cc>
* config: remove subject contextual ui sectionsRobin Jarry2023-03-314-63/+57
| | | | | | | | | | We have been wanting to remove this for a while now. The only use case is styleset and changing the whole styleset based on an email subject does not make much sense. The same feature can be achieve with dynamic msglist* styles based on any email header value in the stylesets now. Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* styleset: allow dynamic msglist stylingRobin Jarry2023-03-315-33/+134
| | | | | | | | | | | Add support for dynamic msglist*.$HEADER,$VALUE.$ATTR = $VALUE where $VALUE can be either a fixed string or a regular expression. This is intended as a replacement of contextual ui sections based on subject values. Implements: https://todo.sr.ht/~rjarry/aerc/18 Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* config: rework styleset parsingRobin Jarry2023-03-311-115/+53
| | | | | | | Simplify code. Prepare for dynamic styling of the message list. Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* style: inherit colors unless explicitly set in layered stylesRobin Jarry2023-03-312-9/+13
| | | | | | | | Inherit from the lower layers colors unless explicitly overridden in upper layers. Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* templates: fix layered fg & bg color for inline stylesRobin Jarry2023-03-311-7/+8
| | | | | | | | | | | | | The logic was inverted. The style argument is actually the "under" layer style. Each character in the RuneBuffer style must be applied on *top* of it, not the other way around. Use colors from style and override them with each character's colors if they are set. Keep attributes handling unchanged. Fixes: ab8f433e1739 ("templates: allow layered fg & bg color for inline styles") Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* config: report accounts.conf format errorsRobin Jarry2023-03-262-13/+15
| | | | | | | | | | | When accounts.conf cannot be parsed, return an error instead of assuming that the file is non existent and wrongfully opening the new account wizard. Use the same ini delimiters for all configuration files. Fixes: https://todo.sr.ht/~rjarry/aerc/151 Reported-by: Jon Fineman <jon@fineman.me> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* colorize: emit OSC 8 for URLs and emailsKirill Chibisov2023-03-264-7/+28
| | | | | | | | | | Mark URLs with OSC 8 escape sequence to help terminal emulators with opening multi-line URLs with the mouse and attach the hyperlink to email addresses, so the users could open them. Link: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda Signed-off-by: Kirill Chibisov <contact@kchibisov.com> Acked-by: Robin Jarry <robin@jarry.cc>
* colorize: use bool for boolean variablesRobin Jarry2023-03-261-27/+28
| | | | | | Do not use int for true/false values. Signed-off-by: Robin Jarry <robin@jarry.cc>
* parse msg-id lists more liberallyNguyễn Gia Phong2023-03-267-38/+99
| | | | | | | | | | | | | | | Some user agents deliberately generate non-standard message identifier lists in In-Reply-To and References headers. Instead of failing silently, aerc now falls back to a desperate parser scavaging whatever looking like <id-left@id-right>. As the more liberal parser being substituted with, References header are now stored for IMAP not only when there's a parsing error. Fixes: 31d2f5be3cec ("message-info: add explicit References field") Signed-off-by: Nguyễn Gia Phong <mcsinyx@disroot.org> Acked-by: Robin Jarry <robin@jarry.cc>
* smtp: replace smtp-starttls with schema optionMarcin Serwin2023-03-264-55/+53
| | | | | | | | | The "smtp-starttls" options is now ignored in favor of more detailed schema specification, similarly to IMAP. Fixes: https://todo.sr.ht/~rjarry/aerc/149 Signed-off-by: Marcin Serwin <marcin.serwin0@protonmail.com> Acked-by: Robin Jarry <robin@jarry.cc>
* ci: fix lint if notmuch is not installedMoritz Poldrack2023-03-162-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The linter goes completely crazy when notmuch is not installed and the notmuch build tag is enabled. With an otherwise successful lint, the following output is generated: worker/notmuch/lib/database.go:14:10: could not import github.com/zenhack/go.notmuch (-: # github.com/zenhack/go.notmuch ../../go/pkg/mod/github.com/brunnre8/go.notmuch@v0.0.0-20201126061756-caa2daf7093c/configList.go:9:11: fatal error: notmuch.h: No such file or directory 9 | // #include <notmuch.h> | ^~~~~~~~~~~ compilation terminated.) (typecheck) notmuch "github.com/zenhack/go.notmuch" ^ commands/eml.go:4:2: "bytes" imported and not used (typecheck) "bytes" ^ aerc.go:39:7: previous case (typecheck) case *widgets.AccountView: ^ exit status 1 make: *** [Makefile:73: lint] Error 1 Only include the notmuch build tag in the lint process if it is actually installed. Signed-off-by: Moritz Poldrack <git@moritz.sh> Signed-off-by: Robin Jarry <robin@jarry.cc>
* doc: merge duplicate :filter in aerc(1)witcher2023-03-161-6/+2
| | | | | | | | | | | :filter was given twice in the "MESSAGE LIST COMMANDS" section of aerc(1), both incomplete/wrong. Merge both to reference aerc-search(1) and say it actually *filters* the message list. Fixes: af63bd0188d1 ("doc: homogenize scdoc markup") References: https://todo.sr.ht/~rjarry/aerc/144 Signed-off-by: witcher <witcher@wiredspace.de> Acked-by: Moritz Poldrack <moritz@poldrack.dev>
* main: rename aerc.go -> main.goRobin Jarry2023-03-151-0/+0
| | | | | | | | I like it better that way. And it will not piss me off every time I need to use auto completion. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Moritz Poldrack <moritz@poldrack.dev>
* config: fix default value of next-message-on-deleteRobin Jarry2023-03-151-1/+1
| | | | | | | | | The default value should be true as stated in the docs. Fixes: b63c93563c62 ("config: use reflection to map ini keys to struct fields") Reported-by: Kirill Chibisov <contact@kchibisov.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Kirill Chibisov <contact@kchibisov.com>
* move/archive: make sure to close existing viewerRobin Jarry2023-03-151-0/+2
| | | | | | | | | | When running :move or :archive with a message viewer opened, the viewer is never closed properly. This leads to resources leak (pager processes left running). Fix that. Reported-by: Kirill Chibisov <contact@kchibisov.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Kirill Chibisov <contact@kchibisov.com>
* openers: support basic shell globbingRobin Jarry2023-03-135-16/+38
| | | | | | | Allow wild cards for MIME types like in filters. Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* openers: add mime type handling for open-linkRobin Jarry2023-03-137-17/+33
| | | | | | | | | Provide a way to configure link openers. Based on the URL mime type: x-scheme-handler/$scheme. Signed-off-by: Kirill Chibisov <contact@kchibisov.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
* doc: improve aerc-templates examplesRobin Jarry2023-03-131-2/+5
| | | | | | Adjust some examples with real world use cases. Signed-off-by: Robin Jarry <robin@jarry.cc>
* fswatcher: fix bsd supportRobin Jarry2023-03-106-20/+14
| | | | | | | | | | | | | | | Fix the following error when running maildir on freebsd: could not create file system watcher: Unsupported OS: freebsd Do not register based on os type. Register based on supported API. Rename linux -> inotify and darwin -> fsevents. Only build fsevents on darwin, and inotify on all other platforms. Fixes: a0935a3de0ce ("worker/lib: implement an fswatcher interface") Reported-by: Jens Grassel <jens@wegtam.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Jens Grassel <jens@wegtam.com>
* account: fix crash/race on initRobin Jarry2023-03-091-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | When an account is initialized too quickly, setTitle may be called before acct.tab is initialized, leading to a crash: runtime error: invalid memory address or nil pointer dereference goroutine 1 [running]: panic({0xa49820, 0x1059510}) runtime/panic.go:890 +0x262 git.sr.ht/~rjarry/aerc/lib/ui.(*Tab).SetTitle(...) git.sr.ht/~rjarry/aerc/lib/ui/tab.go:37 git.sr.ht/~rjarry/aerc/widgets.(*AccountView).setTitle(0xc000838000) git.sr.ht/~rjarry/aerc/widgets/account.go:617 +0x2a0 git.sr.ht/~rjarry/aerc/widgets.(*AccountView).onMessage(0xc000838000, {0xbffc60?, 0xc0000f1080?}) git.sr.ht/~rjarry/aerc/widgets/account.go:364 +0x13e8 git.sr.ht/~rjarry/aerc/widgets.(*Aerc).HandleMessage(0xc0000f4000, {0xbffc60, 0xc0000f1080}) git.sr.ht/~rjarry/aerc/widgets/aerc.go:174 +0x5f main.main() git.sr.ht/~rjarry/aerc/aerc.go:252 +0x965 Avoid this. Fixes: 6b39c0dae1e1 ("tabs: use template for account tab name") Signed-off-by: Robin Jarry <robin@jarry.cc>
* goflags.sh: silence errorsRobin Jarry2023-03-091-1/+1
| | | | | | | No need to print errors when notmuch.h is not found. The only point of this script to check if it is available or not. Signed-off-by: Robin Jarry <robin@jarry.cc>
* doc: add missing references to other manpagesTom Schwindl2023-03-091-2/+3
| | | | | | | | aerc(1) is most likely the entry point for a user who wants to read the docs. Thus, reference all other manpages to improve accessibility. Signed-off-by: Tom Schwindl <schwindl@posteo.de> Acked-by: Robin Jarry <robin@jarry.cc>
* templates: add conditional style methodRobin Jarry2023-03-084-1/+25
| | | | | | | | | | | | | Add .StyleSwitch that takes a string and an arbitrary number of cases (regexp, style). Reuse some of the constructs introduced by previous commit. The style of the first regular expression that matches will be applied. If the string does not match any of the expressions, it will be left as-is. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: add switch/case functionsRobin Jarry2023-03-083-0/+45
| | | | | | | This allows much shorter templates. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: add match functionRobin Jarry2023-03-083-0/+40
| | | | | | | | | | | | | | Add a match function that returns true if a string matches the provided regular expression. The compiled regular expressions are cached in a sync.Map to avoid repetitive compilations of the same expressions. Caveat: if the user mixes the arguments order, it may cause the cache to consume a lot of memory filled with garbage regular expression objects. Ideally, we would need to limit the size of this cache and/or use a LRU cache implementation. Maybe someday? Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: reverse args order for .StyleRobin Jarry2023-03-082-2/+2
| | | | | | | | In preparation for .StyleMatch put the content first, followed by the style name. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: make SubjectBase official apiRobin Jarry2023-03-084-1/+16
| | | | | | | | Document .SubjectBase. Fix its value along the way. Do not reuse d.Subject() which may be empty if d.threadSameSubject is true. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: separate thread prefix from subjectRobin Jarry2023-03-088-16/+27
| | | | | | | | Extract {{.ThreadPrefix}} from {{.Subject}} so that the prefix can be styled in a different color. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* msglist: fix inconsistent thread subject deduplicationRobin Jarry2023-03-081-1/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | When threading is enabled, some messages which have different base subjects are hidden whereas some others which have similar subjects are displayed: [PATCH aerc v3 1/3] mk: remove smart rebuild when GOFLAGS have changed ├─>[PATCH aerc v3 2/3] mk: only install changed/missing files │ └─>Re: [PATCH aerc v3 2/3] mk: only install changed/missing files │ └─>Re: [PATCH aerc v3 2/3] mk: only install changed/missing files ├─> └─>Re: [PATCH aerc v3 1/3] mk: remove smart rebuild when GOFLAGS have changed This happens because we are using the "previous" message to get the subject base instead of the current one. Compute the base subject from the current message. Here is the result: [PATCH aerc v3 1/3] mk: remove smart rebuild when GOFLAGS have changed ├─>[PATCH aerc v3 2/3] mk: only install changed/missing files │ └─> │ └─> ├─>[PATCH aerc v3 3/3] mk: speed up notmuch detection └─>Re: [PATCH aerc v3 1/3] mk: remove smart rebuild when GOFLAGS have changed Fixes: 535300cfdbfc ("config: add columns based index format") Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: avoid error when using .Style with unknown style nameRobin Jarry2023-03-081-1/+4
| | | | | | | | | | | | | | | | | When using {{.Style "foo" bar}} and "foo" is not defined in the styleset under the [user] section, there is an obscure error: template: column-right:1:18: executing "column-right" at <.Style>: error calling Style: runtime error: invalid memory address or nil pointer dereference Which is most of the time truncated and can only be read in logs. Referencing an undefined style is not a serious problem. Return the default tcell style in that case and avoid the error. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* templates: allow layered fg & bg color for inline stylesRobin Jarry2023-03-081-5/+7
| | | | | | | | If a user style has no fg and/or no bg color defined, use the color from the underlying style. Signed-off-by: Robin Jarry <robin@jarry.cc> Acked-by: Tim Culverhouse <tim@timculverhouse.com>
* contrib: fix sendemail validate scriptRobin Jarry2023-03-083-10/+29
| | | | | | | | | | | | | | | | | | The current sendemail-validate script cannot be used for patch series. It works on each patch independently from the others and make it impossible to use when there are inter dependencies. I have submitted an alternate validate script that works on whole series which is still waiting for reviews. In the meantime, propose to use my script which can work. To install it in your environment: curl -Lo ~/.local/bin/git-send-email \ https://paste.sr.ht/blob/cedcf24383022949c8dc5bc1300cf5cbc879b36f echo 'export GIT_EXEC_PATH=$PATH:$(git --exec-path)' >> ~/.profile Link: https://lore.kernel.org/git/20230103231133.64050-1-robin@jarry.cc/ Link: https://paste.sr.ht/~rjarry/7e9a98866ba2c6f34e4169debf4f2c14b574613e Signed-off-by: Robin Jarry <robin@jarry.cc>
* mk: use fixed versions for gofumpt and golangci-lintRobin Jarry2023-03-081-3/+5
| | | | | | @latest is flaky and does not resist GOPROXY hiccups. Signed-off-by: Robin Jarry <robin@jarry.cc>
* statusline: avoid races when updating status stackTim Culverhouse2023-03-071-0/+10
| | | | | | | | | The statusline stack is written and read from separate goroutines without a lock. Make the statusline thread-safe by adding locks for access to the stack. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Acked-by: Robin Jarry <robin@jarry.cc>
* notmuch: use fswatcher to trigger directory count updateTim Culverhouse2023-03-073-13/+37
| | | | | | | | | | | Use fswatcher to watch the underlying notmuch db to trigger directory updates. Remove unused argument in the handleUpdateDirCounts function. Call this function when listing directories to initialize counts when starting aerc. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Ben Lee-Cohen <ben@lee-cohen.com> Acked-by: Robin Jarry <robin@jarry.cc>
* notmuch/checkmail: simplify check-mail functionTim Culverhouse2023-03-071-19/+9
| | | | | | | | | Simplify the check-mail function in the notmuch worker. Add account name to the logs. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Ben Lee-Cohen <ben@lee-cohen.com> Acked-by: Robin Jarry <robin@jarry.cc>
* fswatcher: add a darwin fswatcher implementationTim Culverhouse2023-03-075-0/+97
| | | | | | | | | | Add a darwin implementation of FSWatcher using the fsevents package. The implementation is behind a darwin build flag. Co-authored-by: Ben Cohen <ben@bencohen.net> Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Ben Lee-Cohen <ben@lee-cohen.com> Acked-by: Robin Jarry <robin@jarry.cc>
* maildir: use FSWatcher interfaceTim Culverhouse2023-03-072-13/+8
| | | | | | | | Use the FSWatcher interface to create the watcher. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Ben Lee-Cohen <ben@lee-cohen.com> Acked-by: Robin Jarry <robin@jarry.cc>
* worker/lib: implement an fswatcher interfaceTim Culverhouse2023-03-073-0/+113
| | | | | | | | | | | Implement an FSWatcher interface. The interface is used to abstract away file system watchers, which have implementation specific backends. The initial interface has one implementation: inotify for linux. Subsequent commits will add a macOS watcher. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Tested-by: Ben Lee-Cohen <ben@lee-cohen.com> Acked-by: Robin Jarry <robin@jarry.cc>
* change-tab: document "focus previous tab" functionalityinwit2023-03-071-2/+3
| | | | | | | | | | The current :change-tab command allows to be called with a single "-" as a parameter, in which case it changes focus to the previously focused tab. This is useful to switch back and forth between a pair of tabs, and is undocumented. Document this functionality. Signed-off-by: inwit <inwit@sindominio.net> Acked-by: Robin Jarry <robin@jarry.cc>
* ipc: stay silent if command succeededMoritz Poldrack2023-03-072-3/+2
| | | | | | | | It would be nicer if aerc behaved the same way most other tools behave in that no news is good news. Signed-off-by: Moritz Poldrack <git@moritz.sh> Acked-by: Robin Jarry <robin@jarry.cc>