Files
clide/lib/kernel/src/os.dart
T
jpmschweitzerandClaude Opus 4.8 6d0ebab721 chore: adopt Dart 3.9 toolchain — honest floor + tall-style reformat (T-353)
Raise the declared minimums in pubspec.yaml to what our deps already
require: Flutter >=3.35.0 / Dart >=3.9.0 (was 3.19.0 / 3.5.0). alchemist
0.12 needs Flutter 3.32; Dart 3.9 first ships in Flutter 3.35, so 3.35 is
the binding floor. Pin the exact build toolchain in .fvmrc (Flutter
3.44.1).

Moving to the Dart 3.9 language level switches `dart format` to the new
"tall" style and enables two new lints. This commit is the resulting
mechanical churn, isolated from any behaviour change:
  - whole-tree `dart format` reformat (tall style)
  - `dart fix` for unnecessary_underscores + use_null_aware_elements

No runtime behaviour change; `make test` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 12:11:53 +02:00

71 lines
1.9 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:clide/kernel/src/events/bus.dart';
import 'package:clide/kernel/src/events/types.dart';
import 'package:clide/kernel/src/log.dart';
import 'package:flutter/foundation.dart';
class OsLifecycleEvent extends ClideEvent {
const OsLifecycleEvent(this._kind);
final String _kind;
@override
String get subsystem => 'os';
@override
String get kind => _kind;
}
class OsBridge {
OsBridge({required Logger log, required DaemonBus events}) : _log = log, _events = events;
final Logger _log;
final DaemonBus _events;
Future<bool> openURL(String url) async {
final cmd = _openCommand();
if (cmd == null) {
_log.warn('os', 'openURL unsupported on ${Platform.operatingSystem}');
return false;
}
try {
final r = await Process.run(cmd[0], [...cmd.skip(1), url]);
return r.exitCode == 0;
} catch (e) {
_log.warn('os', 'openURL failed', error: e);
return false;
}
}
Future<bool> reveal(String path) async {
final cmd = _revealCommand(path);
if (cmd == null) return false;
try {
final r = await Process.run(cmd[0], cmd.skip(1).toList());
return r.exitCode == 0;
} catch (e) {
_log.warn('os', 'reveal failed', error: e);
return false;
}
}
/// Fire an OS lifecycle event (called by the platform wiring).
@visibleForTesting
void fire(String kind) {
_events.emit(OsLifecycleEvent(kind));
}
static List<String>? _openCommand() {
if (Platform.isLinux) return ['xdg-open'];
if (Platform.isMacOS) return ['open'];
if (Platform.isWindows) return ['cmd', '/c', 'start', ''];
return null;
}
static List<String>? _revealCommand(String path) {
if (Platform.isLinux) return ['xdg-open', File(path).parent.path];
if (Platform.isMacOS) return ['open', '-R', path];
if (Platform.isWindows) return ['explorer', '/select,', path];
return null;
}
}