ement: proper auto-restore and open-panel flow

my/ement-open now handles 3 cases:
1. Already connected -> ement-list-rooms immediately
2. Sessions file exists -> ement-connect (no credentials), then
   open rooms via ement-after-initial-sync-hook
3. No saved session -> call-interactively ement-connect, then rooms

my/ement-open-after-sync: self-removing hook that opens room list
after initial sync completes (regardless of how connect was triggered).

Startup auto-connect unchanged (doom-after-init-hook).
This commit is contained in:
2026-02-23 13:40:39 +01:00
parent 61bc7e7490
commit 95f80f9c44

View File

@@ -883,19 +883,38 @@ Keeps the status bar and tab bar fully visible at any zoom level.")
) ; end after! ement ) ; end after! ement
;; Defined outside after! so Doom registers them as proper interactive commands. ;; Defined outside after! so Doom registers them as proper interactive commands.
(defun my/ement-open-after-sync (&rest _)
"Open room list after ement finishes initial sync. Self-removing."
(remove-hook 'ement-after-initial-sync-hook #'my/ement-open-after-sync)
(when (fboundp 'ement-list-rooms)
(ement-list-rooms)))
(defun my/ement-maybe-restore () (defun my/ement-maybe-restore ()
"Restore saved ement session silently (no credentials prompt)." "Restore saved ement session silently (no credentials prompt)."
(require 'ement) (require 'ement)
(when (file-exists-p (expand-file-name ement-sessions-file)) (when (file-readable-p (expand-file-name ement-sessions-file))
(ement-connect :user-id "@martin:sukany.cz"))) (ement-connect :user-id "@martin:sukany.cz")))
(defun my/ement-open () (defun my/ement-open ()
"Switch to Matrix: reconnect if needed, then open room list." "Open Matrix panel: show room list (connect/restore if needed).
If already connected: opens room list immediately.
If sessions file exists: auto-restores without credentials, opens rooms after sync.
Otherwise: runs interactive ement-connect, then opens rooms after sync."
(interactive) (interactive)
(require 'ement) (require 'ement)
(if (and (boundp 'ement-sessions) ement-sessions) (cond
(ement-list-rooms) ;; Already connected — open rooms immediately
(my/ement-maybe-restore))) ((and (boundp 'ement-sessions) ement-sessions)
(ement-list-rooms))
;; Saved session exists — restore without credentials, open rooms after sync
((file-readable-p (expand-file-name ement-sessions-file))
(add-hook 'ement-after-initial-sync-hook #'my/ement-open-after-sync)
(ement-connect :user-id "@martin:sukany.cz"))
;; No saved session — interactive connect, open rooms after sync
(t
(add-hook 'ement-after-initial-sync-hook #'my/ement-open-after-sync)
(call-interactively #'ement-connect))))
;; Auto-connect on Emacs startup (outside after! — ement may be deferred) ;; Auto-connect on Emacs startup (outside after! — ement may be deferred)
(add-hook 'doom-after-init-hook #'my/ement-maybe-restore) (add-hook 'doom-after-init-hook #'my/ement-maybe-restore)