From 19078979e38a9facb0be00ed0daeca3bd53c9e3a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 09:40:42 +0100 Subject: [PATCH 01/14] Initial implementation of SetCurrentValue. --- src/Avalonia.Base/AvaloniaObject.cs | 20 +- .../Diagnostics/AvaloniaPropertyValue.cs | 23 +- .../PropertyStore/EffectiveValue.cs | 6 + .../PropertyStore/EffectiveValue`1.cs | 29 +- src/Avalonia.Base/PropertyStore/ValueStore.cs | 23 +- .../AvaloniaObjectTests_SetCurrentValue.cs | 270 ++++++++++++++++++ 6 files changed, 345 insertions(+), 26 deletions(-) create mode 100644 tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 74dc55355b..93bbee12b8 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -355,6 +355,23 @@ namespace Avalonia SetDirectValueUnchecked(property, value); } + public void SetCurrentValue(StyledProperty property, T value) + { + _ = property ?? throw new ArgumentNullException(nameof(property)); + VerifyAccess(); + + LogPropertySet(property, value, BindingPriority.LocalValue); + + if (value is UnsetValueType) + { + _values.ClearLocalValue(property); + } + else if (value is not DoNothingType) + { + _values.SetCurrentValue(property, value); + } + } + /// /// Binds a to an observable. /// @@ -547,7 +564,8 @@ namespace Avalonia property, GetValue(property), BindingPriority.LocalValue, - null); + null, + false); } return _values.GetDiagnostic(property); diff --git a/src/Avalonia.Base/Diagnostics/AvaloniaPropertyValue.cs b/src/Avalonia.Base/Diagnostics/AvaloniaPropertyValue.cs index 4189fd5234..0b3e62f1cc 100644 --- a/src/Avalonia.Base/Diagnostics/AvaloniaPropertyValue.cs +++ b/src/Avalonia.Base/Diagnostics/AvaloniaPropertyValue.cs @@ -3,28 +3,23 @@ using Avalonia.Data; namespace Avalonia.Diagnostics { /// - /// Holds diagnostic-related information about the value of a - /// on a . + /// Holds diagnostic-related information about the value of an + /// on an . /// public class AvaloniaPropertyValue { - /// - /// Initializes a new instance of the class. - /// - /// The property. - /// The current property value. - /// The priority of the current value. - /// A diagnostic string. - public AvaloniaPropertyValue( + internal AvaloniaPropertyValue( AvaloniaProperty property, object? value, BindingPriority priority, - string? diagnostic) + string? diagnostic, + bool isOverriddenCurrentValue) { Property = property; Value = value; Priority = priority; Diagnostic = diagnostic; + IsOverriddenCurrentValue = isOverriddenCurrentValue; } /// @@ -46,5 +41,11 @@ namespace Avalonia.Diagnostics /// Gets a diagnostic string. /// public string? Diagnostic { get; } + + /// + /// Gets a value indicating whether the was overridden by a call to + /// . + /// + public bool IsOverriddenCurrentValue { get; } } } diff --git a/src/Avalonia.Base/PropertyStore/EffectiveValue.cs b/src/Avalonia.Base/PropertyStore/EffectiveValue.cs index 04d3c805c2..78f0ad46b7 100644 --- a/src/Avalonia.Base/PropertyStore/EffectiveValue.cs +++ b/src/Avalonia.Base/PropertyStore/EffectiveValue.cs @@ -29,6 +29,12 @@ namespace Avalonia.PropertyStore /// public BindingPriority BasePriority { get; protected set; } + /// + /// Gets a value indicating whether the was overridden by a call to + /// . + /// + public bool IsOverridenCurrentValue { get; set; } + /// /// Begins a reevaluation pass on the effective value. /// diff --git a/src/Avalonia.Base/PropertyStore/EffectiveValue`1.cs b/src/Avalonia.Base/PropertyStore/EffectiveValue`1.cs index 3e20dcce56..0d93e9d8ed 100644 --- a/src/Avalonia.Base/PropertyStore/EffectiveValue`1.cs +++ b/src/Avalonia.Base/PropertyStore/EffectiveValue`1.cs @@ -57,7 +57,7 @@ namespace Avalonia.PropertyStore Debug.Assert(priority != BindingPriority.LocalValue); UpdateValueEntry(value, priority); - SetAndRaiseCore(owner, (StyledProperty)value.Property, GetValue(value), priority); + SetAndRaiseCore(owner, (StyledProperty)value.Property, GetValue(value), priority, false); } public void SetLocalValueAndRaise( @@ -65,7 +65,16 @@ namespace Avalonia.PropertyStore StyledProperty property, T value) { - SetAndRaiseCore(owner, property, value, BindingPriority.LocalValue); + SetAndRaiseCore(owner, property, value, BindingPriority.LocalValue, false); + } + + public void SetCurrentValueAndRaise( + ValueStore owner, + StyledProperty property, + T value) + { + IsOverridenCurrentValue = true; + SetAndRaiseCore(owner, property, value, Priority, true); } public bool TryGetBaseValue([MaybeNullWhen(false)] out T value) @@ -98,7 +107,7 @@ namespace Avalonia.PropertyStore Debug.Assert(Priority != BindingPriority.Animation); Debug.Assert(BasePriority != BindingPriority.Unset); UpdateValueEntry(null, BindingPriority.Animation); - SetAndRaiseCore(owner, (StyledProperty)property, _baseValue!, BasePriority); + SetAndRaiseCore(owner, (StyledProperty)property, _baseValue!, BasePriority, false); } public override void CoerceValue(ValueStore owner, AvaloniaProperty property) @@ -158,15 +167,16 @@ namespace Avalonia.PropertyStore ValueStore owner, StyledProperty property, T value, - BindingPriority priority) + BindingPriority priority, + bool isOverriddenCurrentValue) { - Debug.Assert(priority < BindingPriority.Inherited); - var oldValue = Value; var valueChanged = false; var baseValueChanged = false; var v = value; + IsOverridenCurrentValue = isOverriddenCurrentValue; + if (_uncommon?._coerce is { } coerce) v = coerce(owner.Owner, value); @@ -209,7 +219,6 @@ namespace Avalonia.PropertyStore T baseValue, BindingPriority basePriority) { - Debug.Assert(priority < BindingPriority.Inherited); Debug.Assert(basePriority > BindingPriority.Animation); Debug.Assert(priority <= basePriority); @@ -225,7 +234,7 @@ namespace Avalonia.PropertyStore bv = coerce(owner.Owner, baseValue); } - if (priority != BindingPriority.Unset && !EqualityComparer.Default.Equals(Value, v)) + if (!EqualityComparer.Default.Equals(Value, v)) { Value = v; valueChanged = true; @@ -233,9 +242,7 @@ namespace Avalonia.PropertyStore _uncommon._uncoercedValue = value; } - if (priority != BindingPriority.Unset && - (BasePriority == BindingPriority.Unset || - !EqualityComparer.Default.Equals(_baseValue, bv))) + if (!EqualityComparer.Default.Equals(_baseValue, bv)) { _baseValue = v; baseValueChanged = true; diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index a758360545..fd5cd91a6c 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -7,7 +7,6 @@ using Avalonia.Data; using Avalonia.Diagnostics; using Avalonia.Styling; using Avalonia.Utilities; -using static Avalonia.Rendering.Composition.Animations.PropertySetSnapshot; namespace Avalonia.PropertyStore { @@ -159,8 +158,9 @@ namespace Avalonia.PropertyStore public void ClearLocalValue(AvaloniaProperty property) { if (TryGetEffectiveValue(property, out var effective) && - effective.Priority == BindingPriority.LocalValue) + (effective.Priority == BindingPriority.LocalValue || effective.IsOverridenCurrentValue)) { + effective.IsOverridenCurrentValue = false; ReevaluateEffectiveValue(property, effective, ignoreLocalValue: true); } } @@ -209,6 +209,20 @@ namespace Avalonia.PropertyStore } } + public void SetCurrentValue(StyledProperty property, T value) + { + if (_effectiveValues.TryGetValue(property, out var v)) + { + ((EffectiveValue)v).SetCurrentValueAndRaise(this, property, value); + } + else + { + var effectiveValue = new EffectiveValue(Owner, property); + AddEffectiveValue(property, effectiveValue); + effectiveValue.SetCurrentValueAndRaise(this, property, value); + } + } + public object? GetValue(AvaloniaProperty property) { if (_effectiveValues.TryGetValue(property, out var v)) @@ -616,11 +630,13 @@ namespace Avalonia.PropertyStore { object? value; BindingPriority priority; + bool overridden = false; if (_effectiveValues.TryGetValue(property, out var v)) { value = v.Value; priority = v.Priority; + overridden = v.IsOverridenCurrentValue; } else if (property.Inherits && TryGetInheritedValue(property, out v)) { @@ -637,7 +653,8 @@ namespace Avalonia.PropertyStore property, value, priority, - null); + null, + overridden); } private int InsertFrame(ValueFrame frame) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs new file mode 100644 index 0000000000..16f924acba --- /dev/null +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs @@ -0,0 +1,270 @@ +using System; +using System.Reactive.Linq; +using Avalonia.Data; +using Avalonia.Diagnostics; +using Avalonia.Reactive; +using Xunit; +using Observable = Avalonia.Reactive.Observable; + +namespace Avalonia.Base.UnitTests +{ + public class AvaloniaObjectTests_SetCurrentValue + { + [Fact] + public void SetCurrentValue_Sets_Unset_Value() + { + var target = new Class1(); + + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + + Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); + Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.FooProperty)); + Assert.True(IsOverridden(target, Class1.FooProperty)); + } + + [Theory] + [InlineData(BindingPriority.LocalValue)] + [InlineData(BindingPriority.Style)] + [InlineData(BindingPriority.Animation)] + public void SetCurrentValue_Overrides_Existing_Value(BindingPriority priority) + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "oldvalue", priority); + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + + Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); + Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); + Assert.True(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void SetCurrentValue_Overrides_Inherited_Value() + { + var parent = new Class1(); + var target = new Class1 { InheritanceParent = parent }; + + parent.SetValue(Class1.InheritedProperty, "inheritedvalue"); + target.SetCurrentValue(Class1.InheritedProperty, "newvalue"); + + Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); + Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.InheritedProperty)); + Assert.True(IsOverridden(target, Class1.InheritedProperty)); + } + + [Fact] + public void SetCurrentValue_Is_Inherited() + { + var parent = new Class1(); + var target = new Class1 { InheritanceParent = parent }; + + parent.SetCurrentValue(Class1.InheritedProperty, "newvalue"); + + Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); + Assert.Equal(BindingPriority.Inherited, GetPriority(target, Class1.InheritedProperty)); + Assert.False(IsOverridden(target, Class1.InheritedProperty)); + } + + [Fact] + public void ClearValue_Clears_CurrentValue_With_Unset_Priority() + { + var target = new Class1(); + + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + target.ClearValue(Class1.FooProperty); + + Assert.Equal("foodefault", target.Foo); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void ClearValue_Clears_CurrentValue_With_Inherited_Priority() + { + var parent = new Class1(); + var target = new Class1 { InheritanceParent = parent }; + + parent.SetValue(Class1.InheritedProperty, "inheritedvalue"); + target.SetCurrentValue(Class1.InheritedProperty, "newvalue"); + target.ClearValue(Class1.InheritedProperty); + + Assert.Equal("inheritedvalue", target.Inherited); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void ClearValue_Clears_CurrentValue_With_LocalValue_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "localvalue"); + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + target.ClearValue(Class1.FooProperty); + + Assert.Equal("foodefault", target.Foo); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void ClearValue_Clears_CurrentValue_With_Style_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "stylevalue", BindingPriority.Style); + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + target.ClearValue(Class1.FooProperty); + + Assert.Equal("stylevalue", target.Foo); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void SetCurrentValue_Can_Be_Coerced() + { + var target = new Class1(); + + target.SetCurrentValue(Class1.CoercedProperty, 60); + Assert.Equal(60, target.GetValue(Class1.CoercedProperty)); + + target.CoerceMax = 50; + target.CoerceValue(Class1.CoercedProperty); + Assert.Equal(50, target.GetValue(Class1.CoercedProperty)); + + target.CoerceMax = 100; + target.CoerceValue(Class1.CoercedProperty); + Assert.Equal(60, target.GetValue(Class1.CoercedProperty)); + } + + [Theory] + [InlineData(BindingPriority.LocalValue)] + [InlineData(BindingPriority.Style)] + [InlineData(BindingPriority.Animation)] + public void SetValue_Overrides_CurrentValue_With_Unset_Priority(BindingPriority priority) + { + var target = new Class1(); + + target.SetCurrentValue(Class1.FooProperty, "current"); + target.SetValue(Class1.FooProperty, "setvalue", priority); + + Assert.Equal("setvalue", target.Foo); + Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void Animation_Value_Overrides_CurrentValue_With_LocalValue_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "localvalue"); + target.SetCurrentValue(Class1.FooProperty, "current"); + target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.Animation); + + Assert.Equal("setvalue", target.Foo); + Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Fact] + public void StyleTrigger_Value_Overrides_CurrentValue_With_Style_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "style", BindingPriority.Style); + target.SetCurrentValue(Class1.FooProperty, "current"); + target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.StyleTrigger); + + Assert.Equal("setvalue", target.Foo); + Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + + [Theory] + [InlineData(BindingPriority.LocalValue)] + [InlineData(BindingPriority.Style)] + [InlineData(BindingPriority.Animation)] + public void Binding_Overrides_CurrentValue_With_Unset_Priority(BindingPriority priority) + { + var target = new Class1(); + + target.SetCurrentValue(Class1.FooProperty, "current"); + + var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), priority); + + Assert.Equal("binding", target.Foo); + Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + + s.Dispose(); + + Assert.Equal("foodefault", target.Foo); + } + + [Fact] + public void Animation_Binding_Overrides_CurrentValue_With_LocalValue_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "localvalue"); + target.SetCurrentValue(Class1.FooProperty, "current"); + + var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.Animation); + + Assert.Equal("binding", target.Foo); + Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + + s.Dispose(); + + Assert.Equal("current", target.Foo); + } + + [Fact] + public void StyleTrigger_Binding_Overrides_CurrentValue_With_Style_Priority() + { + var target = new Class1(); + + target.SetValue(Class1.FooProperty, "style", BindingPriority.Style); + target.SetCurrentValue(Class1.FooProperty, "current"); + + var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.StyleTrigger); + + Assert.Equal("binding", target.Foo); + Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + + s.Dispose(); + + Assert.Equal("style", target.Foo); + } + + private BindingPriority GetPriority(AvaloniaObject target, AvaloniaProperty property) + { + return target.GetDiagnostic(property).Priority; + } + + private bool IsOverridden(AvaloniaObject target, AvaloniaProperty property) + { + return target.GetDiagnostic(property).IsOverriddenCurrentValue; + } + + private class Class1 : AvaloniaObject + { + public static readonly StyledProperty FooProperty = + AvaloniaProperty.Register(nameof(Foo), "foodefault"); + public static readonly StyledProperty InheritedProperty = + AvaloniaProperty.Register(nameof(Inherited), "inheriteddefault", inherits: true); + public static readonly StyledProperty CoercedProperty = + AvaloniaProperty.Register(nameof(Coerced), coerce: Coerce); + + public string Foo => GetValue(FooProperty); + public string Inherited => GetValue(InheritedProperty); + public double Coerced => GetValue(CoercedProperty); + public double CoerceMax { get; set; } = 100; + + private static double Coerce(AvaloniaObject sender, double value) + { + return Math.Min(value, ((Class1)sender).CoerceMax); + } + } + } +} From 8741b7e4106fd0ceef9f68ddc5eb3dfae5604e8e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 10:53:03 +0100 Subject: [PATCH 02/14] Fix IsSet with SetCurrentValue. And add unit tests. --- src/Avalonia.Base/PropertyStore/ValueStore.cs | 7 +------ .../AvaloniaObjectTests_SetCurrentValue.cs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index fd5cd91a6c..64e3c498e9 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -249,12 +249,7 @@ namespace Avalonia.PropertyStore return false; } - public bool IsSet(AvaloniaProperty property) - { - if (_effectiveValues.TryGetValue(property, out var v)) - return v.Priority < BindingPriority.Inherited; - return false; - } + public bool IsSet(AvaloniaProperty property) => _effectiveValues.TryGetValue(property, out _); public void CoerceValue(AvaloniaProperty property) { diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs index 16f924acba..3edf0b105a 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs @@ -1,8 +1,6 @@ using System; -using System.Reactive.Linq; using Avalonia.Data; using Avalonia.Diagnostics; -using Avalonia.Reactive; using Xunit; using Observable = Avalonia.Reactive.Observable; @@ -18,6 +16,7 @@ namespace Avalonia.Base.UnitTests target.SetCurrentValue(Class1.FooProperty, "newvalue"); Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.FooProperty)); Assert.True(IsOverridden(target, Class1.FooProperty)); } @@ -34,6 +33,7 @@ namespace Avalonia.Base.UnitTests target.SetCurrentValue(Class1.FooProperty, "newvalue"); Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); Assert.True(IsOverridden(target, Class1.FooProperty)); } @@ -48,6 +48,7 @@ namespace Avalonia.Base.UnitTests target.SetCurrentValue(Class1.InheritedProperty, "newvalue"); Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); + Assert.True(target.IsSet(Class1.InheritedProperty)); Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.InheritedProperty)); Assert.True(IsOverridden(target, Class1.InheritedProperty)); } @@ -61,6 +62,7 @@ namespace Avalonia.Base.UnitTests parent.SetCurrentValue(Class1.InheritedProperty, "newvalue"); Assert.Equal("newvalue", target.GetValue(Class1.InheritedProperty)); + Assert.False(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.Inherited, GetPriority(target, Class1.InheritedProperty)); Assert.False(IsOverridden(target, Class1.InheritedProperty)); } @@ -74,6 +76,7 @@ namespace Avalonia.Base.UnitTests target.ClearValue(Class1.FooProperty); Assert.Equal("foodefault", target.Foo); + Assert.False(target.IsSet(Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -88,6 +91,7 @@ namespace Avalonia.Base.UnitTests target.ClearValue(Class1.InheritedProperty); Assert.Equal("inheritedvalue", target.Inherited); + Assert.False(target.IsSet(Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -101,6 +105,7 @@ namespace Avalonia.Base.UnitTests target.ClearValue(Class1.FooProperty); Assert.Equal("foodefault", target.Foo); + Assert.False(target.IsSet(Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -114,6 +119,7 @@ namespace Avalonia.Base.UnitTests target.ClearValue(Class1.FooProperty); Assert.Equal("stylevalue", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -146,6 +152,7 @@ namespace Avalonia.Base.UnitTests target.SetValue(Class1.FooProperty, "setvalue", priority); Assert.Equal("setvalue", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -160,6 +167,7 @@ namespace Avalonia.Base.UnitTests target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.Animation); Assert.Equal("setvalue", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -174,6 +182,7 @@ namespace Avalonia.Base.UnitTests target.SetValue(Class1.FooProperty, "setvalue", BindingPriority.StyleTrigger); Assert.Equal("setvalue", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); } @@ -191,6 +200,7 @@ namespace Avalonia.Base.UnitTests var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), priority); Assert.Equal("binding", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(priority, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); @@ -210,6 +220,7 @@ namespace Avalonia.Base.UnitTests var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.Animation); Assert.Equal("binding", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.Animation, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); @@ -229,6 +240,7 @@ namespace Avalonia.Base.UnitTests var s = target.Bind(Class1.FooProperty, Observable.SingleValue("binding"), BindingPriority.StyleTrigger); Assert.Equal("binding", target.Foo); + Assert.True(target.IsSet(Class1.FooProperty)); Assert.Equal(BindingPriority.StyleTrigger, GetPriority(target, Class1.FooProperty)); Assert.False(IsOverridden(target, Class1.FooProperty)); From 0ce9180d7c56b17c7b6a03c44d82161f6d031036 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 11:41:59 +0100 Subject: [PATCH 03/14] Added untyped SetCurrentValue. --- src/Avalonia.Base/AvaloniaObject.cs | 34 +++++++++++++++++++ src/Avalonia.Base/AvaloniaProperty.cs | 7 ++++ src/Avalonia.Base/DirectPropertyBase.cs | 5 +++ src/Avalonia.Base/StyledProperty.cs | 21 ++++++++++++ .../AvaloniaObjectTests_SetCurrentValue.cs | 26 ++++++++++++++ .../AvaloniaPropertyTests.cs | 5 +++ 6 files changed, 98 insertions(+) diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 93bbee12b8..5a5827d0aa 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -355,6 +355,40 @@ namespace Avalonia SetDirectValueUnchecked(property, value); } + /// + /// Sets the value of a dependency property without changing its value source. + /// + /// The property. + /// The value. + /// + /// This method is used by a component that programmatically sets the value of one of its + /// own properties without disabling an application's declared use of the property. The + /// method changes the effective value of the property, but existing data bindings and + /// styles will continue to work. + /// + /// The new value will have the property's current , even if + /// that priority is or + /// . + /// + public void SetCurrentValue(AvaloniaProperty property, object? value) => + property.RouteSetCurrentValue(this, value); + + /// + /// Sets the value of a dependency property without changing its value source. + /// + /// The type of the property. + /// The property. + /// The value. + /// + /// This method is used by a component that programmatically sets the value of one of its + /// own properties without disabling an application's declared use of the property. The + /// method changes the effective value of the property, but existing data bindings and + /// styles will continue to work. + /// + /// The new value will have the property's current , even if + /// that priority is or + /// . + /// public void SetCurrentValue(StyledProperty property, T value) { _ = property ?? throw new ArgumentNullException(nameof(property)); diff --git a/src/Avalonia.Base/AvaloniaProperty.cs b/src/Avalonia.Base/AvaloniaProperty.cs index 5db4d81f03..1c1d09c3f5 100644 --- a/src/Avalonia.Base/AvaloniaProperty.cs +++ b/src/Avalonia.Base/AvaloniaProperty.cs @@ -496,6 +496,13 @@ namespace Avalonia object? value, BindingPriority priority); + /// + /// Routes an untyped SetCurrentValue call to a typed call. + /// + /// The object instance. + /// The value. + internal abstract void RouteSetCurrentValue(AvaloniaObject o, object? value); + /// /// Routes an untyped Bind call to a typed call. /// diff --git a/src/Avalonia.Base/DirectPropertyBase.cs b/src/Avalonia.Base/DirectPropertyBase.cs index 9ee1eee0fa..94dfaaab01 100644 --- a/src/Avalonia.Base/DirectPropertyBase.cs +++ b/src/Avalonia.Base/DirectPropertyBase.cs @@ -152,6 +152,11 @@ namespace Avalonia return null; } + internal override void RouteSetCurrentValue(AvaloniaObject o, object? value) + { + RouteSetValue(o, value, BindingPriority.LocalValue); + } + /// /// Routes an untyped Bind call to a typed call. /// diff --git a/src/Avalonia.Base/StyledProperty.cs b/src/Avalonia.Base/StyledProperty.cs index 79d1b9202d..8e0ecf5544 100644 --- a/src/Avalonia.Base/StyledProperty.cs +++ b/src/Avalonia.Base/StyledProperty.cs @@ -220,6 +220,27 @@ namespace Avalonia } } + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] + internal override void RouteSetCurrentValue(AvaloniaObject target, object? value) + { + if (value == BindingOperations.DoNothing) + return; + + if (value == UnsetValue) + { + target.ClearValue(this); + } + else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var converted)) + { + target.SetCurrentValue(this, (TValue)converted!); + } + else + { + var type = value?.GetType().FullName ?? "(null)"; + throw new ArgumentException($"Invalid value for Property '{Name}': '{value}' ({type})"); + } + } + internal override IDisposable RouteBind( AvaloniaObject target, IObservable source, diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs index 3edf0b105a..8ad36a583e 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs @@ -21,6 +21,19 @@ namespace Avalonia.Base.UnitTests Assert.True(IsOverridden(target, Class1.FooProperty)); } + [Fact] + public void SetCurrentValue_Sets_Unset_Value_Untyped() + { + var target = new Class1(); + + target.SetCurrentValue((AvaloniaProperty)Class1.FooProperty, "newvalue"); + + Assert.Equal("newvalue", target.GetValue(Class1.FooProperty)); + Assert.True(target.IsSet(Class1.FooProperty)); + Assert.Equal(BindingPriority.Unset, GetPriority(target, Class1.FooProperty)); + Assert.True(IsOverridden(target, Class1.FooProperty)); + } + [Theory] [InlineData(BindingPriority.LocalValue)] [InlineData(BindingPriority.Style)] @@ -140,6 +153,19 @@ namespace Avalonia.Base.UnitTests Assert.Equal(60, target.GetValue(Class1.CoercedProperty)); } + [Fact] + public void SetCurrentValue_Unset_Clears_CurrentValue() + { + var target = new Class1(); + + target.SetCurrentValue(Class1.FooProperty, "newvalue"); + target.SetCurrentValue(Class1.FooProperty, AvaloniaProperty.UnsetValue); + + Assert.Equal("foodefault", target.Foo); + Assert.False(target.IsSet(Class1.FooProperty)); + Assert.False(IsOverridden(target, Class1.FooProperty)); + } + [Theory] [InlineData(BindingPriority.LocalValue)] [InlineData(BindingPriority.Style)] diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs index 5733159a23..a9b8a5f21b 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs @@ -179,6 +179,11 @@ namespace Avalonia.Base.UnitTests throw new NotImplementedException(); } + internal override void RouteSetCurrentValue(AvaloniaObject o, object value) + { + throw new NotImplementedException(); + } + internal override EffectiveValue CreateEffectiveValue(AvaloniaObject o) { throw new NotImplementedException(); From 15a0fd6a3f294847dfc26f54690dbf0fb0d86e23 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 16:32:12 +0100 Subject: [PATCH 04/14] ClearLocalValue => ClearValue. It no longer just clears the local value, and the method on `AvaloniaObject` is called simply `ClearValue` so makes sense to use the same naming here. --- src/Avalonia.Base/AvaloniaObject.cs | 8 ++++---- src/Avalonia.Base/PropertyStore/ValueStore.cs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 5a5827d0aa..2c9efc7767 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -118,7 +118,7 @@ namespace Avalonia { _ = property ?? throw new ArgumentNullException(nameof(property)); VerifyAccess(); - _values.ClearLocalValue(property); + _values.ClearValue(property); } /// @@ -152,7 +152,7 @@ namespace Avalonia property = property ?? throw new ArgumentNullException(nameof(property)); VerifyAccess(); - _values.ClearLocalValue(property); + _values.ClearValue(property); } /// @@ -329,7 +329,7 @@ namespace Avalonia if (value is UnsetValueType) { if (priority == BindingPriority.LocalValue) - _values.ClearLocalValue(property); + _values.ClearValue(property); } else if (value is not DoNothingType) { @@ -398,7 +398,7 @@ namespace Avalonia if (value is UnsetValueType) { - _values.ClearLocalValue(property); + _values.ClearValue(property); } else if (value is not DoNothingType) { diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index 64e3c498e9..03d7efc566 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -155,7 +155,7 @@ namespace Avalonia.PropertyStore return observer; } - public void ClearLocalValue(AvaloniaProperty property) + public void ClearValue(AvaloniaProperty property) { if (TryGetEffectiveValue(property, out var effective) && (effective.Priority == BindingPriority.LocalValue || effective.IsOverridenCurrentValue)) @@ -499,7 +499,7 @@ namespace Avalonia.PropertyStore if (existing == observer) { _localValueBindings?.Remove(property.Id); - ClearLocalValue(property); + ClearValue(property); } } } From fcf1ce74c92174fd77d5b6b09c29e586483029f4 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 16:34:46 +0100 Subject: [PATCH 05/14] Use TryGetEffectiveValue. For consistency with the other methods. --- src/Avalonia.Base/PropertyStore/ValueStore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/PropertyStore/ValueStore.cs b/src/Avalonia.Base/PropertyStore/ValueStore.cs index 03d7efc566..8b702665f8 100644 --- a/src/Avalonia.Base/PropertyStore/ValueStore.cs +++ b/src/Avalonia.Base/PropertyStore/ValueStore.cs @@ -211,7 +211,7 @@ namespace Avalonia.PropertyStore public void SetCurrentValue(StyledProperty property, T value) { - if (_effectiveValues.TryGetValue(property, out var v)) + if (TryGetEffectiveValue(property, out var v)) { ((EffectiveValue)v).SetCurrentValueAndRaise(this, property, value); } From 5d66bd0c0e7aae7cf7a1f07cd927fbb4bfa1fa28 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 13 Feb 2023 16:55:32 +0100 Subject: [PATCH 06/14] Refactored common code into separate method. --- src/Avalonia.Base/StyledProperty.cs | 59 +++++++++++++---------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/src/Avalonia.Base/StyledProperty.cs b/src/Avalonia.Base/StyledProperty.cs index 8e0ecf5544..ad1f09066e 100644 --- a/src/Avalonia.Base/StyledProperty.cs +++ b/src/Avalonia.Base/StyledProperty.cs @@ -194,45 +194,48 @@ namespace Avalonia } /// - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] internal override IDisposable? RouteSetValue( AvaloniaObject target, object? value, BindingPriority priority) { - if (value == BindingOperations.DoNothing) - { - return null; - } - else if (value == UnsetValue) - { - target.ClearValue(this); - return null; - } - else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var converted)) - { - return target.SetValue(this, (TValue)converted!, priority); - } - else - { - var type = value?.GetType().FullName ?? "(null)"; - throw new ArgumentException($"Invalid value for Property '{Name}': '{value}' ({type})"); - } + if (ShouldSetValue(target, value, out var converted)) + return target.SetValue(this, converted, priority); + return null; } - [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] internal override void RouteSetCurrentValue(AvaloniaObject target, object? value) { - if (value == BindingOperations.DoNothing) - return; + if (ShouldSetValue(target, value, out var converted)) + target.SetCurrentValue(this, converted); + } + + internal override IDisposable RouteBind( + AvaloniaObject target, + IObservable source, + BindingPriority priority) + { + return target.Bind(this, source, priority); + } + [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = TrimmingMessages.ImplicitTypeConvertionSupressWarningMessage)] + private bool ShouldSetValue(AvaloniaObject target, object? value, [NotNullWhen(true)] out TValue? converted) + { + if (value == BindingOperations.DoNothing) + { + converted = default; + return false; + } if (value == UnsetValue) { target.ClearValue(this); + converted = default; + return false; } - else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var converted)) + else if (TypeUtilities.TryConvertImplicit(PropertyType, value, out var v)) { - target.SetCurrentValue(this, (TValue)converted!); + converted = (TValue)v!; + return true; } else { @@ -241,14 +244,6 @@ namespace Avalonia } } - internal override IDisposable RouteBind( - AvaloniaObject target, - IObservable source, - BindingPriority priority) - { - return target.Bind(this, source, priority); - } - private object? GetDefaultBoxedValue(Type type) { _ = type ?? throw new ArgumentNullException(nameof(type)); From 4fc1995246b2e35574a95e7f7be61d27dc2cc144 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 20:08:09 -0500 Subject: [PATCH 07/14] Make AvaloniaProperty.Register overload with "notifying" parameter internal --- src/Avalonia.Base/AvaloniaProperty.cs | 43 +++++++++++++++---- src/Avalonia.Base/StyledElement.cs | 4 ++ .../AvaloniaPropertyTests.cs | 7 ++- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Base/AvaloniaProperty.cs b/src/Avalonia.Base/AvaloniaProperty.cs index 5db4d81f03..96268376cf 100644 --- a/src/Avalonia.Base/AvaloniaProperty.cs +++ b/src/Avalonia.Base/AvaloniaProperty.cs @@ -225,13 +225,8 @@ namespace Avalonia /// The default value of the property. /// Whether the property inherits its value. /// The default binding mode for the property. - /// A value validation callback. + /// A value validation callback. /// A value coercion callback. - /// - /// A method that gets called before and after the property starts being notified on an - /// object; the bool argument will be true before and false afterwards. This callback is - /// intended to support IsDataContextChanging. - /// /// A public static StyledProperty Register( string name, @@ -239,8 +234,40 @@ namespace Avalonia bool inherits = false, BindingMode defaultBindingMode = BindingMode.OneWay, Func? validate = null, - Func? coerce = null, - Action? notifying = null) + Func? coerce = null) + where TOwner : AvaloniaObject + { + _ = name ?? throw new ArgumentNullException(nameof(name)); + + var metadata = new StyledPropertyMetadata( + defaultValue, + defaultBindingMode: defaultBindingMode, + coerce: coerce); + + var result = new StyledProperty( + name, + typeof(TOwner), + metadata, + inherits, + validate); + AvaloniaPropertyRegistry.Instance.Register(typeof(TOwner), result); + return result; + } + + /// + /// + /// A method that gets called before and after the property starts being notified on an + /// object; the bool argument will be true before and false afterwards. This callback is + /// intended to support IsDataContextChanging. + /// + internal static StyledProperty Register( + string name, + TValue defaultValue, + bool inherits, + BindingMode defaultBindingMode, + Func? validate, + Func? coerce, + Action? notifying) where TOwner : AvaloniaObject { _ = name ?? throw new ArgumentNullException(nameof(name)); diff --git a/src/Avalonia.Base/StyledElement.cs b/src/Avalonia.Base/StyledElement.cs index 5bf022cd51..2cdb973174 100644 --- a/src/Avalonia.Base/StyledElement.cs +++ b/src/Avalonia.Base/StyledElement.cs @@ -41,7 +41,11 @@ namespace Avalonia public static readonly StyledProperty DataContextProperty = AvaloniaProperty.Register( nameof(DataContext), + defaultValue: null, inherits: true, + defaultBindingMode: BindingMode.OneWay, + validate: null, + coerce: null, notifying: DataContextNotifying); /// diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs index 5733159a23..811d6ba576 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs @@ -188,7 +188,12 @@ namespace Avalonia.Base.UnitTests private class Class1 : AvaloniaObject { public static readonly StyledProperty FooProperty = - AvaloniaProperty.Register("Foo", "default", notifying: FooNotifying); + AvaloniaProperty.Register("Foo", "default", + inherits: true, + defaultBindingMode: BindingMode.OneWay, + validate: null, + coerce: null, + notifying: FooNotifying); public int NotifyCount { get; private set; } From 842556177df4f4ef3f664f3b85892a5fd28e5e6d Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 23:05:11 -0500 Subject: [PATCH 08/14] Windows specific cleanups --- .../Avalonia.Direct2D1.csproj | 6 +--- .../Avalonia.Direct2D1/Direct2D1Platform.cs | 2 +- src/Windows/Avalonia.Direct2D1/Disposable.cs | 33 ------------------- .../Avalonia.Direct2D1/ILayerFactory.cs | 2 +- .../Avalonia.Direct2D1/Media/BrushImpl.cs | 4 +-- .../Media/DWriteResourceFontFileEnumerator.cs | 4 +-- .../Media/DWriteResourceFontFileStream.cs | 2 +- .../Media/DrawingContextImpl.cs | 4 +-- .../Avalonia.Direct2D1/Media/GeometryImpl.cs | 4 +-- .../Media/GlyphTypefaceImpl.cs | 4 +-- .../Media/ImageBrushImpl.cs | 4 +-- .../Media/Imaging/BitmapImpl.cs | 4 +-- .../Media/Imaging/D2DBitmapImpl.cs | 4 +-- .../Imaging/D2DRenderTargetBitmapImpl.cs | 4 +-- .../Media/Imaging/WicBitmapImpl.cs | 4 +-- .../Imaging/WicRenderTargetBitmapImpl.cs | 4 +-- .../Media/Imaging/WriteableWicBitmapImpl.cs | 2 +- .../Media/LinearGradientBrushImpl.cs | 4 +-- .../Media/RadialGradientBrushImpl.cs | 4 +-- .../Media/SolidColorBrushImpl.cs | 4 +-- .../Media/StreamGeometryContextImpl.cs | 3 +- .../Media/StreamGeometryImpl.cs | 4 +-- .../Media/TransformedGeometryImpl.cs | 4 +-- .../Avalonia.Direct2D1/OptionalDispose.cs | 2 +- .../Avalonia.Direct2D1/PrimitiveExtensions.cs | 2 +- .../Avalonia.Direct2D1/RenderTarget.cs | 2 +- .../SwapChainRenderTarget.cs | 2 +- .../Avalonia.Win32/Avalonia.Win32.csproj | 1 + .../Avalonia.Win32/DirectX/DirectXStructs.cs | 2 +- .../Avalonia.Win32/DirectX/DxgiConnection.cs | 2 +- .../DirectX/DxgiRenderTarget.cs | 2 +- .../DirectX/DxgiSwapchainWindow.cs | 2 +- .../Avalonia.Win32/PlatformConstants.cs | 4 +-- src/Windows/Avalonia.Win32/ScreenImpl.cs | 3 +- src/Windows/Avalonia.Win32/TrayIconImpl.cs | 3 +- src/Windows/Avalonia.Win32/Win32Platform.cs | 2 +- src/Windows/Avalonia.Win32/WinRT/IBlurHost.cs | 2 +- .../Avalonia.Win32/WinRT/WinRTColor.cs | 2 +- src/Windows/Avalonia.Win32/WinScreen.cs | 2 +- .../Avalonia.Win32/WindowImpl.AppWndProc.cs | 2 +- .../WindowImpl.CustomCaptionProc.cs | 2 +- .../Avalonia.Win32/WindowImpl.WndProc.cs | 2 +- src/Windows/Avalonia.Win32/WindowImpl.cs | 3 +- .../WindowsMountedVolumeInfoProvider.cs | 2 +- 44 files changed, 45 insertions(+), 115 deletions(-) delete mode 100644 src/Windows/Avalonia.Direct2D1/Disposable.cs diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index 32bcdba758..3c2d7b3322 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -5,11 +5,6 @@ Avalonia.Direct2D1 true - - - UnmanagedMethods.cs - - @@ -22,6 +17,7 @@ + diff --git a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs index 99c01dd111..57379d1878 100644 --- a/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs +++ b/src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs @@ -27,7 +27,7 @@ namespace Avalonia namespace Avalonia.Direct2D1 { - public class Direct2D1Platform : IPlatformRenderInterface + internal class Direct2D1Platform : IPlatformRenderInterface { private static readonly Direct2D1Platform s_instance = new Direct2D1Platform(); diff --git a/src/Windows/Avalonia.Direct2D1/Disposable.cs b/src/Windows/Avalonia.Direct2D1/Disposable.cs deleted file mode 100644 index 63dfeb2e0b..0000000000 --- a/src/Windows/Avalonia.Direct2D1/Disposable.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; - -namespace Avalonia.Direct2D1 -{ - public class Disposable : IDisposable where T : IDisposable - { - private readonly IDisposable _extra; - - public Disposable(T inner) - { - Inner = inner; - } - - public Disposable(T inner, IDisposable extra) - { - Inner = inner; - _extra = extra; - } - - public T Inner { get; } - - public static implicit operator T(Disposable i) - { - return i.Inner; - } - - public void Dispose() - { - Inner.Dispose(); - _extra?.Dispose(); - } - } -} diff --git a/src/Windows/Avalonia.Direct2D1/ILayerFactory.cs b/src/Windows/Avalonia.Direct2D1/ILayerFactory.cs index a15bc0056a..504f4981f7 100644 --- a/src/Windows/Avalonia.Direct2D1/ILayerFactory.cs +++ b/src/Windows/Avalonia.Direct2D1/ILayerFactory.cs @@ -2,7 +2,7 @@ namespace Avalonia.Direct2D1 { - public interface ILayerFactory + internal interface ILayerFactory { IDrawingContextLayerImpl CreateLayer(Size size); } diff --git a/src/Windows/Avalonia.Direct2D1/Media/BrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/BrushImpl.cs index 602ea9b568..9fac86e0d2 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/BrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/BrushImpl.cs @@ -1,10 +1,8 @@ using System; -using Avalonia.Metadata; namespace Avalonia.Direct2D1.Media { - [Unstable] - public abstract class BrushImpl : IDisposable + internal abstract class BrushImpl : IDisposable { public SharpDX.Direct2D1.Brush PlatformBrush { get; set; } diff --git a/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileEnumerator.cs b/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileEnumerator.cs index c144e12aea..42cc969b66 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileEnumerator.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileEnumerator.cs @@ -6,7 +6,7 @@ namespace Avalonia.Direct2D1.Media /// /// Resource FontFileEnumerator. /// - public class DWriteResourceFontFileEnumerator : CallbackBase, FontFileEnumerator + internal class DWriteResourceFontFileEnumerator : CallbackBase, FontFileEnumerator { private readonly Factory _factory; private readonly FontFileLoader _loader; @@ -64,4 +64,4 @@ namespace Avalonia.Direct2D1.Media } } } -} \ No newline at end of file +} diff --git a/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileStream.cs b/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileStream.cs index 1802ef4d21..bd2e9ab8c3 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileStream.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DWriteResourceFontFileStream.cs @@ -7,7 +7,7 @@ namespace Avalonia.Direct2D1.Media /// /// This FontFileStream implementation is reading data from a . /// - public class DWriteResourceFontFileStream : CallbackBase, FontFileStream + internal class DWriteResourceFontFileStream : CallbackBase, FontFileStream { private readonly DataStream _stream; diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index d5d6cd8c29..3506abc63b 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -11,15 +11,13 @@ using SharpDX; using SharpDX.Direct2D1; using SharpDX.Mathematics.Interop; using BitmapInterpolationMode = Avalonia.Media.Imaging.BitmapInterpolationMode; -using Avalonia.Metadata; namespace Avalonia.Direct2D1.Media { /// /// Draws using Direct2D1. /// - [Unstable] - public class DrawingContextImpl : IDrawingContextImpl + internal class DrawingContextImpl : IDrawingContextImpl { private readonly IVisualBrushRenderer _visualBrushRenderer; private readonly ILayerFactory _layerFactory; diff --git a/src/Windows/Avalonia.Direct2D1/Media/GeometryImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/GeometryImpl.cs index c84c14daac..9a93d1afd3 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/GeometryImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/GeometryImpl.cs @@ -1,5 +1,4 @@ using Avalonia.Logging; -using Avalonia.Metadata; using Avalonia.Platform; using SharpDX.Direct2D1; @@ -8,8 +7,7 @@ namespace Avalonia.Direct2D1.Media /// /// The platform-specific interface for . /// - [Unstable] - public abstract class GeometryImpl : IGeometryImpl + internal abstract class GeometryImpl : IGeometryImpl { private const float ContourApproximation = 0.0001f; diff --git a/src/Windows/Avalonia.Direct2D1/Media/GlyphTypefaceImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/GlyphTypefaceImpl.cs index 705c715455..e4988322e7 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/GlyphTypefaceImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/GlyphTypefaceImpl.cs @@ -1,6 +1,5 @@ using System; using Avalonia.Media; -using Avalonia.Metadata; using HarfBuzzSharp; using SharpDX.DirectWrite; using FontMetrics = Avalonia.Media.FontMetrics; @@ -9,8 +8,7 @@ using GlyphMetrics = Avalonia.Media.GlyphMetrics; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class GlyphTypefaceImpl : IGlyphTypeface + internal class GlyphTypefaceImpl : IGlyphTypeface { private bool _isDisposed; diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs index 17dc359ed7..829b887d9d 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs @@ -1,13 +1,11 @@ using Avalonia.Media; -using Avalonia.Metadata; using Avalonia.Rendering.Utilities; using Avalonia.Utilities; using SharpDX.Direct2D1; namespace Avalonia.Direct2D1.Media { - [Unstable] - public sealed class ImageBrushImpl : BrushImpl + internal sealed class ImageBrushImpl : BrushImpl { private readonly OptionalDispose _bitmap; diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs index 059105c112..740efe833f 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/BitmapImpl.cs @@ -1,13 +1,11 @@ using System; using System.IO; -using Avalonia.Metadata; using Avalonia.Platform; using D2DBitmap = SharpDX.Direct2D1.Bitmap; namespace Avalonia.Direct2D1.Media { - [Unstable] - public abstract class BitmapImpl : IBitmapImpl, IDisposable + internal abstract class BitmapImpl : IBitmapImpl, IDisposable { public abstract Vector Dpi { get; } public abstract PixelSize PixelSize { get; } diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs index a321b225a0..940d4673b5 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DBitmapImpl.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using Avalonia.Metadata; using SharpDX.WIC; using Bitmap = SharpDX.Direct2D1.Bitmap; @@ -9,8 +8,7 @@ namespace Avalonia.Direct2D1.Media /// /// A Direct2D Bitmap implementation that uses a GPU memory bitmap as its image. /// - [Unstable] - public class D2DBitmapImpl : BitmapImpl + internal class D2DBitmapImpl : BitmapImpl { private readonly Bitmap _direct2DBitmap; diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs index 84f11acdd7..2dbc1d67d1 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using Avalonia.Metadata; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Utilities; @@ -10,8 +9,7 @@ using D2DBitmap = SharpDX.Direct2D1.Bitmap; namespace Avalonia.Direct2D1.Media.Imaging { - [Unstable] - public class D2DRenderTargetBitmapImpl : D2DBitmapImpl, IDrawingContextLayerImpl, ILayerFactory + internal class D2DRenderTargetBitmapImpl : D2DBitmapImpl, IDrawingContextLayerImpl, ILayerFactory { private readonly BitmapRenderTarget _renderTarget; diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs index 72a48aca0c..533a29f68c 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicBitmapImpl.cs @@ -6,7 +6,6 @@ using SharpDX.WIC; using APixelFormat = Avalonia.Platform.PixelFormat; using AlphaFormat = Avalonia.Platform.AlphaFormat; using D2DBitmap = SharpDX.Direct2D1.Bitmap; -using Avalonia.Metadata; using Avalonia.Platform; using PixelFormat = SharpDX.WIC.PixelFormat; @@ -15,8 +14,7 @@ namespace Avalonia.Direct2D1.Media /// /// A WIC implementation of a . /// - [Unstable] - public class WicBitmapImpl : BitmapImpl, IReadableBitmapImpl + internal class WicBitmapImpl : BitmapImpl, IReadableBitmapImpl { private readonly BitmapDecoder _decoder; diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicRenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicRenderTargetBitmapImpl.cs index 9f0d48dbc7..d6b1e618e5 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicRenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WicRenderTargetBitmapImpl.cs @@ -1,13 +1,11 @@ using System; -using Avalonia.Metadata; using Avalonia.Platform; using Avalonia.Rendering; using SharpDX.Direct2D1; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class WicRenderTargetBitmapImpl : WicBitmapImpl, IDrawingContextLayerImpl + internal class WicRenderTargetBitmapImpl : WicBitmapImpl, IDrawingContextLayerImpl { private readonly WicRenderTarget _renderTarget; diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WriteableWicBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WriteableWicBitmapImpl.cs index 5f4c033cf7..0bdf901613 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/WriteableWicBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/WriteableWicBitmapImpl.cs @@ -6,7 +6,7 @@ using PixelFormat = Avalonia.Platform.PixelFormat; namespace Avalonia.Direct2D1.Media.Imaging { - class WriteableWicBitmapImpl : WicBitmapImpl, IWriteableBitmapImpl + internal class WriteableWicBitmapImpl : WicBitmapImpl, IWriteableBitmapImpl { public WriteableWicBitmapImpl(Stream stream, int decodeSize, bool horizontal, Avalonia.Media.Imaging.BitmapInterpolationMode interpolationMode) diff --git a/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs index 5dfe683f59..5de988c30e 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/LinearGradientBrushImpl.cs @@ -1,11 +1,9 @@ using System.Linq; using Avalonia.Media; -using Avalonia.Metadata; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class LinearGradientBrushImpl : BrushImpl + internal class LinearGradientBrushImpl : BrushImpl { public LinearGradientBrushImpl( ILinearGradientBrush brush, diff --git a/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs index 0069e47001..bbb34651c5 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/RadialGradientBrushImpl.cs @@ -1,11 +1,9 @@ using System.Linq; using Avalonia.Media; -using Avalonia.Metadata; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class RadialGradientBrushImpl : BrushImpl + internal class RadialGradientBrushImpl : BrushImpl { public RadialGradientBrushImpl( IRadialGradientBrush brush, diff --git a/src/Windows/Avalonia.Direct2D1/Media/SolidColorBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/SolidColorBrushImpl.cs index b85494e2c1..bf974798a2 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/SolidColorBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/SolidColorBrushImpl.cs @@ -1,10 +1,8 @@ using Avalonia.Media; -using Avalonia.Metadata; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class SolidColorBrushImpl : BrushImpl + internal class SolidColorBrushImpl : BrushImpl { public SolidColorBrushImpl(ISolidColorBrush brush, SharpDX.Direct2D1.RenderTarget target) { diff --git a/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryContextImpl.cs index ec8f82556d..5ffe331ca2 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryContextImpl.cs @@ -9,8 +9,7 @@ using SweepDirection = SharpDX.Direct2D1.SweepDirection; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class StreamGeometryContextImpl : IStreamGeometryContextImpl + internal class StreamGeometryContextImpl : IStreamGeometryContextImpl { private readonly GeometrySink _sink; diff --git a/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryImpl.cs index e1677c0ed1..684460916e 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/StreamGeometryImpl.cs @@ -1,4 +1,3 @@ -using Avalonia.Metadata; using Avalonia.Platform; using SharpDX.Direct2D1; @@ -7,8 +6,7 @@ namespace Avalonia.Direct2D1.Media /// /// A Direct2D implementation of a . /// - [Unstable] - public class StreamGeometryImpl : GeometryImpl, IStreamGeometryImpl + internal class StreamGeometryImpl : GeometryImpl, IStreamGeometryImpl { /// /// Initializes a new instance of the class. diff --git a/src/Windows/Avalonia.Direct2D1/Media/TransformedGeometryImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/TransformedGeometryImpl.cs index 3ecdb49e46..64aaea6f0a 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/TransformedGeometryImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/TransformedGeometryImpl.cs @@ -1,11 +1,9 @@ -using Avalonia.Metadata; using Avalonia.Platform; using SharpDX.Direct2D1; namespace Avalonia.Direct2D1.Media { - [Unstable] - public class TransformedGeometryImpl : GeometryImpl, ITransformedGeometryImpl + internal class TransformedGeometryImpl : GeometryImpl, ITransformedGeometryImpl { /// /// Initializes a new instance of the class. diff --git a/src/Windows/Avalonia.Direct2D1/OptionalDispose.cs b/src/Windows/Avalonia.Direct2D1/OptionalDispose.cs index 1cdf7661df..d526da2b5d 100644 --- a/src/Windows/Avalonia.Direct2D1/OptionalDispose.cs +++ b/src/Windows/Avalonia.Direct2D1/OptionalDispose.cs @@ -2,7 +2,7 @@ namespace Avalonia.Direct2D1 { - public readonly record struct OptionalDispose : IDisposable where T : IDisposable + internal readonly record struct OptionalDispose : IDisposable where T : IDisposable { private readonly bool _dispose; diff --git a/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs b/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs index 669e139d8f..d042d56160 100644 --- a/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs +++ b/src/Windows/Avalonia.Direct2D1/PrimitiveExtensions.cs @@ -8,7 +8,7 @@ using DWrite = SharpDX.DirectWrite; namespace Avalonia.Direct2D1 { - public static class PrimitiveExtensions + internal static class PrimitiveExtensions { /// /// The value for which all absolute numbers smaller than are considered equal to zero. diff --git a/src/Windows/Avalonia.Direct2D1/RenderTarget.cs b/src/Windows/Avalonia.Direct2D1/RenderTarget.cs index 1a749c1a7f..8d5062336c 100644 --- a/src/Windows/Avalonia.Direct2D1/RenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/RenderTarget.cs @@ -5,7 +5,7 @@ using Avalonia.Rendering; namespace Avalonia.Direct2D1 { - public class RenderTarget : IRenderTarget, ILayerFactory + internal class RenderTarget : IRenderTarget, ILayerFactory { /// /// The render target. diff --git a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs index 4935e3db48..531c4119af 100644 --- a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs @@ -8,7 +8,7 @@ using SharpDX.DXGI; namespace Avalonia.Direct2D1 { - public abstract class SwapChainRenderTarget : IRenderTarget, ILayerFactory + internal abstract class SwapChainRenderTarget : IRenderTarget, ILayerFactory { private Size2 _savedSize; private Size2F _savedDpi; diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index 754e883c2f..92ebbd57b8 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -29,5 +29,6 @@ + diff --git a/src/Windows/Avalonia.Win32/DirectX/DirectXStructs.cs b/src/Windows/Avalonia.Win32/DirectX/DirectXStructs.cs index e59eb98c6c..af8168d564 100644 --- a/src/Windows/Avalonia.Win32/DirectX/DirectXStructs.cs +++ b/src/Windows/Avalonia.Win32/DirectX/DirectXStructs.cs @@ -5,7 +5,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32.DirectX { - public unsafe struct HANDLE + internal unsafe struct HANDLE { public readonly void* Value; diff --git a/src/Windows/Avalonia.Win32/DirectX/DxgiConnection.cs b/src/Windows/Avalonia.Win32/DirectX/DxgiConnection.cs index 26696ef903..07fb3169cb 100644 --- a/src/Windows/Avalonia.Win32/DirectX/DxgiConnection.cs +++ b/src/Windows/Avalonia.Win32/DirectX/DxgiConnection.cs @@ -9,7 +9,7 @@ using MicroCom.Runtime; namespace Avalonia.Win32.DirectX { - public unsafe class DxgiConnection : IRenderTimer + internal unsafe class DxgiConnection : IRenderTimer { public const uint ENUM_CURRENT_SETTINGS = unchecked((uint)(-1)); diff --git a/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs b/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs index 065386b401..513aba4f20 100644 --- a/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs +++ b/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs @@ -7,7 +7,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32.DirectX { - public unsafe class DxgiRenderTarget : EglPlatformSurfaceRenderTargetBase + internal unsafe class DxgiRenderTarget : EglPlatformSurfaceRenderTargetBase { // DXGI_FORMAT_B8G8R8A8_UNORM is target texture format as per ANGLE documentation diff --git a/src/Windows/Avalonia.Win32/DirectX/DxgiSwapchainWindow.cs b/src/Windows/Avalonia.Win32/DirectX/DxgiSwapchainWindow.cs index 88226c5c89..a4c6598473 100644 --- a/src/Windows/Avalonia.Win32/DirectX/DxgiSwapchainWindow.cs +++ b/src/Windows/Avalonia.Win32/DirectX/DxgiSwapchainWindow.cs @@ -9,7 +9,7 @@ using Avalonia.OpenGL.Surfaces; namespace Avalonia.Win32.DirectX { - public class DxgiSwapchainWindow : EglGlPlatformSurfaceBase + internal class DxgiSwapchainWindow : EglGlPlatformSurfaceBase { private DxgiConnection _connection; private EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _window; diff --git a/src/Windows/Avalonia.Win32/PlatformConstants.cs b/src/Windows/Avalonia.Win32/PlatformConstants.cs index 9dd4780637..48dd9f45da 100644 --- a/src/Windows/Avalonia.Win32/PlatformConstants.cs +++ b/src/Windows/Avalonia.Win32/PlatformConstants.cs @@ -7,7 +7,7 @@ namespace Avalonia.Win32 public const string WindowHandleType = "HWND"; public const string CursorHandleType = "HCURSOR"; - public static readonly Version Windows8 = new Version(6, 2); - public static readonly Version Windows7 = new Version(6, 1); + internal static readonly Version Windows8 = new Version(6, 2); + internal static readonly Version Windows7 = new Version(6, 1); } } diff --git a/src/Windows/Avalonia.Win32/ScreenImpl.cs b/src/Windows/Avalonia.Win32/ScreenImpl.cs index 69431c7ff6..6154dff307 100644 --- a/src/Windows/Avalonia.Win32/ScreenImpl.cs +++ b/src/Windows/Avalonia.Win32/ScreenImpl.cs @@ -7,8 +7,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32 { - [Unstable] - public class ScreenImpl : IScreenImpl + internal class ScreenImpl : IScreenImpl { private Screen[]? _allScreens; diff --git a/src/Windows/Avalonia.Win32/TrayIconImpl.cs b/src/Windows/Avalonia.Win32/TrayIconImpl.cs index 8a10c6d2e1..c19439c09e 100644 --- a/src/Windows/Avalonia.Win32/TrayIconImpl.cs +++ b/src/Windows/Avalonia.Win32/TrayIconImpl.cs @@ -13,8 +13,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32 { - [Unstable] - public class TrayIconImpl : ITrayIconImpl + internal class TrayIconImpl : ITrayIconImpl { private static readonly IntPtr s_emptyIcon = new System.Drawing.Bitmap(32, 32).GetHicon(); private readonly int _uniqueId; diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index 4b327ed02a..7a9f2bb814 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -107,7 +107,7 @@ namespace Avalonia namespace Avalonia.Win32 { - public class Win32Platform : IPlatformThreadingInterface, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl + internal class Win32Platform : IPlatformThreadingInterface, IWindowingPlatform, IPlatformIconLoader, IPlatformLifetimeEventsImpl { private static readonly Win32Platform s_instance = new(); private static Thread? s_uiThread; diff --git a/src/Windows/Avalonia.Win32/WinRT/IBlurHost.cs b/src/Windows/Avalonia.Win32/WinRT/IBlurHost.cs index 526be6e0f0..a3918d9ae6 100644 --- a/src/Windows/Avalonia.Win32/WinRT/IBlurHost.cs +++ b/src/Windows/Avalonia.Win32/WinRT/IBlurHost.cs @@ -1,6 +1,6 @@ namespace Avalonia.Win32.WinRT { - public enum BlurEffect + internal enum BlurEffect { None, Acrylic, diff --git a/src/Windows/Avalonia.Win32/WinRT/WinRTColor.cs b/src/Windows/Avalonia.Win32/WinRT/WinRTColor.cs index 90b2022054..67769b7533 100644 --- a/src/Windows/Avalonia.Win32/WinRT/WinRTColor.cs +++ b/src/Windows/Avalonia.Win32/WinRT/WinRTColor.cs @@ -4,7 +4,7 @@ using Avalonia.Media; namespace Avalonia.Win32.WinRT { [StructLayout(LayoutKind.Sequential, Pack = 1)] - public record struct WinRTColor + internal record struct WinRTColor { public byte A; public byte R; diff --git a/src/Windows/Avalonia.Win32/WinScreen.cs b/src/Windows/Avalonia.Win32/WinScreen.cs index 69d334cbcc..10e0b3b8b1 100644 --- a/src/Windows/Avalonia.Win32/WinScreen.cs +++ b/src/Windows/Avalonia.Win32/WinScreen.cs @@ -3,7 +3,7 @@ using Avalonia.Platform; namespace Avalonia.Win32 { - public class WinScreen : Screen + internal class WinScreen : Screen { private readonly IntPtr _hMonitor; diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index ed80f88b53..d169ccfc1e 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -15,7 +15,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32 { - public partial class WindowImpl + internal partial class WindowImpl { [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")] diff --git a/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs index 20ab738a2a..4a4565a443 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.CustomCaptionProc.cs @@ -5,7 +5,7 @@ using static Avalonia.Win32.Interop.UnmanagedMethods; namespace Avalonia.Win32 { - public partial class WindowImpl + internal partial class WindowImpl { // Hit test the frame for resizing and moving. private HitTestValues HitTestNCA(IntPtr hWnd, IntPtr wParam, IntPtr lParam) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs index 49197a83e8..e92272c079 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs @@ -6,7 +6,7 @@ using Avalonia.Controls.Platform; namespace Avalonia.Win32 { - public partial class WindowImpl + internal partial class WindowImpl { protected virtual unsafe IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 812c72fd3c..14344f34cf 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -30,8 +30,7 @@ namespace Avalonia.Win32 /// /// Window implementation for Win32 platform. /// - [Unstable] - public partial class WindowImpl : IWindowImpl, EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo + internal partial class WindowImpl : IWindowImpl, EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo { private static readonly List s_instances = new(); diff --git a/src/Windows/Avalonia.Win32/WindowsMountedVolumeInfoProvider.cs b/src/Windows/Avalonia.Win32/WindowsMountedVolumeInfoProvider.cs index 4f4e0b9293..0731097804 100644 --- a/src/Windows/Avalonia.Win32/WindowsMountedVolumeInfoProvider.cs +++ b/src/Windows/Avalonia.Win32/WindowsMountedVolumeInfoProvider.cs @@ -4,7 +4,7 @@ using Avalonia.Controls.Platform; namespace Avalonia.Win32 { - public class WindowsMountedVolumeInfoProvider : IMountedVolumeInfoProvider + internal class WindowsMountedVolumeInfoProvider : IMountedVolumeInfoProvider { public IDisposable Listen(ObservableCollection mountedDrives) { From 8a322d616f2ca1f9f4de4d1afce00146a3d97c75 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 23:05:19 -0500 Subject: [PATCH 09/14] Cleanup Skia internal APIs --- src/Skia/Avalonia.Skia/GlyphRunImpl.cs | 5 +---- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 4 +--- .../Avalonia.Skia/SKTypefaceCollection.cs | 2 +- .../SKTypefaceCollectionCache.cs | 2 +- src/Skia/Avalonia.Skia/readme.md | 22 ------------------- 5 files changed, 4 insertions(+), 31 deletions(-) delete mode 100644 src/Skia/Avalonia.Skia/readme.md diff --git a/src/Skia/Avalonia.Skia/GlyphRunImpl.cs b/src/Skia/Avalonia.Skia/GlyphRunImpl.cs index cc669f9aaa..cfd6fc12f8 100644 --- a/src/Skia/Avalonia.Skia/GlyphRunImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphRunImpl.cs @@ -1,15 +1,12 @@ using System; using System.Collections.Generic; -using Avalonia.Metadata; using Avalonia.Platform; using SkiaSharp; #nullable enable namespace Avalonia.Skia { - /// - [Unstable] - public class GlyphRunImpl : IGlyphRunImpl + internal class GlyphRunImpl : IGlyphRunImpl { public GlyphRunImpl(SKTextBlob textBlob, Size size, Point baselineOrigin) { diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index 71bdc1bd6b..a8dd289a13 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -1,14 +1,12 @@ using System; using System.Runtime.InteropServices; using Avalonia.Media; -using Avalonia.Metadata; using HarfBuzzSharp; using SkiaSharp; namespace Avalonia.Skia { - [Unstable] - public class GlyphTypefaceImpl : IGlyphTypeface + internal class GlyphTypefaceImpl : IGlyphTypeface { private bool _isDisposed; diff --git a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs index 1f3f20730f..73f58e66bc 100644 --- a/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs +++ b/src/Skia/Avalonia.Skia/SKTypefaceCollection.cs @@ -4,7 +4,7 @@ using SkiaSharp; namespace Avalonia.Skia { - public class SKTypefaceCollection + internal class SKTypefaceCollection { private readonly ConcurrentDictionary _typefaces = new ConcurrentDictionary(); diff --git a/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs b/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs index f7a86c11ff..b49efd59cd 100644 --- a/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs +++ b/src/Skia/Avalonia.Skia/SKTypefaceCollectionCache.cs @@ -7,7 +7,7 @@ using SkiaSharp; namespace Avalonia.Skia { - public static class SKTypefaceCollectionCache + internal static class SKTypefaceCollectionCache { private static readonly ConcurrentDictionary s_cachedCollections; diff --git a/src/Skia/Avalonia.Skia/readme.md b/src/Skia/Avalonia.Skia/readme.md deleted file mode 100644 index 7ed92c5453..0000000000 --- a/src/Skia/Avalonia.Skia/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -DrawingContextImpl -- Alpha support missing as SkiaSharp does not expose this -- Gradient Shader caching? -- Pen Dash styles - -Formatted Text Rendering -- Minor polish - -Linux -- Need gpu platform implementation - -macOS -- Need gpu platform implementation - -Android -- Not tested at all yet - -iOS -- Not tested at all yet - -General -- Get Skia Unit Tests passing (most of the issues are related to antialiasing) \ No newline at end of file From f91361a24c59729fa5bdda5d491368cdfd25843b Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 23:05:30 -0500 Subject: [PATCH 10/14] Cleanup linux related APIs --- src/Avalonia.FreeDesktop/DBusHelper.cs | 2 +- .../DBusIme/X11DBusImeHelper.cs | 2 +- src/Avalonia.FreeDesktop/DBusMenuExporter.cs | 2 +- src/Avalonia.FreeDesktop/IX11InputMethod.cs | 6 +-- .../LinuxMountedVolumeInfoProvider.cs | 2 +- src/Avalonia.X11/Glx/Glx.cs | 2 +- src/Avalonia.X11/Glx/GlxConsts.cs | 2 +- src/Avalonia.X11/Glx/GlxContext.cs | 6 +-- src/Avalonia.X11/Glx/GlxDisplay.cs | 8 +-- src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs | 8 +-- src/Avalonia.X11/Glx/GlxPlatformFeature.cs | 2 +- src/Avalonia.X11/Keysyms.cs | 2 +- src/Avalonia.X11/NativeDialogs/Gtk.cs | 29 +++++----- src/Avalonia.X11/TransparencyHelper.cs | 2 +- src/Avalonia.X11/X11Clipboard.cs | 16 +++--- src/Avalonia.X11/X11CursorFactory.cs | 4 +- src/Avalonia.X11/X11Enums.cs | 8 +-- src/Avalonia.X11/X11Exception.cs | 2 +- src/Avalonia.X11/X11Framebuffer.cs | 2 +- src/Avalonia.X11/X11FramebufferSurface.cs | 2 +- src/Avalonia.X11/X11Globals.cs | 12 ++--- src/Avalonia.X11/X11IconLoader.cs | 8 +-- src/Avalonia.X11/X11Info.cs | 2 +- src/Avalonia.X11/X11KeyTransform.cs | 2 +- src/Avalonia.X11/X11NativeControlHost.cs | 10 ++-- src/Avalonia.X11/X11Platform.cs | 8 +-- src/Avalonia.X11/X11PlatformThreading.cs | 32 +++++------ src/Avalonia.X11/X11Screens.cs | 20 +++---- src/Avalonia.X11/X11Structs.cs | 9 ++-- src/Avalonia.X11/X11Window.Ime.cs | 32 +++++------ src/Avalonia.X11/X11Window.Xim.cs | 4 +- src/Avalonia.X11/X11Window.cs | 46 ++++++++-------- src/Avalonia.X11/XError.cs | 5 +- src/Avalonia.X11/XI2Manager.cs | 16 +++--- src/Avalonia.X11/XIStructs.cs | 54 +++++++++---------- src/Avalonia.X11/XLib.cs | 10 ++-- src/Shared/RawEventGrouping.cs | 4 +- 37 files changed, 191 insertions(+), 192 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusHelper.cs b/src/Avalonia.FreeDesktop/DBusHelper.cs index ef99838208..fac77521dc 100644 --- a/src/Avalonia.FreeDesktop/DBusHelper.cs +++ b/src/Avalonia.FreeDesktop/DBusHelper.cs @@ -6,7 +6,7 @@ using Tmds.DBus; namespace Avalonia.FreeDesktop { - public static class DBusHelper + internal static class DBusHelper { /// /// This class uses synchronous execution at DBus connection establishment stage diff --git a/src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs b/src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs index 86978c8b60..d8874b6fae 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/X11DBusImeHelper.cs @@ -6,7 +6,7 @@ using Tmds.DBus; namespace Avalonia.FreeDesktop.DBusIme { - public class X11DBusImeHelper + internal class X11DBusImeHelper { private static readonly Dictionary> KnownMethods = new Dictionary> diff --git a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs index 0e6bee5f24..cfbafc53e5 100644 --- a/src/Avalonia.FreeDesktop/DBusMenuExporter.cs +++ b/src/Avalonia.FreeDesktop/DBusMenuExporter.cs @@ -15,7 +15,7 @@ using Tmds.DBus; namespace Avalonia.FreeDesktop { - public class DBusMenuExporter + internal class DBusMenuExporter { public static ITopLevelNativeMenuExporter? TryCreateTopLevelNativeMenu(IntPtr xid) { diff --git a/src/Avalonia.FreeDesktop/IX11InputMethod.cs b/src/Avalonia.FreeDesktop/IX11InputMethod.cs index 9fa9c1809e..7274b58876 100644 --- a/src/Avalonia.FreeDesktop/IX11InputMethod.cs +++ b/src/Avalonia.FreeDesktop/IX11InputMethod.cs @@ -6,13 +6,13 @@ using Avalonia.Input.TextInput; namespace Avalonia.FreeDesktop { - public interface IX11InputMethodFactory + internal interface IX11InputMethodFactory { (ITextInputMethodImpl method, IX11InputMethodControl control) CreateClient(IntPtr xid); } #pragma warning disable CA1815 // Override equals and operator equals on value types - public struct X11InputMethodForwardedKey + internal struct X11InputMethodForwardedKey #pragma warning restore CA1815 // Override equals and operator equals on value types { public int KeyVal { get; set; } @@ -20,7 +20,7 @@ namespace Avalonia.FreeDesktop public RawKeyEventType Type { get; set; } } - public interface IX11InputMethodControl : IDisposable + internal interface IX11InputMethodControl : IDisposable { void SetWindowActive(bool active); bool IsEnabled { get; } diff --git a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoProvider.cs b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoProvider.cs index 4624a9c340..4aa6bed329 100644 --- a/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoProvider.cs +++ b/src/Avalonia.FreeDesktop/LinuxMountedVolumeInfoProvider.cs @@ -5,7 +5,7 @@ using Avalonia.Controls.Platform; namespace Avalonia.FreeDesktop { - public class LinuxMountedVolumeInfoProvider : IMountedVolumeInfoProvider + internal class LinuxMountedVolumeInfoProvider : IMountedVolumeInfoProvider { public IDisposable Listen(ObservableCollection mountedDrives) { diff --git a/src/Avalonia.X11/Glx/Glx.cs b/src/Avalonia.X11/Glx/Glx.cs index 1a26d7d5f5..fceea3718c 100644 --- a/src/Avalonia.X11/Glx/Glx.cs +++ b/src/Avalonia.X11/Glx/Glx.cs @@ -10,7 +10,7 @@ using Avalonia.SourceGenerator; namespace Avalonia.X11.Glx { - unsafe partial class GlxInterface + internal unsafe partial class GlxInterface { private const string libGL = "libGL.so.1"; [GetProcAddress("glXMakeContextCurrent")] diff --git a/src/Avalonia.X11/Glx/GlxConsts.cs b/src/Avalonia.X11/Glx/GlxConsts.cs index 9d153a6ade..0d1383420d 100644 --- a/src/Avalonia.X11/Glx/GlxConsts.cs +++ b/src/Avalonia.X11/Glx/GlxConsts.cs @@ -4,7 +4,7 @@ #pragma warning disable 414 namespace Avalonia.X11.Glx { - class GlxConsts + internal class GlxConsts { public const int GLX_USE_GL = 1; public const int GLX_BUFFER_SIZE = 2; diff --git a/src/Avalonia.X11/Glx/GlxContext.cs b/src/Avalonia.X11/Glx/GlxContext.cs index 572e4a6077..b1cb330b00 100644 --- a/src/Avalonia.X11/Glx/GlxContext.cs +++ b/src/Avalonia.X11/Glx/GlxContext.cs @@ -7,7 +7,7 @@ using Avalonia.Reactive; namespace Avalonia.X11.Glx { - class GlxContext : IGlContext + internal class GlxContext : IGlContext { public IntPtr Handle { get; } public GlxInterface Glx { get; } @@ -46,8 +46,8 @@ namespace Avalonia.X11.Glx public GlInterface GlInterface { get; } public int SampleCount { get; } public int StencilSize { get; } - - class RestoreContext : IDisposable + + private class RestoreContext : IDisposable { private GlxInterface _glx; private IntPtr _defaultDisplay; diff --git a/src/Avalonia.X11/Glx/GlxDisplay.cs b/src/Avalonia.X11/Glx/GlxDisplay.cs index 9b8a8f0b5b..7749749eaa 100644 --- a/src/Avalonia.X11/Glx/GlxDisplay.cs +++ b/src/Avalonia.X11/Glx/GlxDisplay.cs @@ -6,7 +6,7 @@ using static Avalonia.X11.Glx.GlxConsts; namespace Avalonia.X11.Glx { - unsafe class GlxDisplay + internal unsafe class GlxDisplay { private readonly X11Info _x11; private readonly GlVersion[] _probeProfiles; @@ -106,7 +106,7 @@ namespace Avalonia.X11.Glx } } - IntPtr CreatePBuffer() + private IntPtr CreatePBuffer() { return Glx.CreatePbuffer(_x11.Display, _fbconfig, new[] { GLX_PBUFFER_WIDTH, 1, GLX_PBUFFER_HEIGHT, 1, 0 }); } @@ -116,8 +116,8 @@ namespace Avalonia.X11.Glx public GlxContext CreateContext(IGlContext share) => CreateContext(CreatePBuffer(), share, share.SampleCount, share.StencilSize, true); - - GlxContext CreateContext(IntPtr defaultXid, IGlContext share, + + private GlxContext CreateContext(IntPtr defaultXid, IGlContext share, int sampleCount, int stencilSize, bool ownsPBuffer) { var sharelist = ((GlxContext)share)?.Handle ?? IntPtr.Zero; diff --git a/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs b/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs index ebb1e18723..17c5909a39 100644 --- a/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs +++ b/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs @@ -6,7 +6,7 @@ using static Avalonia.OpenGL.GlConsts; namespace Avalonia.X11.Glx { - class GlxGlPlatformSurface: IGlPlatformSurface + internal class GlxGlPlatformSurface: IGlPlatformSurface { private readonly EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _info; @@ -21,7 +21,7 @@ namespace Avalonia.X11.Glx return new RenderTarget((GlxContext)context, _info); } - class RenderTarget : IGlPlatformSurfaceRenderTarget + private class RenderTarget : IGlPlatformSurfaceRenderTarget { private readonly GlxContext _context; private readonly EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _info; @@ -46,8 +46,8 @@ namespace Avalonia.X11.Glx return new Session(_context, _info, oldContext); } - - class Session : IGlPlatformSurfaceRenderingSession + + private class Session : IGlPlatformSurfaceRenderingSession { private readonly GlxContext _context; private readonly EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _info; diff --git a/src/Avalonia.X11/Glx/GlxPlatformFeature.cs b/src/Avalonia.X11/Glx/GlxPlatformFeature.cs index bc50fa61aa..06766e0963 100644 --- a/src/Avalonia.X11/Glx/GlxPlatformFeature.cs +++ b/src/Avalonia.X11/Glx/GlxPlatformFeature.cs @@ -6,7 +6,7 @@ using Avalonia.Platform; namespace Avalonia.X11.Glx { - class GlxPlatformGraphics : IPlatformGraphics + internal class GlxPlatformGraphics : IPlatformGraphics { public GlxDisplay Display { get; private set; } public bool CanCreateContexts => true; diff --git a/src/Avalonia.X11/Keysyms.cs b/src/Avalonia.X11/Keysyms.cs index 651a06f574..970cf5ad4d 100644 --- a/src/Avalonia.X11/Keysyms.cs +++ b/src/Avalonia.X11/Keysyms.cs @@ -3,7 +3,7 @@ // ReSharper disable CommentTypo namespace Avalonia.X11 { - enum X11Key + internal enum X11Key { VoidSymbol = 0xffffff /* Void symbol */, BackSpace = 0xff08 /* Back space, back char */, diff --git a/src/Avalonia.X11/NativeDialogs/Gtk.cs b/src/Avalonia.X11/NativeDialogs/Gtk.cs index 4e56ae73cf..3f225dc6bc 100644 --- a/src/Avalonia.X11/NativeDialogs/Gtk.cs +++ b/src/Avalonia.X11/NativeDialogs/Gtk.cs @@ -7,8 +7,7 @@ using Avalonia.Platform.Interop; // ReSharper disable IdentifierTypo namespace Avalonia.X11.NativeDialogs { - - static unsafe class Glib + internal static unsafe class Glib { private const string GlibName = "libglib-2.0.so.0"; private const string GObjectName = "libgobject-2.0.so.0"; @@ -36,7 +35,7 @@ namespace Avalonia.X11.NativeDialogs IntPtr destroy); - class ConnectedSignal : IDisposable + private class ConnectedSignal : IDisposable { private readonly IntPtr _instance; private GCHandle _handle; @@ -75,7 +74,7 @@ namespace Avalonia.X11.NativeDialogs } - static bool TimeoutHandler(IntPtr data) + private static bool TimeoutHandler(IntPtr data) { var handle = GCHandle.FromIntPtr(data); var cb = (Func)handle.Target; @@ -95,7 +94,7 @@ namespace Avalonia.X11.NativeDialogs s_pinnedHandler = TimeoutHandler; } - static void AddTimeout(int priority, uint interval, Func callback) + private static void AddTimeout(int priority, uint interval, Func callback) { var handle = GCHandle.Alloc(callback); g_timeout_add_full(priority, interval, s_pinnedHandler, GCHandle.ToIntPtr(handle), IntPtr.Zero); @@ -123,13 +122,13 @@ namespace Avalonia.X11.NativeDialogs } [StructLayout(LayoutKind.Sequential)] - unsafe struct GSList + internal unsafe struct GSList { public readonly IntPtr Data; public readonly GSList* Next; } - enum GtkFileChooserAction + internal enum GtkFileChooserAction { Open, Save, @@ -137,7 +136,7 @@ namespace Avalonia.X11.NativeDialogs } // ReSharper disable UnusedMember.Global - enum GtkResponseType + internal enum GtkResponseType { Help = -11, Apply = -10, @@ -153,14 +152,14 @@ namespace Avalonia.X11.NativeDialogs } // ReSharper restore UnusedMember.Global - static unsafe class Gtk + internal static unsafe class Gtk { private static IntPtr s_display; private const string GdkName = "libgdk-3.so.0"; private const string GtkName = "libgtk-3.so.0"; [DllImport(GtkName)] - static extern void gtk_main_iteration(); + private static extern void gtk_main_iteration(); [DllImport(GtkName)] @@ -231,10 +230,10 @@ namespace Avalonia.X11.NativeDialogs public static extern void gtk_widget_hide(IntPtr gtkWidget); [DllImport(GtkName)] - static extern bool gtk_init_check(int argc, IntPtr argv); + private static extern bool gtk_init_check(int argc, IntPtr argv); [DllImport(GdkName)] - static extern IntPtr gdk_x11_window_foreign_new_for_display(IntPtr display, IntPtr xid); + private static extern IntPtr gdk_x11_window_foreign_new_for_display(IntPtr display, IntPtr xid); [DllImport(GdkName)] public static extern IntPtr gdk_x11_window_get_xid(IntPtr window); @@ -244,13 +243,13 @@ namespace Avalonia.X11.NativeDialogs public static extern IntPtr gtk_container_add(IntPtr container, IntPtr widget); [DllImport(GdkName)] - static extern IntPtr gdk_set_allowed_backends(Utf8Buffer backends); + private static extern IntPtr gdk_set_allowed_backends(Utf8Buffer backends); [DllImport(GdkName)] - static extern IntPtr gdk_display_get_default(); + private static extern IntPtr gdk_display_get_default(); [DllImport(GtkName)] - static extern IntPtr gtk_application_new(Utf8Buffer appId, int flags); + private static extern IntPtr gtk_application_new(Utf8Buffer appId, int flags); [DllImport(GdkName)] public static extern void gdk_window_set_transient_for(IntPtr window, IntPtr parent); diff --git a/src/Avalonia.X11/TransparencyHelper.cs b/src/Avalonia.X11/TransparencyHelper.cs index 2140b61b6f..5ca2d1d337 100644 --- a/src/Avalonia.X11/TransparencyHelper.cs +++ b/src/Avalonia.X11/TransparencyHelper.cs @@ -3,7 +3,7 @@ using Avalonia.Controls; namespace Avalonia.X11 { - class TransparencyHelper : IDisposable, X11Globals.IGlobalsSubscriber + internal class TransparencyHelper : IDisposable, X11Globals.IGlobalsSubscriber { private readonly X11Info _x11; private readonly IntPtr _window; diff --git a/src/Avalonia.X11/X11Clipboard.cs b/src/Avalonia.X11/X11Clipboard.cs index 2aa7797067..04d1aae194 100644 --- a/src/Avalonia.X11/X11Clipboard.cs +++ b/src/Avalonia.X11/X11Clipboard.cs @@ -9,7 +9,7 @@ using Avalonia.Input.Platform; using static Avalonia.X11.XLib; namespace Avalonia.X11 { - class X11Clipboard : IClipboard + internal class X11Clipboard : IClipboard { private readonly X11Info _x11; private IDataObject _storedDataObject; @@ -33,12 +33,12 @@ namespace Avalonia.X11 }.Where(a => a != IntPtr.Zero).ToArray(); } - bool IsStringAtom(IntPtr atom) + private bool IsStringAtom(IntPtr atom) { return _textAtoms.Contains(atom); } - - Encoding GetStringEncoding(IntPtr atom) + + private Encoding GetStringEncoding(IntPtr atom) { return (atom == _x11.Atoms.XA_STRING || atom == _x11.Atoms.OEMTEXT) @@ -213,7 +213,7 @@ namespace Avalonia.X11 } } - Task SendFormatRequest() + private Task SendFormatRequest() { if (_requestedFormatsTcs == null || _requestedFormatsTcs.Task.IsCompleted) _requestedFormatsTcs = new TaskCompletionSource(); @@ -222,7 +222,7 @@ namespace Avalonia.X11 return _requestedFormatsTcs.Task; } - Task SendDataRequest(IntPtr format) + private Task SendDataRequest(IntPtr format) { if (_requestedDataTcs == null || _requestedFormatsTcs.Task.IsCompleted) _requestedDataTcs = new TaskCompletionSource(); @@ -230,7 +230,7 @@ namespace Avalonia.X11 return _requestedDataTcs.Task; } - bool HasOwner => XGetSelectionOwner(_x11.Display, _x11.Atoms.CLIPBOARD) != IntPtr.Zero; + private bool HasOwner => XGetSelectionOwner(_x11.Display, _x11.Atoms.CLIPBOARD) != IntPtr.Zero; public async Task GetTextAsync() { @@ -252,7 +252,7 @@ namespace Avalonia.X11 return (string)await SendDataRequest(target); } - void StoreAtomsInClipboardManager(IntPtr[] atoms) + private void StoreAtomsInClipboardManager(IntPtr[] atoms) { if (_x11.Atoms.CLIPBOARD_MANAGER != IntPtr.Zero && _x11.Atoms.SAVE_TARGETS != IntPtr.Zero) { diff --git a/src/Avalonia.X11/X11CursorFactory.cs b/src/Avalonia.X11/X11CursorFactory.cs index 16de10e163..56fd2f14ef 100644 --- a/src/Avalonia.X11/X11CursorFactory.cs +++ b/src/Avalonia.X11/X11CursorFactory.cs @@ -12,7 +12,7 @@ using Avalonia.Utilities; namespace Avalonia.X11 { - partial class X11CursorFactory : ICursorFactory + internal partial class X11CursorFactory : ICursorFactory { private static readonly byte[] NullCursorData = new byte[] { 0 }; @@ -142,7 +142,7 @@ namespace Avalonia.X11 } } - class CursorImpl : ICursorImpl + internal class CursorImpl : ICursorImpl { public CursorImpl() { } public CursorImpl(IntPtr handle) => Handle = handle; diff --git a/src/Avalonia.X11/X11Enums.cs b/src/Avalonia.X11/X11Enums.cs index d97e1c42bb..9d671ae6d2 100644 --- a/src/Avalonia.X11/X11Enums.cs +++ b/src/Avalonia.X11/X11Enums.cs @@ -3,7 +3,7 @@ using System; namespace Avalonia.X11 { - public enum Status + internal enum Status { Success = 0, /* everything's okay */ BadRequest = 1, /* bad request code */ @@ -38,7 +38,7 @@ namespace Avalonia.X11 } [Flags] - public enum XEventMask : int + internal enum XEventMask : int { NoEventMask = 0, KeyPressMask = (1 << 0), @@ -69,7 +69,7 @@ namespace Avalonia.X11 } [Flags] - public enum XModifierMask + internal enum XModifierMask { ShiftMask = (1 << 0), LockMask = (1 << 1), @@ -89,7 +89,7 @@ namespace Avalonia.X11 } [Flags] - public enum XCreateWindowFlags + internal enum XCreateWindowFlags { CWBackPixmap = (1 << 0), CWBackPixel = (1 << 1), diff --git a/src/Avalonia.X11/X11Exception.cs b/src/Avalonia.X11/X11Exception.cs index 2ac5a31d9b..231ece497b 100644 --- a/src/Avalonia.X11/X11Exception.cs +++ b/src/Avalonia.X11/X11Exception.cs @@ -2,7 +2,7 @@ using System; namespace Avalonia.X11 { - public class X11Exception : Exception + internal class X11Exception : Exception { public X11Exception(string message) : base(message) { diff --git a/src/Avalonia.X11/X11Framebuffer.cs b/src/Avalonia.X11/X11Framebuffer.cs index a9fedff8b5..90e4b18571 100644 --- a/src/Avalonia.X11/X11Framebuffer.cs +++ b/src/Avalonia.X11/X11Framebuffer.cs @@ -5,7 +5,7 @@ using SkiaSharp; using static Avalonia.X11.XLib; namespace Avalonia.X11 { - class X11Framebuffer : ILockedFramebuffer + internal class X11Framebuffer : ILockedFramebuffer { private readonly IntPtr _display; private readonly IntPtr _xid; diff --git a/src/Avalonia.X11/X11FramebufferSurface.cs b/src/Avalonia.X11/X11FramebufferSurface.cs index 07c88b51a8..05885d1a25 100644 --- a/src/Avalonia.X11/X11FramebufferSurface.cs +++ b/src/Avalonia.X11/X11FramebufferSurface.cs @@ -4,7 +4,7 @@ using Avalonia.Platform; using static Avalonia.X11.XLib; namespace Avalonia.X11 { - public class X11FramebufferSurface : IFramebufferPlatformSurface + internal class X11FramebufferSurface : IFramebufferPlatformSurface { private readonly IntPtr _display; private readonly IntPtr _xid; diff --git a/src/Avalonia.X11/X11Globals.cs b/src/Avalonia.X11/X11Globals.cs index 39834a44b3..1ae0544724 100644 --- a/src/Avalonia.X11/X11Globals.cs +++ b/src/Avalonia.X11/X11Globals.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; using static Avalonia.X11.XLib; namespace Avalonia.X11 { - unsafe class X11Globals + internal unsafe class X11Globals { private readonly AvaloniaX11Platform _plat; private readonly int _screenNumber; @@ -75,7 +75,7 @@ namespace Avalonia.X11 } } - IntPtr GetSupportingWmCheck(IntPtr window) + private IntPtr GetSupportingWmCheck(IntPtr window) { XGetWindowProperty(_x11.Display, _rootWindow, _x11.Atoms._NET_SUPPORTING_WM_CHECK, IntPtr.Zero, new IntPtr(IntPtr.Size), false, @@ -95,7 +95,7 @@ namespace Avalonia.X11 } } - void UpdateCompositingAtomOwner() + private void UpdateCompositingAtomOwner() { // This procedure is described in https://tronche.com/gui/x/icccm/sec-2.html#s-2.8 @@ -128,10 +128,10 @@ namespace Avalonia.X11 if(ev.type == XEventName.DestroyNotify) UpdateCompositingAtomOwner(); } - - void UpdateWmName() => WmName = GetWmName(); - string GetWmName() + private void UpdateWmName() => WmName = GetWmName(); + + private string GetWmName() { var wm = GetSupportingWmCheck(_rootWindow); if (wm == IntPtr.Zero || wm != GetSupportingWmCheck(wm)) diff --git a/src/Avalonia.X11/X11IconLoader.cs b/src/Avalonia.X11/X11IconLoader.cs index bf59d72c0f..51db815b31 100644 --- a/src/Avalonia.X11/X11IconLoader.cs +++ b/src/Avalonia.X11/X11IconLoader.cs @@ -7,9 +7,9 @@ using Avalonia.Platform; namespace Avalonia.X11 { - class X11IconLoader : IPlatformIconLoader + internal class X11IconLoader : IPlatformIconLoader { - static IWindowIconImpl LoadIcon(Bitmap bitmap) + private static IWindowIconImpl LoadIcon(Bitmap bitmap) { var rv = new X11IconData(bitmap); bitmap.Dispose(); @@ -28,8 +28,8 @@ namespace Avalonia.X11 return LoadIcon(ms); } } - - unsafe class X11IconData : IWindowIconImpl, IFramebufferPlatformSurface + + internal unsafe class X11IconData : IWindowIconImpl, IFramebufferPlatformSurface { private int _width; private int _height; diff --git a/src/Avalonia.X11/X11Info.cs b/src/Avalonia.X11/X11Info.cs index 72f3bf3137..17cd6b12c6 100644 --- a/src/Avalonia.X11/X11Info.cs +++ b/src/Avalonia.X11/X11Info.cs @@ -6,7 +6,7 @@ using static Avalonia.X11.XLib; // ReSharper disable UnusedAutoPropertyAccessor.Local namespace Avalonia.X11 { - unsafe class X11Info + internal unsafe class X11Info { public IntPtr Display { get; } public IntPtr DeferredDisplay { get; } diff --git a/src/Avalonia.X11/X11KeyTransform.cs b/src/Avalonia.X11/X11KeyTransform.cs index 59f1da564c..6732a0f448 100644 --- a/src/Avalonia.X11/X11KeyTransform.cs +++ b/src/Avalonia.X11/X11KeyTransform.cs @@ -4,7 +4,7 @@ using Avalonia.Input; namespace Avalonia.X11 { - static class X11KeyTransform + internal static class X11KeyTransform { private static readonly Dictionary KeyDic = new Dictionary { diff --git a/src/Avalonia.X11/X11NativeControlHost.cs b/src/Avalonia.X11/X11NativeControlHost.cs index 6c4eb81c84..e8710580eb 100644 --- a/src/Avalonia.X11/X11NativeControlHost.cs +++ b/src/Avalonia.X11/X11NativeControlHost.cs @@ -6,7 +6,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { // TODO: Actually implement XEmbed instead of simply using XReparentWindow - class X11NativeControlHost : INativeControlHostImpl + internal class X11NativeControlHost : INativeControlHostImpl { private readonly AvaloniaX11Platform _platform; public X11Window Window { get; } @@ -57,7 +57,7 @@ namespace Avalonia.X11 public bool IsCompatibleWith(IPlatformHandle handle) => handle.HandleDescriptor == "XID"; - class DumbWindow : INativeControlHostDestroyableControlHandle + private class DumbWindow : INativeControlHostDestroyableControlHandle { private readonly IntPtr _display; @@ -96,8 +96,8 @@ namespace Avalonia.X11 } } } - - class Attachment : INativeControlHostControlTopLevelAttachment + + private class Attachment : INativeControlHostControlTopLevelAttachment { private readonly IntPtr _display; private readonly IntPtr _orphanedWindow; @@ -129,7 +129,7 @@ namespace Avalonia.X11 _attachedTo = null; } - void CheckDisposed() + private void CheckDisposed() { if (_child == null) throw new ObjectDisposedException("X11 INativeControlHostControlTopLevelAttachment"); diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index c5ae327c2f..170c6ce6b3 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -20,7 +20,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { - class AvaloniaX11Platform : IWindowingPlatform + internal class AvaloniaX11Platform : IWindowingPlatform { private Lazy _keyboardDevice = new Lazy(() => new KeyboardDevice()); public KeyboardDevice KeyboardDevice => _keyboardDevice.Value; @@ -35,7 +35,7 @@ namespace Avalonia.X11 public IntPtr OrphanedWindow { get; private set; } public X11Globals Globals { get; private set; } [DllImport("libc")] - static extern void setlocale(int type, string s); + private static extern void setlocale(int type, string s); public void Initialize(X11PlatformOptions options) { Options = options; @@ -138,7 +138,7 @@ namespace Avalonia.X11 throw new NotSupportedException(); } - static bool EnableIme(X11PlatformOptions options) + private static bool EnableIme(X11PlatformOptions options) { // Disable if explicitly asked by user var avaloniaImModule = Environment.GetEnvironmentVariable("AVALONIA_IM_MODULE"); @@ -160,7 +160,7 @@ namespace Avalonia.X11 return isCjkLocale; } - static bool ShouldUseXim() + private static bool ShouldUseXim() { // Check if we are forbidden from using IME if (Environment.GetEnvironmentVariable("AVALONIA_IM_MODULE") == "none" diff --git a/src/Avalonia.X11/X11PlatformThreading.cs b/src/Avalonia.X11/X11PlatformThreading.cs index d724cd2aed..1946642de3 100644 --- a/src/Avalonia.X11/X11PlatformThreading.cs +++ b/src/Avalonia.X11/X11PlatformThreading.cs @@ -9,7 +9,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { - unsafe class X11PlatformThreading : IPlatformThreadingInterface + internal unsafe class X11PlatformThreading : IPlatformThreadingInterface { private readonly AvaloniaX11Platform _platform; private readonly IntPtr _display; @@ -19,7 +19,7 @@ namespace Avalonia.X11 private Thread _mainThread; [StructLayout(LayoutKind.Explicit)] - struct epoll_data + private struct epoll_data { [FieldOffset(0)] public IntPtr ptr; @@ -36,30 +36,30 @@ namespace Avalonia.X11 private const int O_NONBLOCK = 2048; [StructLayout(LayoutKind.Sequential)] - struct epoll_event + private struct epoll_event { public uint events; public epoll_data data; } [DllImport("libc")] - extern static int epoll_create1(int size); + private extern static int epoll_create1(int size); [DllImport("libc")] - extern static int epoll_ctl(int epfd, int op, int fd, ref epoll_event __event); + private extern static int epoll_ctl(int epfd, int op, int fd, ref epoll_event __event); [DllImport("libc")] - extern static int epoll_wait(int epfd, epoll_event* events, int maxevents, int timeout); + private extern static int epoll_wait(int epfd, epoll_event* events, int maxevents, int timeout); [DllImport("libc")] - extern static int pipe2(int* fds, int flags); + private extern static int pipe2(int* fds, int flags); [DllImport("libc")] - extern static IntPtr write(int fd, void* buf, IntPtr count); + private extern static IntPtr write(int fd, void* buf, IntPtr count); [DllImport("libc")] - extern static IntPtr read(int fd, void* buf, IntPtr count); - - enum EventCodes + private extern static IntPtr read(int fd, void* buf, IntPtr count); + + private enum EventCodes { X11 = 1, Signal =2 @@ -72,7 +72,7 @@ namespace Avalonia.X11 private int _epoll; private Stopwatch _clock = Stopwatch.StartNew(); - class X11Timer : IDisposable + private class X11Timer : IDisposable { private readonly X11PlatformThreading _parent; @@ -104,7 +104,7 @@ namespace Avalonia.X11 } } - List _timers = new List(); + private List _timers = new List(); public X11PlatformThreading(AvaloniaX11Platform platform) { @@ -139,12 +139,12 @@ namespace Avalonia.X11 throw new X11Exception("Unable to attach signal pipe to epoll"); } - int TimerComparer(X11Timer t1, X11Timer t2) + private int TimerComparer(X11Timer t1, X11Timer t2) { return t2.Priority - t1.Priority; } - void CheckSignaled() + private void CheckSignaled() { int buf = 0; while (read(_sigread, &buf, new IntPtr(4)).ToInt64() > 0) @@ -164,7 +164,7 @@ namespace Avalonia.X11 Signaled?.Invoke(prio); } - unsafe void HandleX11(CancellationToken cancellationToken) + private unsafe void HandleX11(CancellationToken cancellationToken) { while (XPending(_display) != 0) { diff --git a/src/Avalonia.X11/X11Screens.cs b/src/Avalonia.X11/X11Screens.cs index 87899b11ed..6c7283952d 100644 --- a/src/Avalonia.X11/X11Screens.cs +++ b/src/Avalonia.X11/X11Screens.cs @@ -8,7 +8,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { - class X11Screens : IScreenImpl + internal class X11Screens : IScreenImpl { private IX11Screens _impl; @@ -17,7 +17,7 @@ namespace Avalonia.X11 _impl = impl; } - static unsafe X11Screen[] UpdateWorkArea(X11Info info, X11Screen[] screens) + private static unsafe X11Screen[] UpdateWorkArea(X11Info info, X11Screen[] screens) { var rect = default(PixelRect); foreach (var s in screens) @@ -58,14 +58,14 @@ namespace Avalonia.X11 XFree(prop); return screens; } - - class Randr15ScreensImpl : IX11Screens + + private class Randr15ScreensImpl : IX11Screens { private readonly X11ScreensUserSettings _settings; private X11Screen[] _cache; private X11Info _x11; private IntPtr _window; - const int EDIDStructureLength = 32; // Length of a EDID-Block-Length(128 bytes), XRRGetOutputProperty multiplies offset and length by 4 + private const int EDIDStructureLength = 32; // Length of a EDID-Block-Length(128 bytes), XRRGetOutputProperty multiplies offset and length by 4 public Randr15ScreensImpl(AvaloniaX11Platform platform, X11ScreensUserSettings settings) { @@ -160,7 +160,7 @@ namespace Avalonia.X11 } } - class FallbackScreensImpl : IX11Screens + private class FallbackScreensImpl : IX11Screens { public FallbackScreensImpl(X11Info info, X11ScreensUserSettings settings) { @@ -220,17 +220,17 @@ namespace Avalonia.X11 _impl.Screens.Select(s => new Screen(s.Scaling, s.Bounds, s.WorkingArea, s.IsPrimary)).ToArray(); } - interface IX11Screens + internal interface IX11Screens { X11Screen[] Screens { get; } } - class X11ScreensUserSettings + internal class X11ScreensUserSettings { public double GlobalScaleFactor { get; set; } = 1; public Dictionary NamedScaleFactors { get; set; } - static double? TryParse(string s) + private static double? TryParse(string s) { if (s == null) return null; @@ -276,7 +276,7 @@ namespace Avalonia.X11 } } - class X11Screen + internal class X11Screen { private const int FullHDWidth = 1920; private const int FullHDHeight = 1080; diff --git a/src/Avalonia.X11/X11Structs.cs b/src/Avalonia.X11/X11Structs.cs index 26515762b4..18f860a1a8 100644 --- a/src/Avalonia.X11/X11Structs.cs +++ b/src/Avalonia.X11/X11Structs.cs @@ -1751,8 +1751,7 @@ namespace Avalonia.X11 { { public IntPtr client_data; public XIMProc callback; - [NonSerialized] - GCHandle gch; + [NonSerialized] private GCHandle gch; public XIMCallback (IntPtr clientData, XIMProc proc) { @@ -1769,7 +1768,7 @@ namespace Avalonia.X11 { [StructLayout(LayoutKind.Sequential)] #pragma warning disable CA1815 // Override equals and operator equals on value types - public unsafe struct XImage + internal unsafe struct XImage #pragma warning restore CA1815 // Override equals and operator equals on value types { public int width, height; /* size of image */ @@ -1896,8 +1895,8 @@ namespace Avalonia.X11 { public const string XNSpotLocation = "spotLocation"; public const string XNFontSet = "fontSet"; } - - unsafe struct XRRMonitorInfo { + + internal unsafe struct XRRMonitorInfo { public IntPtr Name; public int Primary; public int Automatic; diff --git a/src/Avalonia.X11/X11Window.Ime.cs b/src/Avalonia.X11/X11Window.Ime.cs index e6066c7964..26ead5e6b8 100644 --- a/src/Avalonia.X11/X11Window.Ime.cs +++ b/src/Avalonia.X11/X11Window.Ime.cs @@ -11,7 +11,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { - partial class X11Window + internal partial class X11Window { private ITextInputMethodImpl _ime; private IX11InputMethodControl _imeControl; @@ -20,7 +20,7 @@ namespace Avalonia.X11 private Queue<(RawKeyEventArgs args, XEvent xev, int keyval, int keycode)> _imeQueue = new Queue<(RawKeyEventArgs args, XEvent xev, int keyVal, int keyCode)>(); - unsafe void CreateIC() + private unsafe void CreateIC() { if (_x11.HasXim) { @@ -65,8 +65,8 @@ namespace Avalonia.X11 new IntPtr((int)(XIMProperties.XIMPreeditNothing | XIMProperties.XIMStatusNothing)), XNames.XNClientWindow, _handle, XNames.XNFocusWindow, _handle, IntPtr.Zero); } - - void InitializeIme() + + private void InitializeIme() { var ime = AvaloniaLocator.Current.GetService()?.CreateClient(_handle); if (ime == null && _x11.HasXim) @@ -89,9 +89,9 @@ namespace Avalonia.X11 } } - void UpdateImePosition() => _imeControl?.UpdateWindowInfo(Position, RenderScaling); + private void UpdateImePosition() => _imeControl?.UpdateWindowInfo(Position, RenderScaling); - void HandleKeyEvent(ref XEvent ev) + private void HandleKeyEvent(ref XEvent ev) { var index = ev.KeyEvent.state.HasAllFlags(XModifierMask.ShiftMask); @@ -117,7 +117,7 @@ namespace Avalonia.X11 ScheduleKeyInput(args, ref ev, (int)key, ev.KeyEvent.keycode); } - void TriggerClassicTextInputEvent(ref XEvent ev) + private void TriggerClassicTextInputEvent(ref XEvent ev) { var text = TranslateEventToString(ref ev); if (text != null) @@ -128,8 +128,8 @@ namespace Avalonia.X11 private const int ImeBufferSize = 64 * 1024; [ThreadStatic] private static IntPtr ImeBuffer; - - unsafe string TranslateEventToString(ref XEvent ev) + + private unsafe string TranslateEventToString(ref XEvent ev) { if (ImeBuffer == IntPtr.Zero) ImeBuffer = Marshal.AllocHGlobal(ImeBufferSize); @@ -158,9 +158,9 @@ namespace Avalonia.X11 return text; } - - - void ScheduleKeyInput(RawKeyEventArgs args, ref XEvent xev, int keyval, int keycode) + + + private void ScheduleKeyInput(RawKeyEventArgs args, ref XEvent xev, int keyval, int keycode) { _x11.LastActivityTimestamp = xev.ButtonEvent.time; @@ -170,8 +170,8 @@ namespace Avalonia.X11 ScheduleInput(args); } - - bool FilterIme(RawKeyEventArgs args, XEvent xev, int keyval, int keycode) + + private bool FilterIme(RawKeyEventArgs args, XEvent xev, int keyval, int keycode) { if (_ime == null) return false; @@ -182,7 +182,7 @@ namespace Avalonia.X11 return true; } - async void ProcessNextImeEvent() + private async void ProcessNextImeEvent() { if(_processingIme) return; @@ -203,7 +203,7 @@ namespace Avalonia.X11 } // This class is used to attach the text value of the key to an asynchronously dispatched KeyDown event - class RawKeyEventArgsWithText : RawKeyEventArgs + private class RawKeyEventArgsWithText : RawKeyEventArgs { public RawKeyEventArgsWithText(IKeyboardDevice device, ulong timestamp, IInputRoot root, RawKeyEventType type, Key key, RawInputModifiers modifiers, string text) : diff --git a/src/Avalonia.X11/X11Window.Xim.cs b/src/Avalonia.X11/X11Window.Xim.cs index 8446d35cc6..cc5ecad09f 100644 --- a/src/Avalonia.X11/X11Window.Xim.cs +++ b/src/Avalonia.X11/X11Window.Xim.cs @@ -8,9 +8,9 @@ using Avalonia.Threading; using static Avalonia.X11.XLib; namespace Avalonia.X11 { - partial class X11Window + internal partial class X11Window { - class XimInputMethod : ITextInputMethodImpl, IX11InputMethodControl + private class XimInputMethod : ITextInputMethodImpl, IX11InputMethodControl { private readonly X11Window _parent; private bool _windowActive, _imeActive; diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index c78ef2350e..9f09212814 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -27,7 +27,7 @@ using static Avalonia.X11.XLib; // ReSharper disable StringLiteralTypo namespace Avalonia.X11 { - unsafe partial class X11Window : IWindowImpl, IPopupImpl, IXI2Client + internal unsafe partial class X11Window : IWindowImpl, IPopupImpl, IXI2Client { private readonly AvaloniaX11Platform _platform; private readonly bool _popup; @@ -59,7 +59,7 @@ namespace Avalonia.X11 private bool _useRenderWindow = false; private bool _usePositioningFlags = false; - enum XSyncState + private enum XSyncState { None, WaitConfigure, @@ -219,7 +219,7 @@ namespace Avalonia.X11 }); } - class SurfaceInfo : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo + private class SurfaceInfo : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo { private readonly X11Window _window; private readonly IntPtr _display; @@ -249,7 +249,7 @@ namespace Avalonia.X11 public double Scaling => _window.RenderScaling; } - void UpdateMotifHints() + private void UpdateMotifHints() { var functions = MotifFunctions.Move | MotifFunctions.Close | MotifFunctions.Resize | MotifFunctions.Minimize | MotifFunctions.Maximize; @@ -278,7 +278,7 @@ namespace Avalonia.X11 PropertyMode.Replace, ref hints, 5); } - void UpdateSizeHints(PixelSize? preResize) + private void UpdateSizeHints(PixelSize? preResize) { var min = _minMaxSize.minSize; var max = _minMaxSize.maxSize; @@ -386,7 +386,7 @@ namespace Avalonia.X11 public IRenderer CreateRenderer(IRenderRoot root) => new CompositingRenderer(root, _platform.Compositor, () => Surfaces); - void OnEvent(ref XEvent ev) + private void OnEvent(ref XEvent ev) { if (ev.type == XEventName.MapNotify) { @@ -668,7 +668,7 @@ namespace Avalonia.X11 } - static RawInputModifiers TranslateModifiers(XModifierMask state) + private static RawInputModifiers TranslateModifiers(XModifierMask state) { var rv = default(RawInputModifiers); if (state.HasAllFlags(XModifierMask.Button1Mask)) @@ -704,13 +704,13 @@ namespace Avalonia.X11 private double _scaling = 1; - void ScheduleInput(RawInputEventArgs args, ref XEvent xev) + private void ScheduleInput(RawInputEventArgs args, ref XEvent xev) { _x11.LastActivityTimestamp = xev.ButtonEvent.time; ScheduleInput(args); } - void DispatchInput(RawInputEventArgs args) + private void DispatchInput(RawInputEventArgs args) { Input?.Invoke(args); if (!args.Handled && args is RawKeyEventArgsWithText text && !string.IsNullOrEmpty(text.Text)) @@ -746,8 +746,8 @@ namespace Avalonia.X11 _rawEventGrouper.HandleEvent(args); } - - void MouseEvent(RawPointerEventType type, ref XEvent ev, XModifierMask mods) + + private void MouseEvent(RawPointerEventType type, ref XEvent ev, XModifierMask mods) { var mev = new RawPointerEventArgs( _mouse, (ulong)ev.ButtonEvent.time.ToInt64(), _inputRoot, @@ -755,7 +755,7 @@ namespace Avalonia.X11 ScheduleInput(mev, ref ev); } - void EnqueuePaint() + private void EnqueuePaint() { if (!_triggeredExpose) { @@ -767,8 +767,8 @@ namespace Avalonia.X11 }, DispatcherPriority.Render); } } - - void DoPaint() + + private void DoPaint() { Paint?.Invoke(new Rect()); if (_xSyncCounter != IntPtr.Zero && _xSyncState == XSyncState.WaitPaint) @@ -819,8 +819,8 @@ namespace Avalonia.X11 return null; } - - void Cleanup() + + private void Cleanup() { if (_rawEventGrouper != null) { @@ -871,7 +871,7 @@ namespace Avalonia.X11 } } - bool ActivateTransientChildIfNeeded() + private bool ActivateTransientChildIfNeeded() { if (_disabled) { @@ -923,9 +923,9 @@ namespace Avalonia.X11 Resize(size, true, PlatformResizeReason.Layout); } - PixelSize ToPixelSize(Size size) => new PixelSize((int)(size.Width * RenderScaling), (int)(size.Height * RenderScaling)); - - void Resize(Size clientSize, bool force, PlatformResizeReason reason) + private PixelSize ToPixelSize(Size size) => new PixelSize((int)(size.Width * RenderScaling), (int)(size.Height * RenderScaling)); + + private void Resize(Size clientSize, bool force, PlatformResizeReason reason) { if (!force && clientSize == ClientSize) return; @@ -1020,7 +1020,7 @@ namespace Avalonia.X11 .OrderByDescending(x => x.Width + x.Height).FirstOrDefault(); - void SendNetWMMessage(IntPtr message_type, IntPtr l0, + private void SendNetWMMessage(IntPtr message_type, IntPtr l0, IntPtr? l1 = null, IntPtr? l2 = null, IntPtr? l3 = null, IntPtr? l4 = null) { var xev = new XEvent @@ -1044,7 +1044,7 @@ namespace Avalonia.X11 } - void BeginMoveResize(NetWmMoveResize side, PointerPressedEventArgs e) + private void BeginMoveResize(NetWmMoveResize side, PointerPressedEventArgs e) { var pos = GetCursorPos(_x11); XUngrabPointer(_x11.Display, new IntPtr(0)); @@ -1184,7 +1184,7 @@ namespace Avalonia.X11 ChangeWMAtoms(!value, _x11.Atoms._NET_WM_STATE_SKIP_TASKBAR); } - void ChangeWMAtoms(bool enable, params IntPtr[] atoms) + private void ChangeWMAtoms(bool enable, params IntPtr[] atoms) { if (atoms.Length != 1 && atoms.Length != 2) throw new ArgumentException(); diff --git a/src/Avalonia.X11/XError.cs b/src/Avalonia.X11/XError.cs index 2cc8f63c96..fbe9c34686 100644 --- a/src/Avalonia.X11/XError.cs +++ b/src/Avalonia.X11/XError.cs @@ -2,11 +2,12 @@ using System; namespace Avalonia.X11 { - static class XError + internal static class XError { private static readonly XErrorHandler s_errorHandlerDelegate = Handler; public static XErrorEvent LastError; - static int Handler(IntPtr display, ref XErrorEvent error) + + private static int Handler(IntPtr display, ref XErrorEvent error) { LastError = error; return 0; diff --git a/src/Avalonia.X11/XI2Manager.cs b/src/Avalonia.X11/XI2Manager.cs index 7bf1df41b6..f66616f2aa 100644 --- a/src/Avalonia.X11/XI2Manager.cs +++ b/src/Avalonia.X11/XI2Manager.cs @@ -7,7 +7,7 @@ using static Avalonia.X11.XLib; namespace Avalonia.X11 { - unsafe class XI2Manager + internal unsafe class XI2Manager { private static readonly XiEventType[] DefaultEventTypes = new XiEventType[] { @@ -30,7 +30,7 @@ namespace Avalonia.X11 private bool _multitouch; private Dictionary _clients = new Dictionary(); - class DeviceInfo + private class DeviceInfo { public int Id { get; } public XIValuatorClassInfo[] Valuators { get; private set; } @@ -67,7 +67,7 @@ namespace Avalonia.X11 } } - class PointerDeviceInfo : DeviceInfo + private class PointerDeviceInfo : DeviceInfo { public PointerDeviceInfo(XIDeviceInfo info) : base(info) { @@ -197,7 +197,7 @@ namespace Avalonia.X11 } } - void OnEnterLeaveEvent(IXI2Client client, ref XIEnterLeaveEvent ev) + private void OnEnterLeaveEvent(IXI2Client client, ref XIEnterLeaveEvent ev) { if (ev.evtype == XiEventType.XI_Leave) { @@ -215,7 +215,7 @@ namespace Avalonia.X11 } } - void OnDeviceEvent(IXI2Client client, ParsedDeviceEvent ev) + private void OnDeviceEvent(IXI2Client client, ParsedDeviceEvent ev) { if (ev.Type == XiEventType.XI_TouchBegin || ev.Type == XiEventType.XI_TouchUpdate @@ -304,7 +304,7 @@ namespace Avalonia.X11 } } - unsafe class ParsedDeviceEvent + internal unsafe class ParsedDeviceEvent { public XiEventType Type { get; } public RawInputModifiers Modifiers { get; } @@ -367,8 +367,8 @@ namespace Avalonia.X11 Emulated = ev->flags.HasAllFlags(XiDeviceEventFlags.XIPointerEmulated); } } - - interface IXI2Client + + internal interface IXI2Client { IInputRoot InputRoot { get; } void ScheduleXI2Input(RawInputEventArgs args); diff --git a/src/Avalonia.X11/XIStructs.cs b/src/Avalonia.X11/XIStructs.cs index f4581a99ba..9a1ed01764 100644 --- a/src/Avalonia.X11/XIStructs.cs +++ b/src/Avalonia.X11/XIStructs.cs @@ -10,7 +10,7 @@ using Atom = System.IntPtr; namespace Avalonia.X11 { [StructLayout(LayoutKind.Sequential)] - struct XIAddMasterInfo + internal struct XIAddMasterInfo { public int Type; public IntPtr Name; @@ -19,7 +19,7 @@ namespace Avalonia.X11 } [StructLayout(LayoutKind.Sequential)] - struct XIRemoveMasterInfo + internal struct XIRemoveMasterInfo { public int Type; public int Deviceid; @@ -29,7 +29,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - struct XIAttachSlaveInfo + internal struct XIAttachSlaveInfo { public int Type; public int Deviceid; @@ -37,14 +37,14 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - struct XIDetachSlaveInfo + internal struct XIDetachSlaveInfo { public int Type; public int Deviceid; }; [StructLayout(LayoutKind.Explicit)] - struct XIAnyHierarchyChangeInfo + internal struct XIAnyHierarchyChangeInfo { [FieldOffset(0)] public int type; /* must be first element */ @@ -59,7 +59,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - struct XIModifierState + internal struct XIModifierState { public int Base; public int Latched; @@ -68,14 +68,14 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIButtonState + internal unsafe struct XIButtonState { public int MaskLen; public byte* Mask; }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIValuatorState + internal unsafe struct XIValuatorState { public int MaskLen; public byte* Mask; @@ -83,7 +83,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIEventMask + internal unsafe struct XIEventMask { public int Deviceid; public int MaskLen; @@ -91,14 +91,14 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - struct XIAnyClassInfo + internal struct XIAnyClassInfo { public XiDeviceClass Type; public int Sourceid; }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIButtonClassInfo + internal unsafe struct XIButtonClassInfo { public int Type; public int Sourceid; @@ -108,7 +108,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIKeyClassInfo + internal unsafe struct XIKeyClassInfo { public int Type; public int Sourceid; @@ -117,7 +117,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - struct XIValuatorClassInfo + internal struct XIValuatorClassInfo { public int Type; public int Sourceid; @@ -132,7 +132,7 @@ namespace Avalonia.X11 /* new in XI 2.1 */ [StructLayout(LayoutKind.Sequential)] - struct XIScrollClassInfo + internal struct XIScrollClassInfo { public int Type; public int Sourceid; @@ -142,14 +142,14 @@ namespace Avalonia.X11 public int Flags; }; - enum XiScrollType + internal enum XiScrollType { Vertical = 1, Horizontal = 2 } [StructLayout(LayoutKind.Sequential)] - struct XITouchClassInfo + internal struct XITouchClassInfo { public int Type; public int Sourceid; @@ -158,7 +158,7 @@ namespace Avalonia.X11 }; [StructLayout(LayoutKind.Sequential)] - unsafe struct XIDeviceInfo + internal unsafe struct XIDeviceInfo { public int Deviceid; public IntPtr Name; @@ -169,7 +169,7 @@ namespace Avalonia.X11 public XIAnyClassInfo** Classes; } - enum XiDeviceType + internal enum XiDeviceType { XIMasterPointer = 1, XIMasterKeyboard = 2, @@ -178,13 +178,13 @@ namespace Avalonia.X11 XIFloatingSlave = 5 } - enum XiPredefinedDeviceId : int + internal enum XiPredefinedDeviceId : int { XIAllDevices = 0, XIAllMasterDevices = 1 } - enum XiDeviceClass + internal enum XiDeviceClass { XIKeyClass = 0, XIButtonClass = 1, @@ -194,7 +194,7 @@ namespace Avalonia.X11 } [StructLayout(LayoutKind.Sequential)] - unsafe struct XIDeviceChangedEvent + internal unsafe struct XIDeviceChangedEvent { public int Type; /* GenericEvent */ public UIntPtr Serial; /* # of last request processed by server */ @@ -211,7 +211,7 @@ namespace Avalonia.X11 } [StructLayout(LayoutKind.Sequential)] - struct XIDeviceEvent + internal struct XIDeviceEvent { public XEventName type; /* GenericEvent */ public UIntPtr serial; /* # of last request processed by server */ @@ -238,7 +238,7 @@ namespace Avalonia.X11 } [StructLayout(LayoutKind.Sequential)] - unsafe struct XIEnterLeaveEvent + internal unsafe struct XIEnterLeaveEvent { public XEventName type; /* GenericEvent */ public UIntPtr serial; /* # of last request processed by server */ @@ -266,14 +266,14 @@ namespace Avalonia.X11 } [Flags] - public enum XiDeviceEventFlags : int + internal enum XiDeviceEventFlags : int { None = 0, XIPointerEmulated = (1 << 16) } [StructLayout(LayoutKind.Sequential)] - unsafe struct XIEvent + internal unsafe struct XIEvent { public int type; /* GenericEvent */ public UIntPtr serial; /* # of last request processed by server */ @@ -284,7 +284,7 @@ namespace Avalonia.X11 public IntPtr time; } - enum XiEventType + internal enum XiEventType { XI_DeviceChanged = 1, XI_KeyPress = 2, @@ -315,7 +315,7 @@ namespace Avalonia.X11 XI_LASTEVENT = XI_BarrierLeave, } - enum XiEnterLeaveDetail + internal enum XiEnterLeaveDetail { XINotifyAncestor = 0, XINotifyVirtual = 1, diff --git a/src/Avalonia.X11/XLib.cs b/src/Avalonia.X11/XLib.cs index 753d5f530c..7a43cd378b 100644 --- a/src/Avalonia.X11/XLib.cs +++ b/src/Avalonia.X11/XLib.cs @@ -16,11 +16,11 @@ namespace Avalonia.X11 { internal unsafe static class XLib { - const string libX11 = "libX11.so.6"; - const string libX11Randr = "libXrandr.so.2"; - const string libX11Ext = "libXext.so.6"; - const string libXInput = "libXi.so.6"; - const string libXCursor = "libXcursor.so.1"; + private const string libX11 = "libX11.so.6"; + private const string libX11Randr = "libXrandr.so.2"; + private const string libX11Ext = "libXext.so.6"; + private const string libXInput = "libXi.so.6"; + private const string libXCursor = "libXcursor.so.1"; [DllImport(libX11)] public static extern IntPtr XOpenDisplay(IntPtr display); diff --git a/src/Shared/RawEventGrouping.cs b/src/Shared/RawEventGrouping.cs index 966744888c..c4772db820 100644 --- a/src/Shared/RawEventGrouping.cs +++ b/src/Shared/RawEventGrouping.cs @@ -17,8 +17,8 @@ internal class RawEventGrouper : IDisposable private readonly Action _eventCallback; private readonly Queue _inputQueue = new(); private readonly Action _dispatchFromQueue; - readonly Dictionary _lastTouchPoints = new(); - RawInputEventArgs? _lastEvent; + private readonly Dictionary _lastTouchPoints = new(); + private RawInputEventArgs? _lastEvent; public RawEventGrouper(Action eventCallback) { From 33f9fe68b23e85e82c13a16b0ae055cac6075ad6 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 23:05:43 -0500 Subject: [PATCH 11/14] macOS and iOS internals --- src/Avalonia.Native/CallbackBase.cs | 2 +- .../MacOSMountedVolumeInfoProvider.cs | 2 +- src/Avalonia.Native/MenuActionCallback.cs | 2 +- src/Avalonia.Native/PredicateCallback.cs | 2 +- src/Avalonia.Native/ScreenImpl.cs | 2 +- src/iOS/Avalonia.iOS/ClipboardImpl.cs | 14 +++++++------- src/iOS/Avalonia.iOS/LayerFbo.cs | 2 +- src/iOS/Avalonia.iOS/Stubs.cs | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Avalonia.Native/CallbackBase.cs b/src/Avalonia.Native/CallbackBase.cs index 2d875dbc0e..9f59c97f9b 100644 --- a/src/Avalonia.Native/CallbackBase.cs +++ b/src/Avalonia.Native/CallbackBase.cs @@ -6,7 +6,7 @@ using MicroCom.Runtime; namespace Avalonia.Native { - public abstract class NativeCallbackBase : CallbackBase, IMicroComExceptionCallback + internal abstract class NativeCallbackBase : CallbackBase, IMicroComExceptionCallback { public void RaiseException(Exception e) { diff --git a/src/Avalonia.Native/MacOSMountedVolumeInfoProvider.cs b/src/Avalonia.Native/MacOSMountedVolumeInfoProvider.cs index e79c7a40d3..1170a6fd9b 100644 --- a/src/Avalonia.Native/MacOSMountedVolumeInfoProvider.cs +++ b/src/Avalonia.Native/MacOSMountedVolumeInfoProvider.cs @@ -64,7 +64,7 @@ namespace Avalonia.Native } } - public class MacOSMountedVolumeInfoProvider : IMountedVolumeInfoProvider + internal class MacOSMountedVolumeInfoProvider : IMountedVolumeInfoProvider { public IDisposable Listen(ObservableCollection mountedDrives) { diff --git a/src/Avalonia.Native/MenuActionCallback.cs b/src/Avalonia.Native/MenuActionCallback.cs index 3acbb9c19c..e9446e2da1 100644 --- a/src/Avalonia.Native/MenuActionCallback.cs +++ b/src/Avalonia.Native/MenuActionCallback.cs @@ -3,7 +3,7 @@ using Avalonia.Native.Interop; namespace Avalonia.Native { - public class MenuActionCallback : NativeCallbackBase, IAvnActionCallback + internal class MenuActionCallback : NativeCallbackBase, IAvnActionCallback { private Action _action; diff --git a/src/Avalonia.Native/PredicateCallback.cs b/src/Avalonia.Native/PredicateCallback.cs index dbb65791f0..1ff71063af 100644 --- a/src/Avalonia.Native/PredicateCallback.cs +++ b/src/Avalonia.Native/PredicateCallback.cs @@ -3,7 +3,7 @@ using Avalonia.Native.Interop; namespace Avalonia.Native { - public class PredicateCallback : NativeCallbackBase, IAvnPredicateCallback + internal class PredicateCallback : NativeCallbackBase, IAvnPredicateCallback { private Func _predicate; diff --git a/src/Avalonia.Native/ScreenImpl.cs b/src/Avalonia.Native/ScreenImpl.cs index 53bd12cde1..c64d1378e8 100644 --- a/src/Avalonia.Native/ScreenImpl.cs +++ b/src/Avalonia.Native/ScreenImpl.cs @@ -5,7 +5,7 @@ using Avalonia.Platform; namespace Avalonia.Native { - class ScreenImpl : IScreenImpl, IDisposable + internal class ScreenImpl : IScreenImpl, IDisposable { private IAvnScreens _native; diff --git a/src/iOS/Avalonia.iOS/ClipboardImpl.cs b/src/iOS/Avalonia.iOS/ClipboardImpl.cs index b9f74d69c6..150f3424e3 100644 --- a/src/iOS/Avalonia.iOS/ClipboardImpl.cs +++ b/src/iOS/Avalonia.iOS/ClipboardImpl.cs @@ -6,7 +6,7 @@ using UIKit; namespace Avalonia.iOS { - public class ClipboardImpl : IClipboard + internal class ClipboardImpl : IClipboard { public Task GetTextAsync() { @@ -16,19 +16,19 @@ namespace Avalonia.iOS public Task SetTextAsync(string text) { UIPasteboard.General.String = text; - return Task.FromResult(0); + return Task.CompletedTask; } public Task ClearAsync() { UIPasteboard.General.String = ""; - return Task.FromResult(0); + return Task.CompletedTask; } - public Task SetDataObjectAsync(IDataObject data) => throw new PlatformNotSupportedException(); + public Task SetDataObjectAsync(IDataObject data) => Task.CompletedTask; - public Task GetFormatsAsync() => throw new PlatformNotSupportedException(); + public Task GetFormatsAsync() => Task.FromResult(Array.Empty()); - public Task GetDataAsync(string format) => throw new PlatformNotSupportedException(); + public Task GetDataAsync(string format) => Task.FromResult(null); } -} \ No newline at end of file +} diff --git a/src/iOS/Avalonia.iOS/LayerFbo.cs b/src/iOS/Avalonia.iOS/LayerFbo.cs index 9a93cdfb22..c19fb2ee8d 100644 --- a/src/iOS/Avalonia.iOS/LayerFbo.cs +++ b/src/iOS/Avalonia.iOS/LayerFbo.cs @@ -5,7 +5,7 @@ using OpenGLES; namespace Avalonia.iOS { - public class LayerFbo + internal class LayerFbo { private readonly EAGLContext _context; private readonly GlInterface _gl; diff --git a/src/iOS/Avalonia.iOS/Stubs.cs b/src/iOS/Avalonia.iOS/Stubs.cs index 9c46aa78cc..6ac89fcab2 100644 --- a/src/iOS/Avalonia.iOS/Stubs.cs +++ b/src/iOS/Avalonia.iOS/Stubs.cs @@ -5,7 +5,7 @@ using Avalonia.Platform; namespace Avalonia.iOS { - class CursorFactoryStub : ICursorFactory + internal class CursorFactoryStub : ICursorFactory { public ICursorImpl CreateCursor(IBitmapImpl cursor, PixelPoint hotSpot) => new CursorImplStub(); ICursorImpl ICursorFactory.GetCursor(StandardCursorType cursorType) => new CursorImplStub(); @@ -16,7 +16,7 @@ namespace Avalonia.iOS } } - class WindowingPlatformStub : IWindowingPlatform + internal class WindowingPlatformStub : IWindowingPlatform { public IWindowImpl CreateWindow() => throw new NotSupportedException(); @@ -25,7 +25,7 @@ namespace Avalonia.iOS public ITrayIconImpl CreateTrayIcon() => null; } - class PlatformIconLoaderStub : IPlatformIconLoader + internal class PlatformIconLoaderStub : IPlatformIconLoader { public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) { @@ -50,7 +50,7 @@ namespace Avalonia.iOS } } - public class IconStub : IWindowIconImpl + internal class IconStub : IWindowIconImpl { private readonly MemoryStream _ms; From d27936af67f79101bae2df07a5b0113b85f90ec5 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 13 Feb 2023 23:05:50 -0500 Subject: [PATCH 12/14] Android and browser internals --- src/Android/Avalonia.Android/AndroidInputMethod.cs | 4 ++-- src/Android/Avalonia.Android/Avalonia.Android.csproj | 1 + .../Platform/Input/AndroidKeyboardDevice.cs | 2 +- .../Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs | 2 +- src/Android/Avalonia.Android/PlatformIconLoader.cs | 4 ++-- src/Android/Avalonia.Android/Stubs.cs | 6 +++--- src/Browser/Avalonia.Browser/Skia/BrowserSkiaGpu.cs | 2 +- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Android/Avalonia.Android/AndroidInputMethod.cs b/src/Android/Avalonia.Android/AndroidInputMethod.cs index c885a7768c..df0c494648 100644 --- a/src/Android/Avalonia.Android/AndroidInputMethod.cs +++ b/src/Android/Avalonia.Android/AndroidInputMethod.cs @@ -32,7 +32,7 @@ namespace Avalonia.Android ActionPrevious = 0x00000007, } - class AndroidInputMethod : ITextInputMethodImpl, IAndroidInputMethod + internal class AndroidInputMethod : ITextInputMethodImpl, IAndroidInputMethod where TView : View, IInitEditorInfo { private readonly TView _host; @@ -167,7 +167,7 @@ namespace Avalonia.Android } } - public readonly record struct ComposingRegion + internal readonly record struct ComposingRegion { private readonly int _start = -1; private readonly int _end = -1; diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index 66557418dd..2533016e9f 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -5,6 +5,7 @@ true true portable + Avalonia.Android.Internal diff --git a/src/Android/Avalonia.Android/Platform/Input/AndroidKeyboardDevice.cs b/src/Android/Avalonia.Android/Platform/Input/AndroidKeyboardDevice.cs index 726ccdbbdd..ab84801e57 100644 --- a/src/Android/Avalonia.Android/Platform/Input/AndroidKeyboardDevice.cs +++ b/src/Android/Avalonia.Android/Platform/Input/AndroidKeyboardDevice.cs @@ -5,7 +5,7 @@ using Avalonia.Input; namespace Avalonia.Android.Platform.Input { - public class AndroidKeyboardDevice : KeyboardDevice, IKeyboardDevice { + internal class AndroidKeyboardDevice : KeyboardDevice, IKeyboardDevice { private static readonly Dictionary KeyDic = new Dictionary { // { Keycode.Cancel?, Key.Cancel }, diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index f205458f0e..47297a4f76 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -10,7 +10,7 @@ using Avalonia.Platform; namespace Avalonia.Android { - public abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, IPlatformNativeSurfaceHandle + internal abstract class InvalidationAwareSurfaceView : SurfaceView, ISurfaceHolderCallback, IPlatformNativeSurfaceHandle { bool _invalidateQueued; readonly object _lock = new object(); diff --git a/src/Android/Avalonia.Android/PlatformIconLoader.cs b/src/Android/Avalonia.Android/PlatformIconLoader.cs index 88677a9375..f557685dd2 100644 --- a/src/Android/Avalonia.Android/PlatformIconLoader.cs +++ b/src/Android/Avalonia.Android/PlatformIconLoader.cs @@ -3,7 +3,7 @@ using Avalonia.Platform; namespace Avalonia.Android { - class PlatformIconLoader : IPlatformIconLoader + internal class PlatformIconLoader : IPlatformIconLoader { public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) { @@ -29,7 +29,7 @@ namespace Avalonia.Android } // Stores the icon created as a stream to support saving even though an icon is never shown - public class FakeIcon : IWindowIconImpl + internal class FakeIcon : IWindowIconImpl { private Stream stream = new MemoryStream(); diff --git a/src/Android/Avalonia.Android/Stubs.cs b/src/Android/Avalonia.Android/Stubs.cs index f36c01dbc8..05638cdf88 100644 --- a/src/Android/Avalonia.Android/Stubs.cs +++ b/src/Android/Avalonia.Android/Stubs.cs @@ -4,7 +4,7 @@ using Avalonia.Platform; namespace Avalonia.Android { - class WindowingPlatformStub : IWindowingPlatform + internal class WindowingPlatformStub : IWindowingPlatform { public IWindowImpl CreateWindow() => throw new NotSupportedException(); @@ -13,7 +13,7 @@ namespace Avalonia.Android public ITrayIconImpl CreateTrayIcon() => null; } - class PlatformIconLoaderStub : IPlatformIconLoader + internal class PlatformIconLoaderStub : IPlatformIconLoader { public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) { @@ -38,7 +38,7 @@ namespace Avalonia.Android } } - public class IconStub : IWindowIconImpl + internal class IconStub : IWindowIconImpl { private readonly MemoryStream _ms; diff --git a/src/Browser/Avalonia.Browser/Skia/BrowserSkiaGpu.cs b/src/Browser/Avalonia.Browser/Skia/BrowserSkiaGpu.cs index 4d3d8dcd97..3c04935f0d 100644 --- a/src/Browser/Avalonia.Browser/Skia/BrowserSkiaGpu.cs +++ b/src/Browser/Avalonia.Browser/Skia/BrowserSkiaGpu.cs @@ -6,7 +6,7 @@ using Avalonia.Reactive; namespace Avalonia.Browser.Skia { - public class BrowserSkiaGpu : ISkiaGpu + internal class BrowserSkiaGpu : ISkiaGpu { public ISkiaGpuRenderTarget? TryCreateRenderTarget(IEnumerable surfaces) { From b92134c6820b5d739fa9ca16a7bb9d8e696635c8 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 14 Feb 2023 11:55:14 +0100 Subject: [PATCH 13/14] Added failing test for #10246. --- .../ItemsControlTests.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs index 28e88d1e71..f074972cef 100644 --- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs @@ -147,6 +147,25 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new[] { child }, target.GetLogicalChildren()); } + [Fact] + public void Control_Item_Should_Be_Logical_Child_After_Layout() + { + var target = new ItemsControl + { + Template = GetTemplate(), + }; + var root = new TestRoot(target); + var child = new Control(); + + target.Template = GetTemplate(); + target.Items = new[] { child }; + root.LayoutManager.ExecuteInitialLayoutPass(); + + Assert.Equal(target, child.Parent); + Assert.Equal(target, child.GetLogicalParent()); + Assert.Equal(new[] { child }, target.GetLogicalChildren()); + } + [Fact] public void Added_Container_Should_Have_LogicalParent_Set_To_ItemsControl() { From c9bb9f2c010a0be39fdcbeb0f4a788d20712a8a1 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 14 Feb 2023 12:04:50 +0100 Subject: [PATCH 14/14] Don't add duplicate logical children. --- src/Avalonia.Controls/ItemsControl.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 2f02a48d55..ce12d5f2bf 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -559,7 +559,12 @@ namespace Avalonia.Controls return new ItemContainerGenerator(this); } - internal void AddLogicalChild(Control c) => LogicalChildren.Add(c); + internal void AddLogicalChild(Control c) + { + if (!LogicalChildren.Contains(c)) + LogicalChildren.Add(c); + } + internal void RemoveLogicalChild(Control c) => LogicalChildren.Remove(c); ///