ukui-control-center/0011-power-add-sleep-function.patch
2021-07-12 14:07:29 +08:00

454 lines
13 KiB
Diff

From 1ed0391590fb670596523e2ce1df224c1f105769 Mon Sep 17 00:00:00 2001
From: tanyulong <tanyulong@kylinos.cn>
Date: Mon, 12 Jul 2021 13:59:08 +0800
Subject: [PATCH] power add sleep function
---
commonComponent/ComboxFrame/comboxframe.cpp | 21 ++++++
commonComponent/ComboxFrame/comboxframe.h | 29 ++++++++
commonComponent/comboxframe.pri | 7 ++
plugins/system/power/power.cpp | 78 ++++++++++++++++++++-
plugins/system/power/power.h | 16 +++++
plugins/system/power/power.pro | 3 +-
plugins/system/power/power.ui | 15 +---
plugins/system/power/powermacrodata.h | 1 +
registeredQDbus/sysdbusregister.cpp | 44 ++++++++----
registeredQDbus/sysdbusregister.h | 13 ++--
10 files changed, 193 insertions(+), 34 deletions(-)
create mode 100644 commonComponent/ComboxFrame/comboxframe.cpp
create mode 100644 commonComponent/ComboxFrame/comboxframe.h
create mode 100644 commonComponent/comboxframe.pri
diff --git a/commonComponent/ComboxFrame/comboxframe.cpp b/commonComponent/ComboxFrame/comboxframe.cpp
new file mode 100644
index 0000000..aba3553
--- /dev/null
+++ b/commonComponent/ComboxFrame/comboxframe.cpp
@@ -0,0 +1,21 @@
+#include "comboxframe.h"
+
+ComboxFrame::ComboxFrame(QString labelStr, QWidget *parent) : mTitleName(labelStr), QFrame(parent) {
+
+ this->setMinimumSize(550, 50);
+ this->setMaximumSize(960, 50);
+ this->setFrameShape(QFrame::Shape::Box);
+
+ mTitleLabel = new QLabel(mTitleName, this);
+ mCombox = new QComboBox(this);
+
+ mHLayout = new QHBoxLayout(this);
+ mHLayout->addWidget(mTitleLabel);
+ mHLayout->addWidget(mCombox);
+
+ this->setLayout(mHLayout);
+}
+
+ComboxFrame::~ComboxFrame() {
+
+}
diff --git a/commonComponent/ComboxFrame/comboxframe.h b/commonComponent/ComboxFrame/comboxframe.h
new file mode 100644
index 0000000..d6f2679
--- /dev/null
+++ b/commonComponent/ComboxFrame/comboxframe.h
@@ -0,0 +1,29 @@
+#ifndef COMBOXFRAME_H
+#define COMBOXFRAME_H
+
+#include <QWidget>
+#include <QObject>
+#include <QLabel>
+#include <QComboBox>
+#include <QFrame>
+#include <QHBoxLayout>
+
+class ComboxFrame : public QFrame
+{
+ Q_OBJECT
+public:
+ ComboxFrame(QString labelStr, QWidget *parent = nullptr);
+ ~ComboxFrame();
+
+public:
+ QComboBox *mCombox;
+
+private:
+ QLabel *mTitleLabel;
+ QHBoxLayout *mHLayout;
+ QString mTitleName;
+
+signals:
+};
+
+#endif // COMBOXFRAME_H
diff --git a/commonComponent/comboxframe.pri b/commonComponent/comboxframe.pri
new file mode 100644
index 0000000..e1399d5
--- /dev/null
+++ b/commonComponent/comboxframe.pri
@@ -0,0 +1,7 @@
+#LIBINTERFACE_NAME = $$qtLibraryTarget(comboxframe)
+
+SOURCES += \
+ $$PWD/ComboxFrame/comboxframe.cpp \
+
+HEADERS += \
+ $$PWD/ComboxFrame/comboxframe.h \
diff --git a/plugins/system/power/power.cpp b/plugins/system/power/power.cpp
index ac35f93..52d1168 100755
--- a/plugins/system/power/power.cpp
+++ b/plugins/system/power/power.cpp
@@ -22,6 +22,10 @@
#include "powermacrodata.h"
#include <QDebug>
+#include <QDBusInterface>
+#include <QDBusReply>
+#include <QDBusConnection>
+#include <QSettings>
typedef enum {
BALANCE,
@@ -45,6 +49,9 @@ const int COMPUTER_BALANCE = 30 * 60;
const int DISPLAY_SAVING = 20 * 60;
const int COMPUTER_SAVING = 2 * 60 * 60;
+const QStringList kHibernate { QObject::tr("Never"),QObject::tr("10min"), QObject::tr("20min"),
+ QObject::tr("40min"), QObject::tr("80min")};
+
Power::Power() {
ui = new Ui::Power;
pluginWidget = new QWidget;
@@ -59,11 +66,17 @@ Power::Power() {
const QByteArray id(POWERMANAGER_SCHEMA);
+ initDbus();
setupComponent();
isPowerSupply();
if (QGSettings::isSchemaInstalled(id)) {
settings = new QGSettings(id, QByteArray(), this);
- initModeStatus();
+
+ mPowerKeys = settings->keys();
+
+ initGeneralSet();
+
+ initModeStatus();
setupConnect();
initPowerOtherStatus();
} else {
@@ -126,6 +139,7 @@ void Power::isPowerSupply() {
ui->closeLidFrame->setVisible(false);
ui->title2Label->setVisible(false);
ui->iconFrame->setVisible(false);
+ ui->verticalSpacer_2->changeSize(0, 0);
} else {
qDebug() << "brightness info is valid";
isExitsPower = true ;
@@ -134,6 +148,10 @@ void Power::isPowerSupply() {
}
}
+void Power::setHibernateTime(QString hibernate) {
+ mUkccInterface->call("setSuspendThenHibernate", hibernate);
+}
+
void Power::setupComponent() {
//
ui->powerModeBtnGroup->setId(ui->balanceRadioBtn, BALANCE);
@@ -453,3 +471,61 @@ void Power::refreshUI() {
// ui->customWidget->setStyleSheet("QWidget{background: #F4F4F4; border-top-left-radius: 6px; border-top-right-radius: 6px;}");
}
}
+
+void Power::initGeneralSet() {
+ if (getHibernateStatus() && mPowerKeys.contains("afterIdleAction")) {
+ mHibernate = new ComboxFrame(tr("After suspending this time, the system will go to sleep:"), pluginWidget);
+
+ ui->powerLayout->addWidget(new QLabel(tr("General Settings")));
+ ui->powerLayout->addWidget(mHibernate);
+
+ ui->powerLayout->addStretch();
+
+ for(int i = 0; i < kHibernate.length(); i++) {
+ mHibernate->mCombox->addItem(kHibernate.at(i));
+ }
+
+ if (getHibernateTime().isEmpty()) {
+ mHibernate->mCombox->setCurrentIndex(0);
+ } else {
+ mHibernate->mCombox->setCurrentText(getHibernateTime());
+ }
+
+ connect(mHibernate->mCombox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=](int index) {
+ setHibernateTime(mHibernate->mCombox->currentText());
+ if (index) {
+ settings->set(HIBERNATE_KEY, "suspend-then-hibernate");
+ } else {
+ settings->set(HIBERNATE_KEY, "suspend");
+ }
+ });
+ }
+}
+
+bool Power::getHibernateStatus() {
+
+ QDBusInterface loginInterface("org.freedesktop.login1",
+ "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager",
+ QDBusConnection::systemBus());
+
+ if (loginInterface.isValid()) {
+ QDBusReply<QString> reply = loginInterface.call("CanSuspendThenHibernate");
+ return reply.value() == "yes" ? true : false;
+ }
+}
+
+QString Power::getHibernateTime() {
+ QDBusReply<QString> hibernateTime = mUkccInterface->call("getSuspendThenHibernate");
+ if (hibernateTime.isValid()) {
+ return hibernateTime.value();
+ }
+ return "";
+}
+
+void Power::initDbus() {
+ mUkccInterface = new QDBusInterface("com.control.center.qt.systemdbus",
+ "/",
+ "com.control.center.interface",
+ QDBusConnection::systemBus());
+}
diff --git a/plugins/system/power/power.h b/plugins/system/power/power.h
index d6d5d1d..b4da6e4 100755
--- a/plugins/system/power/power.h
+++ b/plugins/system/power/power.h
@@ -29,6 +29,8 @@
#include "shell/interface.h"
+#include "commonComponent/ComboxFrame/comboxframe.h"
+
namespace Ui {
class Power;
}
@@ -78,9 +80,23 @@ private:
QStringList lidStringList;
QStringList buttonStringList;
QStringList iconShowList;
+
+ QStringList mPowerKeys;
bool settingsCreate;
bool isExitsPower;
+
+ ComboxFrame *mHibernate;
+ QDBusInterface *mUkccInterface;
+
+private:
+ void initGeneralSet();
+ bool getHibernateStatus();
+ QString getHibernateTime();
+ void initDbus();
+
+private slots:
+ void setHibernateTime(QString hibernate);
};
#endif // POWER_H
diff --git a/plugins/system/power/power.pro b/plugins/system/power/power.pro
index f417bc4..795ac94 100755
--- a/plugins/system/power/power.pro
+++ b/plugins/system/power/power.pro
@@ -1,8 +1,9 @@
+include(../../../env.pri)
QT += widgets dbus
TEMPLATE = lib
CONFIG += plugin
-include(../../../env.pri)
+include($$PROJECT_COMPONENTSOURCE/comboxframe.pri)
TARGET = $$qtLibraryTarget(power)
DESTDIR = ../..
diff --git a/plugins/system/power/power.ui b/plugins/system/power/power.ui
index aea2b2a..e8be31d 100755
--- a/plugins/system/power/power.ui
+++ b/plugins/system/power/power.ui
@@ -72,7 +72,7 @@
<number>0</number>
</property>
<item>
- <layout class="QVBoxLayout" name="verticalLayout">
+ <layout class="QVBoxLayout" name="powerLayout">
<property name="spacing">
<number>8</number>
</property>
@@ -1127,19 +1127,6 @@
</layout>
</widget>
</item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
</layout>
</item>
</layout>
diff --git a/plugins/system/power/powermacrodata.h b/plugins/system/power/powermacrodata.h
index 65fc099..208d8c7 100755
--- a/plugins/system/power/powermacrodata.h
+++ b/plugins/system/power/powermacrodata.h
@@ -32,6 +32,7 @@
#define BUTTON_SUSPEND_KEY "button-suspend"
#define BUTTON_POWER_KEY "button-power"
#define IDLE_DIM_TIME_KEY "idle-dim-time"
+#define HIBERNATE_KEY "after-idle-action"
#define PRESENT_VALUE "present"
#define ALWAYS_VALUE "always"
diff --git a/registeredQDbus/sysdbusregister.cpp b/registeredQDbus/sysdbusregister.cpp
index 58d31db..54c2509 100755
--- a/registeredQDbus/sysdbusregister.cpp
+++ b/registeredQDbus/sysdbusregister.cpp
@@ -20,30 +20,26 @@
#include "sysdbusregister.h"
#include <QDebug>
-#include <QSettings>
#include <QSharedPointer>
+#include <QRegExp>
+#include <stdlib.h>
SysdbusRegister::SysdbusRegister()
{
+ mHibernateFile = "/etc/systemd/sleep.conf";
+ mHibernateSet = new QSettings(mHibernateFile, QSettings::IniFormat, this);
+ mHibernateSet->setIniCodec("UTF-8");
}
SysdbusRegister::~SysdbusRegister()
{
}
-//QString SysdbusRegister::name () const{
-// return m_name;
-//}
-
-//void SysdbusRegister::SetName(QString name){
-// m_name = name;
-//}
-
-void SysdbusRegister::exitService(){
+void SysdbusRegister::exitService() {
qApp->exit(0);
}
-QString SysdbusRegister::GetComputerInfo(){
+QString SysdbusRegister::GetComputerInfo() {
QByteArray ba;
FILE * fp = NULL;
char cmd[128];
@@ -86,7 +82,7 @@ QString SysdbusRegister::getNoPwdLoginStatus(){
}
//设置免密登录状态
-void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username){
+void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username) {
QString filename = "/etc/lightdm/lightdm.conf";
QSettings Settings(filename, QSettings::IniFormat);
@@ -105,8 +101,7 @@ void SysdbusRegister::setNoPwdLoginStatus(bool status,QString username){
}
// 设置自动登录状态
-void SysdbusRegister::setAutoLoginStatus(QString username)
-{
+void SysdbusRegister::setAutoLoginStatus(QString username) {
QString filename = "/etc/lightdm/lightdm.conf";
QSettings Settings(filename, QSettings::IniFormat);
@@ -118,3 +113,24 @@ void SysdbusRegister::setAutoLoginStatus(QString username)
systemRun("sudo groupadd -r autologin");
systemRun(QString("sudo gpasswd -a %1 autologin").arg(username));
}
+
+
+QString SysdbusRegister::getSuspendThenHibernate() {
+ mHibernateSet->beginGroup("Sleep");
+
+ QString time = mHibernateSet->value("HibernateDelaySec").toString();
+
+ mHibernateSet->endGroup();
+ mHibernateSet->sync();
+
+ return time;
+}
+
+void SysdbusRegister::setSuspendThenHibernate(QString time) {
+ mHibernateSet->beginGroup("Sleep");
+
+ mHibernateSet->setValue("HibernateDelaySec", time);
+
+ mHibernateSet->endGroup();
+ mHibernateSet->sync();
+}
diff --git a/registeredQDbus/sysdbusregister.h b/registeredQDbus/sysdbusregister.h
index 8bfc94f..df75d2d 100755
--- a/registeredQDbus/sysdbusregister.h
+++ b/registeredQDbus/sysdbusregister.h
@@ -23,8 +23,8 @@
#include <QObject>
#include <QCoreApplication>
#include <QProcess>
-
#include <QFile>
+#include <QSettings>
class SysdbusRegister : public QObject
{
@@ -37,15 +37,15 @@ public:
~SysdbusRegister();
private:
-// QString m_name;
+ QString mHibernateFile;
+
+ QSettings *mHibernateSet;
signals:
Q_SCRIPTABLE void nameChanged(QString);
Q_SCRIPTABLE void computerinfo(QString);
public slots:
-// Q_SCRIPTABLE QString name() const;
-// Q_SCRIPTABLE void SetName(QString name);
Q_SCRIPTABLE void exitService();
Q_SCRIPTABLE QString GetComputerInfo();
@@ -59,7 +59,12 @@ public slots:
//设置自动登录状态
Q_SCRIPTABLE void setAutoLoginStatus(QString username);
+
+ // 获取挂起到休眠时间
+ Q_SCRIPTABLE QString getSuspendThenHibernate();
+ // 设置挂起到休眠时间
+ Q_SCRIPTABLE void setSuspendThenHibernate(QString time);
};
#endif // SYSDBUSREGISTER_H
--
2.23.0