Skip to content

Commit 9e77c7e

Browse files
committed
fix: 修复换不同显示器后系统缩放未改变的问题。
接4k缩放到2.75倍后,拔掉再接1080p显示器,此时系统仍然为2.75倍缩放。切换显示器后,通过计算当前显示器最大缩放倍数a和当前系统缩放倍数b对比,a小于b则设置为当前显示器推荐的缩放值。 接多块不同显示器(最大缩放率不同),逻辑如上。 Log: 修复换不同显示器后系统缩放未改变的问题。 pms: BUG-306327
1 parent 0df8574 commit 9e77c7e

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

display1/handle_event.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ import (
1515
// 在 wayland 下,仅显示器属性改变。
1616
func (m *Manager) handleMonitorChanged(monitorInfo *MonitorInfo) {
1717
m.updateMonitor(monitorInfo)
18+
if monitorInfo.Enabled {
19+
m.tryToChangeScaleFactor(monitorInfo.Width, monitorInfo.Height)
20+
}
1821
if _useWayland {
1922
return
2023
}
@@ -54,6 +57,7 @@ func (m *Manager) handleMonitorAdded(monitorInfo *MonitorInfo) {
5457
}
5558
m.updatePropMonitors()
5659
m.updateMonitorsId(nil)
60+
m.tryToChangeScaleFactor(monitorInfo.Width, monitorInfo.Height)
5761
}
5862

5963
// wayland 下断开显示器

display1/manager.go

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"encoding/json"
99
"errors"
1010
"fmt"
11-
configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager"
1211
"math"
1312
"os"
1413
"os/exec"
@@ -19,11 +18,15 @@ import (
1918
"sync"
2019
"time"
2120

21+
configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager"
22+
2223
"github.com/davecgh/go-spew/spew"
2324
"github.com/godbus/dbus/v5"
2425
"github.com/linuxdeepin/dde-api/dxinput"
2526
dxutil "github.com/linuxdeepin/dde-api/dxinput/utils"
27+
"github.com/linuxdeepin/dde-daemon/common/scale"
2628
"github.com/linuxdeepin/dde-daemon/display1/brightness"
29+
xs "github.com/linuxdeepin/go-dbus-factory/session/org.deepin.dde.xsettings1"
2730
sysdisplay "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.display1"
2831
dgesture "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.gesture1"
2932
inputdevices "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.inputdevices1"
@@ -228,6 +231,8 @@ type Manager struct {
228231
ColorTemperatureManual int32
229232
CustomColorTempTimePeriod string
230233

234+
xsManager xs.XSettings
235+
231236
isVM bool
232237
}
233238

@@ -253,6 +258,9 @@ func newManager(service *dbusutil.Service) *Manager {
253258
},
254259
isVM: isVM,
255260
}
261+
if !_greeterMode {
262+
m.xsManager = xs.NewXSettings(m.service.Conn())
263+
}
256264
m.redshiftRunner.cb = func(value int) {
257265
m.setColorTempOneShot()
258266
}
@@ -3042,3 +3050,49 @@ func (m *Manager) detectDrmSupportGamma() bool {
30423050
}
30433051
return false
30443052
}
3053+
3054+
// 从控制中心迁移过来计算屏幕缩放范围。此函数返回屏幕最大的缩放值
3055+
func calcMaxScaleFactor(width, height uint16) float64 {
3056+
scaleFactors := []float64{1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0}
3057+
3058+
maxWScale := float64(width) / 1024.0
3059+
maxHScale := float64(height) / 768.0
3060+
3061+
maxValue := 0.0
3062+
if maxWScale < maxHScale {
3063+
maxValue = maxWScale
3064+
} else {
3065+
maxValue = maxHScale
3066+
}
3067+
3068+
if maxValue > 3.0 {
3069+
maxValue = 3.0
3070+
}
3071+
3072+
maxScale := 0.0
3073+
for idx := 0; (float64(idx)*0.25 + 1.0) <= maxValue; idx++ {
3074+
maxScale = scaleFactors[idx]
3075+
}
3076+
3077+
return maxScale
3078+
}
3079+
3080+
func (m *Manager) tryToChangeScaleFactor(monitorWidth, monitorHeight uint16) {
3081+
// x 下拔掉显示器会触发更新操作,高宽均为0
3082+
if monitorWidth == 0 || monitorHeight == 0 {
3083+
return
3084+
}
3085+
3086+
curScale, err := m.xsManager.GetScaleFactor(0)
3087+
if err != nil {
3088+
logger.Warning("failed to get scale factor:", err)
3089+
return
3090+
}
3091+
3092+
maxScale := calcMaxScaleFactor(monitorWidth, monitorHeight)
3093+
if curScale > maxScale && m.xsManager != nil {
3094+
recommendScaleFactor := scale.GetRecommendedScaleFactor(m.xConn)
3095+
// 更新scale factor
3096+
m.xsManager.SetScaleFactor(0, recommendScaleFactor)
3097+
}
3098+
}

0 commit comments

Comments
 (0)