ebox/ebox-render-context.el
Kinneyzhang cdf841232a refactor(ebox): publish roots through TP surfaces
Move ephemeral rendering, initial buffer mounts, declarative commits, and opaque handle updates onto retained TP surfaces while keeping Ebox layout planning and runtime indexes transactionally synchronized.

Verified with: make check EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
2026-08-06 05:49:22 +08:00

66 lines
2.9 KiB
EmacsLisp

;;; ebox-render-context.el --- Shared render context binding -*- lexical-binding: t; -*-
;;; Commentary:
;; Owns the compile-safe render-context binding shared by the incremental
;; planner and the buffer backend. Keeping this macro below both modules avoids
;; their runtime dependency cycle becoming an invalid byte-compiled function.
;;; Code:
(defvar ebox-viewport-width nil)
(defvar ebox-viewport-height nil)
(defvar ebox--render-runtime-revision nil)
(defvar ebox--surface-materialization-active nil)
(defvar ebox--render-cache-table nil)
(defvar ebox--render-cache-signature-cache nil)
(defvar ebox--viewport-dependent-node-ids-cache nil)
(defvar ebox--viewport-dependent-subtree-cache nil)
(defvar ebox--viewport-height-dependent-subtree-cache nil)
(defvar ebox--flex-content-min-width-table nil
"Render-owned box measurements reusable by native scene compilation.")
(declare-function ebox--buffer-render-state
"ebox-incremental" (buffer))
(defmacro ebox--with-buffer-render-context (buffer &rest body)
"Evaluate BODY using BUFFER's stored render context."
(declare (indent 1) (debug t))
(let ((target-buffer (make-symbol "target-buffer"))
(render-state (make-symbol "render-state")))
`(let* ((,target-buffer ,buffer)
(,render-state
(ebox--buffer-render-state ,target-buffer)))
(with-current-buffer ,target-buffer
(let* ((ebox-viewport-width
(plist-get ,render-state :viewport-width))
(ebox-viewport-height
(plist-get ,render-state :viewport-height))
(ebox--render-runtime-revision
(plist-get ,render-state :runtime-revision))
(ebox--surface-materialization-active t)
(ebox--render-cache-table
(plist-get ,render-state :render-cache))
(ebox--render-cache-signature-cache
(or ebox--render-cache-signature-cache
(plist-get ,render-state :render-signature-cache)
(make-hash-table :test 'eq)))
(ebox--viewport-dependent-node-ids-cache
(or ebox--viewport-dependent-node-ids-cache
(make-hash-table :test 'eq)))
(ebox--viewport-dependent-subtree-cache
(or ebox--viewport-dependent-subtree-cache
(make-hash-table :test 'eq)))
(ebox--viewport-height-dependent-subtree-cache
(or ebox--viewport-height-dependent-subtree-cache
(plist-get
,render-state
:viewport-height-dependent-subtree-cache)
(make-hash-table :test 'eq)))
(ebox--flex-content-min-width-table
(or ebox--flex-content-min-width-table
(plist-get ,render-state :flex-content-min-widths))))
,@body)))))
(provide 'ebox-render-context)
;;; ebox-render-context.el ends here