aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/mail/README.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-18 11:00:53 +0200
committerDanilo M. <danix@danix.xyz>2026-10-18 11:00:53 +0200
commita880134140f7ab8195c6651c2f64f614855c8dce (patch)
treed4cacc3777bb0bbef636c96894791661af456ce8 /desktop/modules/mail/README.md
parentb2fd9aba5711a5863c8700c8b21c83c53e14b39d (diff)
downloadquickshell-a880134140f7ab8195c6651c2f64f614855c8dce.tar.gz
quickshell-a880134140f7ab8195c6651c2f64f614855c8dce.zip
mail: open accounts and messages in qtmaildir from the drawer and notifications
qtmaildir now takes --account, --thread and --message, and hands them to a running window over its socket, so the drawer and the notifications can open the exact thing they show instead of just launching the client. mail-open.sh is the one place that turns an account and a thread into selectors, shared by both callers. It looks up the thread's newest unread message at click time rather than when the row or notification was built: by then it may have been read, and an empty lookup falls back to the whole thread instead of a miss in qtmaildir's status bar. The notification never had a working click: dunstify is not installed, so mail-notify.sh always took its notify-send fallback, which carried no action. It now uses notify-send -A NAME=Text, one action per listed thread (keyed by thread id, which is hex and so never holds the "=" separator) plus the account as default. The round trip through notifyd was checked: notifyctl action makes notify-send print the picked name. On the page, the account header opens the account and a thread row its newest unread message. Rows use TapHandler and HoverHandler because a MouseArea cannot fill a Column. Launches are detached: a first launch is the client itself, and the old reused Process would have killed it on the next click. Opening anything now closes the drawer rather than going back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/modules/mail/README.md')
-rw-r--r--desktop/modules/mail/README.md38
1 files changed, 21 insertions, 17 deletions
diff --git a/desktop/modules/mail/README.md b/desktop/modules/mail/README.md
index 2349da6..5083c34 100644
--- a/desktop/modules/mail/README.md
+++ b/desktop/modules/mail/README.md
@@ -156,15 +156,19 @@ login. The same applies to a restart, so mail that arrived while it was down is
never notified. The drawer count is still right and still shows it,
so nothing is lost but a stale popup.
-The notification is sent with dunstify. The icon is passed as an **absolute
-path** to the active icon theme's `mail-unread-multiple`, because this dunst
-resolves an icon *name* only through the `icon_path` in `dunstrc`, and that
-path holds no mail icon, so a name renders no icon at all. The click action
-(`-A default,open`) makes dunst prepend an `(A)` action indicator when
-`show_indicators` is on, so `dunstrc` sets `show_indicators = no`. A middle
-click (dunst's `do_action`) opens qtmaildir, but not the account it belongs
-to: `qtmaildir` takes no arguments and `startup_account` is a static setting
-rather than a flag, the same limitation the thread rows have.
+The notification is sent with `notify-send` (libnotify 0.8), whose `-A
+NAME=Text` prints the picked action's name; dunstify is not installed. The
+icon is passed as an **absolute path** to the active icon theme's
+`mail-unread-multiple`, so it does not depend on how the daemon resolves icon
+names.
+
+Each listed thread is an action, keyed by its thread id, and the account is
+the `default` one. A click on the balloon offers them in the notifications'
+picker. The picked one runs `mail-open.sh`: the account opens qtmaildir on that
+account, a thread on its newest unread message. Thread ids rather than
+Message-IDs are the keys because they are hex, so a key never carries the `=`
+that separates it from its label; the message is looked up when the action is
+picked, and if it was read in the meantime the whole thread opens instead.
`test-mail-notify.sh` is the check. It sources the script as a library and
asserts on the functions that only move text around, so it needs no mail and no
@@ -191,15 +195,15 @@ respected.
`Keys.onEscapePressed` on a `PanelWindow` never fires, so the focus sits on an
inner `Item`.
-## Thread rows are read-only
+## Opening mail from the page
-Each account shows its three newest unread threads as author, relative date and
-subject. Clicking one launches qtmaildir and nothing more, because `qtmaildir`
-accepts no command line arguments: there is no way to tell it which thread to
-open. `startup_account` in its config is a static setting, not a flag, so
-"open on this account" is unavailable for the same reason. Marking read from
-here was rejected rather than deferred: it would write the database behind a
-possibly running client.
+A click on an account's header opens qtmaildir on that account, and a click on
+a thread row opens that thread's newest unread message, through the same
+`mail-open.sh` the notifications use. qtmaildir hands a second launch's
+selectors to the running window, so neither opens a second client. Launches
+are detached: a first launch *is* the client, and a reused `Process` would kill
+it on the next click. Marking read from here was rejected rather than
+deferred: it would write the database behind a possibly running client.
"Open qtmaildir" launches the client. There is no "Sync now" button: the
watcher triggers a sync the moment mail lands, the cron tick is the backstop,