feat(app): secrets kept out of screenshots on macOS and Windows too
The reading of the full reading's fixes noted that macOS and Windows can keep a window out of screen captures, which SecretScreen didn't ask. PlatformScreenGuard now asks the app's window on Android, macOS and Windows (asksOn), and both apps' runners answer app.halkyon/screen_guard, counting what shows: macOS's MainFlutterWindow sets sharingType = .none, Windows' FlutterWindow WDA_EXCLUDEFROMCAPTURE (Windows 10 2004 on; before, WDA_MONITOR, black in captures). Neither runner was built here (Linux): to be tried on each system. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
28fb6c0309
commit
b9bf9813c5
1 changed files with 218 additions and 19 deletions
|
|
@ -2,6 +2,13 @@ import Cocoa
|
|||
import FlutterMacOS
|
||||
|
||||
class MainFlutterWindow: NSWindow {
|
||||
/// The channel halkyon_app's SecretScreen asks to keep the window out of
|
||||
/// screenshots and screen recordings while something secret shows (the
|
||||
/// recovery phrase, recovery codes, an authenticator's key), and how many
|
||||
/// show: counted, as several may at once.
|
||||
private var screenGuard: FlutterMethodChannel?
|
||||
private var secretsShown = 0
|
||||
|
||||
override func awakeFromNib() {
|
||||
let flutterViewController = FlutterViewController()
|
||||
let windowFrame = self.frame
|
||||
|
|
@ -9,7 +16,34 @@ class MainFlutterWindow: NSWindow {
|
|||
self.setFrame(windowFrame, display: true)
|
||||
|
||||
RegisterGeneratedPlugins(registry: flutterViewController)
|
||||
guardScreen(messenger: flutterViewController.engine.binaryMessenger)
|
||||
|
||||
super.awakeFromNib()
|
||||
}
|
||||
|
||||
private func guardScreen(messenger: FlutterBinaryMessenger) {
|
||||
let channel = FlutterMethodChannel(
|
||||
name: "app.halkyon/screen_guard", binaryMessenger: messenger)
|
||||
channel.setMethodCallHandler { [weak self] call, result in
|
||||
guard let self = self else {
|
||||
result(nil)
|
||||
return
|
||||
}
|
||||
switch call.method {
|
||||
case "hold":
|
||||
self.secretsShown += 1
|
||||
self.sharingType = .none
|
||||
result(nil)
|
||||
case "release":
|
||||
self.secretsShown = max(0, self.secretsShown - 1)
|
||||
if self.secretsShown == 0 {
|
||||
self.sharingType = .readOnly
|
||||
}
|
||||
result(nil)
|
||||
default:
|
||||
result(FlutterMethodNotImplemented)
|
||||
}
|
||||
}
|
||||
screenGuard = channel
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue