Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions bin/dde-system-daemon/exported_methods_auto.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 18 additions & 10 deletions bin/dde-system-daemon/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"os"

configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager"
systemPower "github.com/linuxdeepin/go-dbus-factory/system/org.deepin.dde.power1"

// modules:
_ "github.com/linuxdeepin/dde-daemon/accounts1"
Expand Down Expand Up @@ -42,12 +43,15 @@ import (
//go:generate dbusutil-gen em -type Daemon

type Daemon struct {
loginManager login1.Manager
systemSigLoop *dbusutil.SignalLoop
service *dbusutil.Service
systemd systemd1.Manager
dsSystem configManager.Manager
signals *struct { // nolint
loginManager login1.Manager
systemSigLoop *dbusutil.SignalLoop
service *dbusutil.Service
systemd systemd1.Manager
dsSystem configManager.Manager
systemPower systemPower.Power
idleStatePath string
idleScreenStatePath string
signals *struct { // nolint
HandleForSleep struct {
start bool
}
Expand Down Expand Up @@ -110,11 +114,15 @@ func main() {
logger.SetRestartCommand("/usr/lib/deepin-daemon/dde-system-daemon")

_daemon = &Daemon{
loginManager: login1.NewManager(service.Conn()),
service: service,
systemSigLoop: dbusutil.NewSignalLoop(service.Conn(), 10),
systemd: systemd1.NewManager(service.Conn()),
loginManager: login1.NewManager(service.Conn()),
service: service,
systemSigLoop: dbusutil.NewSignalLoop(service.Conn(), 10),
systemd: systemd1.NewManager(service.Conn()),
systemPower: systemPower.NewPower(service.Conn()),
idleStatePath: IdleFile,
idleScreenStatePath: IdleScreenFile,
}
_daemon.getDsgValue()
_daemon.service = service
_daemon.initSystemDaemonDConfig()
err = service.Export(dbusPath, _daemon)
Expand Down
147 changes: 145 additions & 2 deletions bin/dde-system-daemon/power.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,89 @@
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

package main

import (
"github.com/linuxdeepin/go-lib/dbusutil"
"errors"
"fmt"
"io/ioutil"
"os/exec"
"strconv"
"strings"
"syscall"

"github.com/godbus/dbus/v5"
configManager "github.com/linuxdeepin/go-dbus-factory/org.desktopspec.ConfigManager"
"github.com/linuxdeepin/go-lib/dbusutil"
"github.com/linuxdeepin/go-lib/utils"
)

const (
IdleFile = "/sys/devices/system/loongarch/relax_state"
IdleScreenFile = "/sys/devices/system/loongarch/idle_state"
)

const (
dsettingsPowerName = "org.deepin.dde.daemon.power"
dsettingsIdleStatePath = "idleStatePath"
dsettingsIdleScreenStatePath = "idleScreenStatePath"
)

func isStrInList(item string, items []string) bool {
for _, v := range items {
if item == v {
return true
}
}
return false
}

func (d *Daemon) getDsgValue() {
ds := configManager.NewConfigManager(d.systemSigLoop.Conn())

powerPath, err := ds.AcquireManager(0, dsettingsSystemDaemonID, dsettingsPowerName, "")
if err != nil {
logger.Warning(err)
return
}

dsPower, err := configManager.NewManager(d.systemSigLoop.Conn(), powerPath)
if err != nil {
logger.Warning(err)
return
}

keyList, err := dsPower.KeyList().Get(0)
if err != nil {
logger.Warning(err)
}

if isStrInList(dsettingsIdleStatePath, keyList) {
v, err := dsPower.Value(0, dsettingsIdleStatePath)
if err != nil {
logger.Warning(err)
} else {
if dsgIdleStatePath, ok := v.Value().(string); ok {
d.idleStatePath = dsgIdleStatePath
logger.Info("idleStatePath : ", d.idleStatePath)
}
}
}

if isStrInList(dsettingsIdleScreenStatePath, keyList) {
v, err := dsPower.Value(0, dsettingsIdleScreenStatePath)
if err != nil {
logger.Warning(err)
} else {
if dsgIdleScreenStatePath, ok := v.Value().(string); ok {
d.idleScreenStatePath = dsgIdleScreenStatePath
logger.Info("idleScreenStatePath : ", d.idleScreenStatePath)
}
}
}
}

// TODO: 临时方案,hwe一些机型内核wifi有问题,需要停止wifip2p扫描,待内核修改后去掉
func stopNetworkDisaplay() {
err := exec.Command("killall", "deepin-network-display-daemon").Run()
Expand Down Expand Up @@ -38,3 +113,71 @@ func (d *Daemon) forwardPrepareForSleepSignal(service *dbusutil.Service) error {
}
return nil
}

func (d *Daemon) systemPowerSetShortIdleState(state bool) {
logger.Info("systemPowerSetShortIdleState : ", state)
if d.systemPower != nil {
err := d.systemPower.SetShortIdleState(0, state)
if err != nil {
logger.Warning("failed to SetShortIdleState, err : ", err)
}
}
}

func (d *Daemon) setState(file string, state bool) error {
shortIdleState, err := d.systemPower.ShortIdleState().Get(0)
if err != nil {
logger.Warning("Get systemPower.ShortIdleState err :", err)
}
logger.Infof("##### setState shortIdleState : %v, state : %v", shortIdleState, state)
if shortIdleState == state {
logger.Info("shortIdleState is same with state : ", state)
return errors.New("Short idle state not exchange.")
}
if file == d.idleStatePath {
d.systemPowerSetShortIdleState(state)
}

// 写file内核文件
if !utils.IsFileExist(file) {
err := fmt.Errorf("%s not found", file)
logger.Warning(err)
return err
}

// 读取file文件内容
content, err := ioutil.ReadFile(file)
if err != nil {
logger.Errorf("Failed to read file %s: %v", file, err)
return err
}
contentStr := strings.TrimSpace(string(content))

// 如果不一致,将state的值写入file
// 将true转换为1,false转换为0
newValue := 0
if state {
newValue = 1
}
logger.Infof("Current content=%s, will set %v", contentStr, newValue)
// 将值写入文件
newContent := strconv.Itoa(newValue)
err = ioutil.WriteFile(file, []byte(newContent), 0644)
if err != nil {
logger.Errorf("Failed to write file %s: %v", file, err)
return err
}
syscall.Sync()
logger.Infof("Successfully updated %s with value: %d", file, newValue)
return nil
}

func (d *Daemon) SetIdleState(state bool) *dbus.Error {
logger.Infof("SetIdleState %s try set state: %v", d.idleStatePath, state)
return dbusutil.ToError(d.setState(d.idleStatePath, state))
}

func (d *Daemon) SetScreenState(state bool) *dbus.Error {
logger.Infof("SetScreenState %s try set state: %v", d.idleScreenStatePath, state)
return dbusutil.ToError(d.setState(d.idleScreenStatePath, state))
}
21 changes: 20 additions & 1 deletion keybinding1/utils.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

Expand Down Expand Up @@ -319,6 +319,8 @@ func (m *Manager) systemTurnOffScreen() {
}
if err != nil {
logger.Warning("Set DPMS off error:", err)
} else {
callSetScreenState(true)
}

if bScreenBlackLock && m.isWmBlackScreenActive() {
Expand Down Expand Up @@ -436,6 +438,23 @@ func (m *Manager) doLock(autoStartAuth bool) {
}
}

func callSetScreenState(state bool) {
systemConn, err := dbus.SystemBus()
if err != nil {
logger.Warning("Failed to get system bus:", err)
return
}

logger.Infof("callSetScreenState: calling SetScreenState with state=%v", state)
err = systemConn.Object("org.deepin.dde.Daemon1", "/org/deepin/dde/Daemon1").Call("org.deepin.dde.Daemon1.SetScreenState", 0, dbus.MakeVariant(state)).Err
if err != nil {
logger.Warning(err)
return
}

logger.Infof("callSetScreenState: SetScreenState called successfully with state=%v", state)
}

func doPrepareSuspend() {
sessionDBus, _ := dbus.SessionBus()
obj := sessionDBus.Object("org.deepin.dde.Power1", "/org/deepin/dde/Power1")
Expand Down
Loading
Loading