diff --git a/display1/auto_brightness.go b/display1/auto_brightness.go index 7d748e9c9..f0d8756a7 100644 --- a/display1/auto_brightness.go +++ b/display1/auto_brightness.go @@ -254,6 +254,9 @@ func (abm *AutoBrightnessManager) Stop() error { atomic.StoreInt32(&abm.stopping, 1) abm.stopCompensationTimer() atomic.StoreInt32(&abm.stopping, 0) + + // 先取消正在进行的渐变,再恢复亮度 + abm.cancelOngoingTransition(abm.manager) abm.restoreSavedBrightness() if abm.sensorClient != nil { @@ -352,6 +355,8 @@ func (abm *AutoBrightnessManager) OnManualBrightnessChange() { manager := abm.manager abm.mutex.Unlock() logger.Info("[AutoBrightness] Manual brightness change detected, disabling auto brightness mode") + // 立即取消正在进行的渐变,防止渐变继续覆盖用户手动设置的亮度 + abm.cancelOngoingTransition(manager) // 异步保存配置并停止功能 go func() { err := abm.saveConfig() @@ -374,10 +379,14 @@ func (abm *AutoBrightnessManager) OnManualBrightnessChange() { abm.manualOverride = time.Now() overrideDuration := abm.config.ManualOverrideDuration sensorClient := abm.sensorClient + manager := abm.manager abm.mutex.Unlock() logger.Infof("[AutoBrightness] Manual brightness change detected, pausing auto adjustment for %d seconds", overrideDuration) + // 立即取消正在进行的渐变 + abm.cancelOngoingTransition(manager) + if sensorClient != nil && sensorClient.IsClaimed() { err := sensorClient.ReleaseLight() if err != nil { @@ -386,6 +395,18 @@ func (abm *AutoBrightnessManager) OnManualBrightnessChange() { } } +// cancelOngoingTransition 立即取消指定显示器上正在进行的渐变 +func (abm *AutoBrightnessManager) cancelOngoingTransition(manager *Manager) { + if manager == nil || manager.transitionManager == nil { + return + } + builtinMonitor := manager.getBuiltinMonitor() + if builtinMonitor == nil { + return + } + manager.transitionManager.StopMonitor(builtinMonitor.Name) +} + // resetHistoryState 重置历史状态,使下次能立即触发亮度调节 // 注意:此函数假设调用者已经持有锁 func (abm *AutoBrightnessManager) resetHistoryState() { @@ -594,11 +615,12 @@ func (abm *AutoBrightnessManager) onServiceChange(available bool) { func (abm *AutoBrightnessManager) onLightLevelChange(rawLightLevel int) { abm.mutex.Lock() running := abm.running + enabled := abm.config.Enabled inManualOverride := abm.isInManualOverride() abm.lastSensorDataTime = time.Now() abm.mutex.Unlock() - if !running || inManualOverride { + if !running || !enabled || inManualOverride { return } @@ -760,7 +782,7 @@ func (abm *AutoBrightnessManager) ensureSensorClaimed(sensorClient *SensorProxyC func (abm *AutoBrightnessManager) compensationTick() { abm.mutex.Lock() - if !abm.running { + if !abm.running || !abm.config.Enabled { abm.mutex.Unlock() return } diff --git a/display1/brightness.go b/display1/brightness.go index 14229ee56..6f63d2c48 100644 --- a/display1/brightness.go +++ b/display1/brightness.go @@ -294,6 +294,7 @@ func (m *Manager) setBrightnessAndSync(name string, value float64) error { } // setBrightnessWithTransition 使用渐变效果设置亮度(强制启用渐变) +// 亮度属性会在渐变过程中通过 onStepFunc 回调逐步更新,而非立即跳到目标值 func (m *Manager) setBrightnessWithTransition(name string, value float64) error { logger.Debug("Starting brightness setting with transition", name, value) monitors := m.getConnectedMonitors() @@ -322,8 +323,6 @@ func (m *Manager) setBrightnessWithTransition(name string, value float64) error } } - monitor.setPropBrightnessWithLock(value) - logger.Debug("end set brightness with transition", name, value) return nil diff --git a/display1/brightness/brightness_transition.go b/display1/brightness/brightness_transition.go index 452ccacab..3e0a61884 100644 --- a/display1/brightness/brightness_transition.go +++ b/display1/brightness/brightness_transition.go @@ -106,6 +106,9 @@ type TransitionExecutor struct { // 获取当前亮度百分比函数 getterFunc func() (float64, error) + // 每步回调(用于同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比) + onStepFunc func(monitorName string, percent float64) + // 配置参数 config TransitionConfig @@ -126,6 +129,13 @@ func NewTransitionExecutor(monitorName string, brightnessType BrightnessType, se } } +// SetOnStepFunc 设置每步回调(用于在过渡过程中同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比) +func (e *TransitionExecutor) SetOnStepFunc(fn func(monitorName string, percent float64)) { + e.mu.Lock() + defer e.mu.Unlock() + e.onStepFunc = fn +} + // SetBrightness 设置亮度(百分比,0.0 - 1.0) func (e *TransitionExecutor) SetBrightness(targetPercent float64) error { return e.SetBrightnessWithForce(targetPercent, false) @@ -281,11 +291,16 @@ func (e *TransitionExecutor) runTransition(task *transitionTask) { return } - // 更新实时值 + // 更新实时值并通知回调 e.mu.Lock() e.currentPercent = currentPercent + onStep := e.onStepFunc e.mu.Unlock() + if onStep != nil { + onStep(e.monitorName, currentPercent) + } + // 如果达到目标值,结束过渡 if abs(currentPercent-task.target) < epsilon { logger.Debugf("[%s] Transition completed: %.2f%% -> %.2f%%", e.monitorName, task.startValue*100, task.target*100) @@ -419,6 +434,9 @@ type TransitionManager struct { // 获取 Gamma 当前亮度的回调 getGammaFunc func(monitorName string) (float64, error) + + // 每步回调(用于同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比) + onStepFunc func(monitorName string, percent float64) } // NewTransitionManager 创建统一过渡管理器 @@ -439,6 +457,16 @@ func (m *TransitionManager) SetEnabled(enabled bool) { } } +// SetOnStepFunc 设置每步回调(用于在过渡过程中同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比) +func (m *TransitionManager) SetOnStepFunc(fn func(monitorName string, percent float64)) { + m.mu.Lock() + defer m.mu.Unlock() + m.onStepFunc = fn + for _, executor := range m.executors { + executor.SetOnStepFunc(fn) + } +} + // SetDuration 设置过渡时长(毫秒) func (m *TransitionManager) SetDuration(durationMs int) { m.mu.Lock() @@ -523,7 +551,12 @@ func (m *TransitionManager) SetBrightness(monitorName string, targetPercent floa m.mu.Lock() m.executors[monitorName] = executor + onStep := m.onStepFunc m.mu.Unlock() + + if onStep != nil { + executor.SetOnStepFunc(onStep) + } } return executor.SetBrightnessWithForce(targetPercent, forceTransition) @@ -589,6 +622,17 @@ func (m *TransitionManager) Stop() { } } +// StopMonitor 停止指定显示器的过渡 +func (m *TransitionManager) StopMonitor(monitorName string) { + m.mu.Lock() + executor, exists := m.executors[monitorName] + m.mu.Unlock() + + if exists { + executor.Stop() + } +} + // GetConfig 获取当前配置 func (m *TransitionManager) GetConfig() TransitionConfig { m.mu.Lock() diff --git a/display1/manager.go b/display1/manager.go index 2f50bc79c..32afb91e2 100644 --- a/display1/manager.go +++ b/display1/manager.go @@ -197,10 +197,10 @@ type Manager struct { debugOpts debugOptions redshiftRunner *redshiftRunner - sessionActive bool - sessionActiveMu sync.RWMutex - newSysCfg *SysRootConfig - cursorShowed bool + sessionActive bool + sessionActiveMu sync.RWMutex + newSysCfg *SysRootConfig + cursorShowed bool // dconfig com.deepin.Display displayConfigMgr configManager.Manager @@ -3716,6 +3716,14 @@ func (m *Manager) initTransitionManager() { }, ) + // 设置每步回调:在渐变过程中同步亮度属性到 D-Bus + m.transitionManager.SetOnStepFunc(func(monitorName string, percent float64) { + if m.builtinMonitor != nil && m.builtinMonitor.Name == monitorName { + m.builtinMonitor.setPropBrightnessWithLock(percent) + } + m.syncPropBrightness() + }) + logger.Infof("Unified transition manager initialized: enabled=%v, duration=%dms, stepPercent=%.2f%%, minInterval=%dms", m.transitionEnabled, m.transitionDuration, m.transitionStepPercent, m.transitionMinStepInterval) }