Created
March 3, 2018 21:59
-
-
Save anonymous/d493038526a497bea5fa23aa09c565c1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import AppKit | |
// https://stackoverflow.com/a/48486247 | |
func shell(_ launchPath: String, _ arguments: [String]) -> String { | |
let task = Process() | |
task.launchPath = launchPath | |
task.arguments = arguments | |
let pipe = Pipe() | |
task.standardOutput = pipe | |
task.launch() | |
let data = pipe.fileHandleForReading.readDataToEndOfFile() | |
let output = String(data: data, encoding: String.Encoding.utf8)! | |
if output.count > 0 { | |
// remove newline character. | |
let lastIndex = output.index(before: output.endIndex) | |
return String(output[output.startIndex ..< lastIndex]) | |
} | |
return output | |
} | |
func main(pattern: String, stop_on_launch: Bool = false) throws { | |
let workspace = NSWorkspace.shared | |
let regex = try NSRegularExpression(pattern: "^\(pattern)$") | |
let is_matching = { (app: NSRunningApplication) -> Bool in | |
let x = app.bundleIdentifier ?? "[no name]" | |
return regex.numberOfMatches(in: x, range: NSRange(x.startIndex..., in: x)) > 0 | |
} | |
// Set of applications to stop | |
var pids = Set( | |
workspace.runningApplications | |
.filter { is_matching($0) } | |
.map { $0.processIdentifier } | |
) | |
let resume_app = { (pid: pid_t) in | |
print("kill -CONT \(pid)") | |
shell("/bin/kill", ["-CONT", "\(pid)"]) | |
pids.insert(pid) | |
} | |
let stop_apps = { () in | |
pids.forEach { print("kill -STOP \($0)") } | |
pids.forEach { shell("/bin/kill", ["-STOP", "\($0)"]) } | |
pids.removeAll() | |
} | |
let token = workspace.observe(\.frontmostApplication) { workspace, _ in | |
guard let app = workspace.frontmostApplication else { | |
return | |
} | |
print("Switching to: \(app.bundleIdentifier ?? "") (pid: \(app.processIdentifier))") | |
if is_matching(app) { | |
resume_app(app.processIdentifier) | |
} else if (!pids.isEmpty) { | |
stop_apps() | |
} | |
} | |
if stop_on_launch { | |
stop_apps() | |
} | |
RunLoop.current.run( | |
mode: RunLoopMode.defaultRunLoopMode, | |
before: NSDate.distantFuture | |
) | |
} | |
do { | |
try main(pattern: CommandLine.arguments[1]) | |
} catch { | |
print("Invalid regexp pattern") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment