Skip to content

Commit

Permalink
Update README.
Browse files Browse the repository at this point in the history
  • Loading branch information
cormiertyshawn895 committed Aug 14, 2024
1 parent 8bd43f0 commit f77b09e
Show file tree
Hide file tree
Showing 12 changed files with 87 additions and 25 deletions.
31 changes: 21 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
<a href="https://github.com/cormiertyshawn895/RecordingIndicatorUtility/releases/download/2.0/RecordingIndicatorUtility.2.0.zip" alt="Download Recording Indicator Utility"><img src="RecordingIndicatorUtility/Screenshots/icon.png" width="150" alt="Recording Indicator Utility App icon" align="left"/></a>
### You may not need Recording Indicator Utility

<div>
<h2>Recording Indicator Utility</h2>
<p>In macOS Sonoma 14.4 or later, you can hide the recording indicator on external displays without using Recording Indicator Utility. <a href="https://support.apple.com/118449">Learn more ↗</a></p>
<p>Recording Indicator Utility lets you turn off the <a href="https://twitter.com/applesupport/status/1454202118336811015">orange microphone recording indicator light</a>, making it ideal for professionals who <a href="https://cdm.link/2021/12/apple-added-an-orange-dot-thats-a-showstopper-for-live-visuals-and-it-needs-a-fix/">run live events</a>, <a href="https://telestreamforum.forumbee.com/t/x2hgw5f/orange-dot-on-imac-screen-when-screenflow-is-recording">record screencasts</a>, or use a <a href="https://www.globaldelight.com/faq/boom3dmac">system-wide volume equalizer</a>. Recording Indicator Utility supports <a href="https://apps.apple.com/app/macos-sonoma/id6450717509">macOS Sonoma</a>, <a href="https://apps.apple.com/app/macos-ventura/id1638787999">macOS Ventura</a> and <a href="https://apps.apple.com/app/macos-monterey/id1576738294">macOS Monterey</a>.</p>
You can follow these steps to [hide the recording indicator on external displays](https://support.apple.com/118449) without using Recording Indicator Utility.

1. [Update to the latest version of macOS](https://support.apple.com/en-us/108382).
1. Start up from macOS Recovery. [Instructions for Mac with Apple silicon](https://support.apple.com/guide/mac-help/mchl82829c17/mac#mchl5abfbb29). [Instructions for Intel-based Mac](https://support.apple.com/guide/mac-help/mchl338cf9a8#mchl69906860).
1. From the Utilities menu in the menu bar, choose Terminal.
1. Enter this command: `system-override suppress-sw-camera-indication-on-external-displays=on`
1. Quit Terminal.
1. From the Apple menu, choose Restart.
1. After your Mac restarts, choose Apple menu  > System Settings, then click Privacy & Security in the sidebar.
1. Click Microphone (or Camera).
1. Turn off Privacy Indicators for Microphone (or Camera) Access.


---

### Downloading Recording Indicator Utility

<p>You can use Recording Indicator Utility to turn off the recording indicator on the primary display and external displays not in full screen. This is ideal for professionals who <a href="https://cdm.link/2021/12/apple-added-an-orange-dot-thats-a-showstopper-for-live-visuals-and-it-needs-a-fix/">run live events</a>, <a href="https://telestreamforum.forumbee.com/t/x2hgw5f/orange-dot-on-imac-screen-when-screenflow-is-recording">record screencasts</a>, or use a <a href="https://www.globaldelight.com/faq/boom3dmac">system-wide volume equalizer</a>.</p>

</div>

<p align="center">
<a href="https://github.com/cormiertyshawn895/RecordingIndicatorUtility/releases/download/2.0/RecordingIndicatorUtility.2.0.zip" alt="Download Recording Indicator Utility"><img width="362" src="RecordingIndicatorUtility/Screenshots/resources/download-button.png" alt="Download Recording Indicator Utility"></a>
Expand All @@ -22,12 +35,10 @@

After downloading Recording Indicator Utility, double click to open it. macOS may prompt you “Recording Indicator Utility cannot be opened because it is from an unidentified developer.” This is expected.

To open Recording Indicator Utility, [right-click](https://support.apple.com/HT207700) on Recording Indicator Utility in Finder, and click “Open” as shown below.
To open Recording Indicator Utility, navigate to System Settings > Privacy & Security, then scroll down and click [“Open Anyway”](https://support.apple.com/102445#openanyway).

![](RecordingIndicatorUtility/Screenshots/screenshot-gatekeeper.jpg)

If you right-clicked when opening Recording Indicator Utility for the first time, you may need to [right-click](https://support.apple.com/HT207700) for a second time. If Recording Indicator Utility still can’t be opened, [check your GateKeeper settings](https://support.apple.com/en-us/HT202491) under the General tab in System Preferences > Security & Privacy. Click “Open Anyway” to open Recording Indicator Utility.

Recording Indicator Utility will not harm your Mac. This alert shows up because Recording Indicator Utility modifies macOS and cannot be notarized. Recording Indicator Utility is [open source](https://github.com/cormiertyshawn895/RecordingIndicatorUtility), so you can always [examine its source code](https://github.com/cormiertyshawn895/RecordingIndicatorUtility/tree/master/RecordingIndicatorUtility) to verify its inner working.

---
Expand Down Expand Up @@ -69,7 +80,7 @@ Open Recording Indicator Utility, turn on the recording indicator, then click
No. Your admin password is required before Recording Indicator Utility can make any changes. Recording Indicator Utility is designed to support professionals who [run live events](https://cdm.link/2021/12/apple-added-an-orange-dot-thats-a-showstopper-for-live-visuals-and-it-needs-a-fix/), [record screencasts](https://telestreamforum.forumbee.com/t/x2hgw5f/orange-dot-on-imac-screen-when-screenflow-is-recording), or use a [system-wide volume equalizer](https://www.globaldelight.com/faq/boom3dmac).

#### How does Recording Indicator Utility differ from undot and YellowDot?
Recording Indicator Utility supports the latest version of [macOS Sonoma](https://apps.apple.com/app/macos-sonoma/id6450717509), [macOS Ventura](https://apps.apple.com/app/macos-ventura/id1638787999) and [macOS Monterey](https://apps.apple.com/app/macos-monterey/id1576738294). It requires adjusting security settings.
Recording Indicator Utility supports the latest version of macOS, but requires adjusting security settings.

[undot](https://github.com/s4y/undot) and [YellowDot](https://lowtechguys.com/yellowdot/) only support macOS 12.1 and earlier, allow you to turn off the recording indicator in full-screen apps, and do not require adjusting security settings.

Expand Down
4 changes: 2 additions & 2 deletions Recording Indicator Utility.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = RecordingIndicatorUtility/RecordingIndicatorUtility.entitlements;
CODE_SIGN_IDENTITY = "-";
CURRENT_PROJECT_VERSION = 14;
CURRENT_PROJECT_VERSION = 16;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Recording Indicator Utility";
Expand Down Expand Up @@ -457,7 +457,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = RecordingIndicatorUtility/RecordingIndicatorUtility.entitlements;
CODE_SIGN_IDENTITY = "-";
CURRENT_PROJECT_VERSION = 14;
CURRENT_PROJECT_VERSION = 16;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Recording Indicator Utility";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "cp -R &quot;$SRCROOT/RecordingIndicatorUtility/Supplemental/What to do if Recording Indicator Utility can&#x2019;t be opened.pdf&quot; &quot;$ARCHIVE_PATH/Products/Applications&quot;&#10;mv &quot;$ARCHIVE_PATH/Products/Applications/$PRODUCT_NAME.app&quot; &quot;$ARCHIVE_PATH/Products/Applications/Recording Indicator Utility (right click to open).app&quot;&#10;MARKETING_FOLDER=&quot;$PRODUCT_NAME $MARKETING_VERSION&quot;&#10;MARKETING_PATH=&quot;$ARCHIVE_PATH/Products/$MARKETING_FOLDER&quot;&#10;mv &quot;$ARCHIVE_PATH/Products/Applications&quot; &quot;$MARKETING_PATH&quot;&#10;&#10;">
scriptText = "cp -R &quot;$SRCROOT/RecordingIndicatorUtility/Supplemental/Help.webloc&quot; &quot;$ARCHIVE_PATH/Products/Applications&quot;&#10;MARKETING_FOLDER=&quot;$PRODUCT_NAME $MARKETING_VERSION&quot;&#10;MARKETING_PATH=&quot;$ARCHIVE_PATH/Products/$MARKETING_FOLDER&quot;&#10;mv &quot;$ARCHIVE_PATH/Products/Applications&quot; &quot;$MARKETING_PATH&quot;&#10;&#10;">
<EnvironmentBuildable>
<BuildableReference
BuildableIdentifier = "primary"
Expand Down
13 changes: 12 additions & 1 deletion RecordingIndicatorUtility/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,13 @@ CA
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Show system-override Instructions" id="PE7-gb-7lT">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showSystemOverrideInstructions:" target="Voe-Tx-rLC" id="bSq-6Y-n94"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="fcF-X2-Thh"/>
<menuItem title="Check for Updates..." id="914-zk-pyf">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
Expand Down Expand Up @@ -430,7 +437,11 @@ CA
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Recording_Indicator_Utility" customModuleProvider="target"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Recording_Indicator_Utility" customModuleProvider="target">
<connections>
<outlet property="showSystemOverrideMenuItem" destination="PE7-gb-7lT" id="Tbe-F3-lrt"/>
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
Expand Down
41 changes: 35 additions & 6 deletions RecordingIndicatorUtility/Core/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,16 @@ import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
var shouldPreventClosing = false
@IBOutlet weak var showSystemOverrideMenuItem: NSMenuItem!

func applicationDidFinishLaunching(_ aNotification: Notification) {
NSApp.activate(ignoringOtherApps: true)
if (!osAtLeastSonomaE) {
showSystemOverrideMenuItem.isHidden = true
}
if (osAtLeastSonomaE && !UserDefaults.standard.bool(forKey: "AcknowledgedSystemOverrideAlert") && SystemInformation.shared.isSystemstatusdLoaded) {
self.showSystemOverrideInstructions(self)
}
}

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
Expand All @@ -35,7 +42,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
text: SystemInformation.shared.newVersionChangelog ?? "A newer version of Recording Indicator Utility is available.",
firstButtonText: "Download",
secondButtonText: "Learn More...",
thirdButtonText: "Cancel") { (response) in
thirdButtonText: "Cancel") { (response, isChecked) in
if (response == .alertFirstButtonReturn) {
AppDelegate.current.safelyOpenURL(SystemInformation.shared.latestZIP)
} else if (response == .alertSecondButtonReturn) {
Expand All @@ -47,14 +54,31 @@ class AppDelegate: NSObject, NSApplicationDelegate {
text:"",
firstButtonText: "OK",
secondButtonText: "View Release Page...",
thirdButtonText: "") { (response) in
thirdButtonText: "") { (response, isChecked) in
if (response == .alertSecondButtonReturn) {
AppDelegate.current.safelyOpenURL(SystemInformation.shared.releasePage)
}
}
}
}

@IBAction func showSystemOverrideInstructions(_ sender: Any) {
UserDefaults.standard.setValue(nil, forKey: "AcknowledgedSystemOverrideAlert")
AppDelegate.showOptionSheet(title: "You can hide the recording indicator on external displays without using Recording Indicator Utility.",
text: "Start up from macOS Recovery, and enter this command in Terminal:\n\nsystem-override suppress-sw-camera-indication-on-external-displays=on\n\nRestart, then open System Settings > Privacy & Security > Microphone, and turn off Privacy Indicators.",
firstButtonText: "Learn More…",
secondButtonText: " Continue ",
thirdButtonText: "",
checkboxText: "Don’t show this message again") { (response, isChecked) in
if (response == .alertFirstButtonReturn) {
AppDelegate.current.safelyOpenURL("https://support.apple.com/118449")
}
if (isChecked == true) {
UserDefaults.standard.setValue(true, forKey: "AcknowledgedSystemOverrideAlert")
}
}
}

@IBAction func checkForUpdates(_ sender: Any? = nil) {
SystemInformation.shared.checkForConfigurationUpdates()
if (SystemInformation.shared.hasNewerVersion == true) {
Expand All @@ -81,7 +105,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}

@IBAction func issueTracker(_ sender: Any) {
self.safelyOpenURL("https://github.com/cormiertyshawn895/RecordingIndicatorUtility/issues")
self.safelyOpenURL("https://github.com/cormiertyshawn895/RecordingIndicatorUtility/issues?q=")
}

static var current: AppDelegate {
Expand All @@ -94,12 +118,17 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
}

static func showOptionSheet(title: String, text: String, firstButtonText: String, secondButtonText: String, thirdButtonText: String, prefersKeyWindow: Bool = false, callback: @escaping ((_ response: NSApplication.ModalResponse)-> ())) {
static func showOptionSheet(title: String, text: String, firstButtonText: String, secondButtonText: String, thirdButtonText: String, checkboxText: String? = nil, prefersKeyWindow: Bool = false, callback: @escaping ((_ response: NSApplication.ModalResponse, _ isChecked: Bool?)-> ())) {
let alert = NSAlert()
alert.messageText = title
alert.informativeText = text
alert.alertStyle = NSAlert.Style.informational
alert.addButton(withTitle: firstButtonText)
var checkbox: NSButton?
if let checkboxText = checkboxText {
checkbox = NSButton(checkboxWithTitle: checkboxText, target: nil, action: nil)
alert.accessoryView = checkbox
}
if secondButtonText.count > 0 {
alert.addButton(withTitle: secondButtonText)
}
Expand All @@ -108,11 +137,11 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
if let window = prefersKeyWindow ? NSApp.keyWindow : self.appWindow {
alert.beginSheetModal(for: window) { (response) in
callback(response)
callback(response, checkbox?.state == .on)
}
} else {
let response = alert.runModal()
callback(response)
callback(response, checkbox?.state == .on)
}
}

Expand Down
3 changes: 3 additions & 0 deletions RecordingIndicatorUtility/Extensions/Process-Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

import Foundation

private let processInfo = ProcessInfo()
let osAtLeastSonomaE = processInfo.isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 14, minorVersion: 4, patchVersion: 0))

extension Process {
static func runNonAdminTask(toolPath: String, arguments: [String], attemptInteractive: String? = nil) -> String {
let task = Process()
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions RecordingIndicatorUtility/Supplemental/Help.webloc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?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>URL</key>
<string>https://support.apple.com/102445#openanyway</string>
</dict>
</plist>
Binary file not shown.
Binary file not shown.
4 changes: 2 additions & 2 deletions RecordingIndicatorUtility/Support/SupportPath.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
<plist version="1.0">
<dict>
<key>NewVersionVisibleTitle</key>
<string>Recording Indicator Utility 2.0 (Build 14) contains compatibility improvements.</string>
<string>Recording Indicator Utility 2.0 (Build 16) contains compatibility improvements.</string>
<key>NewVersionChangelog</key>
<string>• Improves compatibility with macOS
</string>
<key>LatestZIP</key>
<string>https://github.com/cormiertyshawn895/RecordingIndicatorUtility/releases/download/2.0/RecordingIndicatorUtility.2.0.zip</string>
<key>LatestBuildNumber</key>
<integer>14</integer>
<integer>16</integer>
<key>SupportPathURL</key>
<string>https://raw.githubusercontent.com/cormiertyshawn895/RecordingIndicatorUtility/master/RecordingIndicatorUtility/Support/SupportPath.plist</string>
<key>ReleasePage</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class ViewController: NSViewController {
text: "This version of Recording Indicator Utility is only designed and tested for macOS Ventura and macOS Monterey, and does not support macOS \(osFullVersion.majorVersion).",
firstButtonText: "Check for Updates",
secondButtonText: "Continue Anyway",
thirdButtonText: "Quit") { (response) in
thirdButtonText: "Quit") { (response, isChecked) in
if (response == .alertFirstButtonReturn) {
AppDelegate.current.checkForUpdates()
} else if (response == .alertSecondButtonReturn) {
Expand Down Expand Up @@ -152,7 +152,7 @@ class ViewController: NSViewController {
self.waitingForRestart = SystemInformation.shared.lastSystemBootTime
self.updateUI()
let title = loaded ? "Turning on the recording indicator light requires a restart to take effect." : "Turning off the recording indicator light requires a restart to take effect."
AppDelegate.showOptionSheet(title: title, text: "Do you want to restart now?", firstButtonText: "Restart Now", secondButtonText: "Not Now", thirdButtonText: "") { response in
AppDelegate.showOptionSheet(title: title, text: "Do you want to restart now?", firstButtonText: "Restart Now", secondButtonText: "Not Now", thirdButtonText: "") { response, isChecked in
if (response == .alertFirstButtonReturn) {
self.performReboot()
}
Expand Down Expand Up @@ -231,7 +231,7 @@ class ViewController: NSViewController {
return
}

AppDelegate.showOptionSheet(title: "Would you like to raise security settings?", text: "This will re-enable System Integrity Protection. Your Mac will automatically restart afterwards.", firstButtonText: "Continue and Restart", secondButtonText: "Cancel", thirdButtonText: "") { response in
AppDelegate.showOptionSheet(title: "Would you like to raise security settings?", text: "This will re-enable System Integrity Protection. Your Mac will automatically restart afterwards.", firstButtonText: "Continue and Restart", secondButtonText: "Cancel", thirdButtonText: "") { response, isChecked in
if (response == .alertFirstButtonReturn) {
self.applyRaisedSecuritySettings()
}
Expand Down

0 comments on commit f77b09e

Please sign in to comment.