]> code.delx.au - gnu-emacs-elpa/blobdiff - darkroom.el
Tidy up margin calculation
[gnu-emacs-elpa] / darkroom.el
index b9733161ef24d5832e249ac5ed48423767f91036..864a6e4abd5df27c30e5a5d83971ed3a8336379e 100644 (file)
@@ -84,59 +84,72 @@ Value is passed to `text-scale-increase'."
   :type 'float
   :group 'darkroom)
 
-(defun darkroom-margins ()
-  (cond ((functionp darkroom-margins)
-         (funcall darkroom-margins))
-        ((consp darkroom-margins)
-         darkroom-margins)
-        ((and (floatp darkroom-margins)
-              (< darkroom-margins 1))
-         (let ((delta (darkroom-float-to-columns darkroom-margins)))
-           (cons delta delta)))))
+(defun darkroom-compute-margins ()
+  (or darkroom-buffer-margins
+      (cond ((functionp darkroom-margins)
+             (funcall darkroom-margins))
+            ((consp darkroom-margins)
+             darkroom-margins)
+            ((and (floatp darkroom-margins)
+                  (< darkroom-margins 1))
+             (let ((delta (darkroom-float-to-columns darkroom-margins)))
+               (cons delta delta))))))
 
 (defun darkroom-float-to-columns (f)
   (ceiling (* (let ((edges (window-edges)))
                 (- (nth 2 edges) (nth 0 edges)))
               f)))
 
+(defvar darkroom-buffer-margins nil
+  "Buffer-local version of `darkroom-margins' defcustom.
+Set by `darkroom-set-margins'")
+
 (defun darkroom-set-margins (&optional margins)
-  "Adjust margins to `darkroom-margins' or optional MARGINS."
-  (let* ((window-configuration-change-hook nil)
-         (margins (or margins
-                      (darkroom-margins))))
+  "Set margins from MARGINS or `darkroom-compute-margins'."
+  (let* ((window-configuration-change-hook nil))
+    (when margins
+      (when (null (car margins)) (setcar margins 0))
+      (when (null (cdr margins)) (setcdr margins 0)))
+    (set (make-local-variable 'darkroom-buffer-margins)
+         (or margins (darkroom-compute-margins)))
     (walk-windows #'(lambda (w)
                       (when (eq (window-buffer w) (current-buffer))
-                        (setq fringes-outside-margins darkroom-fringes-outside-margins)
+                        (setq fringes-outside-margins
+                              darkroom-fringes-outside-margins)
                         ;; See description of
                         ;; `fringes-outside-margins' for the reason
                         ;; for this apparent noop
                         (set-window-buffer w (current-buffer))
-                        (set-window-margins w (car margins) (cdr margins))))
+                        (set-window-margins w (car darkroom-buffer-margins)
+                                            (cdr darkroom-buffer-margins))))
                   nil
                   'all-frames)))
 
 (defun darkroom-increase-margins (increment)
   (interactive (list darkroom-margin-increment))
-  (when (floatp darkroom-margins)
-    (setq darkroom-margins (+ increment darkroom-margins))
-    (darkroom-set-margins)))
+  (unless (and (consp darkroom-buffer-margins)
+               (numberp (car darkroom-buffer-margins))
+               (numberp (cdr darkroom-buffer-margins)))
+    (error "`darkroom-buffer-margins' corrupted. Must be a cons of numbers."))
+  (setcar darkroom-buffer-margins
+          (round (* (+ 1 increment) (car darkroom-buffer-margins))))
+  (setcdr darkroom-buffer-margins
+          (round (* (+ 1 increment) (cdr darkroom-buffer-margins))))
+  (darkroom-set-margins darkroom-buffer-margins))
 
 (defun darkroom-decrease-margins (decrement)
   (interactive (list darkroom-margin-increment))
   (darkroom-increase-margins (- decrement)))
 
-(defvar darkroom-mode-map (let ((map (make-sparse-keymap)))
-                                  (define-key map (kbd "C-M-+") 'darkroom-increase-margins)
-                                  (define-key map (kbd "C-M--") 'darkroom-decrease-margins)
-                                  map))
+(defvar darkroom-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map (kbd "C-M-+") 'darkroom-increase-margins)
+    (define-key map (kbd "C-M--") 'darkroom-decrease-margins)
+    map))
 
 (defvar darkroom-saved-mode-line-format nil)
-
 (defvar darkroom-saved-header-line-format nil)
-
-(make-variable-buffer-local 'darkroom-saved-mode-line-format)
-
-(make-variable-buffer-local 'darkroom-saved-header-line-format)
+(defvar darkroom-saved-margins nil)
 
 (define-minor-mode darkroom-mode
   "Remove visual distractions and focus on writing.
@@ -144,24 +157,30 @@ When this mode is active, everything but the buffer's text is
 elided from view. The buffer margins are set so that text is
 centered on screen. Text size is increased (display engine
 allowing) by `darkroom-text-scale-increase'." nil nil nil
-  (cond (darkroom-mode
-         (setq darkroom-saved-mode-line-format mode-line-format
-               mode-line-format nil
-               darkroom-saved-header-line-format header-line-format
-               header-line-format nil)
-         (darkroom-set-margins)
-         (text-scale-increase darkroom-text-scale-increase)
-         (add-hook 'window-configuration-change-hook 'darkroom-set-margins nil t))
-        (t
-         (setq mode-line-format darkroom-saved-mode-line-format
-               header-line-format darkroom-saved-header-line-format)
-         (text-scale-decrease 2)
-         (darkroom-set-margins '(0 . 0))
-         (remove-hook 'window-configuration-change-hook 'darkroom-set-margins t))))
+(cond (darkroom-mode
+       (set (make-local-variable 'darkroom-saved-mode-line-format)
+            mode-line-format)
+       (set (make-local-variable 'darkroom-saved-header-line-format)
+            header-line-format)
+       (set (make-local-variable 'darkroom-saved-margins) (window-margins))
+       (setq mode-line-format nil)
+       (setq header-line-format nil)
+       (darkroom-set-margins)
+       (text-scale-increase darkroom-text-scale-increase)
+       (add-hook 'window-configuration-change-hook 'darkroom-set-margins
+                 nil t))
+      (t
+       (setq mode-line-format darkroom-saved-mode-line-format
+             header-line-format darkroom-saved-header-line-format)
+       (text-scale-decrease 2)
+       (let (darkroom-buffer-margins)
+         (darkroom-set-margins darkroom-saved-margins))
+       (remove-hook 'window-configuration-change-hook 'darkroom-set-margins
+                    t))))
 
 (defun darkroom-maybe-enable ()
   (cond ((and (not darkroom-mode) (= (count-windows) 1))
-         (darkroom-mode 1)) 
+         (darkroom-mode 1))
         ((and darkroom-mode (> (count-windows) 1))
          (darkroom-mode -1))
         (t
@@ -172,13 +191,15 @@ allowing) by `darkroom-text-scale-increase'." nil nil nil
 
 (define-minor-mode darkroom-tentative-mode
   "Minor mode that enters `darkroom-mode' when all windws are deleted"
-  nil "D" nil
+  nil "DarkroomT" nil
   (cond (darkroom-tentative-mode
-         (add-hook 'window-configuration-change-hook 'darkroom-maybe-enable nil t)
+         (add-hook 'window-configuration-change-hook
+                   'darkroom-maybe-enable nil t)
          (darkroom-maybe-enable))
         (t
          (if darkroom-mode (darkroom-mode -1))
-         (remove-hook 'window-configuration-change-hook 'darkroom-maybe-enable t))))
+         (remove-hook 'window-configuration-change-hook
+                      'darkroom-maybe-enable t))))