summaryrefslogtreecommitdiffhomepage
path: root/lib/eos/jao-afio.el
diff options
context:
space:
mode:
Diffstat (limited to 'lib/eos/jao-afio.el')
-rw-r--r--lib/eos/jao-afio.el92
1 files changed, 64 insertions, 28 deletions
diff --git a/lib/eos/jao-afio.el b/lib/eos/jao-afio.el
index b588989..74e1d78 100644
--- a/lib/eos/jao-afio.el
+++ b/lib/eos/jao-afio.el
@@ -1,6 +1,6 @@
;;; jao-afio.el --- workspaces in just one frame -*- lexical-binding: t; -*-
-;; Copyright (C) 2020, 2021, 2022, 2024 jao
+;; Copyright (C) 2020, 2021, 2022, 2024, 2025 jao
;; Author: jao <mail@jao.io>
;; Keywords: frames
@@ -23,6 +23,8 @@
(require 'jao-doc-session)
(defvar jao-afio-use-frames (not window-system))
+(defvar jao-afio-frame-parameters nil)
+(defvar jao-afio-persist-configurations nil)
(defvar jao-open-doc-fun 'find-file)
(defvar jao-afio-mail-function 'gnus)
@@ -32,16 +34,49 @@
(defvar jao-afio--configs '(?c ?w ?g ?p ?s ?t))
(defvar jao-afio--previous-config (car jao-afio--configs))
+(defvar jao-afio--config-names
+ '((?c . "main") (?s . "scratch") (?g . "mail")
+ (?p . "docs") (?w . "web") (?t . "chats")))
+
+(define-multisession-variable jao-afio-configurations nil)
+
+(defmacro jao-afio-add-frame-parameters (name &rest params)
+ `(add-to-list 'jao-afio-frame-parameters
+ '(,(if name (format "%s" name) 'def) ,params)))
+
+(defun jao-afio--current-wc ()
+ (window-state-get (frame-root-window) t))
+
+(defun jao-afio-save-configuration ()
+ (interactive)
+ (when-let* ((c (jao-afio--current-config)))
+ (setf (alist-get c (multisession-value jao-afio-configurations))
+ (jao-afio--current-wc))
+ (message "Configuration of %s saved" (jao-afio-frame-name c))))
+
+(defun jao-afio-restore-configuration (c)
+ (when-let* ((_ jao-afio-persist-configurations)
+ (c (alist-get c (multisession-value jao-afio-configurations))))
+ (window-state-put c)
+ t))
(defun jao-afio--current-config (&optional c f)
(when c (modify-frame-parameters f `((afio . ,c))))
(frame-parameter f 'afio))
+(defun jao-afio--set-up-frame (cfg)
+ (when jao-afio-use-frames
+ (let ((fn (jao-afio-frame-name cfg)))
+ (set-frame-name fn)
+ (when-let* ((params (cadr (or (assoc fn jao-afio-frame-parameters)
+ (assoc 'def jao-afio-frame-parameters)))))
+ (modify-frame-parameters nil params)))))
+
(defun jao-afio--init (&optional f)
(interactive)
(jao-afio--current-config ?c)
(if jao-afio-use-frames
- (set-frame-name "W1")
+ (jao-afio--set-up-frame ?c)
(window-configuration-to-register ?c)))
(defun jao-afio--check-frame ()
@@ -71,17 +106,16 @@
;;;###autoload
(defun jao-afio-open-pdf-session (&optional docs)
(interactive)
- (let ((jao-doc-session-inhibit-save t))
- (dolist (doc (or docs (jao-doc-session)))
- (when (and doc (file-exists-p doc))
- (if (jao-pdf-is-pdf-file doc) (jao-open-doc doc) (find-file doc))
- (other-window 1)))
- (other-window 1)))
+ (dolist (doc (or docs (jao-doc-session)))
+ (when (and (stringp doc) (file-exists-p doc))
+ (if (jao-pdf-is-pdf-file doc) (jao-open-doc doc) (find-file doc))
+ (other-window 1)))
+ (other-window 1))
(defun jao-afio-open-doc ()
(interactive)
(delete-other-windows)
- (split-window-right)
+ (split-window-right 80)
(let ((docs (cl-remove-if-not 'jao-doc-session-is-doc (buffer-list))))
(if (car docs)
(progn (switch-to-buffer (car docs))
@@ -122,10 +156,10 @@
;;;###autoload
(defun jao-afio-open-gnus ()
(interactive)
- (delete-other-windows)
(jao-org-agenda)
(calendar)
(find-file (expand-file-name "inbox.org" org-directory))
+ (delete-other-windows)
(gnus)
(jao-gnus--set-summary-line))
@@ -147,10 +181,12 @@
(defun jao-afio--open-mail (fun)
(unless (get-buffer "*Calendar*") (calendar))
(delete-other-windows)
- (split-window-horizontally -80)
- (funcall fun)
- ;; (set-window-dedicated-p nil t)
- (jao-afio--mail-sidebar))
+ (if (< (frame-width) 160)
+ (funcall fun)
+ (split-window-horizontally -80)
+ (funcall fun)
+ ;; (set-window-dedicated-p nil t)
+ (jao-afio--mail-sidebar)))
;;;###autoload
(defun jao-afio-open-mail ()
@@ -162,21 +198,22 @@
;;;###autoload
(defun jao-afio-reset ()
(interactive)
- (delete-other-windows)
- (cl-case (jao-afio--current-config)
- (?w (jao-afio-open-www))
- (?g (jao-afio-open-mail))
- (?p (jao-afio-open-doc))
- (t (jao-afio-trisect))))
+ (let ((c (jao-afio--current-config)))
+ (unless (jao-afio-restore-configuration c)
+ (delete-other-windows)
+ (cl-case c
+ (?w (jao-afio-open-www))
+ (?g (jao-afio-open-mail))
+ (?p (jao-afio-open-doc))
+ (t (jao-afio-trisect)))
+ (when jao-afio-persist-configurations (jao-afio-save-configuration)))))
;;; go to frame
(defsubst jao-afio--find-frame (c)
(seq-find (lambda (f) (eq (jao-afio--current-config nil f) c)) (frame-list)))
(defun jao-afio-frame-name (&optional c)
- (alist-get (or c (jao-afio--current-config))
- '((?c . "main") (?s . "scratch") (?g . "mail")
- (?p . "docs") (?w . "web") (?t . "chats"))))
+ (alist-get (or c (jao-afio--current-config)) jao-afio--config-names))
(defun jao-afio-frame-no (&optional c)
(alist-get (or c (jao-afio--current-config))
@@ -195,16 +232,15 @@
(let ((f (jao-afio--find-frame next)))
(select-frame-set-input-focus (or f (make-frame)))
(when (setq reset (or reset (not f)))
- (set-frame-name
- (format "W%s" (or (jao-afio-frame-no next) next)))))
+ (jao-afio--set-up-frame next)))
(window-configuration-to-register (jao-afio--current-config))
(when (and (not reset) (get-register next))
(ignore-errors (jump-to-register next)))
(setq reset (or reset (not (get-register next)))))
(jao-afio--current-config next)
(unless (eq current next) (setq jao-afio--previous-config current))
- (when reset (jao-afio-reset))
- (run-hooks 'jao-afio-switch-hook)))))
+ (when reset (jao-afio-reset)))
+ (run-hooks 'jao-afio-switch-hook))))
(defun jao-afio-goto-main (&optional reset)
(interactive "P")
@@ -228,7 +264,7 @@
(defun jao-afio-goto-scratch (&optional one-win)
(interactive "P")
- (jao-afio--goto-frame ?s nil)
+ (jao-afio--goto-frame ?s one-win)
(when one-win (delete-other-windows)))
(defun jao-afio-goto-chats (&optional reset)