整合功能與 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