Skip to content

Commit e1d25fa

Browse files
dengbo11deepin-bot[bot]
authored andcommitted
fix: wayland下切换电源屏幕不能点亮
当监听到有鼠标或者键盘按键事件,进行系统唤醒处理(HandleIdleOff),该操作统一放到电源模块处理 Log: 修复wayland下切换电源屏幕不能点亮的问题 Bug: https://pms.uniontech.com/bug-view-158673.html https://pms.uniontech.com/bug-view-170613.html Influence: 系统正常唤醒(屏幕正常点亮和关闭) Change-Id: I9ac4c89d4dc55c61c280ce06b0e4e852973e2140
1 parent 92df479 commit e1d25fa

File tree

4 files changed

+158
-110
lines changed

4 files changed

+158
-110
lines changed

keybinding/manager.go

Lines changed: 4 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ type Manager struct {
9797

9898
enableListenGSettings bool
9999
delayNetworkStateChange bool
100-
dpmsIsOff bool
101100
clickNum uint32
102101
shortcutCmd string
103102
shortcutKey string
@@ -230,7 +229,6 @@ func (m *Manager) init() {
230229
sessionBus := m.service.Conn()
231230
sysBus, _ := dbus.SystemBus()
232231
m.delayNetworkStateChange = true
233-
m.dpmsIsOff = false
234232

235233
// init settings
236234
m.gsSystem = gio.NewSettings(gsSchemaSystem)
@@ -329,7 +327,6 @@ func (m *Manager) init() {
329327

330328
go m.listenGlobalAccel(sessionBus)
331329
go m.listenKeyboardEvent(sysBus)
332-
go m.listenMouseEvent(sysBus)
333330
}
334331
}
335332

@@ -469,49 +466,6 @@ func (m *Manager) listenGlobalAccel(sessionBus *dbus.Conn) error {
469466
}
470467
})
471468

472-
//+ 监控鼠标移动事件
473-
err = sessionBus.Object("com.deepin.daemon.KWayland",
474-
"/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "CursorMove").Err
475-
if err != nil {
476-
logger.Warning(err)
477-
return err
478-
}
479-
m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{
480-
Name: "com.deepin.daemon.KWayland.Output.CursorMove",
481-
}, func(sig *dbus.Signal) {
482-
if len(sig.Body) > 1 {
483-
if m.dpmsIsOff {
484-
err := exec.Command("dde_wldpms", "-s", "On").Run()
485-
if err != nil {
486-
logger.Warningf("failed to exec dde_wldpms: %s", err)
487-
} else {
488-
m.dpmsIsOff = false
489-
}
490-
}
491-
}
492-
})
493-
494-
//+ 监控鼠标按下事件
495-
err = sessionBus.Object("com.deepin.daemon.KWayland",
496-
"/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "ButtonPress").Err
497-
if err != nil {
498-
logger.Warning(err)
499-
return err
500-
}
501-
m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{
502-
Name: "com.deepin.daemon.KWayland.Output.ButtonPress",
503-
}, func(sig *dbus.Signal) {
504-
if len(sig.Body) > 1 {
505-
if m.dpmsIsOff {
506-
err := exec.Command("dde_wldpms", "-s", "On").Run()
507-
if err != nil {
508-
logger.Warningf("failed to exec dde_wldpms: %s", err)
509-
} else {
510-
m.dpmsIsOff = false
511-
}
512-
}
513-
}
514-
})
515469
return nil
516470
}
517471

@@ -528,23 +482,11 @@ func (m *Manager) listenKeyboardEvent(systemBus *dbus.Conn) error {
528482
if len(sig.Body) > 1 {
529483
key := sig.Body[0].(uint32)
530484
value := sig.Body[1].(uint32)
531-
//+ 短按电源键同时出发kwin快捷键逻辑和libinput逻辑有冲突,先屏蔽
532-
if m.dpmsIsOff && value == 1 && key != 116 {
533-
logger.Debug("Keyboard:", key, value)
534-
err := exec.Command("dde_wldpms", "-s", "On").Run()
535-
if err != nil {
536-
logger.Warningf("failed to exec dde_wldpms: %s", err)
537-
} else {
538-
m.dpmsIsOff = false
539-
}
540-
}
541485

542-
if _useWayland {
543-
if key == CapslockKey && value == KeyPress {
544-
m.handleKeyEventByWayland("capslock")
545-
} else if key == NumlockKey && value == KeyPress {
546-
m.handleKeyEventByWayland("numlock")
547-
}
486+
if key == CapslockKey && value == KeyPress {
487+
m.handleKeyEventByWayland("capslock")
488+
} else if key == NumlockKey && value == KeyPress {
489+
m.handleKeyEventByWayland("numlock")
548490
}
549491
}
550492
})
@@ -560,31 +502,6 @@ func (m *Manager) listenKeyboardEvent(systemBus *dbus.Conn) error {
560502
return nil
561503
}
562504

563-
func (m *Manager) listenMouseEvent(systemBus *dbus.Conn) error {
564-
err := systemBus.Object("com.deepin.daemon.Gesture",
565-
"/com/deepin/daemon/Gesture").AddMatchSignal("com.deepin.daemon.Gesture", "MouseEvent").Err
566-
if err != nil {
567-
logger.Warning(err)
568-
return err
569-
}
570-
m.systemSigLoop.AddHandler(&dbusutil.SignalRule{
571-
Name: "com.deepin.daemon.Gesture.MouseEvent",
572-
}, func(sig *dbus.Signal) {
573-
if len(sig.Body) > 1 {
574-
if m.dpmsIsOff {
575-
logger.Debug("MouseEvent: dpms on")
576-
err := exec.Command("dde_wldpms", "-s", "On").Run()
577-
if err != nil {
578-
logger.Warningf("failed to exec dde_wldpms: %s", err)
579-
} else {
580-
m.dpmsIsOff = false
581-
}
582-
}
583-
}
584-
})
585-
return nil
586-
}
587-
588505
// 初始化 NumLock 数字锁定键状态
589506
func (m *Manager) initNumLockState(sysBus *dbus.Conn) {
590507
// 从 gsettings 读取相关设置

keybinding/utils.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,13 +219,7 @@ func (m *Manager) systemTurnOffScreen() {
219219

220220
doPrepareSuspend()
221221
if useWayland {
222-
if m.dpmsIsOff == false {
223-
err = exec.Command("dde_wldpms", "-s", "Off").Run()
224-
m.dpmsIsOff = true
225-
} else {
226-
err = exec.Command("dde_wldpms", "-s", "On").Run()
227-
m.dpmsIsOff = false
228-
}
222+
err = exec.Command("dde_wldpms", "-s", "Off").Run()
229223
} else {
230224
err = dpms.ForceLevelChecked(m.conn, dpms.DPMSModeOff).Check(m.conn)
231225
}

session/power/manager.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ type Manager struct {
135135

136136
// 是否支持节能模式
137137
isPowerSaveSupported bool
138+
kwinHanleIdleOffCh chan bool
138139
}
139140

140141
var _manager *Manager
@@ -350,6 +351,25 @@ func (m *Manager) init() {
350351
m.initSubmodules()
351352
m.startSubmodules()
352353
m.inhibitLogind()
354+
355+
if m.UseWayland {
356+
m.kwinHanleIdleOffCh = make(chan bool, 10)
357+
go m.listenEventToHandleIdleOff()
358+
359+
go func() {
360+
for ch := range m.kwinHanleIdleOffCh {
361+
if ch {
362+
logger.Info("kwin handle idle off")
363+
364+
if v := m.submodules[submodulePSP]; v != nil {
365+
if psp := v.(*powerSavePlan); psp != nil {
366+
psp.HandleIdleOff()
367+
}
368+
}
369+
}
370+
}
371+
}()
372+
}
353373
}
354374

355375
func (m *Manager) destroy() {
@@ -446,3 +466,64 @@ func (m *Manager) isSessionActive() bool {
446466
}
447467
return active
448468
}
469+
470+
// wayland下在收到键盘或者鼠标事件后,需要进行系统空闲处理(主要是唤醒屏幕)
471+
func (m *Manager) listenEventToHandleIdleOff() error {
472+
//+ 监控按键事件
473+
err := m.systemSigLoop.Conn().Object("com.deepin.daemon.Gesture",
474+
"/com/deepin/daemon/Gesture").AddMatchSignal("com.deepin.daemon.Gesture", "KeyboardEvent").Err
475+
if err != nil {
476+
logger.Warning(err)
477+
return err
478+
}
479+
480+
m.systemSigLoop.AddHandler(&dbusutil.SignalRule{
481+
Name: "com.deepin.daemon.Gesture.KeyboardEvent",
482+
}, func(sig *dbus.Signal) {
483+
if len(sig.Body) > 1 {
484+
value := sig.Body[1].(uint32)
485+
if m.getDPMSMode() != dpmsStateOn && value == 1 {
486+
logger.Debug("receive keyboard event to handle idle off")
487+
m.kwinHanleIdleOffCh <- true
488+
}
489+
}
490+
})
491+
492+
//+ 监控鼠标移动事件
493+
err = m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland",
494+
"/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "CursorMove").Err
495+
if err != nil {
496+
logger.Warning(err)
497+
return err
498+
}
499+
m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{
500+
Name: "com.deepin.daemon.KWayland.Output.CursorMove",
501+
}, func(sig *dbus.Signal) {
502+
if len(sig.Body) > 1 {
503+
if m.getDPMSMode() != dpmsStateOn {
504+
logger.Debug("receive cursor move event to handle idle off")
505+
m.kwinHanleIdleOffCh <- true
506+
}
507+
}
508+
})
509+
510+
//+ 监控鼠标按下事件
511+
err = m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland",
512+
"/com/deepin/daemon/KWayland/Output").AddMatchSignal("com.deepin.daemon.KWayland.Output", "ButtonPress").Err
513+
if err != nil {
514+
logger.Warning(err)
515+
return err
516+
}
517+
m.sessionSigLoop.AddHandler(&dbusutil.SignalRule{
518+
Name: "com.deepin.daemon.KWayland.Output.ButtonPress",
519+
}, func(sig *dbus.Signal) {
520+
if len(sig.Body) > 1 {
521+
if m.getDPMSMode() != dpmsStateOn {
522+
logger.Debug("acquire button press to handle idle off")
523+
m.kwinHanleIdleOffCh <- true
524+
}
525+
}
526+
})
527+
528+
return nil
529+
}

session/power/utils.go

Lines changed: 72 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,32 +93,59 @@ func (m *Manager) setWmBlackScreenActive(active bool) {
9393
}
9494
}
9595

96+
func (m *Manager) getDPMSMode() int32 {
97+
logger.Debug("get DPMS Mode")
98+
99+
var err error
100+
var mode int32
101+
102+
if m.UseWayland {
103+
mode, err = m.getDpmsModeByKwin()
104+
} else {
105+
var dpmsInfo *dpms.InfoReply
106+
c := m.helper.xConn
107+
dpmsInfo, err = dpms.Info(c).Reply(c)
108+
if err != nil {
109+
mode = int32(dpmsInfo.PowerLevel)
110+
}
111+
}
112+
113+
if err != nil {
114+
logger.Warning("get DPMS mode error:", err)
115+
}
116+
117+
return mode
118+
}
119+
96120
func (m *Manager) setDPMSModeOn() {
97121
logger.Info("DPMS On")
122+
98123
var err error
99124

100125
if m.UseWayland {
101-
m.setDpmsModeByKwin(dpmsStateOn)
126+
err = m.setDpmsModeByKwin(dpmsStateOn)
102127
} else {
103128
c := m.helper.xConn
104129
err = dpms.ForceLevelChecked(c, dpms.DPMSModeOn).Check(c)
105130
}
131+
106132
if err != nil {
107-
logger.Warning("Set DPMS on error:", err)
133+
logger.Warning("set DPMS on error:", err)
108134
}
109135
}
110136

111137
func (m *Manager) setDPMSModeOff() {
112138
logger.Info("DPMS Off")
139+
113140
var err error
114141
if m.UseWayland {
115-
m.setDpmsModeByKwin(dpmsStateOff)
142+
err = m.setDpmsModeByKwin(dpmsStateOff)
116143
} else {
117144
c := m.helper.xConn
118145
err = dpms.ForceLevelChecked(c, dpms.DPMSModeOff).Check(c)
119146
}
120147
if err != nil {
121-
logger.Warning("Set DPMS off error:", err)
148+
logger.Warning("set DPMS off error:", err)
122149
}
123150
}
124151

@@ -484,27 +511,56 @@ func isFloatEqual(f1, f2 float64) bool {
484511
return math.Abs(f1-f2) < 1e-6
485512
}
486513

487-
func (m *Manager) setDpmsModeByKwin(mode int32) {
488-
logger.Info("Set DPMS State", mode)
489-
sessionBus, err := dbus.SessionBus()
514+
func (m *Manager) getDpmsList() ([]dbus.Variant, error) {
515+
sessionBus := m.sessionSigLoop.Conn()
516+
sessionObj := sessionBus.Object("com.deepin.daemon.KWayland", "/com/deepin/daemon/KWayland/DpmsManager")
517+
var ret []dbus.Variant
518+
err := sessionObj.Call("com.deepin.daemon.KWayland.DpmsManager.dpmsList", 0).Store(&ret)
490519
if err != nil {
491520
logger.Warning(err)
492-
return
521+
return nil, err
493522
}
494-
sessionObj := sessionBus.Object("com.deepin.daemon.KWayland", "/com/deepin/daemon/KWayland/DpmsManager")
495-
var ret []dbus.Variant
496-
err = sessionObj.Call("com.deepin.daemon.KWayland.DpmsManager.dpmsList", 0).Store(&ret)
523+
524+
return ret, nil
525+
}
526+
527+
func (m *Manager) getDpmsModeByKwin() (int32, error) {
528+
list, err := m.getDpmsList()
497529
if err != nil {
498530
logger.Warning(err)
499-
return
531+
return dpmsStateOn, err
532+
}
533+
534+
var dpmsMode int32
535+
for i := 0; i < len(list); i++ {
536+
v := list[i].Value().(string)
537+
sessionObj := m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", dbus.ObjectPath(v))
538+
err = sessionObj.Call("com.deepin.daemon.KWayland.Dpms.getDpmsMode", 0).Store(&dpmsMode)
539+
if err != nil {
540+
logger.Warning(err)
541+
return dpmsStateOn, err
542+
}
543+
}
544+
545+
return dpmsMode, nil
546+
}
547+
548+
func (m *Manager) setDpmsModeByKwin(mode int32) error {
549+
list, err := m.getDpmsList()
550+
if err != nil {
551+
logger.Warning(err)
552+
return err
500553
}
501-
for i := 0; i < len(ret); i++ {
502-
v := ret[i].Value().(string)
503-
sessionObj := sessionBus.Object("com.deepin.daemon.KWayland", dbus.ObjectPath(v))
554+
555+
for i := 0; i < len(list); i++ {
556+
v := list[i].Value().(string)
557+
sessionObj := m.sessionSigLoop.Conn().Object("com.deepin.daemon.KWayland", dbus.ObjectPath(v))
504558
err = sessionObj.Call("com.deepin.daemon.KWayland.Dpms.setDpmsMode", 0, int32(mode)).Err
505559
if err != nil {
506560
logger.Warning(err)
507-
return
561+
return err
508562
}
509563
}
564+
565+
return nil
510566
}

0 commit comments

Comments
 (0)