[PR #1918] Add USB brightness control for older Apple displays #1334

Open
opened 2026-10-02 22:09:52 -06:00 by gitea-mirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/MonitorControl/MonitorControl/pull/1918
Author: @minimum91
Created: 9/26/2026
Status: 🔄 Open

Base: main ← Head: usb-apple-displays


📝 Commits (1)

  • 87bf5d2 Add USB brightness control for older Apple displays

📊 Changes

6 files changed (+162 additions, -5 deletions)

View changed files

📝 MonitorControl.xcodeproj/project.pbxproj (+4 -0)
📝 MonitorControl/Model/OtherDisplay.swift (+17 -1)
📝 MonitorControl/Support/AppDelegate.swift (+9 -4)
📝 MonitorControl/Support/DisplayManager.swift (+35 -0)
➕ MonitorControl/Support/USBDisplayControl.swift (+94 -0)
📝 MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift (+3 -0)

📄 Description

This adds hardware brightness control for older Apple displays that current macOS doesn't drive, such as the ADC Apple Studio and Cinema Displays. They don't support DDC, so today MonitorControl can only dim them in software.

These displays implement the USB Monitor Control class instead: brightness is a HID feature control (usage page 0x82, usage 0x10) on their USB connection. macOS's own AppleUSBDisplays driver controls later Apple displays this way, but it explicitly excludes the ADC-era product IDs (for example 0x9215 to 0x9219).

Changes

  • USBDisplayControl.swift (new): finds Apple USB monitors (vendor 0x05AC, usage page 0x80) that have a brightness control. It reads and writes that control through IOKit HID, on the usual 0–100 DDC scale.
  • DisplayManager.updateUSBDisplayControls(): pairs each Apple OtherDisplay with its USB connection.
    • It matches by EDID model number first, which is normally the USB product ID.
    • Otherwise, when exactly one display is left over, it gets the one USB display that isn't driven by AppleUSBDisplays.
    • It runs from configure() and after wake, next to updateArm64AVServices().
  • OtherDisplay: a display with a usbControl counts as hardware-controlled.
    • Brightness reads and writes go over USB instead of DDC.
    • Contrast and volume are marked unavailable, since these displays only offer brightness.
  • Settings: such displays show "Hardware (USB)".

Displays without such a USB connection behave exactly as before. Only Apple displays that already end up as OtherDisplay are considered; displays that macOS handles are skipped.

Testing

Tested on macOS 12 (Monterey) with two displays connected at the same time:

  • an Apple Studio Display 15" (ADC, 0x9215), connected through Apple's DVI to ADC adapter
  • an Apple Cinema HD Display (0x9221)

Results:

  • The Studio Display is controlled over USB. The menu slider, the brightness keys and the OSD all adjust its backlight.
  • The Cinema HD Display, which macOS drives natively, keeps working as before.

The other ADC models (Studio Display 17", Cinema Display 20" and 23") use the same USB protocol but haven't been tested.

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/MonitorControl/MonitorControl/pull/1918 **Author:** [@minimum91](https://github.com/minimum91) **Created:** 9/26/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `usb-apple-displays` --- ### 📝 Commits (1) - [`87bf5d2`](https://github.com/MonitorControl/MonitorControl/commit/87bf5d28a9fca8d2533e9022ac7f0d89018837fd) Add USB brightness control for older Apple displays ### 📊 Changes **6 files changed** (+162 additions, -5 deletions) <details> <summary>View changed files</summary> 📝 `MonitorControl.xcodeproj/project.pbxproj` (+4 -0) 📝 `MonitorControl/Model/OtherDisplay.swift` (+17 -1) 📝 `MonitorControl/Support/AppDelegate.swift` (+9 -4) 📝 `MonitorControl/Support/DisplayManager.swift` (+35 -0) ➕ `MonitorControl/Support/USBDisplayControl.swift` (+94 -0) 📝 `MonitorControl/View Controllers/Preferences/DisplaysPrefsViewController.swift` (+3 -0) </details> ### 📄 Description This adds hardware brightness control for older Apple displays that current macOS doesn't drive, such as the ADC Apple Studio and Cinema Displays. They don't support DDC, so today MonitorControl can only dim them in software. These displays implement the USB Monitor Control class instead: brightness is a HID feature control (usage page 0x82, usage 0x10) on their USB connection. macOS's own AppleUSBDisplays driver controls later Apple displays this way, but it explicitly excludes the ADC-era product IDs (for example 0x9215 to 0x9219). ## Changes - **`USBDisplayControl.swift`** (new): finds Apple USB monitors (vendor 0x05AC, usage page 0x80) that have a brightness control. It reads and writes that control through IOKit HID, on the usual 0–100 DDC scale. - **`DisplayManager.updateUSBDisplayControls()`**: pairs each Apple `OtherDisplay` with its USB connection. - It matches by EDID model number first, which is normally the USB product ID. - Otherwise, when exactly one display is left over, it gets the one USB display that isn't driven by AppleUSBDisplays. - It runs from `configure()` and after wake, next to `updateArm64AVServices()`. - **`OtherDisplay`**: a display with a `usbControl` counts as hardware-controlled. - Brightness reads and writes go over USB instead of DDC. - Contrast and volume are marked unavailable, since these displays only offer brightness. - **Settings**: such displays show "Hardware (USB)". Displays without such a USB connection behave exactly as before. Only Apple displays that already end up as `OtherDisplay` are considered; displays that macOS handles are skipped. ## Testing Tested on macOS 12 (Monterey) with two displays connected at the same time: - an Apple Studio Display 15" (ADC, 0x9215), connected through Apple's DVI to ADC adapter - an Apple Cinema HD Display (0x9221) Results: - The Studio Display is controlled over USB. The menu slider, the brightness keys and the OSD all adjust its backlight. - The Cinema HD Display, which macOS drives natively, keeps working as before. The other ADC models (Studio Display 17", Cinema Display 20" and 23") use the same USB protocol but haven't been tested. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
github-starred/MonitorControl#1334
No description provided.