二图胜千言:
实现可能并不十分优雅(
(eval-when-compile
(require 'xwidget))
(defun xwidget-wl-window-remnant (window)
(when-let* ((object (next-single-property-change (point-min) 'display))
(total (xwidget-window-inside-pixel-height window))
(remnant 0))
(save-excursion
(goto-char (point-min))
(while (< (point) object)
(setq remnant (+ remnant (line-pixel-height)))
(forward-line 1))
(goto-char (+ object 2))
(while (< (point) (point-max))
(setq remnant (+ remnant (line-pixel-height)))
(forward-line 1)))
(- total (+ remnant 6))))
(defun xwidget-wl-window-adjust (frame)
(walk-windows (lambda (window)
(with-current-buffer (window-buffer window)
(when (or (eq major-mode 'wl-message-mode)
(eq major-mode 'mime-view-mode))
(when-let* ((xwidget (car (get-buffer-xwidgets (buffer-name))))
(width (xwidget-window-inside-pixel-width window))
(height (xwidget-wl-window-remnant window)))
(xwidget-resize xwidget width height)))) 'none frame)))
(define-advice wl-summary-set-message-buffer-or-redisplay
(:after (&rest _args) xwidget-wl-window-init)
(xwidget-wl-window-adjust (selected-frame)))
(add-to-list 'window-size-change-functions
'xwidget-wl-window-adjust)
(define-advice mime-shr-preview-text/html
(:override (entity _situation) xwidget-wl-render-html)
(let ((inhibit-read-only t))
(insert ".")
(let* ((cursor (- (point-max) 1))
(source (with-temp-buffer
(mime-insert-text-content entity)
(buffer-string)))
(cookie (make-temp-file "xwidget" nil ".html"))
(object (xwidget-insert cursor 'webkit (buffer-name) 1 1)))
(set-xwidget-query-on-exit-flag object nil)
(with-temp-file cookie (insert source))
(xwidget-webkit-goto-uri object (concat "file://" cookie)))))