Skip to content

Instantly share code, notes, and snippets.

@henrik

henrik/1-info.md

Last active May 8, 2021
Embed
What would you like to do?
Automatically launch Cuphead (from Steam) on a Mac when a Nimbus Bluetooth game controller is connected.

The only game I play on the Mac Mini connected to our TV is Cuphead.

I wanted the game to launch automatically when I turn on one of our Nimbus game controllers, which connect via Bluetooth.

This is how:

  • Save the .scpt file below as e.g. ~/Library/Scripts/LaunchCupheadIfControllerIsConnected.scpt
    • In the .scpt, change "Nimbus" if your Bluetooth game controllers have some other name.
  • Save the .plist below as e.g. ~/Library/LaunchAgents/henrik.launch_cuphead_if_controller_is_connected.plist
    • In the .plist, change media to whatever your username is.
  • Load the .plist as a launch agent with launchctl load ~/Library/LaunchAgents/henrik.launch_cuphead_if_controller_is_connected.plist

That should be it. When something changes about Bluetooth devices, the launch agent will trigger the script. The script checks if there is a connected device with "Nimbus" in its name (our controllers are named "Nimbus 1" and "Nimbus 2"). If so, it launches Cuphead if not already launched.

On the first run (possibly two runs?) you should get a macOS prompt to confirm permissions.

Works for me(tm) on macOS Mojave.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>henrik.launch_cuphead_if_controller_is_connected</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/osascript</string>
<string>/Users/media/Library/Scripts/LaunchCupheadIfControllerIsConnected.scpt</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/com.apple.Bluetooth.plist</string>
</array>
</dict>
</plist>
use framework "IOBluetooth"
use scripting additions -- https://stackoverflow.com/a/52806598/6962
on isDeviceConnected(substring)
repeat with device in (current application's IOBluetoothDevice's pairedDevices() as list)
if device's isConnected and (device's nameOrAddress as string) contains substring then return true
end repeat
return false
end isDeviceConnected
-- Nimbus game controller
if isDeviceConnected("Nimbus") then
tell application "System Events" to set cupheadIsRunning to ((name of processes) contains "Cuphead")
if not cupheadIsRunning then
-- Steam doesn't seem to like us opening Cuphead.app directly.
open location "steam://run/268910"
end if
end if
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment