DisplayTab: toggle ddcutil, disabled by default

This commit is contained in:
Ly-sec
2025-11-03 18:21:37 +01:00
parent 5cce13c730
commit 3ad7271871
10 changed files with 115 additions and 7 deletions
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "Mindesthelligkeit erzwingen (1%)",
"description": "Löst das Problem, dass die Hintergrundbeleuchtung auf einigen Displays bei 0% Helligkeit vollständig ausgeschaltet wird."
},
"external-brightness": {
"label": "Externe Helligkeitsunterstützung",
"description": "DDCUtil-Unterstützung zum Steuern der Helligkeit externer Displays über das DDC/CI-Protokoll aktivieren."
},
"brightness-unavailable": {
"ddc-disabled": "Helligkeitssteuerung nicht verfügbar. Aktivieren Sie \"Externe Helligkeitsunterstützung\", um die Helligkeit dieses Displays zu steuern.",
"generic": "Die Helligkeitssteuerung ist für dieses Display nicht verfügbar."
}
},
"night-light": {
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "Enforce minimum brightness (1%)",
"description": "Solves the problem of backlight completely turning off on some displays at 0% brightness."
},
"external-brightness": {
"label": "External brightness support",
"description": "Enable DDCUtil support for controlling brightness on external displays via DDC/CI protocol."
},
"brightness-unavailable": {
"ddc-disabled": "Brightness control unavailable. Enable \"External brightness support\" to control this display's brightness.",
"generic": "Brightness control is not available for this display."
}
},
"night-light": {
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "Forzar brillo mínimo (1%)",
"description": "Resuelve el problema de la retroiluminación que se apaga completamente en algunas pantallas al 0% de brillo."
},
"external-brightness": {
"label": "Soporte de brillo externo",
"description": "Habilitar soporte DDCUtil para controlar el brillo en pantallas externas mediante el protocolo DDC/CI."
},
"brightness-unavailable": {
"ddc-disabled": "Control de brillo no disponible. Habilita \"Soporte de brillo externo\" para controlar el brillo de esta pantalla.",
"generic": "El control de brillo no está disponible para esta pantalla."
}
},
"night-light": {
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "Imposer une luminosité minimale (1%)",
"description": "Résout le problème de l'extinction complète du rétroéclairage sur certains écrans à 0% de luminosité."
},
"external-brightness": {
"label": "Prise en charge de la luminosité externe",
"description": "Activer le support DDCUtil pour contrôler la luminosité des écrans externes via le protocole DDC/CI."
},
"brightness-unavailable": {
"ddc-disabled": "Contrôle de la luminosité indisponible. Activez \"Prise en charge de la luminosité externe\" pour contrôler la luminosité de cet écran.",
"generic": "Le contrôle de la luminosité n'est pas disponible pour cet écran."
}
},
"night-light": {
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "Forçar brilho mínimo (1%)",
"description": "Resolve o problema da retroiluminação apagar completamente em alguns monitores com brilho em 0%."
},
"external-brightness": {
"label": "Suporte de brilho externo",
"description": "Ativar suporte DDCUtil para controlar o brilho em monitores externos através do protocolo DDC/CI."
},
"brightness-unavailable": {
"ddc-disabled": "Controle de brilho indisponível. Ative \"Suporte de brilho externo\" para controlar o brilho desta tela.",
"generic": "O controle de brilho não está disponível para esta tela."
}
},
"night-light": {
+8
View File
@@ -166,6 +166,14 @@
"enforce-minimum": {
"label": "限制最小亮度为 1%",
"description": "解决亮度为 0% 时部分显示器背光完全关闭的问题。"
},
"external-brightness": {
"label": "外部亮度支持",
"description": "启用 DDCUtil 支持,通过 DDC/CI 协议控制外部显示器的亮度。"
},
"brightness-unavailable": {
"ddc-disabled": "亮度控制不可用。启用“外部亮度支持”以控制此显示器的亮度。",
"generic": "此显示器无法使用亮度控制。"
}
},
"night-light": {
+2 -1
View File
@@ -227,7 +227,8 @@
},
"brightness": {
"brightnessStep": 5,
"enforceMinimum": true
"enforceMinimum": true,
"enableDdcSupport": false
},
"colorSchemes": {
"useWallpaperColors": false,
+1
View File
@@ -370,6 +370,7 @@ Singleton {
property JsonObject brightness: JsonObject {
property int brightnessStep: 5
property bool enforceMinimum: true
property bool enableDdcSupport: false
}
property JsonObject colorSchemes: JsonObject {
+32 -3
View File
@@ -113,12 +113,17 @@ ColumnLayout {
to: 1
value: brightnessMonitor ? brightnessMonitor.brightness : 0.5
stepSize: 0.01
enabled: brightnessMonitor ? brightnessMonitor.brightnessControlAvailable : false
onMoved: value => {
if (brightnessMonitor.method === "internal") {
if (brightnessMonitor && brightnessMonitor.brightnessControlAvailable) {
brightnessMonitor.setBrightness(value)
}
}
onPressedChanged: (pressed, value) => brightnessMonitor.setBrightness(value)
onPressedChanged: (pressed, value) => {
if (brightnessMonitor && brightnessMonitor.brightnessControlAvailable) {
brightnessMonitor.setBrightness(value)
}
}
Layout.fillWidth: true
}
@@ -127,17 +132,29 @@ ColumnLayout {
Layout.preferredWidth: 55
horizontalAlignment: Text.AlignRight
Layout.alignment: Qt.AlignVCenter
opacity: brightnessMonitor && !brightnessMonitor.brightnessControlAvailable ? 0.5 : 1.0
}
Item {
Layout.preferredWidth: 30
Layout.fillHeight: true
NIcon {
icon: brightnessMonitor.method == "internal" ? "device-laptop" : "device-desktop"
icon: brightnessMonitor && brightnessMonitor.method == "internal" ? "device-laptop" : "device-desktop"
anchors.centerIn: parent
opacity: brightnessMonitor && !brightnessMonitor.brightnessControlAvailable ? 0.5 : 1.0
}
}
}
// Show message when brightness control is not available
NText {
visible: brightnessMonitor && !brightnessMonitor.brightnessControlAvailable
text: !Settings.data.brightness.enableDdcSupport ? I18n.tr("settings.display.monitors.brightness-unavailable.ddc-disabled") : I18n.tr("settings.display.monitors.brightness-unavailable.generic")
pointSize: Style.fontSizeS
color: Color.mOnSurfaceVariant
Layout.fillWidth: true
wrapMode: Text.WordWrap
}
}
}
}
@@ -163,6 +180,18 @@ ColumnLayout {
checked: Settings.data.brightness.enforceMinimum
onToggled: checked => Settings.data.brightness.enforceMinimum = checked
}
NToggle {
Layout.fillWidth: true
label: I18n.tr("settings.display.monitors.external-brightness.label")
description: I18n.tr("settings.display.monitors.external-brightness.description")
checked: Settings.data.brightness.enableDdcSupport
onToggled: checked => {
Settings.data.brightness.enableDdcSupport = checked
// DDC detection will run on next monitor change when enabled
// Monitors will stop using DDC immediately when disabled
}
}
}
NDivider {
+32 -3
View File
@@ -21,7 +21,7 @@ Singleton {
function getAvailableMethods(): list<string> {
var methods = []
if (monitors.some(m => m.isDdc))
if (Settings.data.brightness.enableDdcSupport && monitors.some(m => m.isDdc))
methods.push("ddcutil")
if (monitors.some(m => !m.isDdc))
methods.push("internal")
@@ -47,11 +47,30 @@ Singleton {
Component.onCompleted: {
Logger.i("Brightness", "Service started")
if (Settings.data.brightness.enableDdcSupport) {
ddcProc.running = true
}
}
onMonitorsChanged: {
ddcMonitors = []
ddcProc.running = true
if (Settings.data.brightness.enableDdcSupport) {
ddcProc.running = true
}
}
Connections {
target: Settings.data.brightness
function onEnableDdcSupportChanged() {
if (Settings.data.brightness.enableDdcSupport) {
// Re-detect DDC monitors when enabled
ddcMonitors = []
ddcProc.running = true
} else {
// Clear DDC monitors when disabled
ddcMonitors = []
}
}
}
Variants {
@@ -101,11 +120,21 @@ Singleton {
id: monitor
required property ShellScreen modelData
readonly property bool isDdc: root.ddcMonitors.some(m => m.model === modelData.model)
readonly property bool isDdc: Settings.data.brightness.enableDdcSupport && root.ddcMonitors.some(m => m.model === modelData.model)
readonly property string busNum: root.ddcMonitors.find(m => m.model === modelData.model)?.busNum ?? ""
readonly property bool isAppleDisplay: root.appleDisplayPresent && modelData.model.startsWith("StudioDisplay")
readonly property string method: isAppleDisplay ? "apple" : (isDdc ? "ddcutil" : "internal")
// Check if brightness control is available for this monitor
readonly property bool brightnessControlAvailable: {
if (isAppleDisplay)
return true
if (isDdc)
return true
// For internal displays, check if we have a brightness path
return brightnessPath !== ""
}
property real brightness
property real lastBrightness: 0
property real queuedBrightness: NaN