branch: elpa/dirvish commit 254dc73d85f0d8973e0220d1c4b4a81fa4cde874 Author: Alex Lu <hellosimon1...@hotmail.com> Commit: Alex Lu <hellosimon1...@hotmail.com>
fix: `dirvish-toggle-subtree` requires positive window fringe (#311) The error occurs when user executed `(set-fringe-style 0)` or uses 0-pixel fringes in some way. Closes: #311 --- dirvish.el | 21 ++++++++++++++------- extensions/dirvish-vc.el | 12 ++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/dirvish.el b/dirvish.el index e3ba547e37..cac77fc7bb 100644 --- a/dirvish.el +++ b/dirvish.el @@ -130,7 +130,7 @@ The valid value are: "Like `dirvish-use-mode-line', but for header line." :group 'dirvish :type 'symbol) -(defcustom dirvish-mode-line-height 30 +(defcustom dirvish-mode-line-height 21 "Height of Dirvish's mode line. The value should be a cons cell (H-WIN . H-FRAME), where H-WIN and H-FRAME represent the height of mode line in single window @@ -139,7 +139,7 @@ integer INT, it is seen as a shorthand for (INT . INT)." :group 'dirvish :type '(choice integer (cons integer integer))) -(defcustom dirvish-header-line-height 30 +(defcustom dirvish-header-line-height '(25 . 35) "Like `dirvish-mode-line-height', but for header line." :type '(choice integer (cons integer integer))) @@ -171,7 +171,7 @@ Set it to nil to use the default `mode-line-format'." "Like `dirvish-mode-line-format', but for header line ." :group 'dirvish :type 'plist) -(defcustom dirvish-mode-line-bar-image-width 2 +(defcustom dirvish-mode-line-bar-image-width 3 "Pixel width of the leading bar image in both mode-line and header-line. If the value is 0, the bar image is hidden." :group 'dirvish :type 'integer) @@ -197,6 +197,10 @@ Works all the same as `dirvish-hide-details' but for cursor." :type '(choice (boolean :tag "Apply to all Dirvish buffers") (repeat :tag "Apply to a list of buffer types: 'dired, 'dirvish, 'dirvish-fd or 'dirvish-side" symbol))) +(defcustom dirvish-window-fringe 3 + "Root window's left fringe in pixels." + :group 'dirvish :type 'natnum) + (defcustom dirvish-preview-dired-sync-omit nil "If non-nil, `dired' preview buffers sync `dired-omit-mode' from root window. Notice that it only take effects on the built-in `dired' preview dispatcher." @@ -602,8 +606,9 @@ ARGS is a list of keyword arguments for `dirvish' struct." (defun dirvish--clear-session (dv &optional from-quit) "Reset DV's slot and kill its buffers. FROM-QUIT is used to signify the calling command." - (let ((index (cdr (dv-index dv))) (frg (dirvish-prop :fringe))) - (when frg (set-window-fringes nil (frame-parameter nil 'left-fringe))) + (let ((index (cdr (dv-index dv)))) + (set-window-fringes + nil (frame-parameter nil 'left-fringe) (frame-parameter nil 'right-fringe)) (if (not (dv-curr-layout dv)) (cl-loop for (_d . b) in (dv-roots dv) when (and (not (get-buffer-window b)) @@ -1293,7 +1298,8 @@ LEVEL is the depth of current window." (window-parameters . ((no-other-window . t)))) for b = (dirvish--create-parent-buffer dv parent current level) for w = (display-buffer b `(dirvish--display-buffer . ,args)) do - (with-selected-window w (set-window-dedicated-p w t)))))) + (with-selected-window w + (set-window-fringes w 1 1) (set-window-dedicated-p w t)))))) (defun dirvish--init-special-buffers (dv) "Initialize special buffers for DV." @@ -1387,12 +1393,13 @@ INHIBIT-SETUP is non-nil." (when layout (dirvish--init-special-buffers dv)) (dirvish--setup-mode-line dv) (when w-order (let ((ignore-window-parameters t)) (delete-other-windows))) - (dirvish-prop :fringe nil) ;; if called from `dirvish-side--auto-jump', do nothing (when (eq (dv-type dv) 'default) (dirvish--change-selected)) (when-let* ((fixed (dv-size-fixed dv))) (setq window-size-fixed fixed)) (when (or (dv-curr-layout dv) (dv-dedicated dv)) (set-window-dedicated-p nil t)) + ;; ensure a positive fringe on both sides for `dirvish-subtree' (#311) + (set-window-fringes nil (1+ dirvish-window-fringe) 1) (dolist (pane w-order) (let* ((buf (dirvish--special-buffer pane dv (eq pane 'preview))) (args (alist-get pane w-args)) diff --git a/extensions/dirvish-vc.el b/extensions/dirvish-vc.el index 18c4603eb3..309df01736 100644 --- a/extensions/dirvish-vc.el +++ b/extensions/dirvish-vc.el @@ -21,10 +21,6 @@ (defclass dirvish-vc-preview (transient-switches) () "Class for dirvish vc-* preview dispatchers.") -(defcustom dirvish-vc-state-fringe 2 - "The width of the fringe used to display the vc state indicator." - :group 'dirvish :type 'integer) - (defcustom dirvish-vc-state-face-alist '((up-to-date . nil) (edited . dirvish-vc-edited-state) @@ -176,13 +172,9 @@ It is called when `:vc-backend' is included in DIRVISH-PROPs while (dirvish-define-attribute vc-state "The version control state at left fringe. This attribute only works on graphic displays." - ;; Avoid setting fringes repeatedly - :when (prog1 t (unless (dirvish-prop :fringe) - (dirvish-prop :fringe (car (window-fringes))) - (set-window-fringes nil dirvish-vc-state-fringe))) + :when (and (symbolp (dirvish-prop :vc-backend)) (not (dirvish-prop :remote))) (let ((ov (make-overlay l-beg l-beg))) - (when-let* (((symbolp (dirvish-prop :vc-backend))) - (state (dirvish-attribute-cache f-name :vc-state)) + (when-let* ((state (dirvish-attribute-cache f-name :vc-state)) (face (alist-get state dirvish-vc-state-face-alist)) (display `(left-fringe dirvish-vc-gutter . ,(cons face nil)))) (overlay-put ov 'before-string (propertize " " 'display display)))