From 3e32379f541feaa07dc6f337e9ef2081d4d6d9a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Feb 2021 15:51:41 -0500 Subject: [PATCH] ui/zen: add +zen/toggle{,-fullscreen} commands A more reliable "Distraction-free" fullscreen mode. --- modules/config/default/+emacs-bindings.el | 3 ++- modules/config/default/+evil-bindings.el | 3 ++- modules/ui/zen/autoload.el | 29 +++++++++++++++++++++++ modules/ui/zen/config.el | 6 +++-- 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 modules/ui/zen/autoload.el diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 7e59de95f..ab6d930a0 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -292,7 +292,8 @@ (:when (featurep! :lang org +pomodoro) :desc "Pomodoro timer" "t" #'org-pomodoro) (:when (featurep! :ui zen) - :desc "Zen mode" "z" #'writeroom-mode)) + :desc "Zen mode" "z" #'+zen/toggle + :desc "Zen mode" "z" #'+zen/toggle-fullscreen)) ;;; v --- versioning (:prefix-map ("v" . "versioning") diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 65be6cce7..64e8382b8 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -693,7 +693,8 @@ (:when (featurep! :editor word-wrap) :desc "Soft line wrapping" "w" #'+word-wrap-mode) (:when (featurep! :ui zen) - :desc "Zen mode" "z" #'writeroom-mode))) + :desc "Zen mode" "z" #'+zen/toggle + :desc "Zen mode (fullscreen)" "Z" #'+zen/toggle-fullscreen))) (after! which-key (let ((prefix-re (regexp-opt (list doom-leader-key doom-leader-alt-key)))) diff --git a/modules/ui/zen/autoload.el b/modules/ui/zen/autoload.el new file mode 100644 index 000000000..9e97d190f --- /dev/null +++ b/modules/ui/zen/autoload.el @@ -0,0 +1,29 @@ +;;; ui/zen/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defalias '+zen/toggle #'writeroom-mode) + +(defvar +zen--last-wconf nil) +;;;###autoload +(defun +zen/toggle-fullscreen () + "Toggle `writeroom-mode' fullscreen and delete all other windows. +Invoke again to revert to the window configuration before it was activated." + (interactive) + (require 'writeroom-mode) + (let ((writeroom-global-effects +zen--old-writeroom-global-effects) + (writeroom-maximize-window t)) + (if writeroom-mode + (progn + (set-frame-parameter + nil 'fullscreen + (let ((fullscreen-restore (frame-parameter nil 'fullscreen-restore))) + (if (memq fullscreen-restore '(maximized fullheight fullwidth)) + fullscreen-restore + nil))) + (set-window-configuration +zen--last-wconf)) + (setq +zen--last-wconf (current-window-configuration)) + (modify-frame-parameters + nil `((fullscreen . fullboth) + (fullscreen-restore . ,(frame-parameter nil 'fullscreen))))) + (let ((writeroom-global-effects (remq 'writeroom-set-fullscreen writeroom-global-effects))) + (call-interactively #'+zen/toggle)))) diff --git a/modules/ui/zen/config.el b/modules/ui/zen/config.el index c465e6795..4919a4c9b 100644 --- a/modules/ui/zen/config.el +++ b/modules/ui/zen/config.el @@ -18,9 +18,11 @@ (after! writeroom-mode ;; Users should be able to activate writeroom-mode in one buffer (e.g. an org - ;; buffer) and code in another. Fullscreening/maximizing will be opt-in. + ;; buffer) and code in another. No global behavior should be applied. + ;; Fullscreening/maximizing will be opt-in. + (defvar +zen--old-writeroom-global-effects writeroom-global-effects) + (setq writeroom-global-effects nil) (setq writeroom-maximize-window nil) - (remove-hook 'writeroom-global-effects #'writeroom-set-fullscreen) (add-hook! 'writeroom-mode-hook (defun +zen-enable-text-scaling-mode-h ()