整合功能與 CLI

BetterDisplay 提供多種應用整合選項,包括命令列、自訂 URL Scheme、HTTP 介面、通知中心和 macOS 快捷指令。

本文基於應用版本 v4.1.5。
本文中描述的部分功能需要 Pro 許可證

啟用整合功能

整合功能可在 設定 > 應用程式 > 整合 下啟用(CLI 和基於通知的整合預設已啟用)。

整合設定
設定 > 應用程式 > 整合

控制整合

從應用版本 v3.5.3 開始,控制整合(透過腳本或網絡控制顯示器、接收器和其他裝置)也可以在特定顯示器/裝置下進行配置。以下是一些關於如何配置網絡控制的示例連結:

(注意:基於分佈式通知中心的控制整合也可用。)

概述與語法

應用支援以下整合方式:

各種整合方式可以在應用設定中單獨啟用和停用。

一個整合命令可以接收一個或多個操作以及零個或多個參數。參數可以有也可以沒有關聯的值。

命令列存取語法

./BetterDisplay operation [operation] [-parameter[=value]] [-parameter[=value]]

說明:

您也可以使用 betterdisplaycli 進行更簡便的存取。透過 Homebrew 安裝:

brew install waydabber/betterdisplay/betterdisplaycli

示例(兩個命令都將名為 MyDisplay 的顯示器亮度設定為 80%):

./BetterDisplay set -name=MyDisplay -brightness=0.8
betterdisplaycli set --name=MyDisplay --brightness=80%

自訂 URL Scheme 整合語法

BetterDisplay://operation[/operation (…)][?parameter[=value]][&parameter[=value]]

示例(原始 URL 和使用 open 命令的腳本存取,帶正確轉義):

BetterDisplay://set?name=MyDisplay&brightness=0.8
open BetterDisplay://set\?name=MyDisplay\&brightness=0.8

為保護存取安全,可以在設定中定義一個特殊令牌,然後必須透過 token= 參數包含在 URL 中。自訂 URL Scheme 整合支援 x-callback-url 來回報成功、錯誤和結果。更多資訊:x-callback-url.com/specification

HTTP 整合語法

http://<hostname>:55777/command/[command/][?parameter[=value]][&parameter[=value]]

示例(原始 URL 和使用 curl 命令的腳本存取,帶正確轉義):

http://localhost:55777/set?name=MyDisplay&brightness=0.8
curl http://localhost:55777/set\?name=MyDisplay\&brightness=0.8

監聽端口可在設定中自訂。以上示例使用 localhost 進行本地存取 — 遠端呼叫時請使用適當的主機名。為保護存取安全,可以在設定中定義一個特殊令牌,然後必須透過 token= 參數包含在 URL 中。

在 URL 中可以使用 %20 替代空格。

操作(Operations)

操作定義了命令的解釋方式。某些操作可以組合使用(例如 settoggleget 組合,同時設定和獲取值)。

參數(Parameters)

參數影響操作的執行方式。某些參數可以相互混合使用。參數可以有也可以沒有值。某些參數需要額外的參數才能運作。

裝置識別與裝置列表

設定或獲取值

呼叫應用功能的參數

亮度與音量控制

硬件顯示控制(DDC)

軟件圖像調整

顯示模式與解像度

HDR 與 XDR

色彩配置檔與連接模式

顯示器佈局與狀態

虛擬螢幕管理

串流與畫中畫(PIP)

顯示器保護設定

EDID 操作

幀緩衝色彩映射

資訊檢索

全域功能(非裝置特定)

顯示器組管理

DDC 直接存取參數

透過 CLI 直接存取 DDC

這可以作為 m1ddc 的替代方案(支援所有連接,包括 m1ddc 不支援的連接)。與 m1ddc 不同,DDC CLI 存取需要執行中的 BetterDisplay 進程。示例:

直接設定亮度:

curl http://localhost:55777/set\?namelike=gp27\&feature=ddc\&vcp=luminance\&value=50

使用不同風格(CLI 風格和十六進制數字):

./BetterDisplay set -namelike=gp27 -feature=ddc -vcp=0x10 -value=0x32

設定亮度值然後獲取目前值、最小值(始終為 0)和最大值:

curl http://localhost:55777/set/get\?namelike=16p-l\&feature=ddc\&vcp=luminance\&value=30\&min\&max

獲取亮度的目前值和最大值:

./BetterDisplay get -namelike=gp27 -feature=ddc -vcp=luminance -value -max

CLI 示例

與自訂控制互動(setgetfeedtoggleperform):

以下是包含各種 CLI 命令使用示例的討論和評論:

更改顯示模式:

色彩配置檔和 XDR 預設:

管理虛擬螢幕:

使用 -moveTo 移動顯示器(也可使用 -placement 指定座標)和配置鏡像:

配置顯示器保護設定:

配置 PIP 和串流:

EDID 操作:

配置連接色彩模式(Apple Silicon):

管理顯示器組:

管理 Sidecar:

透過安裝 betterdisplaycli 進行 CLI 存取

傳統 CLI 操作可以透過應用套件中嵌入的應用二進制檔案存取。如果應用安裝在 /Applications 下,可以使用絕對路徑。例如,以下命令將列印幫助資訊:

/Applications/BetterDisplay.app/Contents/MacOS/BetterDisplay help

為簡化 CLI 存取,您可以安裝 betterdisplaycli

betterdisplaycli help

該工具可透過以下方式安裝:

基於 DistributedNotificationCenter 的第三方應用整合

BetterDisplay 可以使用 macOS 通知分發系統與第三方應用整合。

向 BetterDisplay 發送請求

以下 Swift 結構體定義了發送給 BetterDisplay 的通知必須符合的 JSON 數據結構:

struct IntegrationNotificationRequestData: Codable {
  var uuid: String?
  var commands: [String] = []
  var parameters: [String: String?] = [:]
}

欄位說明

請求通知必須使用以下通知名稱發送:

com.betterdisplay.BetterDisplay.request

示例代碼

以下示例代碼演示如何請求 BetterDisplay 將所有已連接顯示器的亮度設定為 80%(0.8):

let integrationNotificationRequestData = IntegrationNotificationRequestData(
  uuid: UUID().uuidString,
  commands: ["set"],
  parameters: ["brightness": "0.8"]
)
do {
  let encoded = try JSONEncoder().encode(integrationNotificationRequestData)
  if let encodedString = String(data: encoded, encoding: .utf8) {
    DistributedNotificationCenter.default().postNotificationName(
      "com.betterdisplay.BetterDisplay.request",
      object: encodedString,
      userInfo: nil,
      deliverImmediately: true
    )
  }
} catch {}

接收 BetterDisplay 的回應

以下 Swift 結構體定義了 BetterDisplay 返回的回應 JSON 數據結構:

struct IntegrationNotificationResponseData: Codable {
  var uuid: String?
  var result: Bool?
  var payload: String?
}

欄位說明

所有欄位都是可選的。BetterDisplay 使用以下通知名稱發送回應:

com.betterdisplay.BetterDisplay.response

betterdisplaycli 代碼

請查看 betterdisplaycli,它是 BetterDisplay 的簡單 CLI 工具,其代碼也演示了如何使用通知分發進行應用整合。

OSD 通知分發整合

BetterDisplay 可以向第三方應用發送通知,這些應用可以使用此資訊來呈現替代的 OSD GUI。此功能已在 MediaMateDynamicLakePro(3.0 及更新版本)中實現。

該功能必須在 設定 > 應用程式 > 整合 下啟用才能運作:

OSD 通知整合設定
啟用 OSD 通知分發整合

開發者資訊

通知包含一個 JSON 文字數據,可以解碼為以下結構:

struct OsdNotification: Codable {
  var displayID: Int? = nil       // 應在哪個顯示器上顯示 OSD
  var systemIconID: Int? = nil    // 1 - 亮度, 3 - 音量, 4 - 靜音, 0 - 無圖示
  var customSymbol: String? = nil // 使用自訂圖示時的 SF Symbol 名稱
  var text: String? = nil         // OSD HUD 中顯示的附加文字
  var lock: Bool? = nil           // 同時顯示鎖定圖示
  var controlTarget: String? = nil // 控制類型的進一步描述
  var value: Double? = nil        // OSD 值(刻度:0 到最大值)
  var maxValue: Double? = nil     // 最大值
  var symbolFadeAfter: Int? = nil // 次要符號淡出時間(毫秒)
  var symbolSizeMultiplier: Double? = nil // 符號大小調整
  var textFadeAfter: Int? = nil   // 文字淡出時間(毫秒)
}

所有值都是可選的。如果同時添加了系統圖示和自訂符號,則自訂符號為次要符號。

controlTarget 目前可以有以下值,此資訊幫助呈現應用進一步自訂 OSD 外觀:

combinedBrightness / hardwareBrightness / softwareBrightness
volume / mute
hardwareContrast
redHardwareBlackLevel / greenHardwareBlackLevel / blueHardwareBlackLevel
redHardwareGain / greenHardwareGain / blueHardwareGain
gain / gamma / rGamma / gGamma / bGamma
temperature / contrast / blueLight / underscan

接收通知的方式很簡單,只需添加一個觀察者:

DistributedNotificationCenter.default.addObserver(
  self,
  selector: #selector(osdNotificationBetterDisplay),
  name: .init("com.betterdisplay.BetterDisplay.osd"),
  object: nil
)

@objc func integrationOsdNotification(notification: NSNotification) {
  guard let notificationString = notification.object as? String else { return }
  do {
    let osdNotification = try JSONDecoder().decode(
      OsdNotification.self,
      from: Data(notificationString.utf8)
    )
    // 處理 osdNotification
  } catch {}
}

更多注意事項:GitHub 討論

App Intents 支援(macOS 快捷指令)

應用還透過 App Intents 框架支援 macOS 快捷指令應用。請注意,並非所有操作都可作為 App Intents 使用 — 對於進階用戶,建議在快捷指令應用中使用 CLI。

一些透過終端機命令可存取的額外應用設定

隱藏 PIP 視窗調整大小百分比資訊:

defaults write pro.betterdisplay.BetterDisplay pipShowResizePercent NO

允許應用使用所有有效許可證啟用:

defaults write pro.betterdisplay.BetterDisplay disallowActivationWithOutdatedLicense NO

啟用 PIP 滑鼠游標自動跳轉:

defaults write pro.betterdisplay.BetterDisplay pipAutoWarp YES

啟用螢幕串流滑鼠游標自動跳轉:

defaults write pro.betterdisplay.BetterDisplay screenStreamAutoWarp YES

停用螢幕串流目標上的滑鼠光環(虛線圓圈):

defaults write pro.betterdisplay.BetterDisplay screenStreamMouseHalo NO

應用選單滑桿出現時添加動畫效果:

defaults write pro.betterdisplay.BetterDisplay sliderRevealAnimation YES