diff --git a/cx-layer.lisp b/cx-layer.lisp index c968b10bfa43f92805e140b25024c3595f4a2a29..5e83b0df20495c1630448fdf252c54d9850b97e7 100644 --- a/cx-layer.lisp +++ b/cx-layer.lisp @@ -52,10 +52,13 @@ (let ((layer-class (find-layer layer)) (active-context-specializer (layer-context-specializer active-context))) (when (subtypep active-context-specializer layer-class) - (if (eq (first (class-direct-superclasses active-context-specializer)) layer-class) - (return-from maybe-create-active-layer-context active-context) - (setq active-context (ensure-inactive-layer-context layer active-context) - active-context-specializer (layer-context-specializer active-context)))) + (let ((first-layer (first (class-direct-superclasses active-context-specializer)))) + (cond ((eq first-layer layer-class) + (return-from maybe-create-active-layer-context active-context)) + ((subtypep first-layer layer-class) + (error "Layer ~S cannot be placed in front of ~S because the latter inherits from the former." (layer-name layer-class) (layer-name first-layer))) + (t (setq active-context (ensure-inactive-layer-context layer active-context) + active-context-specializer (layer-context-specializer active-context)))))) (let ((new-specializer (make-instance 'standard-class :direct-superclasses @@ -94,7 +97,10 @@ finally (return (loop with new-layer-context = *root-context* for active-layer in (cdr active-layers) - unless (eq active-layer layer-class) do + if (subtypep active-layer layer-class) do + (unless (eq active-layer layer-class) + (error "The layer ~S cannot be deactivated or rearranged because the active layer ~S inherits from it." (layer-name layer-class) (layer-name active-layer))) + else do (setq new-layer-context (ensure-active-layer-context (class-name active-layer)