@ -1,6 +1,7 @@
using System ;
using System ;
using System.Collections.Generic ;
using System.Collections.Generic ;
using System.Diagnostics.CodeAnalysis ;
using System.Diagnostics.CodeAnalysis ;
using System.Linq ;
using System.Threading.Tasks ;
using System.Threading.Tasks ;
using Avalonia.Metadata ;
using Avalonia.Metadata ;
using Avalonia.Threading ;
using Avalonia.Threading ;
@ -42,7 +43,7 @@ namespace Avalonia.Platform
private readonly Dictionary < TKey , TScreen > _ allScreensByKey = screenKeyComparer is not null ?
private readonly Dictionary < TKey , TScreen > _ allScreensByKey = screenKeyComparer is not null ?
new Dictionary < TKey , TScreen > ( screenKeyComparer ) :
new Dictionary < TKey , TScreen > ( screenKeyComparer ) :
new Dictionary < TKey , TScreen > ( ) ;
new Dictionary < TKey , TScreen > ( ) ;
private TScreen [ ] ? _ allScreens ;
private IReadOnlyList < TScreen > ? _ allScreens ;
private int? _ screenCount ;
private int? _ screenCount ;
private bool? _ screenDetailsRequestGranted ;
private bool? _ screenDetailsRequestGranted ;
private DispatcherOperation ? _ onChangeOperation ;
private DispatcherOperation ? _ onChangeOperation ;
@ -134,12 +135,18 @@ namespace Avalonia.Platform
if ( _ allScreens is not null )
if ( _ allScreens is not null )
return ;
return ;
// We don't synchronize this method, as it is expected to be called on UI thread only.
Dispatcher . UIThread . VerifyAccess ( ) ;
var screens = GetAllScreenKeys ( ) ;
var screens = GetAllScreenKeys ( ) ;
var screensSet = new HashSet < TKey > ( screens , screenKeyComparer ) ;
var screensSet = new HashSet < TKey > ( screens , screenKeyComparer ) ;
_ allScreens = new TScreen [ screens . Count ] ;
// .ToList() is only necessary for .NET Framework apps.
#if NET
foreach ( var oldScreenKey in _ allScreensByKey . Keys )
foreach ( var oldScreenKey in _ allScreensByKey . Keys )
#else
foreach ( var oldScreenKey in _ allScreensByKey . Keys . ToList ( ) )
#endif
{
{
if ( ! screensSet . Contains ( oldScreenKey ) )
if ( ! screensSet . Contains ( oldScreenKey ) )
{
{
@ -151,24 +158,24 @@ namespace Avalonia.Platform
}
}
}
}
int i = 0 ;
var tempScreens = new List < TScreen > ( screens . Count ) ;
foreach ( var newScreenKey in screens )
foreach ( var newScreenKey in screens )
{
{
if ( _ allScreensByKey . TryGetValue ( newScreenKey , out var oldScreen ) )
if ( _ allScreensByKey . TryGetValue ( newScreenKey , out var oldScreen ) )
{
{
ScreenChanged ( oldScreen ) ;
ScreenChanged ( oldScreen ) ;
_ allScreens [ i ] = oldScreen ;
tempScreens . Add ( oldScreen ) ;
}
}
else
else
{
{
var newScreen = CreateScreenFromKey ( newScreenKey ) ;
var newScreen = CreateScreenFromKey ( newScreenKey ) ;
ScreenAdded ( newScreen ) ;
ScreenAdded ( newScreen ) ;
_ allScreensByKey [ newScreenKey ] = newScreen ;
_ allScreensByKey [ newScreenKey ] = newScreen ;
_ allScreens [ i ] = newScreen ;
tempScreens . Add ( newScreen ) ;
}
}
i + + ;
}
}
_ allScreens = tempScreens ;
}
}
}
}
}
}