Files

64 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'connect_screen.dart';
import 'rust/frb_generated.dart';
import 'theme.dart';
/// Entry point.
///
/// Before the first widget builds we initialise flutter_rust_bridge, which
/// loads the native `netdesk_frb` library (built from the Rust `netdesk-frb`
/// crate over `netdesk-core`). All session work — signaling, the transport,
/// input injection and the H.264 decode — runs behind that FFI layer; the Dart
/// side only paints frames and forwards input.
///
/// If the engine fails to load we still start the app, surfacing the error on
/// the connect screen instead of crashing to a black window.
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Behave like a true Android app: allow every orientation (tablets are used
// in landscape), and draw behind the system bars for an edge-to-edge look.
await SystemChrome.setPreferredOrientations(const [
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
String? initError;
try {
await RustLib.init();
} catch (e) {
initError = '$e';
}
runApp(NetDeskApp(initError: initError));
}
/// Root application widget.
///
/// NetDesk is Akronlogic's premium cross-platform remote-desktop client. This
/// Flutter layer is the touch-native front-end; it binds to the Rust
/// `netdesk-core` crate via flutter_rust_bridge to drive the whole session.
class NetDeskApp extends StatelessWidget {
const NetDeskApp({super.key, this.initError});
/// Non-null when the native engine could not be loaded at startup.
final String? initError;
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'NetDesk',
debugShowCheckedModeBanner: false,
theme: NetDeskTheme.dark,
darkTheme: NetDeskTheme.dark,
themeMode: ThemeMode.dark,
home: ConnectScreen(initError: initError),
);
}
}