diff -Nru ukui-screensaver-4.10.0.0/debian/patches/0071-sync-codes-from-v11-2503.patch ukui-screensaver-4.10.0.0/debian/patches/0071-sync-codes-from-v11-2503.patch
--- ukui-screensaver-4.10.0.0/debian/patches/0071-sync-codes-from-v11-2503.patch	1970-01-01 08:00:00.000000000 +0800
+++ ukui-screensaver-4.10.0.0/debian/patches/0071-sync-codes-from-v11-2503.patch	2024-11-15 10:53:30.000000000 +0800
@@ -0,0 +1,704 @@
+From: liudun <liudun@kylinos.cn>
+Date: Tue, 21 Jan 2025 13:51:08 +0800
+Subject: sync codes from v11-2503
+
+---
+ src/dbusifs/kglobalaccelhelper.cpp      | 13 +++++---
+ src/lock-backend/dbusupperinterface.cpp | 27 +++++++++-------
+ src/lock-backend/dbusupperinterface.h   |  2 +-
+ src/lock-dialog/backenddbushelper.cpp   |  3 +-
+ src/lock-dialog/backenddbushelper.h     |  2 +-
+ src/lock-dialog/lockdialogmodel.h       |  2 +-
+ src/lock-dialog/main.cpp                | 23 ++++++++------
+ src/screensaver/CMakeLists.txt          |  6 ++--
+ src/screensaver/main.cpp                |  3 ++
+ src/screensaver/screensaver.cpp         | 50 ++++++++++++++++--------------
+ src/widgets/blockwidget.cpp             | 55 ++++++++++++++++++++++++++++++---
+ src/widgets/blockwidget.h               |  1 +
+ src/widgets/fullbackgroundwidget.cpp    | 20 ++++++------
+ src/widgets/lockwidget.cpp              |  6 ++++
+ src/widgets/powerlistwidget.cpp         | 27 +++++++++++-----
+ src/widgets/powerlistwidget.h           |  6 ++--
+ 16 files changed, 168 insertions(+), 78 deletions(-)
+
+diff --git a/src/dbusifs/kglobalaccelhelper.cpp b/src/dbusifs/kglobalaccelhelper.cpp
+index 1094cc6..070b404 100644
+--- a/src/dbusifs/kglobalaccelhelper.cpp
++++ b/src/dbusifs/kglobalaccelhelper.cpp
+@@ -36,10 +36,15 @@ KglobalAccelHelper::~KglobalAccelHelper() {}
+ 
+ bool KglobalAccelHelper::blockShortcut(bool val)
+ {
+-    QDBusMessage result = m_kglobalInterface->call("blockGlobalShortcuts", val);
+-    if (result.type() == QDBusMessage::ErrorMessage) {
+-        qWarning() << "blockShortcut error:" << result.errorMessage();
++    qDebug()<<"m_kglobalInterface isvalid:"<<m_kglobalInterface->isValid();
++    if (m_kglobalInterface->isValid()) {
++        QDBusMessage result = m_kglobalInterface->call("blockGlobalShortcuts", val);
++        if (result.type() == QDBusMessage::ErrorMessage) {
++            qWarning() << "blockShortcut error:" << result.errorMessage();
++            return false;
++        }
++        return true;
++    } else {
+         return false;
+     }
+-    return true;
+ }
+diff --git a/src/lock-backend/dbusupperinterface.cpp b/src/lock-backend/dbusupperinterface.cpp
+index 940d699..a7da4d2 100644
+--- a/src/lock-backend/dbusupperinterface.cpp
++++ b/src/lock-backend/dbusupperinterface.cpp
+@@ -301,7 +301,7 @@ void DbusUpperInterface::SessionTools()
+         message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
+         message << "CmdSessionTools";
+         QDBusConnection::sessionBus().send(message);
+-        emitLockState(true);
++        emitLockState(false, true);
+         return;
+     }
+     m_bLockState = false;
+@@ -309,7 +309,7 @@ void DbusUpperInterface::SessionTools()
+     qDebug() << cmd;
+ 
+     m_procLockDialog.start(cmd);
+-    emitLockState(true);
++    emitLockState(false, true);
+ }
+ 
+ void DbusUpperInterface::AppBlockWindow(QString actionType)
+@@ -340,7 +340,7 @@ void DbusUpperInterface::AppBlockWindow(QString actionType)
+         else
+             return;
+         QDBusConnection::sessionBus().send(message);
+-        emitLockState(false);
++        emitLockState(false, true);
+         return;
+     }
+     if (actionType != "Restart" && actionType != "Shutdown" && actionType != "Suspend" && actionType != "Hibernate"
+@@ -352,7 +352,7 @@ void DbusUpperInterface::AppBlockWindow(QString actionType)
+     qDebug() << cmd;
+ 
+     m_procLockDialog.start(cmd);
+-    emitLockState(false);
++    emitLockState(false, true);
+ }
+ 
+ void DbusUpperInterface::MultiUserBlockWindow(QString actionType)
+@@ -367,7 +367,7 @@ void DbusUpperInterface::MultiUserBlockWindow(QString actionType)
+         else
+             return;
+         QDBusConnection::sessionBus().send(message);
+-        emitLockState(false);
++        emitLockState(false, true);
+         return;
+     }
+     if (actionType != "Restart" && actionType != "Shutdown")
+@@ -378,7 +378,7 @@ void DbusUpperInterface::MultiUserBlockWindow(QString actionType)
+     qDebug() << cmd;
+ 
+     m_procLockDialog.start(cmd);
+-    emitLockState(false);
++    emitLockState(false, true);
+ }
+ 
+ void DbusUpperInterface::Suspend()
+@@ -619,23 +619,25 @@ bool DbusUpperInterface::checkScreenDialogRunning()
+     return isRunning;
+ }
+ 
+-void DbusUpperInterface::emitLockState(bool val)
++void DbusUpperInterface::emitLockState(bool val, bool isSessionTools)
+ {
+     qDebug() << "emitLockState state = " << val;
+ 
+     if (val != m_bBlockShortcutState) {
+         m_kglobalHelper->blockShortcut(val);
+         m_bBlockShortcutState = val;
+-        qDebug() << " block all shortcut " << "blockShortcut states = " << m_bBlockShortcutState;
++        qDebug() << " block all shortcut "
++                 << "blockShortcut states = " << m_bBlockShortcutState;
+     }
+ 
+     QDBusMessage message;
+-    if (val) {
++    if (val && !isSessionTools) {
+         message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "lock");
+-    } else {
++        QDBusConnection::sessionBus().send(message);
++    } else if (!val && !isSessionTools) {
+         message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "unlock");
++        QDBusConnection::sessionBus().send(message);
+     }
+-    QDBusConnection::sessionBus().send(message);
+ }
+ 
+ QString DbusUpperInterface::GetInformation(QString strJson)
+@@ -2619,9 +2621,10 @@ bool DbusUpperInterface::lockStateChanged(const QJsonObject &objInfo)
+ {
+     int nRet = -1;
+     bool state = objInfo.value("Content").toBool();
++    bool isSessionTools = objInfo.value("SessionTools").toBool();
+     if (lockState != state) {
+         lockState = state;
+-        emitLockState(state);
++        emitLockState(state, isSessionTools);
+     }
+     return lockState;
+ }
+diff --git a/src/lock-backend/dbusupperinterface.h b/src/lock-backend/dbusupperinterface.h
+index 67302bb..2797db9 100644
+--- a/src/lock-backend/dbusupperinterface.h
++++ b/src/lock-backend/dbusupperinterface.h
+@@ -68,7 +68,7 @@ public:
+ 
+ public:
+     bool checkScreenDialogRunning();
+-    void emitLockState(bool val);
++    void emitLockState(bool val, bool isSessionTools = false);
+     void LockStartupMode();
+     /**
+      * @brief 获取黑色屏保状态(沿用)
+diff --git a/src/lock-dialog/backenddbushelper.cpp b/src/lock-dialog/backenddbushelper.cpp
+index 16c655b..eb6ff0e 100644
+--- a/src/lock-dialog/backenddbushelper.cpp
++++ b/src/lock-dialog/backenddbushelper.cpp
+@@ -358,11 +358,12 @@ bool BackendDbusHelper::setCurrentSession(QString strSession)
+     return true;
+ }
+ 
+-bool BackendDbusHelper::lockStateChanged(bool isVisible)
++bool BackendDbusHelper::lockStateChanged(bool isVisible, bool isSessionTools)
+ {
+     QJsonObject jsonCmd;
+     jsonCmd["CmdId"] = LOCK_CMD_ID_LOCK_STATE_CHANGED;
+     jsonCmd["Content"] = isVisible;
++    jsonCmd["SessionTools"] = isSessionTools;
+     QDBusPendingReply<int> reply = SetInformation(QString(QJsonDocument(jsonCmd).toJson()));
+     if (reply.isError()) {
+         qWarning() << "lockStateChanged error: " << reply.error().message();
+diff --git a/src/lock-dialog/backenddbushelper.h b/src/lock-dialog/backenddbushelper.h
+index 3bac8b9..426ab68 100644
+--- a/src/lock-dialog/backenddbushelper.h
++++ b/src/lock-dialog/backenddbushelper.h
+@@ -148,7 +148,7 @@ public Q_SLOTS:
+     bool setCurrentUser(QString strUserName);
+     int switchToUser(QString strUserName);
+     bool setCurrentSession(QString strSession);
+-    bool lockStateChanged(bool isVisible);
++    bool lockStateChanged(bool isVisible, bool isSessionTools);
+     void startSession();
+ 
+     void pamAuthenticate(QString strUserName);
+diff --git a/src/lock-dialog/lockdialogmodel.h b/src/lock-dialog/lockdialogmodel.h
+index 72abc20..8db3e16 100644
+--- a/src/lock-dialog/lockdialogmodel.h
++++ b/src/lock-dialog/lockdialogmodel.h
+@@ -512,7 +512,7 @@ Q_SIGNALS:
+ 
+     void agreementInfoChanged();
+ 
+-    void lockStateChanged(bool isVisible);
++    void lockStateChanged(bool isVisible, bool isSessionTools);
+ 
+     void lidstateChanged(const QString &lidstate);
+ 
+diff --git a/src/lock-dialog/main.cpp b/src/lock-dialog/main.cpp
+index 167ab7f..68c6e78 100644
+--- a/src/lock-dialog/main.cpp
++++ b/src/lock-dialog/main.cpp
+@@ -54,10 +54,6 @@ int main(int argc, char *argv[])
+     initUkuiLog4qt("ukui-screensaver-dialog");
+     // 重启或关机时不被session关掉
+     qunsetenv("SESSION_MANAGER");
+-    if (!isGreeterMode()) {
+-        // 试用模式不起锁屏
+-        checkIslivecd();
+-    }
+ 
+     qputenv("QT_QPA_PLATFORMTHEME", QByteArray("ukui"));
+ 
+@@ -85,6 +81,20 @@ int main(int argc, char *argv[])
+     }
+     QString id = QString("ukui-screensaver-dialog" + strDisplay);
+     QtSingleApplication app(id, argc, argv);
++
++    LockDialogModel::CommandLineArgs cmdArgs;
++    if (!lockDialogModel->parseCmdArguments(app.arguments(), cmdArgs)) {
++        return 0;
++    }
++
++    if (!isGreeterMode()) {
++	// 需要判断参数是否是session-tools
++        if (!cmdArgs.isSessionTools) {
++            // 试用模式不起锁屏
++            checkIslivecd();
++        }
++    }
++
+     if (app.isRunning()) {
+         QString strArguments = QApplication::arguments().join(",");
+         app.sendMessage(strArguments);
+@@ -125,11 +135,6 @@ int main(int argc, char *argv[])
+         loopTemp->exec();
+     }
+ 
+-    LockDialogModel::CommandLineArgs cmdArgs;
+-
+-    if (!lockDialogModel->parseCmdArguments(app.arguments(), cmdArgs)) {
+-        return 0;
+-    }
+     QObject::connect(
+         &app, SIGNAL(messageReceived(const QString &)), lockDialogModel, SLOT(onRunningMessage(const QString &)));
+ 
+diff --git a/src/screensaver/CMakeLists.txt b/src/screensaver/CMakeLists.txt
+index ada55ef..ab4eabf 100644
+--- a/src/screensaver/CMakeLists.txt
++++ b/src/screensaver/CMakeLists.txt
+@@ -64,7 +64,7 @@ set(screensaver_SRC
+     ../agreementinfo.cpp
+     )
+ add_executable(ukui-screensaver-default ${screensaver_SRC})
+-target_link_libraries(ukui-screensaver-default Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
++target_link_libraries(ukui-screensaver-default Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network ukui-log4qt Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
+ 
+ qt5_add_resources(screensaver_Plugin_SRC
+         default.qrc
+@@ -112,7 +112,7 @@ set(screensaver_Plugin_SRC
+     )
+ 
+ add_library(screensaver-default SHARED ${screensaver_Plugin_SRC})
+-target_link_libraries(screensaver-default Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
++target_link_libraries(screensaver-default Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network ukui-log4qt Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
+ 
+ qt5_add_resources(Screensaver_SRC
+         default.qrc
+@@ -160,7 +160,7 @@ set(Screensaver_SRC
+     )
+ 
+ add_library(Screensaver STATIC ${Screensaver_SRC})
+-target_link_libraries(Screensaver Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
++target_link_libraries(Screensaver Qt5::Core Qt5::Widgets Qt5::DBus Qt5::X11Extras Qt5::Xml Qt5::Network ukui-log4qt Qt5::Multimedia Qt5::MultimediaWidgets  avformat avcodec ${EXTRA_LIBS})
+ 
+ install(TARGETS
+ 	ukui-screensaver-default
+diff --git a/src/screensaver/main.cpp b/src/screensaver/main.cpp
+index 4190ec5..6b04da1 100644
+--- a/src/screensaver/main.cpp
++++ b/src/screensaver/main.cpp
+@@ -31,6 +31,7 @@
+ #include <sys/prctl.h>
+ #include <signal.h>
+ #include <syslog.h>
++#include <ukui-log4qt.h>
+ 
+ #define WORKING_DIRECTORY "/usr/share/ukui-screensaver"
+ bool bControlFlg = false;//是否控制面板窗口
+@@ -42,6 +43,8 @@ int main(int argc, char *argv[])
+     QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
+ #endif
+     QApplication a(argc, argv);
++
++    initUkuiLog4qt("ukui-screensaver-default");
+ /*
+     prctl(PR_SET_PDEATHSIG, SIGHUP);
+     //加载翻译文件
+diff --git a/src/screensaver/screensaver.cpp b/src/screensaver/screensaver.cpp
+index 71e2f0a..c0fce8c 100644
+--- a/src/screensaver/screensaver.cpp
++++ b/src/screensaver/screensaver.cpp
+@@ -370,7 +370,7 @@ bool Screensaver::eventFilter(QObject *obj, QEvent *event)
+         }
+     }
+ #endif
+-    return false;
++    return QWidget::eventFilter(obj, event);
+ }
+ 
+ void Screensaver::paintEvent(QPaintEvent *event)
+@@ -539,23 +539,25 @@ void Screensaver::resizeEvent(QResizeEvent * /*event*/)
+         if (flag == 0) {
+             QList<QLabel *> labelList = this->findChildren<QLabel *>();
+             for (int i = 0; i < labelList.count(); i++) {
+-                int fontsize = labelList.at(i)->font().pixelSize();
+-                int fontpt = labelList.at(i)->font().pointSize();
+-                if (fontsize > 0) {
++                if (labelList.at(i) != myPreviewLabel) {
++                    int fontsize = labelList.at(i)->font().pixelSize();
++                    int fontpt = labelList.at(i)->font().pointSize();
++                    if (fontsize > 0) {
+ #ifdef USE_INTEL
+-                    const QString SheetStyle = QString("font-size:%1px;").arg(fontsize / 3);
++                        const QString SheetStyle = QString("font-size:%1px;").arg(fontsize / 3);
+ #else
+-                    const QString SheetStyle = QString("font-size:%1px;").arg(fontsize / 4);
++                        const QString SheetStyle = QString("font-size:%1px;").arg(fontsize / 4);
+ #endif
+-                    labelList.at(i)->setStyleSheet(SheetStyle);
+-                } else {
+-                    QFont font = labelList.at(i)->font();
++                        labelList.at(i)->setStyleSheet(SheetStyle);
++                    } else {
++                        QFont font = labelList.at(i)->font();
+ #ifdef USE_INTEL
+-                    font.setPointSize(fontpt / 3);
++                        font.setPointSize(fontpt / 3);
+ #else
+-                    font.setPointSize(fontpt / 4);
++                        font.setPointSize(fontpt / 4);
+ #endif
+-                    labelList.at(i)->setFont(font);
++                        labelList.at(i)->setFont(font);
++                    }
+                 }
+             }
+             QList<QWidget *> childList = timeLayout->findChildren<QWidget *>();
+@@ -882,6 +884,17 @@ void Screensaver::initUI()
+             }
+         }
+     }
++    // V11上在窗口关闭时会收到一个leaveEvent(),控制面板关闭的时候new这个label,会导致控制面板关闭卡顿。
++    if (!myPreviewLabel) {
++        myPreviewLabel = new QLabel(this);
++        myPreviewLabel->setFixedHeight(30);
++        myPreviewLabel->setMinimumWidth(54);
++
++        // 设置样式
++        myPreviewLabel->setStyleSheet("background-color: rgb(38,38,38); border-radius: 0px; color:white;");
++        myPreviewLabel->setAlignment(Qt::AlignCenter);
++        myPreviewLabel->hide();
++    }
+ #endif
+ }
+ 
+@@ -1136,16 +1149,6 @@ void Screensaver::setRandomText()
+ 
+ void Screensaver::setPreviewText(bool bVisible)
+ {
+-    if (!myPreviewLabel) {
+-        myPreviewLabel = new QLabel(this);
+-        myPreviewLabel->setFixedHeight(30);
+-        myPreviewLabel->setMinimumWidth(54);
+-
+-        // 设置样式
+-        myPreviewLabel->setStyleSheet("background-color: rgb(38,38,38); border-radius: 0px; color:white;");
+-        myPreviewLabel->setAlignment(Qt::AlignCenter);
+-    }
+-
+     myPreviewLabel->setText(m_strPreViewTrans);
+     myPreviewLabel->adjustSize();
+ 
+@@ -1312,7 +1315,8 @@ QPixmap Screensaver::loadFromFile(QString strPath)
+ void Screensaver::getVideoFormat(QString fileName)
+ {
+     char *ch;
+-    QByteArray ba = fileName.toLatin1();
++    // 用toLiatin1()解析在有中文路径时回乱码
++    QByteArray ba = fileName.toUtf8();
+     ch = ba.data();
+ 
+     int ret;
+diff --git a/src/widgets/blockwidget.cpp b/src/widgets/blockwidget.cpp
+index 1a3afc0..a0755d3 100644
+--- a/src/widgets/blockwidget.cpp
++++ b/src/widgets/blockwidget.cpp
+@@ -137,8 +137,27 @@ void BlockWidget::setTips(const QString tips)
+     m_tipLabel->show();
+     m_listView->hide();
+     m_tipLabel->setText(tips);
+-    m_cancelButton->setText(tr("Cancel"));
+-    m_confirmButton->setText(tr("Confrim"));
++    QString cancelStrEText = getElidedText(
++        m_cancelButton->font(),
++        m_cancelButton->width() - m_cancelButton->contentsMargins().left() - m_cancelButton->contentsMargins().right(),
++        tr("Cancel"));
++    if (cancelStrEText == tr("Cancel")) {
++        m_cancelButton->setText(tr("Cancel"));
++    } else if (cancelStrEText != tr("Cancel")) {
++        m_cancelButton->setText(cancelStrEText);
++        m_cancelButton->setToolTip(tr("Cancel"));
++    }
++    QString strEText = getElidedText(
++        m_confirmButton->font(),
++        m_confirmButton->width() - m_confirmButton->contentsMargins().left()
++            - m_confirmButton->contentsMargins().right(),
++        tr("Confrim"));
++    if (strEText == tr("Confrim")) {
++        m_confirmButton->setText(tr("Confrim"));
++    } else if (strEText != tr("Confrim")) {
++        m_confirmButton->setText(strEText);
++        m_confirmButton->setToolTip(tr("Confrim"));
++    }
+ }
+ 
+ void BlockWidget::setMsgTips(int type)
+@@ -236,8 +255,27 @@ void BlockWidget::setWarning(QStringList list, int type)
+                                   "QPushButton:pressed {background: rgba(255, 255, 255, 0.3);border-radius: 24px;}");
+     sysFont.setPointSize((16 + m_curFontSize) * m_ptToPx);
+     m_cancelButton->setFont(sysFont);
+-    m_cancelButton->setText(tr("Cancel"));
+-    m_confirmButton->setText(tr("Confrim"));
++    QString cancelStrEText = getElidedText(
++        m_cancelButton->font(),
++        m_cancelButton->width() - m_cancelButton->contentsMargins().left() - m_cancelButton->contentsMargins().right(),
++        tr("Cancel"));
++    if (cancelStrEText == tr("Cancel")) {
++        m_cancelButton->setText(tr("Cancel"));
++    } else if (cancelStrEText != tr("Cancel")) {
++        m_cancelButton->setText(cancelStrEText);
++        m_cancelButton->setToolTip(tr("Cancel"));
++    }
++    QString strEText = getElidedText(
++        m_confirmButton->font(),
++        m_confirmButton->width() - m_confirmButton->contentsMargins().left()
++            - m_confirmButton->contentsMargins().right(),
++        tr("Confrim"));
++    if (strEText == tr("Confrim")) {
++        m_confirmButton->setText(tr("Confrim"));
++    } else if (strEText != tr("Confrim")) {
++        m_confirmButton->setText(strEText);
++        m_confirmButton->setToolTip(tr("Confrim"));
++    }
+ }
+ 
+ QString BlockWidget::getHibited_tr_lowcase(int type)
+@@ -255,3 +293,12 @@ QString BlockWidget::getHibited_tr_lowcase(int type)
+     return "";
+ }
+ 
++QString BlockWidget::getElidedText(QFont font, int width, QString strInfo)
++{
++    QFontMetrics fontMetrics(font);
++    // 如果当前字体下,字符串长度大于指定宽度
++    if (fontMetrics.width(strInfo) > width) {
++        strInfo = QFontMetrics(font).elidedText(strInfo, Qt::ElideRight, width);
++    }
++    return strInfo;
++}
+diff --git a/src/widgets/blockwidget.h b/src/widgets/blockwidget.h
+index 748758a..fdd139b 100644
+--- a/src/widgets/blockwidget.h
++++ b/src/widgets/blockwidget.h
+@@ -48,6 +48,7 @@ public:
+ 
+ private:
+     void initUi();
++    QString getElidedText(QFont font, int width, QString strInfo);
+ 
+ private Q_SLOTS:
+     void onFontSizeChanged(double fontSize);
+diff --git a/src/widgets/fullbackgroundwidget.cpp b/src/widgets/fullbackgroundwidget.cpp
+index 3c313f2..2e3c28e 100644
+--- a/src/widgets/fullbackgroundwidget.cpp
++++ b/src/widgets/fullbackgroundwidget.cpp
+@@ -296,7 +296,7 @@ void FullBackgroundWidget::onSecondRunParam(const QString &str)
+ void FullBackgroundWidget::onShowBlankScreensaver(int nDelay, bool isHasLock)
+ {
+     qDebug() << "onShowBlankScreensaver:" << nDelay << "," << isHasLock;
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, false);
+ 
+     if (isHasLock) {
+         screenStatus = (ScreenStatus)(screenStatus | SCREEN_SAVER | SCREEN_LOCK);
+@@ -347,7 +347,7 @@ void FullBackgroundWidget::onShowLock(bool isStartup)
+     m_isStartupMode = isStartup;
+     show();
+     Q_EMIT m_modelLockDialog->setCurrentUser(m_modelLockDialog->defaultUserName());
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, false);
+     if (m_lockWidget && !m_lockWidget->isHidden())
+         m_lockWidget->show();
+ }
+@@ -363,7 +363,7 @@ void FullBackgroundWidget::onShowSwitchUserLock()
+     screenStatus = (ScreenStatus)(screenStatus | SCREEN_LOCK);
+     show();
+     Q_EMIT m_modelLockDialog->setCurrentUser(m_modelLockDialog->defaultUserName());
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, false);
+     if (m_lockWidget && !m_lockWidget->isHidden()) {
+         m_lockWidget->show();
+         m_lockWidget->onShowUserListWidget(true);
+@@ -376,7 +376,7 @@ void FullBackgroundWidget::onShowSessionTools()
+     m_isSessionTools = true;
+     show();
+     Q_EMIT m_modelLockDialog->setCurrentUser(m_modelLockDialog->defaultUserName());
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, true);
+     if (m_lockWidget && !m_lockWidget->isHidden())
+         m_lockWidget->onShowPowerListWidget(true);
+ }
+@@ -394,7 +394,7 @@ void FullBackgroundWidget::onShowAppBlockWindow(int actionType)
+         if (m_lockWidget && !m_lockWidget->isHidden())
+             screenStatus = (ScreenStatus)(screenStatus | SCREEN_LOCK);
+         Q_EMIT m_modelLockDialog->setCurrentUser(m_modelLockDialog->defaultUserName());
+-        Q_EMIT m_modelLockDialog->lockStateChanged(true);
++        Q_EMIT m_modelLockDialog->lockStateChanged(true, true);
+         m_isSessionTools = true;
+         if (m_lockWidget && !m_lockWidget->isHidden())
+             m_lockWidget->onShowInhibitWarning(lockcheck, actionType, true);
+@@ -408,7 +408,7 @@ void FullBackgroundWidget::onShowMultiUsersBlockWindows(int actionType)
+     show();
+     if (m_lockWidget && !m_lockWidget->isHidden())
+         Q_EMIT m_modelLockDialog->setCurrentUser(m_modelLockDialog->defaultUserName());
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, true);
+     if (m_lockWidget && !m_lockWidget->isHidden())
+         m_lockWidget->onMulUsersLogined(actionType, true);
+ }
+@@ -417,7 +417,7 @@ void FullBackgroundWidget::onShowSessionIdle()
+ {
+     onShowScreensaver();
+     delayLockScreen();
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, true);
+ }
+ 
+ void FullBackgroundWidget::onShowLockScreensaver()
+@@ -459,7 +459,7 @@ void FullBackgroundWidget::onShowScreensaver()
+         }
+     }
+     show();
+-    Q_EMIT m_modelLockDialog->lockStateChanged(true);
++    Q_EMIT m_modelLockDialog->lockStateChanged(true, false);
+ }
+ 
+ void FullBackgroundWidget::onClearScreensaver()
+@@ -468,6 +468,8 @@ void FullBackgroundWidget::onClearScreensaver()
+ 
+     for (auto widget : widgetXScreensaverList) {
+         widget->close();
++        delete widget;
++        widget = nullptr;
+     }
+     widgetXScreensaverList.clear();
+ 
+@@ -514,7 +516,7 @@ void FullBackgroundWidget::onLockScreenTimeout()
+ void FullBackgroundWidget::onCloseScreensaver()
+ {
+     hide();
+-    Q_EMIT m_modelLockDialog->lockStateChanged(false);
++    Q_EMIT m_modelLockDialog->lockStateChanged(false, false);
+     stopDelayLockScreen();
+     screenStatus = UNDEFINED;
+     m_isBlank = false;
+diff --git a/src/widgets/lockwidget.cpp b/src/widgets/lockwidget.cpp
+index a1cabbf..769e240 100644
+--- a/src/widgets/lockwidget.cpp
++++ b/src/widgets/lockwidget.cpp
+@@ -388,6 +388,7 @@ void LockWidget::initUserWidget()
+         m_userListWidget->updateWidgetSize();
+         m_userListWidget->hide();
+         connect(m_userListWidget, &UserListWidget::userSelected, m_modelLockDialog, [=](QString strUserName) {
++            exitSubWidget(false, false);
+             SwitchToUser(strUserName);
+         });
+         connect(m_userListWidget, &UserListWidget::widgetSizeChanged, m_modelLockDialog, [=]() {
+@@ -430,6 +431,11 @@ void LockWidget::initPowerWidget()
+     connect(m_powerListWidget, &PowerListWidget::suspendClicked, this, &LockWidget::onSuspendClicked);
+     connect(m_powerListWidget, &PowerListWidget::itemClicked, this, &LockWidget::onPowerItemClicked);
+     connect(m_powerListWidget, &PowerListWidget::switchuserClicked, this, &LockWidget::onSwitchuserClicked);
++    connect(m_powerListWidget, &PowerListWidget::powerWidgetClicked, this, [=] {
++        exitSubWidget();
++        Q_EMIT sessionToolsExit();
++        m_isSessionTools = false;
++    });
+     //    m_powerListWidget->clearFocus();
+ }
+ 
+diff --git a/src/widgets/powerlistwidget.cpp b/src/widgets/powerlistwidget.cpp
+index 4b35e4d..9e3cbde 100644
+--- a/src/widgets/powerlistwidget.cpp
++++ b/src/widgets/powerlistwidget.cpp
+@@ -51,6 +51,24 @@ bool PowerListWidget::eventFilter(QObject *obj, QEvent *event)
+     return MyListWidget::eventFilter(obj, event);
+ }
+ 
++void PowerListWidget::mouseReleaseEvent(QMouseEvent *event)
++{
++    QPoint mousePos = event->pos();
++    QList<PowerItemWidget*> itemList = this->findChildren<PowerItemWidget*>();
++    for (PowerItemWidget* item : itemList)
++    {
++        if (item->geometry().contains(mousePos))
++        {
++            //  如果是点击的功能按钮,不发信号,防止点击锁屏按钮时不进入锁屏
++            return QListWidget::mouseReleaseEvent(event);;
++        }
++    }
++    //  只有点击空白处,才需要发送信号
++    qDebug() << "Mouse press on list widget";
++    Q_EMIT powerWidgetClicked();
++    return QListWidget::mouseReleaseEvent(event);
++}
++
+ void PowerListWidget::setPowerType(int type)
+ {
+     m_powerType = type;
+@@ -78,9 +96,6 @@ void PowerListWidget::initUI()
+         "QScrollBar::add-line:vertical{width:0px;height:0px}"
+         "QScrollBar::sub-line:vertical{width:0px;height:0px}");
+     //    powerBtnList[0].func = &PowerListWidget::setSystemSuspend1();
+-
+-    m_curFontSize = m_modelLockDialog->getCurFontSize();
+-    m_ptToPx = m_modelLockDialog->getPtToPx();
+ }
+ 
+ void PowerListWidget::initConnections()
+@@ -186,7 +201,7 @@ void PowerListWidget::onUpdateListInfo()
+             QIcon::fromTheme(strIconTheme, QIcon(powerBtnList[i].m_strIcon))
+                 .pixmap(powerBtnList[i].m_icon_width, powerBtnList[i].m_icon_width),
+             "white"));
+-        btnWdg->setFontSize((16 + m_curFontSize) * m_ptToPx);
++        btnWdg->setFontSize((16 + m_modelLockDialog->getCurFontSize()) * m_modelLockDialog->getPtToPx());
+     }
+ }
+ 
+@@ -309,7 +324,7 @@ void PowerListWidget::refreshTranslate()
+         } else if (powerBtnList[i].setFuncName == "PowerOff") {
+             powerBtnList[i].m_strName = tr("Shut Down");
+             powerBtnList[i].m_strToolTip = tr("Close all apps, and then shut down your computer");
+-        } else if (powerBtnList[i].setFuncName == "Log Out") {
++        } else if (powerBtnList[i].setFuncName == "Logout") {
+             powerBtnList[i].m_strName = tr("Log Out");
+             powerBtnList[i].m_strToolTip
+                 = tr("The current user logs out of the system, terminates the session, and returns to the login page");
+@@ -321,8 +336,6 @@ void PowerListWidget::refreshTranslate()
+             powerBtnList[i].m_strName = tr("UpgradeThenRestart");
+         } else if (powerBtnList[i].setFuncName == "UpgradeThenShutdown") {
+             powerBtnList[i].m_strName = tr("UpgradeThenShutdown");
+-        } else if (powerBtnList[i].setFuncName == "PowerOff") {
+-            powerBtnList[i].m_strName = tr("Logout");
+         }
+     }
+     onUpdateListInfo();
+diff --git a/src/widgets/powerlistwidget.h b/src/widgets/powerlistwidget.h
+index 5c272fb..df9cf3b 100644
+--- a/src/widgets/powerlistwidget.h
++++ b/src/widgets/powerlistwidget.h
+@@ -211,6 +211,7 @@ public:
+ protected:
+     bool eventFilter(QObject *obj, QEvent *event);
+     void changeEvent(QEvent *event);
++    void mouseReleaseEvent(QMouseEvent *event) override;
+ 
+ Q_SIGNALS:
+     void mulUsersLogined(int inhibitType, bool iscommand);
+@@ -219,6 +220,8 @@ Q_SIGNALS:
+     void suspendClicked();
+     void switchuserClicked();
+     void sureShutDown(int inhibitType, bool iscommand);
++    void powerWidgetClicked();  /*发送电源管理鼠标点击信号,在eventfilter中点击listwidget的空白处,
++                                      收不到鼠标点击事件,只有在mouseReleaseEvent中能过滤到*/
+ 
+ public Q_SLOTS:
+     void onUpdateListInfo();
+@@ -237,9 +240,6 @@ private:
+     bool m_canSwitchUser = true;
+     bool m_canLogout = true;
+ 
+-    double m_curFontSize;
+-    double m_ptToPx = 1.0;
+-
+     int m_powerType = SAVER;
+     int m_powerBtnNum = 0;
+ 
diff -Nru ukui-screensaver-4.10.0.0/debian/patches/series ukui-screensaver-4.10.0.0/debian/patches/series
--- ukui-screensaver-4.10.0.0/debian/patches/series	2024-11-15 10:53:30.000000000 +0800
+++ ukui-screensaver-4.10.0.0/debian/patches/series	2024-11-15 10:53:30.000000000 +0800
@@ -68,3 +68,4 @@
 0068-105-blockGlobalShortcuts.patch
 0069-106-fixbug.patch
 0070-108.patch
+0071-sync-codes-from-v11-2503.patch