Skip to content

Commit

Permalink
fix: treeland适配,调用login1 的session lock触发锁屏
Browse files Browse the repository at this point in the history
treeland适配,调用login1 的session lock触发锁屏

Log: treeland适配,调用login1 的session lock触发锁屏
pms: BUG-281261
  • Loading branch information
fly602 committed Dec 2, 2024
1 parent 7c4cb68 commit 9403198
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 47 deletions.
2 changes: 1 addition & 1 deletion bin/dde-session-daemon/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ var logger = log.NewLogger("daemon/dde-session-daemon")
var hasDDECookie bool
var hasTreeLand bool

var treeLandNotAllowModules = []string{"x-event-monitor", "keybinding", "trayicon", "screensaver", "inputdevices", "power"}
var treeLandNotAllowModules = []string{"x-event-monitor", "keybinding", "trayicon", "screensaver", "inputdevices"}

func isInShutdown() bool {
bus, err := dbus.SystemBus()
Expand Down
2 changes: 1 addition & 1 deletion keybinding1/manager_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (m *Manager) initHandlers() {
m.handlers[ActionTypeTouchpadCtrl] = buildHandlerFromController(m.touchPadController)

m.handlers[ActionTypeSystemSuspend] = func(ev *KeyEvent) {
if m.gsPower.GetBoolean("sleep-lock") {
if m.gsPower.GetBoolean("sleep-lock") && !isTreeLand() {
m.systemSuspendByFront()
} else {
m.systemSuspend()
Expand Down
12 changes: 10 additions & 2 deletions keybinding1/special_keycode.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,9 +351,17 @@ func (m *Manager) handlePower() {
case powerActionShutdown:
m.systemShutdown()
case powerActionSuspend:
m.systemSuspendByFront()
if isTreeLand() {
m.systemSuspend()
} else {
m.systemSuspendByFront()
}
case powerActionHibernate:
m.systemHibernateByFront()
if isTreeLand() {
m.systemHibernate()
} else {
m.systemHibernateByFront()
}
case powerActionTurnOffScreen:
if screenBlackLock {
systemLock()
Expand Down
24 changes: 24 additions & 0 deletions keybinding1/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package keybinding
import (
"bytes"
"errors"
login1 "github.com/linuxdeepin/go-dbus-factory/system/org.freedesktop.login1"
"os"
"os/exec"
"path/filepath"
Expand Down Expand Up @@ -124,6 +125,10 @@ func (m *Manager) canSuspend() bool {
return can
}

func isTreeLand() bool {
return os.Getenv("XDG_SESSION_TYPE") == "wayland"
}

func (m *Manager) systemSuspend() {
if !m.canSuspend() {
logger.Info("can not suspend")
Expand Down Expand Up @@ -395,6 +400,25 @@ func shouldUseDDEKwin() bool {

func (m *Manager) doLock(autoStartAuth bool) {
logger.Info("Lock Screen")
// 如果是treeland,直接执行login1 的session lock
if isTreeLand() {
currentSessionPath, err := m.sessionManager.CurrentSessionPath().Get(0)
if err != nil || currentSessionPath == "" {
logger.Warning("get sessionManager CurrentSessionPath failed:", err)
return
}
sysBus, _ := dbus.SystemBus()
currentSession, err := login1.NewSession(sysBus, currentSessionPath)
if err != nil || currentSession == nil {
logger.Error("Failed to connect self session:", err)
return
}
err = currentSession.Lock(0)
if err != nil {
logger.Warning("Failed to lock current session:", err)
}
return
}
err := m.lockFront.ShowAuth(0, autoStartAuth)
if err != nil {
logger.Warning("failed to call lockFront ShowAuth:", err)
Expand Down
5 changes: 5 additions & 0 deletions session/power1/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package power
import (
"github.com/linuxdeepin/dde-daemon/loader"
"github.com/linuxdeepin/go-lib/log"
"os"
)

var logger = log.NewLogger("daemon/session/power")
Expand All @@ -27,6 +28,10 @@ func NewDaemon(logger *log.Logger) *Daemon {
}

func (d *Daemon) GetDependencies() []string {
// TODO: Idle在treeland暂时有问题
if os.Getenv("XDG_SESSION_TYPE") == "wayland" {
return []string{"sessionwatcher"}
}
return []string{"screensaver", "sessionwatcher"}
}

Expand Down
9 changes: 6 additions & 3 deletions session/power1/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/godbus/dbus/v5"
notifications "github.com/linuxdeepin/go-dbus-factory/session/org.freedesktop.notifications"
"github.com/linuxdeepin/go-lib/dbusutil/proxy"
"os"

// system bus
shutdownfront "github.com/linuxdeepin/go-dbus-factory/session/com.deepin.dde.shutdownfront"
Expand Down Expand Up @@ -70,9 +71,11 @@ func (h *Helper) init(sysBus, sessionBus *dbus.Conn) error {
h.ShutdownFront = shutdownfront.NewShutdownFront(sessionBus)

// init X conn
h.xConn, err = x.NewConn()
if err != nil {
return err
if os.Getenv("XDG_SESSION_TYPE") != "wayland" {
h.xConn, err = x.NewConn()
if err != nil {
return err
}
}
return nil
}
Expand Down
12 changes: 10 additions & 2 deletions session/power1/lid_switch.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,17 @@ func (h *LidSwitchHandler) doLidStateChanged(state bool) {
case powerActionShutdown:
m.doShutdown()
case powerActionSuspend:
m.doSuspendByFront()
if m.UseWayland {
m.doSuspend()
} else {
m.doSuspendByFront()
}
case powerActionHibernate:
m.doHibernateByFront()
if m.UseWayland {
m.doHibernate()
} else {
m.doHibernateByFront()
}
case powerActionTurnOffScreen:
m.doTurnOffScreen()
case powerActionDoNothing:
Expand Down
55 changes: 28 additions & 27 deletions session/power1/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ func (m *Manager) init() {
m.sessionSigLoop.Start()
m.systemSigLoop.Start()

if len(os.Getenv("WAYLAND_DISPLAY")) != 0 {
if os.Getenv("XDG_SESSION_TYPE") == "wayland" {
m.UseWayland = true
} else {
m.UseWayland = false
Expand Down Expand Up @@ -534,32 +534,33 @@ func (m *Manager) init() {
})
}

if m.UseWayland {
m.kwinHanleIdleOffCh = make(chan bool, 10)
go m.listenEventToHandleIdleOff()

go func() {
for ch := range m.kwinHanleIdleOffCh {
if ch {
m.prepareSuspendLocker.Lock()
// 如果系统处于suspend状态,不需要在上层通过鼠标键盘事件唤醒系统
if m.prepareSuspend >= suspendStatePrepare {
m.prepareSuspendLocker.Unlock()
continue
}
m.prepareSuspendLocker.Unlock()

logger.Info("kwin handle idle off")

if v := m.submodules[submodulePSP]; v != nil {
if psp := v.(*powerSavePlan); psp != nil {
psp.HandleIdleOff()
}
}
}
}
}()
}
// TODO: treeland 上idle暂未实现
//if m.UseWayland {
// m.kwinHanleIdleOffCh = make(chan bool, 10)
// go m.listenEventToHandleIdleOff()
//
// go func() {
// for ch := range m.kwinHanleIdleOffCh {
// if ch {
// m.prepareSuspendLocker.Lock()
// // 如果系统处于suspend状态,不需要在上层通过鼠标键盘事件唤醒系统
// if m.prepareSuspend >= suspendStatePrepare {
// m.prepareSuspendLocker.Unlock()
// continue
// }
// m.prepareSuspendLocker.Unlock()
//
// logger.Info("kwin handle idle off")
//
// if v := m.submodules[submodulePSP]; v != nil {
// if psp := v.(*powerSavePlan); psp != nil {
// psp.HandleIdleOff()
// }
// }
// }
// }
// }()
//}
}

func (m *Manager) destroy() {
Expand Down
9 changes: 9 additions & 0 deletions session/power1/manager_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,15 @@ func (m *Manager) initOnBatteryChangedHandler() {
func (m *Manager) handleBeforeSuspend() {
m.setPrepareSuspend(suspendStatePrepare)
m.setDDEBlackScreenActive(true)
if m.UseWayland {
// 如果是treeland,并且待机休眠唤醒是需要解锁,则将session 给lock
if m.SleepLock.Get() {
err := m.currentSession.Lock(0)
if err != nil {
logger.Warning("set session lock failed:", err)
}
}
}
logger.Debug("before sleep")
}

Expand Down
26 changes: 15 additions & 11 deletions session/power1/power_save_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,17 @@ func newPowerSavePlan(manager *Manager) (string, submodule, error) {
p := new(powerSavePlan)
p.manager = manager

conn := manager.helper.xConn
var err error
p.atomNetWMStateFullscreen, err = conn.GetAtom("_NET_WM_STATE_FULLSCREEN")
if err != nil {
return submodulePSP, nil, err
}
p.atomNetWMStateFocused, err = conn.GetAtom("_NET_WM_STATE_FOCUSED")
if err != nil {
return submodulePSP, nil, err
if !manager.UseWayland {
conn := manager.helper.xConn
p.atomNetWMStateFullscreen, err = conn.GetAtom("_NET_WM_STATE_FULLSCREEN")
if err != nil {
return submodulePSP, nil, err
}
p.atomNetWMStateFocused, err = conn.GetAtom("_NET_WM_STATE_FOCUSED")
if err != nil {
return submodulePSP, nil, err
}
}

p.fullscreenWorkaroundAppList = manager.settings.GetStrv(
Expand Down Expand Up @@ -544,9 +546,11 @@ func (psp *powerSavePlan) stopScreensaver() {
func (psp *powerSavePlan) makeSystemSleep() {
logger.Info("sleep")
psp.stopScreensaver()
// psp.manager.setDPMSModeOn()
// psp.resetBrightness()
psp.manager.doSuspendByFront()
if psp.manager.UseWayland {
psp.manager.doSuspend()
} else {
psp.manager.doSuspendByFront()
}
}

func (psp *powerSavePlan) lock() {
Expand Down
8 changes: 8 additions & 0 deletions session/power1/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,14 @@ func (m *Manager) tryChangeDeepinWM() bool {
}

func (m *Manager) doLock(autoStartAuth bool) {
// 如果是treeland,直接执行login1 的session lock
if m.UseWayland {
err := m.currentSession.Lock(0)
if err != nil {
logger.Warning("set session lock failed:", err)
}
return
}
locked, err := m.sessionManager.Locked().Get(0)
if err != nil {
logger.Warning(err)
Expand Down

0 comments on commit 9403198

Please sign in to comment.