509 lines
26 KiB
Markdown
509 lines
26 KiB
Markdown
# XCUI Editor Agent Guide
|
|
|
|
This file documents the mandatory editor architecture for agents working under
|
|
`editor/`. It is an architecture contract, not just a description of whatever
|
|
the current checkout happens to contain.
|
|
|
|
If this file conflicts with `editor/CMakeLists.txt` or the real directory tree,
|
|
the target-shape rules in this file win. Fix the code or CMake to match these
|
|
rules unless the user explicitly asks to change the architecture contract.
|
|
|
|
## Build Shape
|
|
|
|
The important production targets are:
|
|
|
|
- `XCUIEditorLib`: reusable XCEditor framework code from `editor/src` and
|
|
`editor/include/XCEditor`, including the reusable window authority,
|
|
synchronization planner, and presentation projection under
|
|
`XCEditor/Windowing`.
|
|
- `XCUIEditorApp`: concrete editor executable. Its output name is `XCEngine`.
|
|
|
|
`XCUIEditorLib` is the only production static library allowed under
|
|
`editor/`. All app-side code under `editor/app`, including `Windowing`,
|
|
`Platform`, `Rendering`, `Composition`, `Features`, and `UtilityWindows`, must
|
|
compile into `XCUIEditorApp` unless the code belongs in `XCUIEditorLib`.
|
|
|
|
Do not create, restore, or keep app-internal static library targets. Names such
|
|
as `XCUIEditorAppWindowing`, `XCUIEditorAppCore`, `XCUIEditorAppLib`, and
|
|
`XCUIEditorHost` are forbidden production target boundaries. If any of these
|
|
targets exist in CMake, treat them as stale build debt and remove them as part
|
|
of the boundary cleanup.
|
|
|
|
There is now a narrow public `editor/include/XCEditor/Windowing` layer for the
|
|
generic window authority model, synchronization plan/planner, and presentation
|
|
projection. App-specific window orchestration remains under
|
|
`editor/app/Windowing`, render host contracts remain under
|
|
`editor/app/Rendering/Host`, the concrete D3D12 renderer remains under
|
|
`editor/app/Rendering/D3D12`, and the concrete Win32 host remains under
|
|
`editor/app/Platform/Win32`.
|
|
|
|
## Layering
|
|
|
|
Use these ownership boundaries when changing code:
|
|
|
|
- `editor/include/XCEditor` and `editor/src`: reusable editor framework.
|
|
Keep this layer independent from app state, Win32, D3D12 host code, and
|
|
`App::*` types.
|
|
- `editor/include/XCEditor/Windowing` and `editor/src/Windowing`: reusable
|
|
window authority, validation, synchronization planning, commit, and
|
|
presentation projection. Keep this layer generic and free of app content,
|
|
host runtime, native platform, and rendering details.
|
|
- `editor/app/Composition`, `Commands`, `Features`, `Project`, `Scene`,
|
|
`State`, `System`, `UtilityWindows`: editor product semantics.
|
|
- `editor/app/Windowing/Content`, `Coordinator`, `Frame`, `Host`, `Runtime`:
|
|
app window orchestration, content ownership, host-facing content binding
|
|
contracts, frame driving, frame transfer, and per-window runtime state. Keep
|
|
this layer backend-neutral; it may depend on `editor/app/Rendering/Host`
|
|
contracts, but not concrete render backends.
|
|
- `editor/app/Platform/Win32`: native window, message dispatch, input,
|
|
lifecycle, chrome, HWND ownership, Win32 diagnostics, concrete native render
|
|
surface adapters, and native host adapter behavior.
|
|
- `editor/app/Rendering/Host`: app rendering contracts consumed by app
|
|
windowing and app content, including the render-runtime factory interface.
|
|
- `editor/app/Rendering/D3D12`: concrete D3D12 window renderer, UI renderer,
|
|
texture host, text system, render loop, render-runtime adapter, and
|
|
render-runtime factory.
|
|
|
|
The semantic dependency direction should remain:
|
|
|
|
```text
|
|
XCEditor framework
|
|
<- editor app semantics
|
|
<- app windowing runtime / rendering host contracts
|
|
<- application composition root / concrete Win32 and rendering adapters
|
|
```
|
|
|
|
## Startup Flow
|
|
|
|
The application starts through:
|
|
|
|
```text
|
|
app/main.cpp
|
|
-> RunXCUIEditorApp
|
|
-> Application::Run
|
|
-> Application::Initialize
|
|
```
|
|
|
|
The primary workspace window is initialized through:
|
|
|
|
```text
|
|
EditorContext::BuildWorkspaceController()
|
|
-> EditorWindowSystem::BootstrapPrimaryWindow(...)
|
|
-> EditorWindowManager::CreateWorkspaceWindow(...)
|
|
-> EditorWindowContentFactory::CreateWorkspaceContentController(...)
|
|
-> EditorWindowRenderRuntimeFactory::CreateWindowRenderRuntime()
|
|
-> EditorWindowRuntimeController(EditorContext, contentController, renderRuntime)
|
|
-> EditorWindowInstance(runtimeController)
|
|
-> EditorWindowHostRuntime::CreateHostWindow(windowInstance, ...)
|
|
-> Win32 EditorWindow native peer
|
|
```
|
|
|
|
Keep authoritative window bootstrap in `EditorWindowSystem`; do not move it
|
|
back into the Win32 host.
|
|
|
|
## Frame Runtime Ownership
|
|
|
|
`EditorWindowManager` owns steady-state frame iteration and the immediate-frame
|
|
callbacks used by native paint, resize, maximize/restore, and chrome actions.
|
|
The Win32 host may request a frame through `EditorWindowHostCoordinator`, but it
|
|
must not own the editor frame loop or fetch `EditorContext`.
|
|
|
|
`EditorWindowRuntimeController` lives under `editor/app/Windowing/Runtime`.
|
|
App windowing creates it from `EditorContext` plus a workspace or utility
|
|
content controller plus a backend-neutral `EditorWindowRenderRuntime`, then
|
|
wraps it in app-owned `EditorWindowInstance`. The Win32 host receives the
|
|
instance only as an `EditorHostWindow` owner/native-peer binding; it must not
|
|
store or call `EditorWindowRuntimeController` directly, create content
|
|
controllers, or receive `EditorContext`.
|
|
|
|
Concrete renderer selection is composed above both app windowing and the native
|
|
host. `Application` creates the current
|
|
`D3D12EditorWindowRenderRuntimeFactory` and passes it into
|
|
`EditorWindowManager`; app windowing asks the factory for backend-neutral
|
|
`Rendering::Host::EditorWindowRenderRuntime` instances. `EditorWindowInstance`
|
|
owns runtime controllers that already contain their render runtime; the Win32
|
|
host must not create concrete render backends or own render runtimes.
|
|
`EditorWindowRuntimeController` may call
|
|
`EditorWindowRenderRuntime`, `UiTextureHost`, and `ViewportRenderHost`, but it
|
|
must not include `Rendering/D3D12` headers, `windows.h`, or HWND types.
|
|
|
|
The host contract direction is:
|
|
|
|
```text
|
|
EditorWindowManager / coordinators
|
|
-> ask EditorWindowRenderRuntimeFactory for EditorWindowRenderRuntime
|
|
-> create EditorWindowRuntimeController
|
|
-> wrap it in app-owned EditorWindowInstance
|
|
-> EditorWindowHostRuntime::CreateHostWindow(windowInstance, ...)
|
|
-> Win32 EditorWindow owns HWND/input/chrome and supplies native snapshots
|
|
-> EditorWindowInstance renders from snapshots and returns native frame commands
|
|
```
|
|
|
|
The native peer contract for frame/runtime data is data-shaped. Native render
|
|
surface creation crosses through `EditorNativeWindowRuntimeSurface`, which
|
|
carries an abstract `Rendering::Host::EditorWindowRenderRuntimeSurface` rather
|
|
than a raw HWND/`void*`; per-frame native facts cross through
|
|
`EditorNativeWindowFrameSnapshot`; frame-side native effects cross back through
|
|
`EditorNativeWindowFrameCommands`. Do not add one-off native-peer getters for
|
|
normal frame data such as HWND, render size, DPI, pending input, cursor point,
|
|
workspace bounds, title-bar mode, or cursor application. Extend the
|
|
snapshot/command structs when the frame contract needs new data.
|
|
|
|
Host-visible content binding interfaces live under
|
|
`editor/app/Windowing/Host`, not `editor/app/Windowing/Content`. The native
|
|
host may consume small binding contracts such as
|
|
`EditorWindowInputFeedbackBinding`, `EditorWindowTitleBarBinding`, and
|
|
`EditorWindowDockHostBinding`; it must not include the content-controller
|
|
header or couple to concrete workspace/utility content controllers.
|
|
|
|
## Window Authority Model
|
|
|
|
`EditorWindowSystem` owns the authoritative `UIEditorWindowWorkspaceSet` through
|
|
`EditorWindowWorkspaceStore`.
|
|
|
|
Normal per-frame workspace edits now use direct writes into that authoritative
|
|
state:
|
|
|
|
```text
|
|
EditorWorkspaceWindowContentController::UpdateAndAppend(...)
|
|
-> EditorWindowSystem::TryBuildLiveWindowWorkspaceController(windowId, ...)
|
|
-> UIEditorWorkspaceController::BindToState(...)
|
|
-> workspace operations mutate the bound authoritative workspace/session
|
|
```
|
|
|
|
The old normal path is obsolete:
|
|
|
|
```text
|
|
snapshot diff
|
|
-> workspaceMutation frame request
|
|
-> coordinator
|
|
-> synchronization plan
|
|
-> commit
|
|
```
|
|
|
|
Do not reintroduce `workspaceMutation` as the steady-state route for ordinary
|
|
layout, tab, visibility, or active-panel edits inside an existing workspace
|
|
window.
|
|
|
|
Cross-window create, update, close, and destroyed-window reconciliation still
|
|
use the planner/coordinator flow:
|
|
|
|
```text
|
|
target UIEditorWindowWorkspaceSet
|
|
-> EditorWindowSystem::BuildPlanForWindowSet(...)
|
|
-> EditorWindowWorkspaceCoordinator::ApplySynchronizationPlan(...)
|
|
-> EditorWindowSystem::CommitSynchronizationPlan(...)
|
|
```
|
|
|
|
`EditorWindowWorkspaceCoordinator::RefreshWindowPresentation(...)` refreshes
|
|
each workspace window projection from authoritative state. Presentation should
|
|
follow authority; it should not become a second source of truth.
|
|
|
|
## Frame Transfer Requests
|
|
|
|
`EditorWindowFrameTransferRequests` is only for host-side or cross-window side
|
|
effects that cannot be represented as direct in-window workspace edits.
|
|
|
|
Current request fields are:
|
|
|
|
- `workspace.beginGlobalTabDrag`
|
|
- `workspace.detachPanel`
|
|
- `utility.openUtilityWindow`
|
|
|
|
There is no `workspace.workspaceMutation` field in the current frame transfer
|
|
contract. Treat any doc, comment, or test name that says otherwise as stale.
|
|
|
|
## Window Categories
|
|
|
|
Workspace and utility windows share the native host path but use distinct
|
|
content controllers.
|
|
|
|
- Workspace windows use `EditorWorkspaceWindowContentController`.
|
|
- Utility windows use `EditorUtilityWindowContentController`.
|
|
- App windowing creates content through `EditorWindowContentFactory`.
|
|
- App windowing wraps content in `EditorWindowRuntimeController`, then owns that
|
|
runtime through `EditorWindowInstance`.
|
|
- The concrete host creates a native peer for an existing app-owned
|
|
`EditorHostWindow`; it does not receive or validate runtime controllers.
|
|
|
|
Utility windows are descriptor driven through `EditorUtilityWindowDescriptor`,
|
|
`EditorUtilityWindowRegistry`, and `CreateEditorUtilityWindowPanel(...)`.
|
|
Register new utility windows there rather than hard-coding them in Win32 host
|
|
logic. Utility descriptors may express native host semantics such as
|
|
`EditorWindowNativeShellRole::ToolWindow`, but they must not include
|
|
`windows.h` or encode Win32 style constants such as `WS_EX_*` or `WS_*`.
|
|
|
|
## Modification Rules
|
|
|
|
- First decide whether the change belongs to XCEditor framework, app semantics,
|
|
app windowing, Win32 host, or rendering host.
|
|
- Keep public framework headers free of `App::*`, Win32, and D3D12 host types.
|
|
- Keep `editor/include/XCEditor` and `editor/src` free of `windows.h`, HWND,
|
|
Win32 exception types such as `_EXCEPTION_POINTERS`, and DbgHelp/StackWalk
|
|
code. Win32 crash stack capture belongs under `editor/app/Platform/Win32`;
|
|
framework trace code only writes platform-neutral trace records.
|
|
- Do not add `editor/app` as an include directory for `XCUIEditorLib`.
|
|
App-only services must cross into framework code through framework-owned
|
|
interfaces and app-side adapters.
|
|
- Do not compile `${XCUI_EDITOR_SHARED_SOURCES}` directly into `XCUIEditorApp`;
|
|
the executable should consume shared framework code through `XCUIEditorLib`.
|
|
- Do not add any app-internal static library targets under `editor/`. The only
|
|
editor static library target is `XCUIEditorLib`.
|
|
- Do not compile `editor/app/Windowing` as a standalone library target. It is an
|
|
app source ownership boundary only, and should compile into `XCUIEditorApp`.
|
|
- Use `editor/include/XCEditor/Windowing` and `editor/src/Windowing` for
|
|
generic window authority, synchronization, validation, and presentation
|
|
projection.
|
|
- Use `editor/app/Windowing` for app-specific window runtime semantics,
|
|
content, frame transfer, host contracts, host-visible content binding
|
|
interfaces, runtime controllers, and coordinators.
|
|
- Use `editor/app/Rendering/Host` for renderer-facing contracts that app
|
|
windowing or app content may consume, including
|
|
`EditorWindowRenderRuntimeFactory`.
|
|
- Use `editor/app/Rendering/D3D12` for concrete D3D12 renderer ownership,
|
|
swap-chain/present/capture details, UI texture/text/render systems, and the
|
|
D3D12 `EditorWindowRenderRuntime` implementation and factory.
|
|
- Use `editor/app/Platform/Win32` only for native host behavior and message
|
|
integration. Win32 code may request frames through the host coordinator; it
|
|
must not own the editor frame loop, expose `EditorContext`, or create
|
|
concrete render backends. It may create concrete Win32 render surface adapter
|
|
objects that implement `Rendering::Host::EditorWindowRenderRuntimeSurface`.
|
|
- Do not let `editor/app/Windowing` include `Platform/Win32` headers.
|
|
- Do not let `editor/app/Windowing` include `Rendering/D3D12` headers,
|
|
`windows.h`, or HWND types. It should consume concrete rendering only through
|
|
`Rendering::Host::EditorWindowRenderRuntime` and
|
|
`Rendering::Host::EditorWindowRenderRuntimeFactory`, and it must pass native
|
|
render surfaces only as abstract `EditorWindowRenderRuntimeSurface` objects.
|
|
- Do not let `editor/app/Platform/Win32` include `Rendering/D3D12` headers or
|
|
implement render-runtime factory methods on the native host interfaces.
|
|
- Do not let app semantics such as `UtilityWindows` encode Win32 style bits.
|
|
Use semantic host policy fields, and map those semantics to `WS_*` constants
|
|
inside the Win32 host.
|
|
- Do not spread D3D12 host types into app windowing content, coordinator,
|
|
frame-transfer, runtime-controller, or public host-contract headers.
|
|
- Do not let Win32 host code create workspace or utility content directly.
|
|
It should receive an app-owned `EditorHostWindow`/`EditorWindowInstance`
|
|
created by app windowing, not an `EditorWindowRuntimeController`.
|
|
- Do not let `editor/app/Platform/Win32` include
|
|
`Windowing/Content/EditorWindowContentController.h`. Host-visible content
|
|
state must cross through `Windowing/Host/EditorWindowContentBindings.h` and
|
|
`Windowing/Host/EditorWindowHostInterfaces.h`.
|
|
- Keep `EditorWindowNativePeer` frame/runtime communication data-shaped:
|
|
use `EditorNativeWindowRuntimeSurface`, `EditorNativeWindowFrameSnapshot`,
|
|
`EditorNativeWindowFrameCommands`, and small metrics snapshots instead of
|
|
exposing individual HWND, DPI, size, input, cursor, or title-bar getters to
|
|
app windowing. `EditorNativeWindowRuntimeSurface` must not expose a raw
|
|
native handle field.
|
|
- Do not let Win32 host code call `EditorWindowRuntimeController` or directly
|
|
drive editor runtime frames. Native messages may request immediate frames
|
|
through `EditorWindowHostCoordinator`; app windowing owns the render/update
|
|
step.
|
|
- Use direct authoritative workspace binding for ordinary in-window workspace
|
|
mutations.
|
|
- Use synchronization plans for operations that create, close, replace, or
|
|
reconcile workspace windows.
|
|
- Use frame transfer requests only for host-side or cross-window effects.
|
|
|
|
## Current Architecture Debt
|
|
|
|
The highest-value windowing boundary has been hardened: `XCUIEditorLib` now
|
|
owns the reusable window authority, synchronization planner, workspace store,
|
|
and presentation projection under `XCEditor/Windowing`. App windowing remains
|
|
a source ownership boundary under `editor/app/Windowing`; it is not allowed to
|
|
be a separate production library target. The Win32 host is the concrete native
|
|
adapter and creates native host windows for app-owned `EditorWindowInstance`
|
|
objects supplied by app windowing.
|
|
|
|
The framework/app compile boundary is also enforced. `XCUIEditorLib` does not
|
|
receive `editor/app` includes, and `XCUIEditorApp` does not directly compile
|
|
the shared framework sources. When framework UI code needs app-provided data
|
|
such as loaded icons, expose a framework-owned interface and adapt it in app
|
|
composition code.
|
|
|
|
The top-level target debt is any app-internal static library target left in
|
|
the build. `XCUIEditorLib` must remain the only editor static library. If CMake
|
|
defines targets such as `XCUIEditorAppWindowing`, `XCUIEditorAppCore`,
|
|
`XCUIEditorAppLib`, or `XCUIEditorHost`, remove those target boundaries and
|
|
compile their app-side sources into `XCUIEditorApp`.
|
|
|
|
The main windowing debt that was previously in the Win32 host has been cut:
|
|
frame iteration, immediate frame driving, content-controller construction, and
|
|
`EditorContext` ownership now live in app windowing. `EditorWindowHostCoordinator`
|
|
does not expose `GetEditorContext()`, and the native host receives an
|
|
app-owned `EditorWindowInstance` rather than raw workspace/utility content or a
|
|
runtime controller.
|
|
|
|
The native-peer ownership cut has also been made: `EditorWindowManager` owns
|
|
`EditorWindowInstance` objects, each instance owns its
|
|
`EditorWindowRuntimeController`, and `editor/app/Platform/Win32/Windowing`
|
|
`EditorWindow` is a native peer for HWND/input/chrome/message integration. The
|
|
Win32 platform code must stay free of
|
|
`Windowing/Runtime/EditorWindowRuntimeController.h`.
|
|
|
|
The native frame contract cut has also been made: frame/runtime initialization
|
|
no longer crosses the boundary through granular native-peer getters such as
|
|
HWND, DPI, size, input, cursor, workspace bounds, and title-bar mode. Win32
|
|
captures those native facts into `EditorNativeWindowRuntimeSurface` and
|
|
`EditorNativeWindowFrameSnapshot`; app windowing renders from the snapshot and
|
|
returns native side effects through `EditorNativeWindowFrameCommands`.
|
|
`EditorNativeWindowRuntimeSurface` carries an abstract render surface object,
|
|
not a raw HWND or erased `void*`.
|
|
|
|
The renderer ownership cut has also been made: app windowing no longer owns the
|
|
concrete D3D12 window render loop or Win32 surface setup.
|
|
`EditorWindowRuntimeController` consumes a backend-neutral
|
|
`Rendering::Host::EditorWindowRenderRuntime`, and `EditorWindowManager` receives
|
|
a backend-neutral `Rendering::Host::EditorWindowRenderRuntimeFactory`. The
|
|
current D3D12 factory is composed in `Application`, not in the Win32 host. The
|
|
current D3D12 runtime may recognize the concrete Win32 render surface adapter,
|
|
but app windowing must only traffic in the abstract rendering-host surface type.
|
|
|
|
The platform-boundary cut has also been made: `XCUIEditorLib` trace code is
|
|
platform-neutral, and Win32 exception/DbgHelp stack capture lives under
|
|
`editor/app/Platform/Win32/Diagnostics`. Utility-window descriptors express
|
|
native shell intent with semantic host policy values rather than Win32 style
|
|
bits; the Win32 host maps those semantics to `WS_*` constants.
|
|
|
|
The host/content binding cut has also been made: host-visible content binding
|
|
contracts live in `editor/app/Windowing/Host/EditorWindowContentBindings.h`.
|
|
`editor/app/Windowing/Content/EditorWindowContentController.h` owns concrete
|
|
content-controller contracts, while the Win32 native host consumes only the
|
|
small host binding interfaces exposed from `Windowing/Host`.
|
|
|
|
The remaining promotion debt is the app runtime surface and host contract
|
|
vocabulary itself.
|
|
`editor/app/Windowing` is still app-internal and may depend on app semantics
|
|
such as `EditorContext`, `EditorShellRuntime`, utility window descriptors, and
|
|
product-specific content. This app-internal dependency is a directory-level
|
|
ownership detail only; it must not become a separate static library boundary.
|
|
Do not promote host interfaces, frame transfer, runtime controllers, content
|
|
controllers, or render-runtime contracts to `XCEditor` until they are generic
|
|
enough to expose. Do not move frame ownership back into
|
|
`editor/app/Platform/Win32`, do not move concrete renderer ownership back into
|
|
`editor/app/Windowing`, and do not move renderer factory ownership back into
|
|
the Win32 host.
|
|
|
|
Do not take another library-boundary architecture cut just to keep carving this
|
|
area. After the native-peer and native-frame-contract cuts, the next default
|
|
improvement should be boundary guardrails, such as checks that keep
|
|
`editor/app/Windowing` free of `Rendering/D3D12`, `Platform/Win32`,
|
|
`windows.h`, HWND types, raw native render handles, and one-off native-peer
|
|
frame getters; keep app semantics free of Win32 `WS_*` constants; keep
|
|
`editor/include/XCEditor` and `editor/src` free of Win32 diagnostics and
|
|
exception types; and keep `editor/app/Platform/Win32` free of `Rendering/D3D12`
|
|
and `Windowing/Runtime/EditorWindowRuntimeController.h`; keep
|
|
`editor/app/Platform/Win32` free of
|
|
`Windowing/Content/EditorWindowContentController.h`. Consider another structural
|
|
source-directory cut only when there is concrete pressure, such as another
|
|
native host, another render backend, or headless editor/window tests; do not
|
|
satisfy that pressure by adding another production static library.
|
|
|
|
## Validation
|
|
|
|
Default editor validation is only the app build plus the 12-second smoke run:
|
|
|
|
```powershell
|
|
cmake --build build --config Debug --target editor_ui_smoke_targets
|
|
build\tests\UI\Editor\smoke\Debug\editor_ui_smoke_runner.exe build\editor\Debug\XCEngine.exe
|
|
```
|
|
|
|
Do not run `editor_windowing_phase1_tests`, `editor_ui_tests`, or broader test
|
|
targets by default. Run them only when the user explicitly asks for them or a
|
|
separate targeted change makes them necessary.
|
|
|
|
The runner sets `XCUIEDITOR_SMOKE_TEST_DURATION_SECONDS=12`, waits for the
|
|
editor to launch, lets the app auto-exit, and treats a clean editor exit as
|
|
success.
|
|
|
|
## Recommended Reading
|
|
|
|
Start with these files for editor/windowing work:
|
|
|
|
- `editor/CMakeLists.txt`
|
|
- `editor/app/Bootstrap/Application.*`
|
|
- `editor/app/Composition/EditorContext.*`
|
|
- `editor/app/Composition/EditorShellRuntime.*`
|
|
- `editor/include/XCEditor/Workspace/UIEditorWorkspaceController.h`
|
|
- `editor/src/Workspace/UIEditorWorkspaceController.cpp`
|
|
- `editor/include/XCEditor/Windowing/System/EditorWindowSystem.h`
|
|
- `editor/include/XCEditor/Windowing/System/EditorWindowSynchronizationPlan.h`
|
|
- `editor/include/XCEditor/Windowing/System/EditorWindowSynchronizationPlanner.h`
|
|
- `editor/include/XCEditor/Windowing/Presentation/EditorWorkspaceWindowProjection.h`
|
|
- `editor/include/XCEditor/Windowing/Presentation/EditorWindowPresentationPolicy.h`
|
|
- `editor/src/Windowing/System/EditorWindowSystem.cpp`
|
|
- `editor/src/Windowing/System/EditorWindowWorkspaceStore.*`
|
|
- `editor/src/Windowing/System/EditorWindowSynchronizationPlanner.cpp`
|
|
- `editor/src/Windowing/Presentation/EditorWindowPresentationPolicy.cpp`
|
|
- `editor/app/Windowing/Host/EditorWindowContentBindings.h`
|
|
- `editor/app/Windowing/Host/EditorWindowHostInterfaces.h`
|
|
- `editor/app/Windowing/Content/EditorWindowContentController.h`
|
|
- `editor/app/Windowing/Content/EditorWindowContentFactory.*`
|
|
- `editor/app/Windowing/Content/EditorWorkspaceWindowContentController.*`
|
|
- `editor/app/Windowing/Frame/EditorWindowFrameOrchestrator.*`
|
|
- `editor/app/Windowing/Frame/EditorWindowTransferRequests.h`
|
|
- `editor/app/Windowing/Runtime/EditorWindowRuntimeController.*`
|
|
- `editor/app/Windowing/Runtime/EditorWindowScreenshotController.*`
|
|
- `editor/app/Windowing/EditorWindowInstance.*`
|
|
- `editor/app/Windowing/Coordinator/EditorWindowWorkspaceCoordinator.*`
|
|
- `editor/app/Windowing/Coordinator/EditorUtilityWindowCoordinator.*`
|
|
- `editor/app/Windowing/EditorWindowManager.*`
|
|
- `editor/app/Rendering/Host/EditorWindowRenderRuntime.h`
|
|
- `editor/app/Rendering/D3D12/D3D12EditorWindowRenderRuntime.*`
|
|
- `editor/app/Platform/Win32/Diagnostics/Win32CrashTrace.*`
|
|
- `editor/app/Platform/Win32/Windowing/Win32EditorWindowRenderRuntimeSurface.h`
|
|
- `editor/app/Platform/Win32/Windowing/EditorWindow.*`
|
|
- `editor/app/Platform/Win32/Windowing/EditorWindowHostRuntime.*`
|
|
- `editor/app/Platform/Win32/Windowing/EditorWindowMessageDispatcher.*`
|
|
- `tests/UI/Editor/smoke/CMakeLists.txt`
|
|
|
|
## Recent Cuts
|
|
|
|
- The framework-to-app icon dependency is sealed: `UIEditorShellCompose` uses
|
|
the framework-owned `UIEditorShellIconResolver`, and the app adapts
|
|
`BuiltInIcons` in `EditorShellDrawComposer`.
|
|
- The framework/app compile boundary is sealed: `XCUIEditorLib` does not receive
|
|
`editor/app` includes, `XCUIEditorApp` does not directly compile
|
|
`${XCUI_EDITOR_SHARED_SOURCES}`, and the app consumes framework code through
|
|
`XCUIEditorLib`.
|
|
- The reusable window authority core lives in the framework:
|
|
`EditorWindowSystem`, synchronization planning, workspace store, and
|
|
presentation projection are under `editor/include/XCEditor/Windowing` and
|
|
`editor/src/Windowing`.
|
|
- App windowing owns the runtime cut: content controllers,
|
|
`EditorWindowRuntimeController`, frame driving, frame transfer, host
|
|
contracts, and `EditorWindowManager` are under `editor/app/Windowing` as an
|
|
app source directory, not as a standalone library target; Win32 remains the
|
|
native adapter and no longer exposes `EditorContext`.
|
|
- The native-peer ownership cut is sealed: app windowing now owns live
|
|
`EditorWindowInstance` objects, those instances own
|
|
`EditorWindowRuntimeController`, and Win32 `EditorWindow` only owns the
|
|
native peer side for HWND/input/chrome/message work. `CreateHostWindow(...)`
|
|
binds a native peer to an existing `EditorHostWindow`; it does not receive a
|
|
runtime controller.
|
|
- The native frame contract cut is sealed: app windowing consumes
|
|
`EditorNativeWindowRuntimeSurface` and `EditorNativeWindowFrameSnapshot`
|
|
instead of calling granular native-peer getters for frame/runtime data, and
|
|
Win32 applies frame side effects through `EditorNativeWindowFrameCommands`.
|
|
Runtime surface creation carries an abstract
|
|
`Rendering::Host::EditorWindowRenderRuntimeSurface`, not a raw HWND/`void*`.
|
|
- The concrete renderer cut is sealed: app windowing consumes
|
|
`Rendering::Host::EditorWindowRenderRuntime` and
|
|
`Rendering::Host::EditorWindowRenderRuntimeFactory`, while the current D3D12
|
|
implementation and factory live under `editor/app/Rendering/D3D12`. The
|
|
factory is composed in `Application`; `editor/app/Windowing` should stay free
|
|
of `Rendering/D3D12`, `windows.h`, and HWND types, and
|
|
`editor/app/Platform/Win32` should stay free of `Rendering/D3D12`.
|
|
- The Win32 platform-boundary cut is sealed: framework runtime trace code no
|
|
longer includes Win32/DbgHelp or exposes `_EXCEPTION_POINTERS`; Win32 crash
|
|
stack capture lives under `editor/app/Platform/Win32/Diagnostics`; utility
|
|
window descriptors use semantic native host policies instead of `WS_*`
|
|
constants.
|
|
- The host/content binding cut is sealed: native host-visible content binding
|
|
contracts live under `editor/app/Windowing/Host`, and Win32 code consumes
|
|
`EditorWindowContentBindings.h` instead of the content-controller contract.
|
|
- The production target shape is sealed: `XCUIEditorLib` is the only editor
|
|
static library, and all app-side source directories compile into
|
|
`XCUIEditorApp`.
|
|
- Default validation remains the editor app build plus the 12-second smoke run;
|
|
run broader windowing/unit targets only for targeted coverage.
|