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.el310
1 files changed, 153 insertions, 157 deletions
diff --git a/lib/eos/jao-afio.el b/lib/eos/jao-afio.el
index 306a1d5..b588989 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 jao
+;; Copyright (C) 2020, 2021, 2022, 2024 jao
;; Author: jao <mail@jao.io>
;; Keywords: frames
@@ -18,66 +18,63 @@
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
-;;; Code:
-
+;;; initialisation
(require 'cl-lib)
+(require 'jao-doc-session)
+
+(defvar jao-afio-use-frames (not window-system))
(defvar jao-open-doc-fun 'find-file)
(defvar jao-afio-mail-function 'gnus)
(defvar jao-afio-use-w3m nil)
-(defvar jao-afio-notmuch-in-web nil)
+(defvar jao-afio-auto-toggle nil)
(defvar jao-afio-switch-hook nil)
-(defvar jao-afio--configs '(?c ?w ?g ?p ?s))
-(defvar jao-afio--current-config (car jao-afio--configs))
-(defvar jao-afio--locker nil)
-(defvar jao-afio-fallback-fun nil)
+(defvar jao-afio--configs '(?c ?w ?g ?p ?s ?t))
+(defvar jao-afio--previous-config (car jao-afio--configs))
-(defun jao-afio--check-frame-p ()
- (assoc 'afio (frame-parameters)))
+(defun jao-afio--current-config (&optional c f)
+ (when c (modify-frame-parameters f `((afio . ,c))))
+ (frame-parameter f 'afio))
(defun jao-afio--init (&optional f)
(interactive)
- (when (and (frame-live-p jao-afio--locker)
- (not (eql f jao-afio--locker)))
- (if jao-afio-fallback-fun
- (funcall jao-afio-fallback-fun)
- (error "Another frame is using afio")))
- (setq jao-afio--locker f)
- (modify-frame-parameters f '((afio . t)))
- (setq jao-afio--current-config ?c)
- (mapc (lambda (r) (set-register r nil)) jao-afio--configs)
- (window-configuration-to-register ?c))
-
-(defun jao-afio--steal ()
- (interactive)
- (setq jao-afio--locker nil)
- (jao-afio--init (window-frame (get-buffer-window (current-buffer)))))
+ (jao-afio--current-config ?c)
+ (if jao-afio-use-frames
+ (set-frame-name "W1")
+ (window-configuration-to-register ?c)))
(defun jao-afio--check-frame ()
- (unless (jao-afio--check-frame-p)
- (or ;; (when jao-afio-fallback-fun
- ;; (funcall jao-afio-fallback-fun)
- ;; t)
- (when (y-or-n-p "Another frame is using afio. Steal? ")
- (jao-afio--steal)
- t)
- (error "Aborted"))))
-
-(defun jao-afio--next-frame ()
- (interactive)
- (jao-afio--check-frame)
- (let* ((cur (member jao-afio--current-config jao-afio--configs))
- (next (or (cadr cur) (car jao-afio--configs))))
- (jao-afio--goto-frame next)))
+ (unless (jao-afio--current-config)
+ (jao-afio--init (window-frame (get-buffer-window (current-buffer))))))
+;;; utilities
+(defun jao-afio-trisect (&optional force)
+ (interactive)
+ (let ((fw (frame-width))
+ (display-buffer-alist nil))
+ (cond ((or force (>= fw 240))
+ (let ((b (current-buffer)))
+ (delete-other-windows)
+ (switch-to-buffer (other-buffer b))
+ (split-window-horizontally)
+ (switch-to-buffer (other-buffer b))
+ (split-window-horizontally)
+ (switch-to-buffer b)
+ (balance-windows)))
+ ((> fw 162)
+ (delete-other-windows)
+ (split-window-horizontally)
+ (switch-to-buffer (other-buffer))))))
+
+;;; session openers
;;;###autoload
-(defun jao-afio-open-pdf-session ()
+(defun jao-afio-open-pdf-session (&optional docs)
(interactive)
- (let ((jao-doc-view-inhibit-session-save t))
- (dolist (doc (jao-doc-view-session))
- (when (and (file-exists-p doc) (y-or-n-p (format "Open %s? " doc)))
- (jao-open-doc doc)
+ (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)))
@@ -85,43 +82,48 @@
(interactive)
(delete-other-windows)
(split-window-right)
- (let ((docs (cl-remove-if-not (lambda (b)
- (with-current-buffer b (jao-doc-view--is-doc)))
- (buffer-list))))
+ (let ((docs (cl-remove-if-not 'jao-doc-session-is-doc (buffer-list))))
(if (car docs)
(progn (switch-to-buffer (car docs))
(switch-to-buffer-other-window (or (cadr docs) (car docs))))
- (when (and (jao-doc-view-session) (y-or-n-p "Load saved session? "))
- (jao-afio-open-pdf-session)))))
+ (when-let (docs (jao-doc-session))
+ (when (y-or-n-p (format "Load saved session? (%d docs)" (length docs)))
+ (jao-afio-open-pdf-session docs))))))
+
+(declare-function w3m "w3m")
+(declare-function notmuch "notmuch")
+(declare-function jao-eww-session-eww-buffers "jao-eww-session")
+(declare-function jao-eww-session-load "jao-eww-session")
-(declare w3m "w3m")
-(declare w3m-alive-p "w3m")
-(declare w3m-previous-buffer "w3m")
-(declare notmuch "notmuch")
+(defun jao-afio--open-eww-session ()
+ (if-let (b (jao-eww-session-eww-buffers))
+ (switch-to-buffer (car b))
+ (jao-eww-session-load)))
;;;###autoload
(defun jao-afio-open-www ()
(interactive)
(require 'jao-eww-session)
(if (< (frame-width) 160)
- (if jao-afio-use-w3m (w3m) (jao-eww-session-load))
- (delete-other-windows)
- (split-window-right)
+ (if jao-afio-use-w3m (w3m) (jao-afio--open-eww-session))
(if jao-afio-use-w3m
- (w3m)
- (jao-eww-session-load)
+ (progn (delete-other-windows)
+ (split-window-right)
+ (w3m))
+ (jao-afio-trisect)
+ (jao-afio--open-eww-session)
(let ((b (current-buffer)))
(other-window 1)
- (if jao-afio-notmuch-in-web
- (notmuch)
- (switch-to-buffer (car (jao-eww-session--list-buffers b))))
+ (switch-to-buffer (car (jao-eww-session-eww-buffers b)))
+ (other-window 1)
+ (switch-to-buffer (car (jao-eww-session-eww-buffers b)))
(other-window 1)))))
;;;###autoload
(defun jao-afio-open-gnus ()
(interactive)
(delete-other-windows)
- (org-agenda-list)
+ (jao-org-agenda)
(calendar)
(find-file (expand-file-name "inbox.org" org-directory))
(gnus)
@@ -131,136 +133,130 @@
(other-window 1)
(delete-other-windows-vertically)
(find-file (expand-file-name "inbox.org" org-directory))
+ (set-window-dedicated-p nil t)
(split-window-below (/ (window-height) 3))
(other-window 1)
- (org-agenda-list)
- (split-window-below -9)
+ (jao-org-agenda)
+ (set-window-dedicated-p nil t)
+ (split-window-below -8)
(other-window 1)
(switch-to-buffer "*Calendar*")
+ (set-window-dedicated-p nil t)
(other-window 1))
-;;;###autoload
-(defun jao-afio-open-notmuch ()
- (interactive)
+(defun jao-afio--open-mail (fun)
+ (unless (get-buffer "*Calendar*") (calendar))
(delete-other-windows)
(split-window-horizontally -80)
- (notmuch)
- (jao-afio--mail-sidebar))
-
-(defun jao-afio-open-mail-function ()
- (interactive)
- (jao-trisect)
- (other-window 2)
- (delete-window)
- (other-window 1)
- (funcall jao-afio-mail-function)
+ (funcall fun)
+ ;; (set-window-dedicated-p nil t)
(jao-afio--mail-sidebar))
;;;###autoload
(defun jao-afio-open-mail ()
(interactive)
- (unless (get-buffer "*Calendar*") (calendar))
(cond ((eq 'gnus jao-afio-mail-function) (jao-afio-open-gnus))
- ((eq 'notmuch jao-afio-mail-function) (jao-afio-open-notmuch))
- (jao-afio-open-mail-function (jao-afio-open-mail-function))))
+ ((eq 'notmuch jao-afio-mail-function) (jao-afio--open-mail 'notmuch))
+ (t (jao-afio-trisect))))
+
+;;;###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))))
+
+;;; 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"))))
+
+(defun jao-afio-frame-no (&optional c)
+ (alist-get (or c (jao-afio--current-config))
+ '((?s . 0) (?c . 1) (?g . 2) (?w . 3) (?p . 4) (?t . 5))))
(defun jao-afio--goto-frame (next &optional reset)
- (when (or reset (not (eq next jao-afio--current-config)))
- (let ((next-cfg (when (not reset) (get-register next))))
- (window-configuration-to-register jao-afio--current-config)
- (setq jao-afio--current-config next)
- (if next-cfg
- (jump-to-register next)
- (delete-other-windows)
- (cl-case next
- (?w (jao-afio-open-www))
- (?g (jao-afio-open-mail))
- (?p (jao-afio-open-doc))
- (?s (delete-other-windows))))
- (run-hooks 'jao-afio-switch-hook))))
-
-(defun jao-afio--goto-main (&optional reset)
- (interactive "P")
(jao-afio--check-frame)
- (jao-afio--goto-frame ?c reset))
-
-(defun jao-afio--goto-scratch (&optional reset)
+ (let ((current (jao-afio--current-config)))
+ (if (and jao-afio-auto-toggle
+ (eq next current)
+ (not reset)
+ (not (eq current jao-afio--previous-config)))
+ (jao-afio--goto-frame jao-afio--previous-config)
+ (when (or reset (not (eq next current)))
+ (if jao-afio-use-frames
+ (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)))))
+ (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)))))
+
+(defun jao-afio-goto-main (&optional reset)
(interactive "P")
- (jao-afio--check-frame)
- (jao-afio--goto-frame ?s reset))
+ (jao-afio--goto-frame ?c reset))
-(defun jao-afio--goto-mail (&optional reset)
+(defun jao-afio-goto-mail (&optional reset)
(interactive "P")
- (jao-afio--check-frame)
(jao-afio--goto-frame ?g reset))
-(defun jao-afio--goto-docs (&optional reset)
+(defun jao-afio-goto-docs (&optional reset)
(interactive "P")
- (jao-afio--check-frame)
(jao-afio--goto-frame ?p reset))
-(defun jao-afio--goto-www (&optional reset)
+(defun jao-afio-goto-www (&optional reset)
(interactive "P")
- (if (jao-afio--check-frame-p)
- (jao-afio--goto-frame ?w reset)
- (when (and jao-afio-use-w3m (w3m-alive-p))
- (pop-to-buffer (w3m-alive-p)))))
-
-(defun jao-afio--try-init (&optional f)
- (ignore-errors (jao-afio--init f))
- t)
-
-(defun jao-afio--goto-www-buffer (buf &rest _)
- (jao-afio--goto-www)
- (jao-first-window)
- (switch-to-buffer buf nil t))
-
-(defun jao-afio--goto-pdf-buffer (buf &rest _)
- (if (jao-afio--check-frame-p)
- (progn (jao-afio--goto-docs)
- (jao-first-window)
- (switch-to-buffer buf nil t))
- (pop-to-buffer buf)))
+ (jao-afio--goto-frame ?w reset))
+
+(defun jao-afio-toggle ()
+ (interactive)
+ (jao-afio--goto-frame jao-afio--previous-config))
(defun jao-afio-goto-scratch (&optional one-win)
- (jao-afio--goto-scratch)
+ (interactive "P")
+ (jao-afio--goto-frame ?s nil)
(when one-win (delete-other-windows)))
-(defun jao-afio-current-frame ()
- (cl-case jao-afio--current-config
- (?c "Main")
- (?s "Scratch")
- (?g "Mail")
- (?p "Docs")
- (?w "Web")))
-
-(defun jao-afio-current-no ()
- (cl-case jao-afio--current-config
- (?c "1")
- (?s "0")
- (?g "2")
- (?p "4")
- (?w "3")))
+(defun jao-afio-goto-chats (&optional reset)
+ (interactive "P")
+ (jao-afio--goto-frame ?t reset))
;;;###autoload
(defun jao-afio-goto-nth (n)
(cl-case n
- ((1) (jao-afio--goto-main))
- ((2) (jao-afio--goto-mail))
- ((3) (jao-afio--goto-www))
- ((4) (jao-afio--goto-docs))
- ((5) (jao-afio--goto-scratch-1))
- ((0) (jao-afio--goto-scratch))))
+ ((-1) (jao-afio-goto-scratch t))
+ ((0) (jao-afio-goto-scratch))
+ ((1) (jao-afio-goto-main))
+ ((2) (jao-afio-goto-mail))
+ ((3) (jao-afio-goto-www))
+ ((4) (jao-afio-goto-docs))
+ ((5) (jao-afio-goto-chats))))
+
+;;;###autoload
+(defun jao-afio-pop-to-buffer (n buff)
+ (interactive "NFrame number: \nBBuffer: ")
+ (jao-afio-goto-nth n)
+ (pop-to-buffer buff))
+;;; setup
;;;###autoload
-(defun jao-afio-setup (&optional fallback-fun init-p)
- (global-set-key "\C-cf" 'jao-afio--goto-main)
- (global-set-key "\C-cg" 'jao-afio--goto-mail)
- (global-set-key "\C-cw" 'jao-afio--goto-www)
- (global-set-key "\C-cz" 'jao-afio--goto-docs)
- (setq jao-afio-fallback-fun fallback-fun)
- (add-hook (if init-p 'after-init-hook 'after-make-frame-functions)
- 'jao-afio--try-init))
+(defun jao-afio-setup (&optional use-frames)
+ (setq jao-afio-use-frames use-frames)
+ (jao-afio--init))
(provide 'jao-afio)
;;; jao-afio.el ends here