Skip to content

Commit

Permalink
feat: backport align-right feature from 30.
Browse files Browse the repository at this point in the history
Closes #646.
  • Loading branch information
seagle0128 committed Aug 3, 2023
1 parent cb3234d commit 5bd93c2
Showing 1 changed file with 79 additions and 20 deletions.
99 changes: 79 additions & 20 deletions doom-modeline-core.el
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,79 @@
(require 'nerd-icons)
(require 'shrink-path)


;;
;; Compatibility
;;

;; Backport from 30
(unless (fboundp 'mode--line-format-right-align)
(defcustom mode-line-right-align-edge 'window
"Where function `mode-line-format-right-align' should align to.
Internally, that function uses `:align-to' in a display property,
so aligns to the left edge of the given area. See info node
`(elisp)Pixel Specification'.
Must be set to a symbol. Acceptable values are:
- `window': align to extreme right of window, regardless of margins
or fringes
- `right-fringe': align to right-fringe
- `right-margin': align to right-margin"
:type '(choice (const right-margin)
(const right-fringe)
(const window))
:group 'mode-line)

(defun mode--line-format-right-align ()
"Right-align all following mode-line constructs.
When the symbol `mode-line-format-right-align' appears in
`mode-line-format', return a string of one space, with a display
property to make it appear long enough to align anything after
that symbol to the right of the rendered mode line. Exactly how
far to the right is controlled by `mode-line-right-align-edge'.
It is important that the symbol `mode-line-format-right-align' be
included in `mode-line-format' (and not another similar construct
such as `(:eval (mode-line-format-right-align)'). This is because
the symbol `mode-line-format-right-align' is processed by
`format-mode-line' as a variable."
(let* ((rest (cdr (memq 'mode-line-format-right-align
mode-line-format)))
(rest-str (format-mode-line `("" ,@rest)))
(rest-width (progn
(add-face-text-property
0 (length rest-str) 'mode-line t rest-str)
(string-pixel-width rest-str))))
(propertize " " 'display
;; The `right' spec doesn't work on TTY frames
;; when windows are split horizontally (bug#59620)
(if (and (display-graphic-p)
(not (eq mode-line-right-align-edge 'window)))
`(space :align-to (- ,mode-line-right-align-edge
(,rest-width)))
`(space :align-to (,(- (window-pixel-width)
(window-scroll-bar-width)
(window-right-divider-width)
(* (or (cdr (window-margins)) 1)
(frame-char-width))
;; Manually account for value of
;; `mode-line-right-align-edge' even
;; when display is non-graphical
(pcase mode-line-right-align-edge
('right-margin
(or (cdr (window-margins)) 0))
('right-fringe
;; what here?
(or (cadr (window-fringes)) 0))
(_ 0))
rest-width)))))))

(defvar mode-line-format-right-align '(:eval (mode--line-format-right-align))
"Mode line construct to right align all following constructs.")
;;;###autoload
(put 'mode-line-format-right-align 'risky-local-variable t))


;;
;; Optimization
Expand Down Expand Up @@ -1078,24 +1151,7 @@ Example:
(rhs-forms (doom-modeline--prepare-segments rhs)))
(defalias sym
(lambda ()
(list lhs-forms
(propertize
" "
'face (doom-modeline-face)
'display `(space
:align-to
(- (+ right right-fringe right-margin scroll-bar)
,(let ((rhs-str (format-mode-line (cons "" rhs-forms))))
(if (and (>= emacs-major-version 29)
(fboundp 'string-pixel-width))
(/ (string-pixel-width rhs-str)
(doom-modeline--font-width)
1.0)
(* (string-width rhs-str)
(if (display-graphic-p)
(/ (doom-modeline--font-width) (frame-char-width) 0.95)
1.0)))))))
rhs-forms))
`(,lhs-forms ,rhs-forms))
(concat "Modeline:\n"
(format " %s\n %s"
(prin1-to-string lhs)
Expand All @@ -1107,7 +1163,10 @@ Example:
Throws an error if it doesn't exist."
(let ((fn (intern-soft (format "doom-modeline-format--%s" key))))
(when (functionp fn)
`(:eval (,fn)))))
(let* ((modeline (funcall fn))
(lhs (car modeline))
(rhs (cdr modeline)))
`(,lhs mode-line-format-right-align ,rhs)))))

(defun doom-modeline-set-modeline (key &optional default)
"Set the modeline format. Does nothing if the modeline KEY doesn't exist.
Expand All @@ -1116,7 +1175,7 @@ If DEFAULT is non-nil, set the default mode-line for all buffers."
(setf (if default
(default-value 'mode-line-format)
mode-line-format)
(list "%e" modeline))))
modeline)))


;;
Expand Down

0 comments on commit 5bd93c2

Please sign in to comment.