Restrict a Linux or Mac OS X app to only be able to open one instance at a time. (Currently per user)
This uses Unix sockets to ensure a single instance. There are other ways of doing this however this was the most "portable." For windows support cosnider adding: windows_single_instance
https://pub.dev/packages/unix_single_instance
- Add the
async
modifier to your appsmain
function. - Write a function
cmdProcessor(List<dynamic> decodedArgs)
which re-processes command line options - Add a call to
unixSingleInstance()
inside the appropriate conditions. Placement in the main function to taste.
If using flutter, recommend using this with the: window_manager
plugin
Currently it is on a per-user basis and ignores multiple displays. It could be greatly improved with options which allow you to toggle if it's per X, per user, etc. (If per X and per user and for linux only consider using dbus -- not a strong recommendation.)
import 'package:unix_single_instance/unix_single_instance.dart';
void main(List<String> args) async {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isLinux) {
if (!await unixSingleInstance(arguments, cmdProcessor)) {
exit(0);
return;
}
} else if (Platform.isMacOS) {
if (!await unixSingleInstance(arguments, cmdProcessor)) {
exit(0);
return;
}
}
runApp(const MyApp());
}
void cmdProcessor(List<dynamic> decodedArgs) {
if (decodedArgs.isEmpty && !Platform.isWindows) {
windowManager.waitUntilReadyToShow(null, () async {
await windowManager.show();
await windowManager.focus();
});
}
for (var each in decodedArgs) {
if (each is! String) {
continue;
}
doSomethingWithThis(each);
}
}