| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import 'dart:convert';
- import 'dart:io';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_acrylic/flutter_acrylic.dart';
- import 'package:flutter_pty/flutter_pty.dart';
- import 'package:xterm/xterm.dart';
- void main() {
- WidgetsFlutterBinding.ensureInitialized();
- if (isDesktop) {
- setupAcrylic();
- }
- runApp(MyApp());
- }
- bool get isDesktop {
- if (kIsWeb) return false;
- return [
- TargetPlatform.windows,
- TargetPlatform.linux,
- TargetPlatform.macOS,
- ].contains(defaultTargetPlatform);
- }
- Future<void> setupAcrylic() async {
- await Window.initialize();
- await Window.makeTitlebarTransparent();
- await Window.setEffect(effect: WindowEffect.aero);
- await Window.setBlurViewState(MacOSBlurViewState.active);
- }
- class MyApp extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- title: 'xterm.dart demo',
- debugShowCheckedModeBanner: false,
- home: MyHomePage(),
- );
- }
- }
- class MyHomePage extends StatefulWidget {
- MyHomePage({Key? key}) : super(key: key);
- @override
- // ignore: library_private_types_in_public_api
- _MyHomePageState createState() => _MyHomePageState();
- }
- class _MyHomePageState extends State<MyHomePage> {
- final terminal = Terminal(
- maxLines: 10000,
- );
- late final Pty pty;
- @override
- void initState() {
- super.initState();
- WidgetsBinding.instance.endOfFrame.then(
- (_) {
- if (mounted) _startPty();
- },
- );
- }
- void _startPty() {
- pty = Pty.start(
- shell,
- columns: terminal.viewWidth,
- rows: terminal.viewHeight,
- );
- pty.output
- .cast<List<int>>()
- .transform(Utf8Decoder())
- .listen(terminal.write);
- pty.exitCode.then((code) {
- terminal.write('the process exited with exit code $code');
- });
- terminal.onOutput = (data) {
- pty.write(const Utf8Encoder().convert(data));
- };
- terminal.onResize = (w, h, pw, ph) {
- pty.resize(h, w);
- };
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.transparent,
- body: SafeArea(
- child: TerminalView(
- terminal,
- backgroundOpacity: 0.8,
- ),
- ),
- );
- }
- }
- String get shell {
- if (Platform.isMacOS || Platform.isLinux) {
- return Platform.environment['SHELL'] ?? 'bash';
- }
- if (Platform.isWindows) {
- return 'cmd.exe';
- }
- return 'sh';
- }
|