Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions display1/auto_brightness.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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()
Expand All @@ -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 {
Expand All @@ -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() {
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
}
Expand Down
3 changes: 1 addition & 2 deletions display1/brightness.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand Down
46 changes: 45 additions & 1 deletion display1/brightness/brightness_transition.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ type TransitionExecutor struct {
// 获取当前亮度百分比函数
getterFunc func() (float64, error)

// 每步回调(用于同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比)
onStepFunc func(monitorName string, percent float64)

// 配置参数
config TransitionConfig

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -419,6 +434,9 @@ type TransitionManager struct {

// 获取 Gamma 当前亮度的回调
getGammaFunc func(monitorName string) (float64, error)

// 每步回调(用于同步亮度属性到 D-Bus),参数为(显示器名称, 当前亮度百分比)
onStepFunc func(monitorName string, percent float64)
}

// NewTransitionManager 创建统一过渡管理器
Expand All @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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()
Expand Down
16 changes: 12 additions & 4 deletions display1/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Expand Down
Loading