fix(*): disable xscreensaver,fix high CPU utilization

- 启动时禁用xscreensaver,修复屏保漂浮文字label导致的高CPU占用,修复挂起时调用后端接口引起的阻塞

(cherry picked from commit 0ebb5b38863f3b8b70b9ae82159378ebc9cd31ab)
This commit is contained in:
liuxinhao 2022-07-25 16:51:41 +08:00 committed by openeuler-sync-bot
parent de0a0b0f41
commit 8e9d0fae08
6 changed files with 7 additions and 345 deletions

View File

@ -1,188 +0,0 @@
From a7ecb4a280029c94d743dd20a23baac75f20c930 Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinos.com.cn>
Date: Tue, 21 Dec 2021 15:51:41 +0800
Subject: [PATCH] feature(idle lock): add idle-activation-lock gsettings option
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加空闲时是否锁定屏幕GSettings配置项
---
...com.kylinsec.kiran.screensaver.gschema.xml | 8 +++----
src/idle-watcher/idle-watcher-mate.cpp | 1 +
src/manager.cpp | 12 +++++++---
src/prefs.cpp | 23 +++++++++++--------
src/prefs.h | 6 ++++-
src/view/window.cpp | 2 +-
6 files changed, 33 insertions(+), 19 deletions(-)
diff --git a/data/com.kylinsec.kiran.screensaver.gschema.xml b/data/com.kylinsec.kiran.screensaver.gschema.xml
index d5d77e6..17b6f20 100644
--- a/data/com.kylinsec.kiran.screensaver.gschema.xml
+++ b/data/com.kylinsec.kiran.screensaver.gschema.xml
@@ -5,10 +5,10 @@
<default>"/usr/lib64/kiran-screensaver/libkiran-screensaver-dialog.so"</default>
</key>
-<!-- <key name="idle-activation-lock" type="b">-->
-<!-- <default>true</default>-->
-<!-- <description>空闲时是否锁定</description>-->
-<!-- </key>-->
+ <key name="idle-activation-lock" type="b">
+ <default>true</default>
+ <description>空闲时是否锁定</description>
+ </key>
<key name="can-logout" type="b">
<default>true</default>
diff --git a/src/idle-watcher/idle-watcher-mate.cpp b/src/idle-watcher/idle-watcher-mate.cpp
index f562022..0cba668 100644
--- a/src/idle-watcher/idle-watcher-mate.cpp
+++ b/src/idle-watcher/idle-watcher-mate.cpp
@@ -97,6 +97,7 @@ bool IdleWatcherMate::setIdleDetectionActive(bool idleDetectionActive)
m_idle = false;
m_idleNotice = false;
+ //NOTE:由于空闲预告阶段会抓取鼠标键盘到屏幕外,所以空闲预告阶段不会出现设置空闲检测的情况,暂时不需要考虑特殊情况
if(m_idleTimerID != 0)
{
killTimer(m_idleTimerID);
diff --git a/src/manager.cpp b/src/manager.cpp
index 8c26da9..87041ca 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -137,9 +137,15 @@ bool Manager::initIdleWatcher()
connect(m_idleWatcher,&IdleWatcher::idleChanged,this, &Manager::onWatcherIdleChanged,Qt::DirectConnection);
connect(m_idleWatcher,&IdleWatcher::idleNoticeChanged,this, &Manager::onWatcherIdleNoticeChanged,Qt::DirectConnection);
- m_idleWatcher->setEnabled(true);
- m_idleWatcher->setIdleDetectionActive(true);
-
+ m_idleWatcher->setEnabled(m_prefs->getIdleActivationLock());
+ m_idleWatcher->setIdleDetectionActive(m_prefs->getIdleActivationLock());
+
+ //连接至GSettings变化判断是否开启空闲时锁屏,同步空闲监控器状态
+ connect(m_prefs,&Prefs::idleActivationLockChanged,[this](bool idleActivationLock){
+ KLOG_DEBUG() << "prefs idle activation lock changed:" << idleActivationLock << " update idle watcher enable";
+ m_idleWatcher->setEnabled(idleActivationLock);
+ m_idleWatcher->setIdleDetectionActive(idleActivationLock);
+ });
return true;
}
diff --git a/src/prefs.cpp b/src/prefs.cpp
index bd34bbd..3e654a9 100644
--- a/src/prefs.cpp
+++ b/src/prefs.cpp
@@ -26,11 +26,11 @@
}
#define SCHEMA_KIRAN_SCREENSAVER "com.kylinsec.kiran.screensaver"
-#define KEY_IDLE_ACTIVATION_LOCK "idle-activation-lock"
-#define KEY_CAN_LOGOUT "can-logout"
-#define KEY_CAN_USER_SWITCH "can-user-switch"
-#define KEY_ENABLE_ANIMATION "enable-animation"
-#define KEY_SCREENSAVER_LOCKER "screensaver-locker"
+#define KEY_IDLE_ACTIVATION_LOCK "idleActivationLock"
+#define KEY_CAN_LOGOUT "canLogout"
+#define KEY_CAN_USER_SWITCH "canUserSwitch"
+#define KEY_ENABLE_ANIMATION "enableAnimation"
+#define KEY_SCREENSAVER_LOCKER "screensaverLocker"
using namespace Kiran::ScreenSaver;
@@ -58,7 +58,7 @@ bool Prefs::init()
KLOG_WARNING() << "can't connect screensaver settings changed!";
}
- //m_idleActivationLock = m_screensaverSettings->get(KEY_IDLE_ACTIVATION_LOCK).toBool();
+ m_idleActivationLock = m_screensaverSettings->get(KEY_IDLE_ACTIVATION_LOCK).toBool();
m_canLogout = m_screensaverSettings->get(KEY_CAN_LOGOUT).toBool();
m_canUserSwitch = m_screensaverSettings->get(KEY_CAN_USER_SWITCH).toBool();
m_enableAnimation = m_screensaverSettings->get(KEY_ENABLE_ANIMATION).toBool();
@@ -66,7 +66,7 @@ bool Prefs::init()
///输出设置项
KLOG_DEBUG() << "load kiran-screensaver prefs:";
- //KLOG_DEBUG() << "\t" KEY_IDLE_ACTIVATION_LOCK << m_idleActivationLock;
+ KLOG_DEBUG() << "\t" KEY_IDLE_ACTIVATION_LOCK << m_idleActivationLock;
KLOG_DEBUG() << "\t" KEY_CAN_LOGOUT << m_canLogout;
KLOG_DEBUG() << "\t" KEY_CAN_USER_SWITCH << m_canUserSwitch;
KLOG_DEBUG() << "\t" KEY_ENABLE_ANIMATION << m_enableAnimation;
@@ -91,14 +91,12 @@ bool Prefs::getCanUserSwitch() const
return m_canUserSwitch;
}
-/*
void Prefs::setIdleActivationLock(bool idleActivationLock)
{
RETURN_IF_SAME(m_idleActivationLock, idleActivationLock);
m_idleActivationLock = idleActivationLock;
m_screensaverSettings->set(KEY_IDLE_ACTIVATION_LOCK, m_idleActivationLock);
}
-*/
void Prefs::setCanLogout(bool canLogout)
{
@@ -117,7 +115,7 @@ void Prefs::setCanUserSwitch(bool canUserSwitch)
void Prefs::handleGSettingsChanged(const QString& key)
{
const QMap<QString, bool*> boolKeyMap = {
- //{KEY_IDLE_ACTIVATION_LOCK, &m_idleActivationLock},
+ {KEY_IDLE_ACTIVATION_LOCK, &m_idleActivationLock},
{KEY_CAN_LOGOUT, &m_canLogout},
{KEY_CAN_USER_SWITCH, &m_canUserSwitch},
{KEY_ENABLE_ANIMATION,&m_enableAnimation}
@@ -128,6 +126,11 @@ void Prefs::handleGSettingsChanged(const QString& key)
{
*boolIter.value() = m_screensaverSettings->get(boolIter.key()).toBool();
}
+ qInfo() << "keyChanged" << key;
+ if( key == KEY_IDLE_ACTIVATION_LOCK )
+ {
+ emit idleActivationLockChanged(m_idleActivationLock);
+ }
}
bool Prefs::getEnableAnimation() const
diff --git a/src/prefs.h b/src/prefs.h
index 797bdfe..30431d3 100644
--- a/src/prefs.h
+++ b/src/prefs.h
@@ -30,6 +30,7 @@ namespace ScreenSaver
{
class Prefs : public QObject
{
+ Q_OBJECT
public:
static Prefs* getInstance();
~Prefs() override;
@@ -48,8 +49,11 @@ public:
QString getLockerPluginPath() const;
+signals:
+ void idleActivationLockChanged(bool idleActivationLock);
+
private:
- //void setIdleActivationLock(bool idleActivationLock);
+ void setIdleActivationLock(bool idleActivationLock);
void setCanLogout(bool canLogout);
void setCanUserSwitch(bool canUserSwitch);
void setEnableAnimation(bool enableAnimation);
diff --git a/src/view/window.cpp b/src/view/window.cpp
index b05dd81..c826e97 100644
--- a/src/view/window.cpp
+++ b/src/view/window.cpp
@@ -80,7 +80,7 @@ void Window::setScreen(QScreen *screen)
{
setObjectName(QString("screen_background_%1").arg(screen->name()));
connect(screen, &QScreen::geometryChanged,
- this, &Window::handleScreenGeometryChanged);
+ this, &Window::handleScreenGeometryChanged );
}
else
{
--
2.27.0

View File

@ -1,119 +0,0 @@
From d001fc82a1a872ae1dd0dadc5ef3d0c80181c1f6 Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinos.com.cn>
Date: Fri, 31 Dec 2021 15:32:01 +0800
Subject: [PATCH 2/3] fix(crash): fix crash in some situation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 修复屏保后端在某些情况下崩溃的问题
---
src/idle-watcher/idle-watcher-mate.cpp | 3 +++
src/view/screen-manager.cpp | 16 ++++++++++------
src/view/screen-manager.h | 6 +++---
3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/idle-watcher/idle-watcher-mate.cpp b/src/idle-watcher/idle-watcher-mate.cpp
index 0cba668..9d744c3 100644
--- a/src/idle-watcher/idle-watcher-mate.cpp
+++ b/src/idle-watcher/idle-watcher-mate.cpp
@@ -97,11 +97,14 @@ bool IdleWatcherMate::setIdleDetectionActive(bool idleDetectionActive)
m_idle = false;
m_idleNotice = false;
+
//NOTE:由于空闲预告阶段会抓取鼠标键盘到屏幕外,所以空闲预告阶段不会出现设置空闲检测的情况,暂时不需要考虑特殊情况
if(m_idleTimerID != 0)
{
killTimer(m_idleTimerID);
+ m_idleTimerID = 0;
}
+
m_idleDetectionActive = idleDetectionActive;
return true;
}
diff --git a/src/view/screen-manager.cpp b/src/view/screen-manager.cpp
index f8d7803..d7fc124 100644
--- a/src/view/screen-manager.cpp
+++ b/src/view/screen-manager.cpp
@@ -42,10 +42,10 @@ ScreenManager::ScreenManager(Fade *fade,
if (m_prefs != nullptr)
{
m_enableAnimation = m_prefs->getEnableAnimation();
- m_idleActivationLock = m_prefs->getIdleActivationLock();
+ //m_idleActivationLock = m_prefs->getIdleActivationLock();
}
- QCoreApplication::instance()->installEventFilter(this);
+ QApplication::instance()->installEventFilter(this);
}
ScreenManager::~ScreenManager()
@@ -260,14 +260,15 @@ bool ScreenManager::activate()
// 创建解锁框,屏保框
m_screensaver = new Screensaver(m_enableAnimation, nullptr);
- if (m_idleActivationLock)
- {
+ //NOTE:空闲是否锁定屏幕控制权交由IdleWatcher决定若IdleWatcher发出空闲信号则锁定屏幕
+// if (m_idleActivationLock) // 若开启空闲时锁定屏幕,创建解锁框
+// {
if (!setLockActive(true))
{
delete m_screensaver;
return false;
}
- }
+// }
// 获取桌面壁纸路径
QString backgroundPath;
@@ -371,9 +372,10 @@ bool ScreenManager::eventFilter(QObject *watched, QEvent *event)
return QObject::eventFilter(watched, event);
}
+//NOTE:在事件过滤之中删除某些控件并且该控件同时是事件的接收者需要过滤该事件,避免崩溃
bool ScreenManager::eventFilterActivate(QObject *watched, QEvent *event)
{
- if (!m_active)
+ if ( !m_active || (event->type()!=QEvent::MouseButtonPress && event->type()!=QEvent::KeyPress) )
return false;
// 若解锁框已被激活 按键和鼠标事件触发解锁框显示
@@ -388,6 +390,7 @@ bool ScreenManager::eventFilterActivate(QObject *watched, QEvent *event)
else if (!getLockActive())
{
emit sigReqDeactivated();
+ return true;
}
}
else if (event->type() == QEvent::KeyPress)
@@ -396,6 +399,7 @@ bool ScreenManager::eventFilterActivate(QObject *watched, QEvent *event)
if (!getLockActive())
{
emit sigReqDeactivated();
+ return true;
}
else
{
diff --git a/src/view/screen-manager.h b/src/view/screen-manager.h
index b5253a0..9fa14c9 100644
--- a/src/view/screen-manager.h
+++ b/src/view/screen-manager.h
@@ -121,10 +121,10 @@ private:
// 当前显示内容的背景窗口
Window* m_currentWindow = nullptr;
// 屏保界面
- Screensaver* m_screensaver;
+ Screensaver* m_screensaver = nullptr;
// 解锁框界面
- PluginInterface* m_lockerPluginInterface;
- LockerInterface* m_lockerInterface;
+ PluginInterface* m_lockerPluginInterface = nullptr;
+ LockerInterface* m_lockerInterface = nullptr;
};
} // namespace ScreenSaver
} // namespace Kiran
--
2.27.0

View File

@ -1,32 +0,0 @@
From d588833ca6e4b53037e88a67716f03ce332aae9a Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinos.com.cn>
Date: Tue, 4 Jan 2022 15:26:55 +0800
Subject: [PATCH 3/3] refactor(Qt): adapt to lower version QT
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 适配5.9.2版本Qt,QStringLiteral头文件差异问题
---
src/listener/listener.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/listener/listener.cpp b/src/listener/listener.cpp
index b01996e..4440f72 100644
--- a/src/listener/listener.cpp
+++ b/src/listener/listener.cpp
@@ -20,7 +20,11 @@
#include <QDBusConnectionInterface>
#include <QDateTime>
#include <QDebug>
+#if (QT_VERSION > QT_VERSION_CHECK(5,9,2))
#include <QStringLiteral>
+#else
+#include <QString>
+#endif
#define NOT_SUPPORTED_METHOD \
{ \
--
2.27.0

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,6 @@
Name: kiran-screensaver
Version: 2.2.0
Release: 9
Version: 2.2.1
Release: 1
Summary: Kiran Desktop Screensaver Backend
Summary(zh_CN): kiran桌面屏保后端
@ -8,10 +8,6 @@ License: Mulan PSL v2
Source0: %{name}-%{version}.tar.gz
Patch0001: 0000-feature-idle-lock-add-idle-activation-lock-gsettings-a7ecb4a2.patch
Patch0002: 0002-fix-crash-fix-crash-in-some-situation-d001fc82.patch
Patch0003: 0003-refactor-Qt-adapt-to-lower-version-QT-d588833c.patch
BuildRequires: gcc-c++
BuildRequires: cmake
BuildRequires: qt5-qtbase-devel
@ -74,6 +70,11 @@ glib-compile-schemas /usr/share/glib-2.0/schemas &> /dev/nulls || :
rm -rf %{buildroot}
%changelog
* Mon Jul 25 2022 liuxinhao <liuxinhao@kylinsec.com.cn> - 2.2.1-1
- KYOS-F: fix xscreensaver black screen
- KYOS-F: Fixed high CPU utilization caused by floating label animation
- KYOS-F: fixed unlocked screen due to blocking access to the kiran backend before suspend
* Tue Mar 01 2022 longcheng <longcheng@kylinos.com.cn> - 2.2.0-9
- KYOS-F: Do not output the alarm information to the screen