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