Skip to content

Commit 347922f

Browse files
authored
Move CompositionSwitcher to Experimental namespace (#12960)
* Move CompositionSwitcher to Experimental namespace * Change files * fix * fix * fix * format * fix * fix * format
1 parent faf6124 commit 347922f

File tree

63 files changed

+744
-532
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+744
-532
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Move CompositionSwitcher to Experimental namespace",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,7 @@ winrt::Microsoft::ReactNative::ReactNativeHost CreateReactNativeHost(
9999
winrt::Microsoft::ReactNative::ReactCoreInjection::SetTopLevelWindowId(
100100
host.InstanceSettings().Properties(), reinterpret_cast<uint64_t>(hwnd));
101101

102-
// By using the MicrosoftCompositionContextHelper here, React Native Windows will use Lifted Visuals for its
103-
// tree.
104-
winrt::Microsoft::ReactNative::Composition::CompositionUIService::SetCompositionContext(
105-
host.InstanceSettings().Properties(),
106-
winrt::Microsoft::ReactNative::Composition::MicrosoftCompositionContextHelper::CreateContext(compositor));
102+
winrt::Microsoft::ReactNative::Composition::CompositionUIService::SetCompositor(host.InstanceSettings(), compositor);
107103

108104
return host;
109105
}
@@ -170,8 +166,6 @@ _Use_decl_annotations_ int CALLBACK WinMain(HINSTANCE instance, HINSTANCE, PSTR
170166
bridge.Connect(rootView.Island());
171167
bridge.ResizePolicy(winrt::Microsoft::UI::Content::ContentSizePolicy::ResizeContentToParentWindow);
172168

173-
auto invScale = 1.0f / scaleFactor;
174-
rootView.RootVisual().Scale({invScale, invScale, invScale});
175169
rootView.ScaleFactor(scaleFactor);
176170

177171
// Set the intialSize of the root view
@@ -380,8 +374,7 @@ winrt::Windows::Data::Json::JsonObject DumpVisualTreeRecurse(
380374
winrt::Windows::Data::Json::JsonObject DumpVisualTreeHelper(winrt::Windows::Data::Json::JsonObject payloadObj) {
381375
auto accessibilityId = payloadObj.GetNamedString(L"accessibilityId");
382376
winrt::Windows::Data::Json::JsonObject visualTree;
383-
auto root = winrt::Microsoft::ReactNative::Composition::MicrosoftCompositionContextHelper::InnerVisual(
384-
global_rootView->RootVisual());
377+
auto root = global_rootView->RootVisual();
385378
visualTree = DumpVisualTreeRecurse(root, accessibilityId, false);
386379
return visualTree;
387380
}

packages/playground/windows/ExperimentalFeatures.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
<PropertyGroup Label="Microsoft.ReactNative Experimental Features">
55
<UseHermes>true</UseHermes>
6-
<UseFabric>true</UseFabric>
76
<UseWinUI3>false</UseWinUI3>
87
<UseExperimentalWinUI3>false</UseExperimentalWinUI3>
98
<EnableSourceLink>true</EnableSourceLink>
@@ -20,6 +19,7 @@
2019
</PropertyGroup>
2120

2221
<PropertyGroup Label="WinUI3 for fabric" Condition="'$(SolutionName)'=='playground-composition'">
22+
<UseFabric>true</UseFabric>
2323
<UseWinUI3>true</UseWinUI3>
2424
</PropertyGroup>
2525

packages/playground/windows/playground-composition/CustomComponent.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ struct CustomComponent : CustomComponentT<CustomComponent> {
100100
base_type::FinalizeUpdates(updateMask);
101101
}
102102

103-
winrt::Microsoft::ReactNative::Composition::IVisual CreateVisual() noexcept {
103+
winrt::Microsoft::UI::Composition::Visual CreateVisual() noexcept {
104104
#ifdef USE_EXPERIMENTAL_WINUI3
105105

106106
m_xamlIsland = winrt::Microsoft::UI::Xaml::XamlIsland{};
@@ -109,19 +109,15 @@ struct CustomComponent : CustomComponentT<CustomComponent> {
109109
m_contentIsland = m_xamlIsland.ContentIsland();
110110
#endif
111111

112-
m_visual = CompositionContext().CreateSpriteVisual();
112+
m_visual = Compositor().CreateSpriteVisual();
113113
// m_visual.Brush(CompositionContext().CreateColorBrush({255, 255, 0, 255}));
114114
#ifdef USE_EXPERIMENTAL_WINUI3
115115

116-
auto parentSystemVisual =
117-
winrt::Microsoft::ReactNative::Composition::SystemCompositionContextHelper::InnerVisual(m_visual)
118-
.as<winrt::Windows::UI::Composition::ContainerVisual>();
119-
120116
auto hwnd = reinterpret_cast<HWND>(
121117
winrt::Microsoft::ReactNative::ReactCoreInjection::GetTopLevelWindowId(ReactContext().Properties()));
122118

123119
m_siteBridge = winrt::Microsoft::UI::Content::SystemVisualSiteBridge::Create(
124-
m_contentIsland.Compositor(), parentSystemVisual, winrt::Microsoft::UI::GetWindowIdFromWindow(hwnd));
120+
m_contentIsland.Compositor(), m_visual, winrt::Microsoft::UI::GetWindowIdFromWindow(hwnd));
125121
m_siteBridge.Connect(m_contentIsland);
126122

127123
auto rootXamlVisualSize = m_contentIsland.Root().Size();
@@ -171,7 +167,7 @@ struct CustomComponent : CustomComponentT<CustomComponent> {
171167
const bool m_nativeLayout;
172168
winrt::Microsoft::UI::Xaml::Controls::TextBlock m_buttonLabelTextBlock{nullptr};
173169
winrt::Microsoft::ReactNative::IComponentState m_state;
174-
winrt::Microsoft::ReactNative::Composition::ISpriteVisual m_visual{nullptr};
170+
winrt::Microsoft::UI::Composition::Visual m_visual{nullptr};
175171
#ifdef USE_EXPERIMENTAL_WINUI3
176172
winrt::Microsoft::UI::Xaml::XamlIsland m_xamlIsland{nullptr};
177173
winrt::Microsoft::UI::Content::ContentIsland m_contentIsland{nullptr};

packages/playground/windows/playground-composition/Playground-Composition.cpp

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <UIAutomation.h>
1717
#include <windows.ui.composition.interop.h>
1818

19+
#include <winrt/Microsoft.ReactNative.Composition.Experimental.h>
1920
#include <winrt/Microsoft.ReactNative.Composition.h>
2021
#include <winrt/Windows.UI.Composition.Desktop.h>
2122
#include <winrt/Windows.UI.Composition.h>
@@ -176,32 +177,15 @@ struct WindowData {
176177
}
177178

178179
if (windowData->m_useLiftedComposition) {
179-
// By using the MicrosoftCompositionContextHelper here, React Native Windows will use Lifted Visuals for
180-
// its tree.
181-
winrt::Microsoft::ReactNative::Composition::CompositionUIService::SetCompositionContext(
182-
InstanceSettings().Properties(),
183-
winrt::Microsoft::ReactNative::Composition::MicrosoftCompositionContextHelper::CreateContext(
184-
g_liftedCompositor));
180+
// By setting the compositor here we opt into using the new architecture.
181+
winrt::Microsoft::ReactNative::Composition::CompositionUIService::SetCompositor(
182+
InstanceSettings(), g_liftedCompositor);
185183

186184
auto bridge = winrt::Microsoft::UI::Content::DesktopChildSiteBridge::Create(
187185
g_liftedCompositor, winrt::Microsoft::UI::GetWindowIdFromWindow(hwnd));
188186

189187
auto appContent = m_compRootView.Island();
190188

191-
auto invScale = 1.0f / ScaleFactor(hwnd);
192-
m_compRootView.RootVisual().Scale({invScale, invScale, invScale});
193-
194-
/*
195-
// Future versions of WinAppSDK will have more capabilities around scale and size
196-
auto site = bridge.Site();
197-
auto siteWindow = site.Environment();
198-
auto displayScale = siteWindow.DisplayScale();
199-
200-
site.ParentScale(displayScale);
201-
site.ActualSize({m_width / displayScale, m_height / displayScale});
202-
site.ClientSize({m_width / displayScale, m_height / displayScale});
203-
*/
204-
205189
bridge.Connect(appContent);
206190
bridge.Show();
207191

@@ -211,12 +195,16 @@ struct WindowData {
211195
bridge.ResizePolicy(winrt::Microsoft::UI::Content::ContentSizePolicy::ResizeContentToParentWindow);
212196

213197
} else if (!m_target) {
214-
// By using the SystemCompositionContextHelper here, React Native Windows will use System Visuals for its
215-
// tree.
216-
winrt::Microsoft::ReactNative::Composition::CompositionUIService::SetCompositionContext(
217-
InstanceSettings().Properties(),
218-
winrt::Microsoft::ReactNative::Composition::SystemCompositionContextHelper::CreateContext(
219-
g_compositor));
198+
// General users of RNW should never set CompositionContext - this is an advanced usage to inject another
199+
// composition implementation. By using the SystemCompositionContextHelper here, React Native Windows will
200+
// use System Visuals for its tree.
201+
winrt::Microsoft::ReactNative::ReactPropertyBag(InstanceSettings().Properties())
202+
.Set(
203+
winrt::Microsoft::ReactNative::ReactPropertyId<
204+
winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext>{
205+
L"ReactNative.Composition", L"CompositionContext"},
206+
winrt::Microsoft::ReactNative::Composition::Experimental::SystemCompositionContextHelper::
207+
CreateContext(g_compositor));
220208

221209
auto interop = g_compositor.as<ABI::Windows::UI::Composition::Desktop::ICompositorDesktopInterop>();
222210
winrt::Windows::UI::Composition::Desktop::DesktopWindowTarget target{nullptr};
@@ -231,9 +219,13 @@ struct WindowData {
231219
root.RelativeSizeAdjustment({1.0f, 1.0f});
232220
root.Offset({0, 0, 0});
233221
m_target.Root(root);
234-
m_compRootView.SetWindow(reinterpret_cast<uint64_t>(hwnd));
235-
m_compRootView.RootVisual(
236-
winrt::Microsoft::ReactNative::Composition::SystemCompositionContextHelper::CreateVisual(root));
222+
m_compRootView
223+
.as<winrt::Microsoft::ReactNative::Composition::Experimental::IInternalCompositionRootView>()
224+
.SetWindow(reinterpret_cast<uint64_t>(hwnd));
225+
m_compRootView
226+
.as<winrt::Microsoft::ReactNative::Composition::Experimental::IInternalCompositionRootView>()
227+
.InternalRootVisual(winrt::Microsoft::ReactNative::Composition::Experimental::
228+
SystemCompositionContextHelper::CreateVisual(root));
237229
m_compRootView.ScaleFactor(ScaleFactor(hwnd));
238230
m_compRootView.Size({m_width / ScaleFactor(hwnd), m_height / ScaleFactor(hwnd)});
239231
}
@@ -307,7 +299,9 @@ struct WindowData {
307299

308300
LRESULT TranslateMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) noexcept {
309301
if (!m_useLiftedComposition && m_compRootView) {
310-
return static_cast<LRESULT>(m_compRootView.SendMessage(message, wparam, lparam));
302+
return static_cast<LRESULT>(
303+
m_compRootView.as<winrt::Microsoft::ReactNative::Composition::Experimental::IInternalCompositionRootView>()
304+
.SendMessage(message, wparam, lparam));
311305
}
312306
return 0;
313307
}

vnext/Desktop/React.Windows.Desktop.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
<V8AppPlatform>win32</V8AppPlatform>
5454
<HermesCompileRtti>false</HermesCompileRtti>
5555
<IncludeFabricInterface Condition="'$(IncludeFabricInterface)' == ''">true</IncludeFabricInterface>
56+
<UseWinUI3 Condition="'$(UseWinUI3)' == ''">true</UseWinUI3>
5657
</PropertyGroup>
5758
<PropertyGroup Label="Permissive">
5859
<ENABLEPermissive>true</ENABLEPermissive>

vnext/Desktop/module.g.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
void* winrt_make_Microsoft_Internal_TestController();
99
void* winrt_make_Microsoft_ReactNative_CompositionRootView();
1010
#ifdef USE_WINUI3
11-
void *winrt_make_Microsoft_ReactNative_Composition_MicrosoftCompositionContextHelper();
11+
void *winrt_make_Microsoft_ReactNative_Composition_Experimental_MicrosoftCompositionContextHelper();
1212
#endif
13-
void *winrt_make_Microsoft_ReactNative_Composition_SystemCompositionContextHelper();
13+
void *winrt_make_Microsoft_ReactNative_Composition_Experimental_SystemCompositionContextHelper();
1414
void *winrt_make_Microsoft_ReactNative_Composition_CompositionUIService();
1515
void* winrt_make_Microsoft_ReactNative_JsiRuntime();
1616
void* winrt_make_Microsoft_ReactNative_ReactCoreInjection();
@@ -50,12 +50,12 @@ void* __stdcall winrt_get_activation_factory([[maybe_unused]] std::wstring_view
5050
return winrt_make_Microsoft_ReactNative_CompositionRootView();
5151
}
5252
#ifdef USE_WINUI3
53-
if (requal(name, L"Microsoft.ReactNative.Composition.MicrosoftCompositionContextHelper")) {
54-
return winrt_make_Microsoft_ReactNative_Composition_MicrosoftCompositionContextHelper();
53+
if (requal(name, L"Microsoft.ReactNative.Composition.Experimental.MicrosoftCompositionContextHelper")) {
54+
return winrt_make_Microsoft_ReactNative_Composition_Experimental_MicrosoftCompositionContextHelper();
5555
}
5656
#endif
57-
if (requal(name, L"Microsoft.ReactNative.Composition.SystemCompositionContextHelper")) {
58-
return winrt_make_Microsoft_ReactNative_Composition_SystemCompositionContextHelper();
57+
if (requal(name, L"Microsoft.ReactNative.Composition.Experimental.SystemCompositionContextHelper")) {
58+
return winrt_make_Microsoft_ReactNative_Composition_Experimental_SystemCompositionContextHelper();
5959
}
6060
if (requal(name, L"Microsoft.ReactNative.Composition.CompositionUIService")) {
6161
return winrt_make_Microsoft_ReactNative_Composition_CompositionUIService();

vnext/Microsoft.ReactNative.Cxx/AutoDraw.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
#include <winrt/Microsoft.ReactNative.Composition.h>
55

6-
#include <CompositionSwitcher.interop.h>
6+
#include <CompositionSwitcher.Experimental.interop.h>
77

88
namespace Microsoft::ReactNative::Composition {
99

1010
class AutoDrawDrawingSurface {
1111
public:
1212
AutoDrawDrawingSurface(
13-
winrt::Microsoft::ReactNative::Composition::IDrawingSurfaceBrush &drawingSurface,
13+
winrt::Microsoft::ReactNative::Composition::Experimental::IDrawingSurfaceBrush &drawingSurface,
1414
POINT *offset) noexcept {
1515
drawingSurface.as(m_drawingSurfaceInterop);
1616
m_drawingSurfaceInterop->BeginDraw(m_d2dDeviceContext.put(), offset);
@@ -31,7 +31,7 @@ class AutoDrawDrawingSurface {
3131
}
3232

3333
private:
34-
winrt::com_ptr<ICompositionDrawingSurfaceInterop> m_drawingSurfaceInterop;
34+
winrt::com_ptr<Experimental::ICompositionDrawingSurfaceInterop> m_drawingSurfaceInterop;
3535
winrt::com_ptr<ID2D1DeviceContext> m_d2dDeviceContext;
3636
};
3737

vnext/Microsoft.ReactNative.Cxx/CompositionSwitcher.interop.h renamed to vnext/Microsoft.ReactNative.Cxx/CompositionSwitcher.Experimental.interop.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <winrt/Microsoft.ReactNative.Composition.h>
1313
#include <winrt/Windows.Graphics.DirectX.Direct3D11.h>
1414

15-
namespace Microsoft::ReactNative::Composition {
15+
namespace Microsoft::ReactNative::Composition::Experimental {
1616

1717
struct __declspec(uuid("941FDD90-ED27-49CE-A1CD-86ECB2D4A0FA")) ICompositionDrawingSurfaceInterop : public IUnknown {
1818
virtual HRESULT BeginDraw(ID2D1DeviceContext **deviceContextOut, POINT *offset) noexcept = 0;
@@ -31,4 +31,4 @@ struct __declspec(uuid("4742F122-3EE0-48AA-9EA9-44A00147B55F")) ICompositionCont
3131
virtual void D2DFactory(ID2D1Factory1 **outD2DFactory) noexcept = 0;
3232
};
3333

34-
} // namespace Microsoft::ReactNative::Composition
34+
} // namespace Microsoft::ReactNative::Composition::Experimental

vnext/Microsoft.ReactNative/CompositionComponentView.idl

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import "Theme.idl";
66
import "ViewProps.idl";
77
import "Composition.Input.idl";
88
import "CompositionSwitcher.idl";
9+
import "IReactContext.idl";
910

1011
#include "DocString.h"
1112

@@ -28,7 +29,7 @@ namespace Microsoft.ReactNative.Composition
2829
[experimental]
2930
[webhosthidden]
3031
runtimeclass CreateCompositionComponentViewArgs : Microsoft.ReactNative.CreateComponentViewArgs {
31-
ICompositionContext CompositionContext { get; };
32+
Microsoft.UI.Composition.Compositor Compositor { get; };
3233
ComponentViewFeatures Features;
3334
};
3435

@@ -37,21 +38,35 @@ namespace Microsoft.ReactNative.Composition
3738
unsealed runtimeclass ComponentView : Microsoft.ReactNative.ComponentView {
3839
ComponentView(CreateCompositionComponentViewArgs args);
3940

40-
ICompositionContext CompositionContext { get; };
41+
Microsoft.UI.Composition.Compositor Compositor { get; };
4142
Theme Theme;
4243
overridable void OnThemeChanged();
4344
Boolean CapturePointer(Microsoft.ReactNative.Composition.Input.Pointer pointer);
4445
void ReleasePointerCapture(Microsoft.ReactNative.Composition.Input.Pointer pointer);
4546
};
4647

48+
namespace Experimental {
49+
[webhosthidden]
50+
[experimental]
51+
DOC_STRING("Custom ViewComponents need to implement this interface to be able to provide a custom"
52+
" visual using the composition context that allows custom compositors. This is only required for"
53+
" custom components that need to support running in RNW instances with custom compositors. Most"
54+
" custom components can just override CreateVisual on ViewComponentView."
55+
" This will be removed in a future version")
56+
interface IInternalCreateVisual
57+
{
58+
Microsoft.ReactNative.Composition.Experimental.IVisual CreateInternalVisual();
59+
}
60+
}
61+
4762
[experimental]
4863
[webhosthidden]
4964
unsealed runtimeclass ViewComponentView : ComponentView {
5065
ViewComponentView(CreateCompositionComponentViewArgs args);
5166

5267
Microsoft.ReactNative.ViewProps ViewProps { get; };
5368

54-
overridable IVisual CreateVisual();
69+
overridable Microsoft.UI.Composition.Visual CreateVisual();
5570
};
5671

5772
[experimental]

0 commit comments

Comments
 (0)