@@ -73,6 +73,7 @@ const (
7373 gsKeyRateFilter = "rate-filter"
7474 //gsKeyPrimary = "primary"
7575 gsXSettingsPrimaryName = "primary-monitor-name"
76+ gsXSettingsPrimaryRect = "primary-monitor-rect"
7677 gsKeyCustomMode = "current-custom-mode"
7778 gsKeyColorTemperatureMode = "color-temperature-mode"
7879 gsKeyColorTemperatureManual = "color-temperature-manual"
@@ -1002,45 +1003,75 @@ func (m *Manager) init() {
10021003 }
10031004
10041005 go func () {
1005- // 每次设置过主屏后 ,都将此值同步到xsettings
1006+ // 每次设置过主屏和其rect区域后 ,都将此值同步到xsettings
10061007 bus , _ := dbus .SessionBus ()
10071008 display := sessiondisplay .NewDisplay (bus )
10081009 sigLoop := dbusutil .NewSignalLoop (bus , 10 )
10091010 sigLoop .Start ()
10101011 display .InitSignalExt (sigLoop , true )
1012+
10111013 err = display .Primary ().ConnectChanged (func (hasValue bool , primary string ) {
10121014 if ! hasValue {
10131015 return
10141016 }
10151017
1016- // 保持主屏数据和xsettings同步
1017- for _ , key := range m .xSettingsGs .ListKeys () {
1018- if gsXSettingsPrimaryName == key {
1019- oldPrimary := m .xSettingsGs .GetString (gsXSettingsPrimaryName )
1020- if oldPrimary != primary {
1021- m .xSettingsGs .SetString (gsXSettingsPrimaryName , primary )
1022- }
1023- return
1018+ // 保持主屏Name和xsettings同步
1019+ if m .xSettingsGs .GetSchema ().HasKey (gsXSettingsPrimaryName ) {
1020+ oldPrimary := m .xSettingsGs .GetString (gsXSettingsPrimaryName )
1021+ if oldPrimary != primary {
1022+ m .xSettingsGs .SetString (gsXSettingsPrimaryName , primary )
10241023 }
1024+ return
10251025 }
10261026 })
10271027 if err != nil {
10281028 logger .Warning ("connect to `Primary` property changed failed:" , err )
10291029 }
10301030
1031- // 启动后先同步一次
1032- for _ , key := range m .xSettingsGs .ListKeys () {
1033- if gsXSettingsPrimaryName == key {
1034- oldPrimary := m .xSettingsGs .GetString (gsXSettingsPrimaryName )
1035- if oldPrimary != m .Primary {
1036- m .xSettingsGs .SetString (gsXSettingsPrimaryName , m .Primary )
1031+ err = display .PrimaryRect ().ConnectChanged (func (hasValue bool , rect sessiondisplay.Rectangle ) {
1032+ if ! hasValue {
1033+ return
1034+ }
1035+
1036+ // 保持主屏Rect和xsettings同步
1037+ if m .xSettingsGs .GetSchema ().HasKey (gsXSettingsPrimaryRect ) {
1038+ oldRect := m .xSettingsGs .GetString (gsXSettingsPrimaryRect )
1039+ if oldRect != rect2String (rect ) {
1040+ m .xSettingsGs .SetString (gsXSettingsPrimaryRect , rect2String (rect ))
10371041 }
10381042 return
10391043 }
1044+ })
1045+ if err != nil {
1046+ logger .Warning ("connect to `PrimaryRect` property changed failed:" , err )
1047+ }
1048+
1049+ // 启动后先同步一次
1050+ if m .xSettingsGs .GetSchema ().HasKey (gsXSettingsPrimaryName ) {
1051+ oldPrimary := m .xSettingsGs .GetString (gsXSettingsPrimaryName )
1052+ if oldPrimary != m .Primary {
1053+ m .xSettingsGs .SetString (gsXSettingsPrimaryName , m .Primary )
1054+ }
1055+ return
1056+ }
1057+ if m .xSettingsGs .GetSchema ().HasKey (gsXSettingsPrimaryRect ) {
1058+ oldRect := m .xSettingsGs .GetString (gsXSettingsPrimaryRect )
1059+ if oldRect != xrect2String (m .PrimaryRect ) {
1060+ m .xSettingsGs .SetString (gsXSettingsPrimaryRect , xrect2String (m .PrimaryRect ))
1061+ }
1062+ return
10401063 }
10411064 }()
10421065}
10431066
1067+ func xrect2String (rect x.Rectangle ) string {
1068+ return fmt .Sprintf ("%d-%d-%d-%d" , rect .X , rect .Y , rect .Width , rect .Height )
1069+ }
1070+
1071+ func rect2String (rect sessiondisplay.Rectangle ) string {
1072+ return fmt .Sprintf ("%d-%d-%d-%d" , rect .X , rect .Y , rect .Width , rect .Height )
1073+ }
1074+
10441075// calcRecommendedScaleFactor 计算推荐的缩放比
10451076func calcRecommendedScaleFactor (widthPx , heightPx , widthMm , heightMm float64 ) float64 {
10461077 if widthMm == 0 || heightMm == 0 {
0 commit comments