X-Git-Url: https://git.hcoop.net/clinton/lisp-on-lines.git/blobdiff_plain/7dd8b2259b4303e256c06178a5092cefa61bf4c1..3a420e7db4db666d59ae107bc689a359c3bdf07a:/src/display.lisp diff --git a/src/display.lisp b/src/display.lisp index d04a131..e502b85 100644 --- a/src/display.lisp +++ b/src/display.lisp @@ -15,22 +15,35 @@ (setf context (remove-layer (find-description d) context))) (dolist (d activate context) - (setf context (adjoin-layer (find-description d) + (setf context (adjoin-layer (find-description (if (consp d) (car d) d)) context)))) (defun funcall-with-attribute-context (attribute thunk) (funcall-with-layer-context - (modify-layer-context (current-layer-context) + (modify-layer-context (current-layer-context) :activate (attribute-active-descriptions attribute) :deactivate (attribute-inactive-descriptions attribute)) - thunk)) + (lambda () + (with-special-symbol-access + (contextl::funcall-with-special-initargs + (mappend (lambda (desc) + (when (consp desc) + (let ((description (find-description (car desc)))) + (loop + :for (key val) :on (cdr desc) :by #'cddr + :collect (list (find key (description-attributes description) + :key #'attribute-keyword) + :value val))))) + (attribute-active-descriptions attribute)) + (lambda () + (without-special-symbol-access + (funcall thunk)))))))) (defmacro with-attribute-context ((attribute) &body body) `(funcall-with-attribute-context ,attribute (lambda () ,@body))) (defun display (display object &rest args &key deactivate activate &allow-other-keys) - (funcall-with-layer-context (modify-layer-context (current-layer-context) :activate activate