diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 366a7b6ba64..58ddc0cb05d 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -3713,14 +3713,54 @@ Widget loadPowered(BuildContext context) { ).marginOnly(top: 6); } -// max 300 x 60 -Widget loadLogo() { - return FutureBuilder( - future: rootBundle.load('assets/logo.png'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { +const _kDefaultLogoAsset = 'assets/logo.png'; +const _kLightLogoAsset = 'assets/logo_light.png'; +const _kDarkLogoAsset = 'assets/logo_dark.png'; + +List _logoAssetCandidatesForBrightness(Brightness brightness) { + return brightness == Brightness.dark + ? [_kDarkLogoAsset, _kDefaultLogoAsset] + : [_kLightLogoAsset, _kDefaultLogoAsset]; +} + +Future _resolveLogoAsset(Brightness brightness) async { + for (final asset in _logoAssetCandidatesForBrightness(brightness)) { + try { + await rootBundle.load(asset); + return asset; + } on FlutterError { + continue; + } + } + return null; +} + +class _Logo extends StatefulWidget { + const _Logo(); + + @override + State<_Logo> createState() => _LogoState(); +} + +class _LogoState extends State<_Logo> { + final Map> _logoFutures = {}; + + Future _logoFutureFor(Brightness brightness) { + return _logoFutures.putIfAbsent( + brightness, + () => _resolveLogoAsset(brightness), + ); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _logoFutureFor(Theme.of(context).brightness), + builder: (BuildContext context, AsyncSnapshot snapshot) { + final asset = snapshot.data; + if (asset != null) { final image = Image.asset( - 'assets/logo.png', + asset, fit: BoxFit.contain, errorBuilder: (ctx, error, stackTrace) { return Container(); @@ -3732,9 +3772,14 @@ Widget loadLogo() { ).marginOnly(left: 12, right: 12, top: 12); } return const Offstage(); - }); + }, + ); + } } +// max 300 x 60 +Widget loadLogo() => const _Logo(); + Widget loadIcon(double size) { return Image.asset('assets/icon.png', width: size, diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index b02ff48cad6..fc6ab341483 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1426,8 +1426,11 @@ impl Remote { self.handler.set_cursor_position(cp); } Some(message::Union::Clipboard(cb)) => { - let lc = self.handler.lc.read().unwrap(); - if !lc.disable_clipboard.v && !lc.view_only.v { + let clipboard_allowed = { + let lc = self.handler.lc.read().unwrap(); + !lc.disable_clipboard.v && !lc.view_only.v + }; + if clipboard_allowed { #[cfg(not(any(target_os = "android", target_os = "ios")))] update_clipboard(vec![cb], ClipboardSide::Client); #[cfg(target_os = "ios")] @@ -1446,8 +1449,11 @@ impl Remote { } } Some(message::Union::MultiClipboards(_mcb)) => { - let lc = self.handler.lc.read().unwrap(); - if !lc.disable_clipboard.v && !lc.view_only.v { + let clipboard_allowed = { + let lc = self.handler.lc.read().unwrap(); + !lc.disable_clipboard.v && !lc.view_only.v + }; + if clipboard_allowed { #[cfg(not(any(target_os = "android", target_os = "ios")))] update_clipboard(_mcb.clipboards, ClipboardSide::Client); #[cfg(target_os = "ios")]