From fdf769883dc388ed101258f0bee7ae4195162038 Mon Sep 17 00:00:00 2001 From: bbedward Date: Tue, 12 Aug 2025 21:28:14 -0400 Subject: [PATCH] Improve brightness device detection --- Modules/BrightnessPopup.qml | 29 ++++++++-- Modules/ControlCenter/DisplayTab.qml | 12 ++++ Services/BrightnessService.qml | 82 +++++++++++++++++++++++++--- 3 files changed, 110 insertions(+), 13 deletions(-) diff --git a/Modules/BrightnessPopup.qml b/Modules/BrightnessPopup.qml index 0157380c..c44849cf 100644 --- a/Modules/BrightnessPopup.qml +++ b/Modules/BrightnessPopup.qml @@ -20,12 +20,16 @@ PanelWindow { interval: BrightnessService.ddcAvailable ? 500 : 50 repeat: false onTriggered: { - BrightnessService.setBrightnessInternal(pendingValue) + BrightnessService.setBrightnessInternal(pendingValue, BrightnessService.lastIpcDevice) } } function show() { root.brightnessPopupVisible = true + // Update slider to current device brightness when showing + if (BrightnessService.brightnessAvailable) { + brightnessSlider.value = BrightnessService.brightnessLevel + } hideTimer.restart() } @@ -111,9 +115,20 @@ PanelWindow { DankIcon { anchors.centerIn: parent - name: BrightnessService.brightnessLevel - < 30 ? "brightness_low" : BrightnessService.brightnessLevel - < 70 ? "brightness_medium" : "brightness_high" + name: { + const deviceInfo = BrightnessService.getCurrentDeviceInfo(); + + if (!deviceInfo || deviceInfo.class === "backlight") { + // Display backlight + return "brightness_medium"; + } else if (deviceInfo.name.includes("kbd")) { + // Keyboard brightness + return "keyboard"; + } else { + // Other devices (LEDs, etc.) + return "lightbulb"; + } + } size: Theme.iconSize color: Theme.primary } @@ -145,7 +160,7 @@ PanelWindow { onSliderDragFinished: function (finalValue) { if (BrightnessService.brightnessAvailable) { brightnessDebounceTimer.stop() - BrightnessService.setBrightnessInternal(finalValue) + BrightnessService.setBrightnessInternal(finalValue, BrightnessService.lastIpcDevice) } } @@ -153,6 +168,10 @@ PanelWindow { function onBrightnessChanged() { brightnessSlider.value = BrightnessService.brightnessLevel } + + function onDeviceSwitched() { + brightnessSlider.value = BrightnessService.brightnessLevel + } target: BrightnessService } diff --git a/Modules/ControlCenter/DisplayTab.qml b/Modules/ControlCenter/DisplayTab.qml index 96323124..c9db5b71 100644 --- a/Modules/ControlCenter/DisplayTab.qml +++ b/Modules/ControlCenter/DisplayTab.qml @@ -102,6 +102,7 @@ Item { } DankSlider { + id: brightnessSlider width: parent.width value: BrightnessService.brightnessLevel leftIcon: "brightness_low" @@ -115,6 +116,17 @@ Item { brightnessDebounceTimer.stop(); BrightnessService.setBrightnessInternal(finalValue, BrightnessService.currentDevice); } + + Connections { + target: BrightnessService + function onBrightnessChanged() { + brightnessSlider.value = BrightnessService.brightnessLevel; + } + + function onDeviceSwitched() { + brightnessSlider.value = BrightnessService.brightnessLevel; + } + } } } diff --git a/Services/BrightnessService.qml b/Services/BrightnessService.qml index ad14b89c..eb4b0de5 100644 --- a/Services/BrightnessService.qml +++ b/Services/BrightnessService.qml @@ -9,16 +9,30 @@ Singleton { property bool brightnessAvailable: devices.length > 0 property var devices: [] + property var deviceBrightness: ({}) property string currentDevice: "" - property int brightnessLevel: 50 + property string lastIpcDevice: "" + property int brightnessLevel: { + const deviceToUse = lastIpcDevice === "" ? getDefaultDevice() : (lastIpcDevice || currentDevice); + return deviceToUse ? (deviceBrightness[deviceToUse] || 50) : 50; + } property int maxBrightness: 100 property bool brightnessInitialized: false signal brightnessChanged() + signal deviceSwitched() function setBrightnessInternal(percentage, device) { const clampedValue = Math.max(1, Math.min(100, percentage)); - brightnessLevel = clampedValue; + const actualDevice = device === "" ? getDefaultDevice() : (device || currentDevice || getDefaultDevice()); + + // Update the device brightness cache + if (actualDevice) { + var newBrightness = deviceBrightness; + newBrightness[actualDevice] = clampedValue; + deviceBrightness = newBrightness; + } + if (device) brightnessSetProcess.command = ["brightnessctl", "-d", device, "set", clampedValue + "%"]; else @@ -36,6 +50,8 @@ Singleton { return ; currentDevice = deviceName; + lastIpcDevice = deviceName; + deviceSwitched(); brightnessGetProcess.command = ["brightnessctl", "-m", "-d", deviceName, "get"]; brightnessGetProcess.running = true; } @@ -44,6 +60,33 @@ Singleton { deviceListProcess.running = true; } + function getDeviceBrightness(deviceName) { + return deviceBrightness[deviceName] || 50; + } + + function getDefaultDevice() { + // Find first backlight device + for (const device of devices) { + if (device.class === "backlight") { + return device.name; + } + } + // Fallback to first device if no backlight found + return devices.length > 0 ? devices[0].name : ""; + } + + function getCurrentDeviceInfo() { + const deviceToUse = lastIpcDevice === "" ? getDefaultDevice() : (lastIpcDevice || currentDevice); + if (!deviceToUse) return null; + + for (const device of devices) { + if (device.name === deviceToUse) { + return device; + } + } + return null; + } + Component.onCompleted: { refreshDevices(); } @@ -128,9 +171,18 @@ Singleton { const current = parseInt(parts[2]); const max = parseInt(parts[4]); maxBrightness = max; - brightnessLevel = Math.round((current / max) * 100); + const brightness = Math.round((current / max) * 100); + + // Update the device brightness cache + if (currentDevice) { + var newBrightness = deviceBrightness; + newBrightness[currentDevice] = brightness; + deviceBrightness = newBrightness; + } + brightnessInitialized = true; - console.log("BrightnessService: Device", currentDevice, "brightness:", brightnessLevel + "%"); + console.log("BrightnessService: Device", currentDevice, "brightness:", brightness + "%"); + brightnessChanged(); } } } @@ -146,6 +198,10 @@ Singleton { const value = parseInt(percentage); const clampedValue = Math.max(1, Math.min(100, value)); const targetDevice = device || ""; + root.lastIpcDevice = targetDevice; + if (targetDevice && targetDevice !== root.currentDevice) { + root.setCurrentDevice(targetDevice); + } root.setBrightness(clampedValue, targetDevice); if (targetDevice) return "Brightness set to " + clampedValue + "% on " + targetDevice; @@ -157,10 +213,15 @@ Singleton { if (!root.brightnessAvailable) return "Brightness control not available"; - const currentLevel = root.brightnessLevel; + const targetDevice = device || ""; + const actualDevice = targetDevice === "" ? root.getDefaultDevice() : targetDevice; + const currentLevel = actualDevice ? root.getDeviceBrightness(actualDevice) : root.brightnessLevel; const stepValue = parseInt(step || "10"); const newLevel = Math.max(1, Math.min(100, currentLevel + stepValue)); - const targetDevice = device || ""; + root.lastIpcDevice = targetDevice; + if (targetDevice && targetDevice !== root.currentDevice) { + root.setCurrentDevice(targetDevice); + } root.setBrightness(newLevel, targetDevice); if (targetDevice) return "Brightness increased to " + newLevel + "% on " + targetDevice; @@ -172,10 +233,15 @@ Singleton { if (!root.brightnessAvailable) return "Brightness control not available"; - const currentLevel = root.brightnessLevel; + const targetDevice = device || ""; + const actualDevice = targetDevice === "" ? root.getDefaultDevice() : targetDevice; + const currentLevel = actualDevice ? root.getDeviceBrightness(actualDevice) : root.brightnessLevel; const stepValue = parseInt(step || "10"); const newLevel = Math.max(1, Math.min(100, currentLevel - stepValue)); - const targetDevice = device || ""; + root.lastIpcDevice = targetDevice; + if (targetDevice && targetDevice !== root.currentDevice) { + root.setCurrentDevice(targetDevice); + } root.setBrightness(newLevel, targetDevice); if (targetDevice) return "Brightness decreased to " + newLevel + "% on " + targetDevice;