ukui-screensaver/ 0000775 0001750 0001750 00000000000 15254241235 012776 5 ustar feng feng ukui-screensaver/README_zh.md 0000664 0001750 0001750 00000004032 15254241235 014755 0 ustar feng feng # ukui-screensaver
[English](README.md)
UKUI 桌�环境的�����程�,基于 Qt6 开�。
## 功能特性
- é”�å±�界é�¢ï¼šæ”¯æŒ�密ç �认è¯�ã€�生物识别认è¯�
- å±�幕ä¿�护:支æŒ�多å±�ä¿�切æ�¢ã€�å£�纸轮æ’ã€�自定义å£�纸目录
- 电æº�管ç�†ï¼šæ”¯æŒ�挂起ã€�ä¼‘çœ ã€�é‡�å�¯ã€�关机æ“�作
- 多显示器支�
- 音频�视化��
- 虚拟键盘支�
- 网络状�显示
## �赖
### 编译�赖
- cmake (>= 3.5)
- Qt6: qt6-base-dev, qt6-tools-dev, qt6-svg-dev, qt6-multimedia-dev, qt6-base-private-dev, qt6-webengine-dev
- KF6: libkf6windowsystem-dev, libkf6networkmanagerqt-dev
- libpam0g-dev, libglib2.0-dev, libx11-dev, libxtst-dev
- libgsettings-qt6-dev, libmatemixer-dev, libimlib2-dev
- kwayland-dev, libkscreen-dev, libxrandr-dev, libxkbcommon-dev
- libnm-dev, libkylin-nm-base, kylin-nm-plugin-dev
- liblightdm-gobject-dev, libsystemd-dev, libssl-dev
- libavcodec-dev, libavformat-dev, libmpv-dev
- libukui-log4qt-dev, libkysdk-system-dev, libkysdk-applications-dev, libkysdk-base-dev
- libukcc-dev, libcharls-dev, libsqlite3-dev, libtag1-dev, libqrencode-dev, libpwquality-dev
### �行�赖
- ukui-session-manager (>= 4.0.0.0)
- libpam-biometric (>= 3.20.0.10)
- mate-desktop-common
- gstreamer1.0-libav
- libqt6sql6-sqlite
## 编译安装
```bash
cd ukui-screensaver
mkdir build && cd build
cmake ..
make
sudo make install
```
## 项目结构
```
src/
├── lock-dialog/ # ��界�
├── lock-backend/ # ���端(认��用户信�)
├── screensaver/ # �幕�护程�
├── widgets/ # 通用 UI 组件
├── common/ # 公共工具与�置
├── dbusifs/ # D-Bus 接�
├── liblightdm-qt/ # LightDM Qt 绑定
├── VirtualKeyboard/ # 虚拟键盘
├── QtSingleApplication/# �实例应用支�
└── ukccplugins/ # 控制���件
```
## 许��
本项目采用 [GPL-3.0 或更高版本](https://www.gnu.org/licenses/gpl-3.0.html) 许�。详� `debian/copyright`。
ukui-screensaver/config.h.in 0000664 0001750 0001750 00000000204 15254241235 015015 0 ustar feng feng #cmakedefine USE_INTEL
// == 下�是测试用的
#cmakedefine01 TEST_ON
#cmakedefine01 TEST_OF
#ifndef __${VAR}___@VAR@
#endif
ukui-screensaver/src/ 0000775 0001750 0001750 00000000000 15254241235 013565 5 ustar feng feng ukui-screensaver/src/lock-focushelper/ 0000775 0001750 0001750 00000000000 15254241235 017032 5 ustar feng feng ukui-screensaver/src/lock-focushelper/blackwindow.cpp 0000664 0001750 0001750 00000003624 15254241235 022047 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "blackwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
BlackWindow::BlackWindow(QWidget *parent) : QWidget(parent)
{
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint
| Qt::X11BypassWindowManagerHint);
setAttribute(Qt::WA_TranslucentBackground);
setCursor(Qt::BlankCursor);
//qApp->installNativeEventFilter(this);
//installEventFilter(this);
}
void BlackWindow::paintEvent(QPaintEvent *event)
{
for(auto screen : QGuiApplication::screens())
{
QPainter painter(this);
QColor cor = "#000000";
painter.setBrush(cor);
painter.drawRect(screen->geometry());
}
return QWidget::paintEvent(event);
}
void BlackWindow::laterActivate()
{
raise();
}
bool BlackWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::WindowDeactivate){
QTimer::singleShot(50,this,SLOT(laterActivate()));
}
return false;
}
bool BlackWindow::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result)
{
return false;
}
ukui-screensaver/src/lock-focushelper/blackwindow.h 0000664 0001750 0001750 00000002356 15254241235 021515 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef BLACKWINDOW_H
#define BLACKWINDOW_H
#include
#include
class BlackWindow : public QWidget, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
explicit BlackWindow(QWidget *parent = nullptr);
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override;
bool eventFilter(QObject *obj, QEvent *event);
signals:
private Q_SLOTS:
void laterActivate();
protected:
void paintEvent(QPaintEvent *event);
bool screensaverIsShow = false;
};
#endif // BLACKWINDOW_H
ukui-screensaver/src/lock-focushelper/main.cpp 0000664 0001750 0001750 00000002154 15254241235 020464 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include "blackwindow.h"
#include "../widgets/screen-manager.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
BlackWindow w;
w.setGeometry(SCREEN_MANAGER->virtualDesktopGeometry());
//w.activateWindow();
w.show();
a.exec();
return 0;
}
ukui-screensaver/src/ukccplugins/ 0000775 0001750 0001750 00000000000 15254241137 016115 5 ustar feng feng ukui-screensaver/src/ukccplugins/CMakeLists.txt 0000664 0001750 0001750 00000000137 15254241137 020656 0 ustar feng feng add_definitions(-DOPENKYLIN -DNile)
add_subdirectory(screenlock)
add_subdirectory(screensaver)
ukui-screensaver/src/ukccplugins/sessiondbus/ 0000775 0001750 0001750 00000000000 15254241235 020455 5 ustar feng feng ukui-screensaver/src/ukccplugins/sessiondbus/screensaverinterface.h 0000664 0001750 0001750 00000010310 15254241235 025022 0 ustar feng feng /*
* Copyright (C) 2025 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENSAVERINTERFACE_H
#define SCREENSAVERINTERFACE_H
#include
#include
#include "../../lock-backend/dbusupperinterface.h"
class ScreensaverInterface : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.ukui.ScreenSaver.session.Screensaver")
Q_PROPERTY(int preentryTime READ getPreentryTime)
Q_PROPERTY(QString screensaverType READ getScreensaverType)
Q_PROPERTY(bool showBreakTimeUkui READ getShowBreakTimeUkui)
Q_PROPERTY(bool showBreakTimeCustom READ getShowBreakTimeCustom)
Q_PROPERTY(bool screenLockEnabled READ getScreenLockEnabled)
Q_PROPERTY(QString customPath READ getcustomPath)
Q_PROPERTY(bool switchRandom READ getSwitchRandom)
Q_PROPERTY(int cycleTime READ getCycleTime)
Q_PROPERTY(QString customText READ getCustomText)
Q_PROPERTY(bool customTextCentered READ getCustomTextCentered)
Q_PROPERTY(QString background READ getBackground)
Q_PROPERTY(int subMode READ getSubMode)
Q_PROPERTY(bool followSystem READ getMusicFollowSystem)
Q_PROPERTY(QString musicPath READ getMusicPath)
Q_PROPERTY(QStringList photoPath READ getPhotoPath)
Q_PROPERTY(QString photoSelectPath READ getPhotoSelectPath)
Q_PROPERTY(int photoCycleMode READ getPhotoCycleMode)
Q_PROPERTY(int photoCycleInterval READ getPhotoCycleInterval)
Q_PROPERTY(QString weatherData READ getWeatherDate)
Q_PROPERTY(QStringList previewWallpapers READ getPreviewWallpapers)
Q_PROPERTY(QStringList sourceWallpapers READ getSourceWallpapers)
Q_PROPERTY(bool saverDatetimeEnable READ getSaverDatetimeEnable)
public:
ScreensaverInterface(DbusUpperInterface *upperInterface, QObject *parent = nullptr);
~ScreensaverInterface();
int getPreentryTime();
QString getScreensaverType();
bool getShowBreakTimeUkui();
bool getShowBreakTimeCustom();
bool getScreenLockEnabled();
QString getcustomPath();
bool getSwitchRandom();
int getCycleTime();
QString getCustomText();
bool getCustomTextCentered();
QString getBackground();
int getSubMode();
bool getMusicFollowSystem();
QString getMusicPath();
QStringList getPhotoPath();
QString getPhotoSelectPath();
int getPhotoCycleMode();
int getPhotoCycleInterval();
QString getWeatherDate();
QStringList getPreviewWallpapers();
QStringList getSourceWallpapers();
bool getSaverDatetimeEnable();
private:
bool initData();
private:
QString mScreensaverType;
DbusUpperInterface *m_upperInterface = nullptr;
bool m_isInited = false;
public Q_SLOTS:
void setPreentryTime(int time);
void setScreensaverType(QString type);
void setShowBreakTimeUkui(bool b);
void setShowBreakTimeCustom(bool b);
void setScreenLockEnabled(bool b);
void setCustomPath(QString path);
void setSwitchRandom(bool b);
void setCycleTime(int time);
void setCustomText(QString Text);
void setCustomTextCentered(bool b);
void setSubMode(int mode);
void setMusicFollowSystem(bool b);
void setMusicPath(QString path);
void setPhotoCustomPath(QString path);
void setPhotoCycleMode(int mode);
void setPhotoCycleInterval(int time);
void setSelectPhotoPath(QString path);
void removePhotoPath(QString path);
void openFileFolder(QString path);
void setSaverDatetimeEnable(bool enable);
private Q_SLOTS:
void onLockScreenConfigChanged(QString strKey, QVariant value);
void onScreenSaverConfigChanged(QString strKey, QVariant value);
Q_SIGNALS:
void changed(QString key);
};
#endif // SCREENSAVERINTERFACE_H
ukui-screensaver/src/ukccplugins/sessiondbus/screenlockinterface.cpp 0000664 0001750 0001750 00000014036 15254241235 025176 0 ustar feng feng /*
* Copyright (C) 2025 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screenlockinterface.h"
#include
#include
#include "../../lock-backend/gsettingshelper.h"
ScreenlockInterface::ScreenlockInterface(DbusUpperInterface *upperInterface, QObject *parent)
: QObject(parent), m_upperInterface(upperInterface)
{
}
bool ScreenlockInterface::initData()
{
if (!m_isInited) {
mUKCConfig = QDir::homePath() + "/.config/ukui/ukui-control-center.conf";
lockSetting = new QSettings(mUKCConfig, QSettings::IniFormat, this);
m_isInited = true;
}
return m_isInited;
}
ScreenlockInterface::~ScreenlockInterface() {}
void ScreenlockInterface::setShowOnLogin(bool b)
{
initData();
QString bgStr;
struct stat fileStat;
if (b && m_upperInterface) {
bgStr = m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_BACKGROUND).toString();
stat(bgStr.toStdString().c_str(), &fileStat);
if (fileStat.st_uid != 0) { // 在普通用户下
bgStr = copyLoginFile(bgStr);
}
} else if (!b) {
bgStr = "";
}
lockSetting->beginGroup("ScreenLock");
lockSetting->setValue("lockStatus", b);
lockSetting->endGroup();
QString name = qgetenv("USER");
if (name.isEmpty()) {
name = qgetenv("USERNAME");
}
QString lockfilename = "/var/lib/lightdm-data/" + name + "/ukui-greeter.conf";
QSettings lockLoginSettings(lockfilename, QSettings::IniFormat, this);
lockLoginSettings.beginGroup("greeter");
lockLoginSettings.setValue("backgroundPath", bgStr);
lockLoginSettings.endGroup();
Q_EMIT changed("showOnLogin");
}
void ScreenlockInterface::setWallpaper(QString f)
{
initData();
if (m_upperInterface) {
m_upperInterface->getGSettingsInstance()->SetLockScreenConf(KEY_BACKGROUND, f);
}
setShowOnLogin(getShowOnLogin());
Q_EMIT changed("wallpaper");
}
bool ScreenlockInterface::getShowOnLogin()
{
initData();
if (!QFile::exists(mUKCConfig)) {
setShowOnLogin(true);
}
lockSetting->beginGroup("ScreenLock");
lockSetting->sync();
bool status = lockSetting->value("lockStatus").toBool();
lockSetting->endGroup();
return status;
}
QString ScreenlockInterface::getWallpaper()
{
initData();
QString initBgStr = "";
if (m_upperInterface) {
initBgStr = m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_BACKGROUND).toString();
}
// é”�å±�å£�纸ä¸�å˜åœ¨æ—¶ï¼Œä¸Ž"设置-背景"ä¿�æŒ�一致,优先使用当å‰�桌é�¢å£�纸兜底
if (!QFile::exists(initBgStr)) {
QDBusInterface wallpaperInterface(
"org.ukui.ukcc.session", "/Wallpaper", "org.ukui.ukcc.session.Wallpaper", QDBusConnection::sessionBus(), this);
if (wallpaperInterface.isValid()) {
QString desktopBg = wallpaperInterface.property("wallpaper").toString();
if (!desktopBg.isEmpty() && QFile::exists(desktopBg)) {
initBgStr = desktopBg;
}
}
}
// 桌é�¢å£�çº¸ä¹Ÿæ— æ•ˆæ—¶ï¼Œå›žé€€åˆ°ç³»ç»Ÿé»˜è®¤å£�纸(由 ubuntukylin-wallpapers æ��供)
if (!QFile::exists(initBgStr)) {
initBgStr = "/usr/share/backgrounds/ubuntukylin-default-settings.jpg";
// Debian ç‰æ²¡æœ‰ ubuntukylin-wallpapers 的环境,回退到 ukui-session-manager 自带背景
if (!QFile::exists(initBgStr)) {
initBgStr = "/usr/share/ukui/ukui-session-manager/images/background-ukui.png";
}
}
// è§£æž�软链接为实际文件路径,ä¿�è¯�与å£�纸列表(wallpaper.xml)ä¸çš„路径一致,é�¿å…�默认å£�çº¸æ— æ³•é€‰ä¸
QString realPath = QFileInfo(initBgStr).canonicalFilePath();
if (!realPath.isEmpty()) {
initBgStr = realPath;
}
return initBgStr;
}
QStringList ScreenlockInterface::getPreviewWallpapers()
{
initData();
QDBusInterface interface(
"org.ukui.ukcc.session", "/Wallpaper", "org.ukui.ukcc.session.Wallpaper", QDBusConnection::sessionBus(), this);
if (interface.isValid()) {
return interface.property("previewWallpapers").toStringList();
}
return QStringList();
}
QStringList ScreenlockInterface::getSourceWallpapers()
{
QDBusInterface interface(
"org.ukui.ukcc.session", "/Wallpaper", "org.ukui.ukcc.session.Wallpaper", QDBusConnection::sessionBus(), this);
if (interface.isValid()) {
return interface.property("sourceWallpapers").toStringList();
}
return QStringList();
}
bool ScreenlockInterface::getLockDatetimeEnable()
{
initData();
return m_upperInterface->GetLockDatetimeEnable();
}
void ScreenlockInterface::resetDefault()
{
initData();
if (m_upperInterface) {
m_upperInterface->getGSettingsInstance()->ResetLockScreenConf(KEY_BACKGROUND);
// ä¸�å�Œå�‘行版的 schema 默认值å�¯èƒ½æ˜¯æ— 效路径,通过 getWallpaper 统一兜底
setWallpaper(getWallpaper());
}
}
QString ScreenlockInterface::copyLoginFile(QString fileName)
{
QString name = qgetenv("USER");
if (name.isEmpty()) {
name = qgetenv("USERNAME");
}
QString loginFilename = "/var/lib/lightdm-data/" + name + "/" + "loginBackground";
QString loginCmd = QString("cp '%1' %2").arg(fileName).arg(loginFilename);
system(loginCmd.toUtf8().data());
return loginFilename;
}
void ScreenlockInterface::setLockDatetimeEnable(bool enable)
{
m_upperInterface->SetLockDatetimeEnable(enable);
Q_EMIT changed("lockDatetimeEnable");
}
ukui-screensaver/src/ukccplugins/sessiondbus/screensaverinterface.cpp 0000664 0001750 0001750 00000032371 15254241235 025370 0 ustar feng feng /*
* Copyright (C) 2025 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screensaverinterface.h"
#include "../../lock-backend/gsettingshelper.h"
ScreensaverInterface::ScreensaverInterface(DbusUpperInterface *upperInterface, QObject *parent)
: QObject(parent), m_upperInterface(upperInterface)
{
}
bool ScreensaverInterface::initData()
{
if (!m_isInited) {
mScreensaverType.clear();
QString mode = m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_MODE).toString();
if (mode == "default-ukui") {
mScreensaverType = "ukui";
} else if (mode == "default-ukui-custom") {
mScreensaverType = "custom";
} else {
mScreensaverType = "other";
}
connect(
m_upperInterface->getGSettingsInstance().get(),
&GSettingsHelper::lockScreenConfigChanged,
this, &ScreensaverInterface::onLockScreenConfigChanged);
connect(m_upperInterface->getGSettingsInstance().get(),
&GSettingsHelper::weatherKeysConfigChanged,
this,
[=](QString strKey, QVariant value) {
if (strKey == KEY_WEATHER) {
Q_EMIT changed("weatherData");
}
});
connect(m_upperInterface->getGSettingsInstance().get(),
&GSettingsHelper::screenSaverConfigChanged,
this, &ScreensaverInterface::onScreenSaverConfigChanged);
m_isInited = true;
}
return m_isInited;
}
ScreensaverInterface::~ScreensaverInterface() {}
void ScreensaverInterface::onScreenSaverConfigChanged(QString strKey, QVariant value)
{
if (strKey == KEY_MODE) {
Q_EMIT changed("screensaverType");
} else if (strKey == KEY_SUB_MODE) {
Q_EMIT changed("subMode");
} else if (strKey == KEY_BACKGROUND_PATH) {
Q_EMIT changed("customPath");
} else if (strKey == KEY_AUTOMATIC_SWITCHING_ENABLE) {
Q_EMIT changed("switchRandom");
} else if (strKey == KEY_CYCLE_TIME) {
Q_EMIT changed("cycleTime");
} else if (strKey == KEY_MYTEXT) {
Q_EMIT changed("customText");
} else if (strKey == KEY_TEXT_IS_CENTER) {
Q_EMIT changed("customTextCentered");
} else if (strKey == KEY_MUSIC_FOLLOW_SYSTEM) {
Q_EMIT changed("followSystem");
} else if (strKey == KEY_MUSIC_PATH) {
Q_EMIT changed("musicPath");
} else if (strKey == KEY_PHOTO_CUSTOM_PATH) {
Q_EMIT changed("photoPath");
} else if (strKey == KEY_PHOTO_SELECT_PATH) {
Q_EMIT changed("photoSelectPath");
} else if (strKey == KEY_PHOTO_CYCLE_MODE) {
Q_EMIT changed("photoCycleMode");
} else if (strKey == KEY_PHOTO_CYCLE_INTERVAL) {
Q_EMIT changed("photoCycleInterval");
}
}
void ScreensaverInterface::onLockScreenConfigChanged(QString strKey, QVariant value)
{
if (strKey == KEY_MODE) {
QString mode = value.toString();
if (mode == "default-ukui") {
mScreensaverType = "ukui";
} else if (mode == "default-ukui-custom") {
mScreensaverType = "custom";
} else {
mScreensaverType = "other";
}
} else if (strKey == KEY_BACKGROUND) {
Q_EMIT changed("background");
} else if (strKey == KEY_LOCK_ENABLED) {
Q_EMIT changed("screenLockEnabled");
} else if (strKey == KEY_IDLE_DELAY) {
Q_EMIT changed("preentryTime");
}
}
int ScreensaverInterface::getPreentryTime()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_IDLE_DELAY).toInt();
}
void ScreensaverInterface::setPreentryTime(int time)
{
initData();
m_upperInterface->getGSettingsInstance()->SetLockScreenConf(KEY_IDLE_DELAY, time);
Q_EMIT changed("preentryTime");
}
QString ScreensaverInterface::getScreensaverType()
{
initData();
return mScreensaverType;
}
void ScreensaverInterface::setScreensaverType(QString type)
{
initData();
if (type == "ukui") {
m_upperInterface->getGSettingsInstance()->SetLockScreenConf(KEY_MODE, "default-ukui");
} else if (type == "custom") {
m_upperInterface->getGSettingsInstance()->SetLockScreenConf(KEY_MODE, "default-ukui-custom");
}
Q_EMIT changed("screensaverType");
}
bool ScreensaverInterface::getShowBreakTimeUkui()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_SHOW_UKUI_REST_TIME).toBool();
}
void ScreensaverInterface::setShowBreakTimeUkui(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_SHOW_UKUI_REST_TIME, b);
Q_EMIT changed("showBreakTimeUkui");
}
bool ScreensaverInterface::getShowBreakTimeCustom()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_SHOW_CUSTOM_REST_TIME).toBool();
}
void ScreensaverInterface::setShowBreakTimeCustom(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_SHOW_CUSTOM_REST_TIME, b);
Q_EMIT changed("showBreakTimeCustom");
}
bool ScreensaverInterface::getScreenLockEnabled()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_LOCK_ENABLED).toBool();
}
void ScreensaverInterface::setScreenLockEnabled(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetLockScreenConf(KEY_LOCK_ENABLED, b);
Q_EMIT changed("screenLockEnabled");
}
QString ScreensaverInterface::getcustomPath()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_BACKGROUND_PATH).toString();
}
void ScreensaverInterface::setCustomPath(QString path)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_BACKGROUND_PATH, path);
Q_EMIT changed("customPath");
}
bool ScreensaverInterface::getSwitchRandom()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_AUTOMATIC_SWITCHING_ENABLE).toBool();
}
void ScreensaverInterface::setSwitchRandom(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_AUTOMATIC_SWITCHING_ENABLE, b);
Q_EMIT changed("switchRandom");
}
int ScreensaverInterface::getCycleTime()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_CYCLE_TIME).toInt();
}
void ScreensaverInterface::setCycleTime(int time)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_CYCLE_TIME, time);
Q_EMIT changed("cycleTime");
}
QString ScreensaverInterface::getCustomText()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_MYTEXT).toString();
}
void ScreensaverInterface::setCustomText(QString text)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_MYTEXT, text);
Q_EMIT changed("customText");
}
bool ScreensaverInterface::getCustomTextCentered()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_TEXT_IS_CENTER).toBool();
}
void ScreensaverInterface::setCustomTextCentered(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_TEXT_IS_CENTER, b);
Q_EMIT changed("customTextCentered");
}
QString ScreensaverInterface::getBackground()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetLockScreenConf(KEY_BACKGROUND).toString();
}
int ScreensaverInterface::getSubMode()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_SUB_MODE).toInt();
}
bool ScreensaverInterface::getMusicFollowSystem()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_MUSIC_FOLLOW_SYSTEM).toBool();
}
QString ScreensaverInterface::getMusicPath()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_MUSIC_PATH).toString();
}
QStringList ScreensaverInterface::getPhotoPath()
{
initData();
QStringList defaultPath = m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_DEFAULT_PATH).toStringList();
QStringList customPath = m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_CUSTOM_PATH).toStringList();
QSet set;
for (const QString &str : customPath) {
set.insert(str);
}
for (const QString &str : defaultPath) {
set.insert(str);
}
QStringList allPhotoPath = set.values();
qDebug() << "allList = " << allPhotoPath;
return allPhotoPath;
}
QString ScreensaverInterface::getPhotoSelectPath()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_SELECT_PATH).toString();
}
int ScreensaverInterface::getPhotoCycleMode()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_CYCLE_MODE).toInt();
}
int ScreensaverInterface::getPhotoCycleInterval()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_CYCLE_INTERVAL).toInt();
}
QString ScreensaverInterface::getWeatherDate()
{
initData();
return m_upperInterface->getGSettingsInstance()->GetWeatherKeys(KEY_WEATHER).toString();
}
QStringList ScreensaverInterface::getPreviewWallpapers()
{
initData();
QDBusInterface interface(
"org.ukui.ukcc.session", "/Wallpaper", "org.ukui.ukcc.session.Wallpaper", QDBusConnection::sessionBus(), this);
if (interface.isValid()) {
return interface.property("previewWallpapers").toStringList();
}
return QStringList();
}
QStringList ScreensaverInterface::getSourceWallpapers()
{
QDBusInterface interface(
"org.ukui.ukcc.session", "/Wallpaper", "org.ukui.ukcc.session.Wallpaper", QDBusConnection::sessionBus(), this);
if (interface.isValid()) {
return interface.property("sourceWallpapers").toStringList();
}
return QStringList();
}
bool ScreensaverInterface::getSaverDatetimeEnable()
{
initData();
return m_upperInterface->GetSaverDatetimeEnable();
}
void ScreensaverInterface::setSubMode(int mode)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_SUB_MODE, mode);
Q_EMIT changed("subMode");
}
void ScreensaverInterface::setMusicPath(QString path)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_MUSIC_PATH, path);
Q_EMIT changed("musicPath");
}
void ScreensaverInterface::setMusicFollowSystem(bool b)
{
initData();
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_MUSIC_FOLLOW_SYSTEM, b);
Q_EMIT changed("musicFollowSystem");
}
void ScreensaverInterface::setPhotoCustomPath(QString path)
{
initData();
QStringList customPath = m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_CUSTOM_PATH).toStringList();
QSet set;
for (const QString &str : customPath) {
set.insert(str);
}
set.insert(path);
QStringList allPhotoPath = set.values();
qDebug() << "allList = " << allPhotoPath;
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_PHOTO_CUSTOM_PATH, allPhotoPath);
Q_EMIT changed("photoCustomPath");
}
void ScreensaverInterface::removePhotoPath(QString path)
{
initData();
QString selectPath = getPhotoSelectPath();
if (selectPath == path) {
setSelectPhotoPath(DEFAULT_PHOTO_PATH);
}
QStringList customPath = m_upperInterface->getGSettingsInstance()->GetScreenSaverConf(KEY_PHOTO_CUSTOM_PATH).toStringList();
QSet set;
for (const QString &str : customPath) {
set.insert(str);
}
set.remove(path);
QStringList allPhotoPath = set.values();
qDebug() << "allList = " << allPhotoPath;
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_PHOTO_CUSTOM_PATH, allPhotoPath);
Q_EMIT changed("photoCustomPath");
}
void ScreensaverInterface::setPhotoCycleMode(int mode)
{
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_PHOTO_CYCLE_MODE, mode);
Q_EMIT changed("photoCycleMode");
}
void ScreensaverInterface::setPhotoCycleInterval(int time)
{
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_PHOTO_CYCLE_INTERVAL, time);
Q_EMIT changed("photoCycleInterval");
}
void ScreensaverInterface::setSelectPhotoPath(QString path)
{
m_upperInterface->getGSettingsInstance()->SetScreenSaverConf(KEY_PHOTO_SELECT_PATH, path);
Q_EMIT changed("photoSelectPath");
}
void ScreensaverInterface::openFileFolder(QString path)
{
QStringList paths;
paths.append(path);
m_upperInterface->ShowFolder(paths);
Q_EMIT changed("photoSelectPath");
}
void ScreensaverInterface::setSaverDatetimeEnable(bool enable)
{
m_upperInterface->SetSaverDatetimeEnable(enable);
Q_EMIT changed("saverDatetimeEnable");
}
ukui-screensaver/src/ukccplugins/sessiondbus/screenlockinterface.h 0000664 0001750 0001750 00000004125 15254241235 024641 0 ustar feng feng /*
* Copyright (C) 2025 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENLOCKINTERFACE_H
#define SCREENLOCKINTERFACE_H
#include
#include
#include "../../lock-backend/dbusupperinterface.h"
class ScreenlockInterface : public QObject
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.ukui.ScreenSaver.session.Screenlock")
Q_PROPERTY(bool showOnLogin READ getShowOnLogin)
Q_PROPERTY(QString wallpaper READ getWallpaper)
Q_PROPERTY(QStringList previewWallpapers READ getPreviewWallpapers)
Q_PROPERTY(QStringList sourceWallpapers READ getSourceWallpapers)
Q_PROPERTY(bool lockDatetimeEnable READ getLockDatetimeEnable)
public:
ScreenlockInterface(DbusUpperInterface *upperInterface, QObject *parent = nullptr);
~ScreenlockInterface();
bool getShowOnLogin();
QString getWallpaper();
QStringList getPreviewWallpapers();
QStringList getSourceWallpapers();
bool getLockDatetimeEnable();
public Q_SLOTS:
void setShowOnLogin(bool b);
void setWallpaper(QString f);
void resetDefault();
void setLockDatetimeEnable(bool enable);
private:
QString copyLoginFile(QString fileName);
bool initData();
private:
QStringList previewWallpaperList;
QStringList sourceWallpaperList;
QString mUKCConfig = "";
QSettings *lockSetting = nullptr;
DbusUpperInterface *m_upperInterface = nullptr;
bool m_isInited = false;
Q_SIGNALS:
void changed(QString key);
};
#endif // SCREENLOCKINTERFACE_H
ukui-screensaver/src/ukccplugins/screenlock/ 0000775 0001750 0001750 00000000000 15254241235 020244 5 ustar feng feng ukui-screensaver/src/ukccplugins/screenlock/screenlockui.h 0000664 0001750 0001750 00000010660 15254241235 023106 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENLOCKUI_H
#define SCREENLOCKUI_H
#include
#include
#include
#include
#include
#include
#include "pictureunit.h"
#include
#include
#include
#include
#include
#include "../screensaver/photocorver.h"
using namespace kdk;
class ScreenlockUi : public QWidget
{
Q_OBJECT
public:
ScreenlockUi();
~ScreenlockUi();
void setShowOnLogin(bool b);
void setLockDatetimeEnable(bool b);
void setPicture(const QString &data);
void setPictures(const QStringList &picturePathList, const QStringList &sourcePathList);
void createPictureUnit(const QPixmap &pixmap, const QString &filename, const bool &clicked);
void resetClickedPic();
private:
void initUi();
void initScreenLock();
void initSignals();
void initLeavLockStatus();
bool hasBluetoothAdapter();
bool isBluetoothPowered();
bool getLeavLockOn();
QString getLeaveLockDev();
bool getLeaveLockPower();
void setLeaveLockPower(bool on);
QMap getBtPairedDevices();
private slots:
void addPairedDev(QString dev, bool paired);
void powerChanged(bool powered);
void setLeaveLock(bool on);
void defaultAdapterChanged(QString address);
void adapterAdded(QString address);
void adapterRemoved(QString address);
void setBtPushButtonClickSlot();
void btLeaveLockButtonClickSlot(bool clicked);
void bluetoothWidgetIdxChangeSlot(int index);
void devConnectStatusChanged(QString dev, bool status);
void leaveLockSuc();
private:
QVBoxLayout *m_uiLayout = nullptr;
QVBoxLayout *m_screenlockLayout = nullptr;
QVBoxLayout *m_relateLayout = nullptr;
private:
KLabel *m_wallpaperTitleLabel = nullptr;
UkccFrame *m_previewFrame = nullptr;
QHBoxLayout *m_previewLayout = nullptr;
QLabel *m_previewLabel = nullptr;
SettingGroup *m_centerGroup = nullptr;
QWidget *m_noBtWidget = nullptr;
UkccFrame *m_picBtnFrame = nullptr;
QVBoxLayout *m_picBtnLayout = nullptr;
UkccFrame *m_pictureFrame = nullptr;
FlowLayout *m_pictureLayout = nullptr;
UkccFrame *m_bottomFrame = nullptr;
QHBoxLayout *m_bottomLayout = nullptr;
QPushButton *m_localBtn = nullptr;
QPushButton *m_onlineBtn = nullptr;
QPushButton *m_resetBtn = nullptr;
KSwitchButton* m_showPicSwitchButton = nullptr;
KSwitchButton* m_lockDatetimeEnableBtn = nullptr;
KSwitchButton* m_btLeaveLockSwitchButton = nullptr;
KPushButton* m_setBtPushButton = nullptr;
QWidget* m_setBtWidget = nullptr;
UkccFrame* m_relateFrame = nullptr;
QWidget* m_bluetoothWidget = nullptr;
QComboBox* m_bluetoothComboBox = nullptr;
KBackgroundGroup* m_contentBackgroundGroup = nullptr;
QScrollArea *previewScrollArea = nullptr;
private:
KLabel *relateTitleLabel = nullptr;
SettingGroup *relatedGroup = nullptr;
PushButtonWidget *monitorWidget = nullptr;
PushButtonWidget *screensaverWidget = nullptr;
private:
PhotoCorver *prePictureUnit = nullptr;
bool canLeaveLock = false;
QString currentFile;
QString lockdev;
Q_SIGNALS:
void showOnLoginChanged(const bool &b);
void lockDatetimeEnableChanged(const bool &b);
void pictureChanged(const QString &picture);
void localButtonClicked();
void onlineButtonClicked();
void resetButtonClicked();
void toSetMonitor();
void toSetScreensaver();
};
#endif // SCREENLOCKUI_H
ukui-screensaver/src/ukccplugins/screenlock/pictureunit.cpp 0000664 0001750 0001750 00000007226 15254241235 023332 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "pictureunit.h"
#include
#include
#include
#include
#include
#include
PictureUnit::PictureUnit(QWidget *parent) : QLabel(parent)
{
_filename = "";
hoverStyleSheet = QString("border-width: 3px;border-style: solid;border-color: palette(highlight);");
clickedStyleSheet = QString("border-width: 4px;border-style: solid;border-color: palette(highlight);");
if (QGSettings::isSchemaInstalled("org.ukui.style")) {
QGSettings *qtSettings = new QGSettings("org.ukui.style", QByteArray(), this);
connect(qtSettings, &QGSettings::changed, this, [=](const QString &key) {
if (key == "themeColor" && this->clickedFlag) {
this->setStyleSheet(clickedStyleSheet);
}
});
}
clickedFlag = false;
setAttribute(Qt::WA_DeleteOnClose);
setFixedSize(QSize(198, 136));
setScaledContents(true);
MaskWidget *maskWidget = new MaskWidget(this);
maskWidget->setGeometry(0, 0, this->width(), this->height());
isTouchControl = false;
qApp->installEventFilter(this);
this->setAttribute(Qt::WA_AcceptTouchEvents);
}
PictureUnit::~PictureUnit() {}
void PictureUnit::setFilenameText(QString fn)
{
_filename = fn;
}
QString PictureUnit::filenameText()
{
return _filename;
}
void PictureUnit::mouseReleaseEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton && !isTouchControl && e->pos().x() >= 0 && e->pos().y() >= 0
&& e->pos().x() <= width() && e->pos().y() <= height()) {
changeClickedFlag(true);
Q_EMIT clicked(_filename);
}
}
void PictureUnit::enterEvent(QEvent *e)
{
if (getClickedFlag() == false && !isTouchControl) {
setFrameShape(QFrame::Box);
setStyleSheet(hoverStyleSheet);
}
}
void PictureUnit::leaveEvent(QEvent *e)
{
if (getClickedFlag() == false) {
setStyleSheet("border-width: 0px;");
}
}
bool PictureUnit::getClickedFlag()
{
return clickedFlag;
}
void PictureUnit::changeClickedFlag(bool flag)
{
clickedFlag = flag;
if (flag) {
this->setFrameShape(QFrame::Box);
this->setStyleSheet(clickedStyleSheet);
} else {
this->setStyleSheet("border-width: 0px;");
}
}
bool PictureUnit::eventFilter(QObject *w, QEvent *e)
{
if (w == this) {
if (e->type() == QEvent::TouchBegin) {
isTouchControl = true;
QTouchEvent *touchE = static_cast(e);
touchBeginPoint = touchE->touchPoints().at(0).screenPos();
}
} else if (e->type() == QEvent::TouchEnd && isTouchControl) {
isTouchControl = false;
QTouchEvent *touchE = static_cast(e);
touchEndPoint = touchE->touchPoints().at(0).screenPos();
if (qFabs(touchEndPoint.x() - touchBeginPoint.x()) < 1.0
&& qFabs(touchEndPoint.y() - touchBeginPoint.y()) < 1.0) {
emit clicked(_filename);
}
}
return qApp->eventFilter(w, e);
}
ukui-screensaver/src/ukccplugins/screenlock/CMakeLists.txt 0000664 0001750 0001750 00000002565 15254241235 023014 0 ustar feng feng pkg_check_modules(QGS REQUIRED gsettings-qt6)
pkg_check_modules(GIO2.0 REQUIRED gio-2.0)
pkg_check_modules(KYSDKQTWIDGETS REQUIRED kysdk-qtwidgets)
pkg_check_modules(KYSDKDIAGNOSTICS REQUIRED kysdk-diagnostics)
include_directories(${PROJECT_BINARY_DIR})
include_directories(${PROJECT_SOURCE_DIR}/Common)
include_directories(
${QGS_INCLUDE_DIRS}
${GIO2.0_INCLUDE_DIRS}
${KYSDKQTWIDGETS_INCLUDE_DIRS}
${KYSDKDIAGNOSTICS_INCLUDE_DIRS}
/usr/include/ukcc
)
set(EXTRA_LIBS
${EXTRA_LIBS}
${QGS_LIBRARIES}
${GIO2.0_LIBRARIES}
${KYSDKQTWIDGETS_LIBRARIES}
${KYSDKDIAGNOSTICS_LIBRARIES}
-lukcc
)
qt6_add_resources(lockscreen_Plugin_SRC
)
qt6_wrap_cpp(lockscreen_Plugin_SRC
pictureunit.h
screenlock.h
screenlockui.h
../../screensaver/masklable.h
../screensaver/photocorver.h
../../common/commonfunc.h
)
set(lockscreen_Plugin_SRC
${lockscreen_Plugin_SRC}
pictureunit.cpp
screenlock.cpp
screenlockui.cpp
../../screensaver/masklable.cpp
../screensaver/photocorver.cpp
../../common/commonfunc.cpp
)
add_library(screenlock SHARED ${lockscreen_Plugin_SRC})
target_link_libraries(screenlock Qt6::Widgets Qt6::DBus Qt6::Xml Qt6::Svg ${EXTRA_LIBS})
install(TARGETS
screenlock
DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-control-center)
ukui-screensaver/src/ukccplugins/screenlock/pictureunit.h 0000664 0001750 0001750 00000002744 15254241137 023000 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef PICTUREUNIT_H
#define PICTUREUNIT_H
#include
#include
#include
class PictureUnit : public QLabel
{
Q_OBJECT
public:
explicit PictureUnit(QWidget *parent = nullptr);
~PictureUnit();
public:
void setFilenameText(QString fn);
QString filenameText();
void changeClickedFlag(bool flag);
bool getClickedFlag();
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
public:
QString _filename;
QString clickedStyleSheet;
protected:
void mouseReleaseEvent(QMouseEvent * e);
bool eventFilter(QObject *w, QEvent *e);
private:
bool clickedFlag;
QString hoverStyleSheet;
bool isTouchControl;
QPointF touchBeginPoint;
QPointF touchEndPoint;
Q_SIGNALS:
void clicked(QString filename);
};
#endif // PICTUREUNIT_H
ukui-screensaver/src/ukccplugins/screenlock/screenlockui.cpp 0000664 0001750 0001750 00000075340 15254241235 023447 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screenlockui.h"
#include
#include
ScreenlockUi::ScreenlockUi()
{
setAttribute(Qt::WA_DeleteOnClose);
m_screenlockLayout = new QVBoxLayout(this);
m_screenlockLayout->setContentsMargins(0,0,0,0);
initUi();
}
ScreenlockUi::~ScreenlockUi()
{
}
void ScreenlockUi::initUi()
{
initScreenLock();
#ifdef Nile
initLeavLockStatus();
#endif
initSignals();
}
void ScreenlockUi::initScreenLock()
{
// 1 ��
m_wallpaperTitleLabel = new KLabel(this);
m_wallpaperTitleLabel->setContentsMargins(16, 0, 0, 0);
//~ contents_path /Screenlock/Screenlock
m_wallpaperTitleLabel->setText(tr("Screenlock"));
// 2.1 预览图
m_previewFrame = new UkccFrame(this);
m_previewFrame->setFixedHeight(193);
m_previewLayout = new QHBoxLayout(m_previewFrame);
m_previewLayout->setContentsMargins(16, 12, 16, 16);
m_previewLabel = new QLabel(this);
m_previewLabel->setFixedSize(280, 160);
m_centerGroup = new SettingGroup(this);
m_contentBackgroundGroup = new KBackgroundGroup(m_previewFrame);
QList contentList;
// 登录界�显示���纸
QWidget* showPicWidget = new QWidget();
QHBoxLayout* typeLayout = new QHBoxLayout(showPicWidget);
typeLayout->setContentsMargins(16, 0, 0, 0);
typeLayout->setSpacing(0);
//~ contents_path /Screenlock/Show picture of screenlock on screenlogin
KLabel* showPicLabel = new KLabel(showPicWidget);
showPicLabel->setText(tr("Show picture of screenlock on screenlogin"));
showPicLabel->setMinimumWidth(50);
m_showPicSwitchButton = new KSwitchButton(showPicWidget);
typeLayout->addWidget(showPicLabel);
typeLayout->addStretch();
typeLayout->addWidget(m_showPicSwitchButton);
contentList.append(showPicWidget);
QWidget* lockDatetimeEnableWidget = new QWidget();
QHBoxLayout* datetimeeLayout = new QHBoxLayout(lockDatetimeEnableWidget);
datetimeeLayout->setContentsMargins(16, 0, 0, 0);
datetimeeLayout->setSpacing(0);
//~ contents_path /Screenlock/The date and time are displayed
KLabel* datetimeLabel = new KLabel(lockDatetimeEnableWidget);
datetimeLabel->setText(tr("The date and time are displayed"));
datetimeLabel->setMinimumWidth(50);
m_lockDatetimeEnableBtn = new KSwitchButton(lockDatetimeEnableWidget);
datetimeeLayout->addWidget(datetimeLabel);
datetimeeLayout->addStretch();
datetimeeLayout->addWidget(m_lockDatetimeEnableBtn);
contentList.append(lockDatetimeEnableWidget);
#ifdef Nile
// 动��
QWidget* btLeaveLockWidget = new QWidget();
QHBoxLayout* btLeaveLockLayout = new QHBoxLayout(btLeaveLockWidget);
btLeaveLockLayout->setContentsMargins(16, 0, 0, 0);
btLeaveLockLayout->setSpacing(0);
KLabel* btLeaveLockLabel = new KLabel(btLeaveLockWidget);
btLeaveLockLabel->setText(tr("Leave lock (System will be locked when the paired phone gone)"));
btLeaveLockLabel->setMinimumWidth(50);
m_btLeaveLockSwitchButton = new KSwitchButton(btLeaveLockWidget);
btLeaveLockLayout->addWidget(btLeaveLockLabel);
btLeaveLockLayout->addStretch();
btLeaveLockLayout->addWidget(m_btLeaveLockSwitchButton);
contentList.append(btLeaveLockWidget);
// �牙设备
m_bluetoothWidget = new QWidget();
KLabel* bluetoothLabel = new KLabel(m_bluetoothWidget);
bluetoothLabel->setText(tr("Specified device"));
m_bluetoothComboBox = new QComboBox(m_bluetoothWidget);
QHBoxLayout* bluetoothLayout = new QHBoxLayout(m_bluetoothWidget);
bluetoothLayout->setContentsMargins(16, 0, 0, 0);
bluetoothLayout->setSpacing(0);
bluetoothLayout->addWidget(bluetoothLabel);
bluetoothLayout->addStretch();
bluetoothLayout->addWidget(m_bluetoothComboBox);
m_bluetoothWidget->setVisible(false);
contentList.append(m_bluetoothWidget);
// æ— é…�对手机去设置è“�牙
m_setBtWidget = new QWidget();
QHBoxLayout* setBtLayout = new QHBoxLayout(m_setBtWidget);
setBtLayout->setContentsMargins(16, 0, 0, 0);
setBtLayout->setSpacing(0);
KLabel* setBtLabel = new KLabel(m_setBtWidget);
setBtLabel->setText(tr("No paired phone. Please turn to 'Bluetooth' to pair."));
setBtLabel->setMinimumWidth(50);
QLabel* setBticonLabel = new QLabel(m_setBtWidget);
QIcon icon = QIcon::fromTheme("kylin-dialog-warning");
if (icon.isNull()) {
icon = QIcon::fromTheme("dialog-warning");
}
setBticonLabel->setPixmap(icon.pixmap(16, 16));
m_setBtPushButton = new KPushButton(m_setBtWidget);
m_setBtPushButton->setText(tr("Bluetooth"));
setBtLayout->addWidget(setBticonLabel);
setBtLayout->addWidget(setBtLabel);
setBtLayout->addStretch();
setBtLayout->addWidget(m_setBtPushButton);
m_setBtWidget->setVisible(false);
contentList.append(m_setBtWidget);
m_noBtWidget = new QWidget();
contentList.append(m_noBtWidget);
#endif
m_contentBackgroundGroup->addWidgetList(contentList);
// 预览区域滚动�设置
previewScrollArea = new QScrollArea;
previewScrollArea->setFixedHeight(192);
previewScrollArea->viewport()->setAttribute(Qt::WA_TranslucentBackground);
previewScrollArea->setStyleSheet("QScrollArea{background-color: transparent; border-radius: 6px}");
previewScrollArea->verticalScrollBar()->setProperty("drawScrollBarGroove", false);
previewScrollArea->verticalScrollBar()->setEnabled(false);
previewScrollArea->horizontalScrollBar()->setEnabled(false);
previewScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
previewScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
previewScrollArea->setWidgetResizable(true);
previewScrollArea->setWidget(m_previewFrame);
QVBoxLayout* rightPreviewLayout = new QVBoxLayout();
rightPreviewLayout->setContentsMargins(8, 0, 16, 0);
rightPreviewLayout->setSpacing(0);
rightPreviewLayout->addWidget(m_contentBackgroundGroup);
rightPreviewLayout->addStretch();
m_previewLayout->addWidget(m_previewLabel);
m_previewLayout->addSpacing(0);
m_previewLayout->addLayout(rightPreviewLayout);
m_picBtnFrame = new UkccFrame(m_centerGroup);
m_picBtnFrame->setLineWidth(0);
m_pictureFrame = new UkccFrame(m_picBtnFrame);
m_pictureFrame->setLineWidth(0);
m_pictureLayout = new FlowLayout(m_pictureFrame, 8, -1, -1);
m_pictureLayout->setContentsMargins(16, 0, 16, 0);
m_bottomFrame = new UkccFrame(m_picBtnFrame);
// 3.1 选择图片
//~ contents_path /Wallpaper/Choose Picture
QLabel* chooseLabel = new QLabel(tr("Choose Picture"), m_bottomFrame);
// 3.2 本地图片
//~ contents_path /Screenlock/Local Pictures
m_localBtn = new QPushButton(tr("Local Pictures"), m_bottomFrame);
// 3.3 在线图片
//~ contents_path /Screenlock/Online Pictures
m_onlineBtn = new QPushButton(tr("Online Pictures"), m_bottomFrame);
// 3.4 ��默认
//~ contents_path /Screenlock/Reset To Default
m_resetBtn = new QPushButton(tr("Reset To Default"), m_bottomFrame);
m_bottomLayout = new QHBoxLayout(m_bottomFrame);
m_bottomLayout->setContentsMargins(16, 8, 16, 8);
m_bottomLayout->addWidget(chooseLabel);
m_bottomLayout->addStretch();
m_bottomLayout->addWidget(m_localBtn);
m_bottomLayout->addWidget(m_onlineBtn);
m_bottomLayout->addWidget(m_resetBtn);
// 相关设置
m_relateFrame = new UkccFrame(m_picBtnFrame);
m_relateLayout = new QVBoxLayout(m_relateFrame);
UkccFrame* titleFrame = new UkccFrame();
QHBoxLayout* relateTitleLayout = new QHBoxLayout(titleFrame);
relateTitleLayout->setContentsMargins(0, 0, 0, 0);
relateTitleLabel = new KLabel(m_relateFrame);
relateTitleLabel->setContentsMargins(16, 0, 0, 0);
relateTitleLayout->addWidget(relateTitleLabel);
relateTitleLabel->setText(tr("Related Settings"));
KBackgroundGroup* relateGroup = new KBackgroundGroup();
monitorWidget = new PushButtonWidget(tr("Monitor Off"), m_relateFrame);
monitorWidget->setButtonText(tr("Set"));
screensaverWidget = new PushButtonWidget(tr("Screensaver"), m_relateFrame);
screensaverWidget->setButtonText(tr("Set"));
relateGroup->addWidget(titleFrame);
relateGroup->addWidget(monitorWidget);
relateGroup->addWidget(screensaverWidget);
m_relateLayout->addWidget(relateGroup);
m_picBtnLayout = new QVBoxLayout(m_picBtnFrame);
m_picBtnLayout->setContentsMargins(0, 0, 0, 0);
m_picBtnLayout->setSpacing(0);
m_picBtnLayout->addWidget(m_bottomFrame);
m_picBtnLayout->addWidget(m_pictureFrame);
m_picBtnLayout->addWidget(m_relateFrame);
m_centerGroup->addWidget(m_picBtnFrame);
QScrollArea *contentScrollArea = new QScrollArea;
contentScrollArea->viewport()->setAttribute(Qt::WA_TranslucentBackground);
contentScrollArea->setStyleSheet("QScrollArea{background-color: transparent;}");
contentScrollArea->verticalScrollBar()->setProperty("drawScrollBarGroove", false);
contentScrollArea->setWidgetResizable(true);
contentScrollArea->setFrameShape(QFrame::Box);
contentScrollArea->setFrameShadow(QFrame::Plain);
contentScrollArea->setWidget(m_centerGroup);
m_screenlockLayout->addWidget(m_wallpaperTitleLabel);
m_screenlockLayout->addWidget(previewScrollArea);
m_screenlockLayout->addWidget(contentScrollArea);
#ifdef Nile
QHBoxLayout *noBtVLayout = new QHBoxLayout();
QLabel *noBtWarnIcon = new QLabel(m_noBtWidget);
QLabel *noBtMessage = new QLabel(tr("No bluetooth adapter detected, can not use Leave Lock."),m_noBtWidget);
noBtWarnIcon->setPixmap(icon.pixmap(18,18));
noBtVLayout->setContentsMargins(16, 0, 16, 0);
noBtVLayout->setSpacing(16);
noBtVLayout->addWidget(noBtWarnIcon);
noBtVLayout->addWidget(noBtMessage,Qt::AlignLeft);
m_noBtWidget->setLayout(noBtVLayout);
m_noBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
#endif
}
void ScreenlockUi::initLeavLockStatus() {
bool ispowered = isBluetoothPowered();
bool leaveLockOn = getLeavLockOn();//实际�牙维护的离座�功能
bool leaveLockPower = getLeaveLockPower();//离座�按钮
qDebug() << "leavelockpower" << leaveLockPower;
bool hasAdapter = hasBluetoothAdapter();
QMap btDevices = getBtPairedDevices();
m_bluetoothComboBox->clear();
qDebug() << "checked" << m_btLeaveLockSwitchButton->isChecked();
m_btLeaveLockSwitchButton->setChecked(leaveLockPower);
if (leaveLockPower){
m_previewFrame->setFixedHeight(245);
previewScrollArea->setFixedHeight(244);
}
canLeaveLock = !btDevices.isEmpty();
m_bluetoothComboBox->addItem(tr("Please select device"));
for (auto dev : btDevices.keys()) {
m_bluetoothComboBox->addItem(btDevices.value(dev), dev);
}
qDebug() << canLeaveLock << ispowered;
if (canLeaveLock && ispowered) {
lockdev = getLeaveLockDev();
qDebug()<< "lockdev" << lockdev;
if (leaveLockOn && !lockdev.isEmpty() && canLeaveLock) {
m_bluetoothComboBox->setCurrentIndex(m_bluetoothComboBox->findData(lockdev));
} else {
m_bluetoothComboBox->setCurrentIndex(0);
}
}
if (!hasAdapter && leaveLockPower) {
m_noBtWidget->setVisible(!hasAdapter);
return;
}
if (m_bluetoothComboBox->count() == 1 && leaveLockPower) {
m_setBtWidget->setVisible(true);
m_noBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
return;
}
m_bluetoothWidget->setVisible(leaveLockPower && canLeaveLock && ispowered);
m_setBtWidget->setVisible((!canLeaveLock || !ispowered) && leaveLockPower);
}
void ScreenlockUi::setBtPushButtonClickSlot() {
QProcess *process = new QProcess();
QString cmd = "ukui-control-center";
QStringList arg;
arg.clear();
arg << "-m";
arg << "Bluetooth";
process->startDetached(cmd,arg);
}
void ScreenlockUi::btLeaveLockButtonClickSlot(bool clicked) {
setLeaveLockPower(clicked);
if (!clicked) {
m_noBtWidget->setVisible(false);
m_setBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
if (!lockdev.isEmpty()) {
setLeaveLock(false);
}
lockdev.clear();
m_bluetoothComboBox->setCurrentIndex(0);
m_previewFrame->setFixedHeight(193);
previewScrollArea->setFixedHeight(192);
return;
}
m_previewFrame->setFixedHeight(245);
previewScrollArea->setFixedHeight(244);
m_bluetoothComboBox->setCurrentIndex(0);
bool ispowered = isBluetoothPowered();
bool hasAdapter = hasBluetoothAdapter();
if (!hasAdapter) {
m_noBtWidget->setVisible(!hasAdapter);
return;
}
if (m_bluetoothComboBox->count() == 1) {
m_setBtWidget->setVisible(true);
m_noBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
return;
}
m_bluetoothWidget->setVisible(canLeaveLock && ispowered);
m_setBtWidget->setVisible(!canLeaveLock || !ispowered);
}
void ScreenlockUi::bluetoothWidgetIdxChangeSlot(int index) {
if (!lockdev.isEmpty()) {
setLeaveLock(false);
}
if (index == 0) {
lockdev.clear();
return;
}
lockdev = m_bluetoothComboBox->currentData().toString();
setLeaveLock(true);
}
void ScreenlockUi::initSignals()
{
connect(m_showPicSwitchButton, &KSwitchButton::clicked, this, [=](){
Q_EMIT showOnLoginChanged(m_showPicSwitchButton->isChecked());
});
connect(m_lockDatetimeEnableBtn, &KSwitchButton::clicked, this, [=](){
Q_EMIT lockDatetimeEnableChanged(m_lockDatetimeEnableBtn->isChecked());
});
#ifdef Nile
connect(m_btLeaveLockSwitchButton, &KSwitchButton::clicked, this, [=](bool clicked){
btLeaveLockButtonClickSlot(clicked);
});
connect(m_bluetoothComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) {
bluetoothWidgetIdxChangeSlot(index);
});
connect(m_setBtPushButton, &QPushButton::clicked, this, [=](){
setBtPushButtonClickSlot();
});
#endif
connect(monitorWidget, &PushButtonWidget::clicked, this, [=](){
Q_EMIT toSetMonitor();
});
connect(screensaverWidget, &PushButtonWidget::clicked, this, [=](){
Q_EMIT toSetScreensaver();
});
connect(m_localBtn, &QPushButton::clicked, this, [=](){
Q_EMIT localButtonClicked();
});
connect(m_onlineBtn, &QPushButton::clicked, this, [=](){
Q_EMIT onlineButtonClicked();
});
connect(m_resetBtn, &QPushButton::clicked, this, [=](){
Q_EMIT resetButtonClicked();
});
#ifdef Nile
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"devConnectStatusSignal",
this,
SLOT(devConnectStatusChanged(QString, bool)));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"leaveLockSuc",
this,
SLOT(leaveLockSuc()));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"devPairSignal",
this,
SLOT(addPairedDev(QString,bool)));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"defaultAdapterPowerChanged",
this,
SLOT(powerChanged(bool)));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"defaultAdapterChanged",
this,
SLOT(defaultAdapterChanged(QString)));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"adapterAddSignal",
this,
SLOT(adapterAdded(QString)));
QDBusConnection::sessionBus().connect("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"adapterRemoveSignal",
this,
SLOT(adapterRemoved(QString)));
#endif
}
void ScreenlockUi::setShowOnLogin(bool b)
{
m_showPicSwitchButton->blockSignals(true);
m_showPicSwitchButton->setChecked(b);
m_showPicSwitchButton->blockSignals(false);
}
void ScreenlockUi::setLockDatetimeEnable(bool b)
{
m_lockDatetimeEnableBtn->blockSignals(true);
m_lockDatetimeEnableBtn->setChecked(b);
m_lockDatetimeEnableBtn->blockSignals(false);
}
void ScreenlockUi::setPicture(const QString &data)
{
currentFile = data;
QImageReader reader(data);
reader.setDecideFormatFromContent(true);
m_previewLabel->setPixmap(QPixmap::fromImage(reader.read()).scaled(m_previewLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
resetClickedPic();
}
void ScreenlockUi::setPictures(const QStringList &picturePathList, const QStringList &sourcePathList)
{
if (picturePathList.size() != sourcePathList.size()) {
qWarning()<<"picturePathList.size():"<setBackground(pixmap);
if (clicked) {
prePictureUnit = photoCorver;
photoCorver->setClickStatus(clicked);
setPicture(filename);
}
photoCorver->setObjectName(filename);
connect(photoCorver, &PhotoCorver::photoCorverLeftClicked, [=](){
setPicture(filename);
Q_EMIT pictureChanged(filename);
});
m_pictureLayout->addWidget(photoCorver);
}
void ScreenlockUi::resetClickedPic() {
if (prePictureUnit != nullptr) {
prePictureUnit->setClickStatus(false);
prePictureUnit = nullptr;
}
for (int i = m_pictureLayout->count() - 1; i >= 0; --i) {
QLayoutItem *it = m_pictureLayout->itemAt(i);
PhotoCorver *picUnit = static_cast(it->widget());
if (currentFile == picUnit->objectName()) {
picUnit->setClickStatus(true);
prePictureUnit = picUnit;
}
}
}
QMap ScreenlockUi::getBtPairedDevices() {
QMap pairedList;
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getPairedPhoneAddr");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage)
{
QStringList ret = response.arguments().takeFirst().toStringList();
if (ret.isEmpty())
return pairedList;
for (int i = 0; i < ret.size(); i++) {
if (pairedList.contains(ret.at(i)))
continue;
QDBusMessage _message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getDevName");
_message << ret.at(i);
QDBusMessage _response = QDBusConnection::sessionBus().call(_message);
if (_response.type() == QDBusMessage::ReplyMessage)
{
QString devName = _response.arguments().takeFirst().toString();
if (devName == "")
continue;
pairedList.insert(ret.at(i), devName);
}
}
}
return pairedList;
}
bool ScreenlockUi::hasBluetoothAdapter() {
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth", \
"getAdapterDevAddressList");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage) {
QStringList ret = response.arguments().takeFirst().toStringList();
return !ret.isEmpty();
} else
return false;
}
bool ScreenlockUi::isBluetoothPowered() {
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getDefaultAdapterPower");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage) {
return response.arguments().takeFirst().toBool();
} else
return false;
}
void ScreenlockUi::devConnectStatusChanged(QString dev, bool status) {
qDebug() << "dev" << dev << "status" << status << "lockdev" << lockdev;
if (dev == lockdev && !status) {
return ;
}
if (dev != lockdev) {
initLeavLockStatus();
}
}
void ScreenlockUi::leaveLockSuc()
{
setLeaveLock(false);
initLeavLockStatus();
}
void ScreenlockUi::addPairedDev(QString dev, bool paired) {
int index = m_bluetoothComboBox->findData(dev);
if (paired && index >= 0)
return;
if (!paired && index >= 0) {
m_bluetoothComboBox->removeItem(m_bluetoothComboBox->findData(dev));
if (m_bluetoothComboBox->count() == 1) {
m_noBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
m_setBtWidget->setVisible(true);
}
if (lockdev == dev)
lockdev.clear();
return;
}
QDBusMessage _message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getDevName");
_message << dev;
QDBusMessage _response = QDBusConnection::sessionBus().call(_message);
if (_response.type() == QDBusMessage::ReplyMessage)
{
QString devName = _response.arguments().takeFirst().toString();
if (devName != "") {
m_bluetoothComboBox->addItem(devName, dev);
m_setBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(true);
}
}
}
void ScreenlockUi::powerChanged(bool powered) {
if (!m_btLeaveLockSwitchButton->isChecked())
return;
if (!hasBluetoothAdapter()) {
m_noBtWidget->setVisible(true);
m_setBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(false);
return;
}
m_noBtWidget->setVisible(false);
m_setBtWidget->setVisible(!powered);
m_bluetoothWidget->setVisible(powered);
setLeaveLock(false);
}
void ScreenlockUi::setLeaveLockPower(bool on)
{
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"setLeaveLockPower");
message << on;
QDBusConnection::sessionBus().call(message);
}
bool ScreenlockUi::getLeaveLockPower()
{
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getLeaveLockPower");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage)
return response.arguments().takeFirst().toBool();
else
return false;
}
void ScreenlockUi::setLeaveLock(bool on) {
if (lockdev.isEmpty())
return;
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"setLeaveLock");
message << lockdev << on;
QDBusConnection::sessionBus().call(message);
}
bool ScreenlockUi::getLeavLockOn() {
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getLeaveLock");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage)
return response.arguments().takeFirst().toBool();
else
return false;
}
QString ScreenlockUi::getLeaveLockDev() {
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth",
"getLeaveLockDev");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage)
return response.arguments().takeFirst().toString();
else
return QString("");
}
void ScreenlockUi::defaultAdapterChanged(QString address) {
Q_UNUSED(address);
if (!m_btLeaveLockSwitchButton->isChecked())
return;
bool ispowered = isBluetoothPowered();
bool leaveLockOn = getLeavLockOn();
bool hasAdapter = hasBluetoothAdapter();
QMap btDevices = getBtPairedDevices();
lockdev.clear();
m_bluetoothComboBox->clear();
if (leaveLockOn && !m_btLeaveLockSwitchButton->isChecked()) {
m_btLeaveLockSwitchButton->click();
}
canLeaveLock = !btDevices.isEmpty();
m_bluetoothComboBox->addItem(tr("Please select device"));
for (auto dev : btDevices.keys())
m_bluetoothComboBox->addItem(btDevices.value(dev), dev);
if (!hasAdapter && leaveLockOn) {
m_noBtWidget->setVisible(!hasAdapter);
return;
}
m_bluetoothWidget->setVisible(leaveLockOn && canLeaveLock && ispowered);
m_setBtWidget->setVisible((!canLeaveLock || !ispowered) && leaveLockOn);
}
void ScreenlockUi::adapterAdded(QString address) {
Q_UNUSED(address);
if (!m_btLeaveLockSwitchButton->isChecked())
return;
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth", \
"getAdapterDevAddressList");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage) {
QStringList ret = response.arguments().takeFirst().toStringList();
if (ret.size() > 1)
return;
else {
bool ispowered = isBluetoothPowered();
QMap btDevices = getBtPairedDevices();
lockdev.clear();
m_bluetoothComboBox->clear();
canLeaveLock = !btDevices.isEmpty();
m_bluetoothComboBox->addItem(tr("Please select device"));
for (auto dev : btDevices.keys()) {
m_bluetoothComboBox->addItem(btDevices.value(dev), dev);
}
m_noBtWidget->setVisible(false);
m_setBtWidget->setVisible(false);
m_bluetoothWidget->setVisible(canLeaveLock && ispowered);
m_setBtWidget->setVisible(!canLeaveLock || !ispowered);
}
}
}
void ScreenlockUi::adapterRemoved(QString address) {
Q_UNUSED(address);
if (!m_btLeaveLockSwitchButton->isChecked())
return;
QDBusMessage message = QDBusMessage::createMethodCall("com.ukui.bluetooth",
"/com/ukui/bluetooth",
"com.ukui.bluetooth", \
"getAdapterDevAddressList");
QDBusMessage response = QDBusConnection::sessionBus().call(message);
if (response.type() == QDBusMessage::ReplyMessage) {
QStringList ret = response.arguments().takeFirst().toStringList();
if (ret.size() < 1){
lockdev.clear();
m_bluetoothComboBox->clear();
m_noBtWidget->setVisible(true);
m_bluetoothWidget->setVisible(false);
m_setBtWidget->setVisible(false);
}
}
}
ukui-screensaver/src/ukccplugins/screenlock/screenlock.h 0000664 0001750 0001750 00000005260 15254241235 022550 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENLOCK_H
#define SCREENLOCK_H
#include
#include
#include "screenlockui.h"
#include
#include
#include
#ifdef signals
#undef signals
#endif
#include
#include
class Screenlock : public QObject, CommonInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.ukcc.CommonInterface")
Q_INTERFACES(CommonInterface)
public:
Screenlock();
~Screenlock();
QString plugini18nName() Q_DECL_OVERRIDE;
int pluginTypes() Q_DECL_OVERRIDE;
QWidget * pluginUi() Q_DECL_OVERRIDE;
const QString name() const Q_DECL_OVERRIDE;
bool isShowOnHomePage() const Q_DECL_OVERRIDE;
QIcon icon() const Q_DECL_OVERRIDE;
bool isEnable() const Q_DECL_OVERRIDE;
virtual QString translationPath() const {
return QStringLiteral("/usr/share/ukui-screensaver/ukccplugins/i18n/%1.ts");
}
private:
void connectToServer();
/**
* @brief getDefaultAppId
* @param contentType
* @return
*/
QString getDefaultAppId(const char *contentType);
public Q_SLOTS:
void keyChangedSlot(const QString &key);
public:
void initContent();
void initShowOnLogin();
void initLockDatetimeEnable();
void initWallpaper();
void connectUiSignals();
void showLocalWpDialog();
void loadPictureInfo();
void convertPixmapSlot(const QString &filename, int num);
void picUnitClickSlot(PictureUnit* picUnit, QString fn);
void loadPictureInfoSlot();
public Q_SLOTS:
void dataChanged(const QString &key);
private:
QString toChangeKey;
QString pluginName;
int pluginType;
bool mFirstLoad;
ScreenlockUi *screenlockui = nullptr;
QDBusInterface *screenlockInterface = nullptr;
bool bIsCloudService = false;
QList m_picInfoList;
QFutureWatcher m_watcher;
QStringList m_previewPictures;
QStringList m_sourcePictures;
};
#endif // SCREENLOCK_H
ukui-screensaver/src/ukccplugins/screenlock/screenlock.cpp 0000664 0001750 0001750 00000034645 15254241235 023114 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screenlock.h"
#include
using namespace ukcc;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOCAL_USR_PATH QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)
#define LOCAL_APP_PATH QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)\
%QStringLiteral("/ukui-control-center/")
#define LOCAL_WALLPAPER_PATH QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)\
%QStringLiteral("/ukui-control-center/wallpaperData/")
#define LOCAL_WALLPAPER_HASH_PATH QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)\
%QStringLiteral("/ukui-control-center/wallpaperData/HASH")
#define HTTPSTYPE "x-scheme-handler/https"
#define LOCAL_CONFIG_DIR "/.config/"
#define SYSTEM_CONFIG_DIR "/usr/share/applications/"
Screenlock::Screenlock() : mFirstLoad(true)
{
QTranslator *translator = new QTranslator(this);
QLocale locale;
translator->load("/usr/share/ukui-screensaver/ukccplugins/i18n_qm/" + locale.name() + ".qm");
QApplication::installTranslator(translator);
pluginName = tr("Screenlock");
pluginType = PERSONALIZED;
screenlockInterface = new QDBusInterface(
"org.ukui.ScreenSaver",
"/Screenlock",
"org.ukui.ScreenSaver.session.Screenlock",
QDBusConnection::sessionBus(),
this);
m_previewPictures = screenlockInterface->property("previewWallpapers").toStringList();
m_sourcePictures = screenlockInterface->property("sourceWallpapers").toStringList();
m_picInfoList.clear();
}
Screenlock::~Screenlock() {}
QString Screenlock::plugini18nName()
{
return pluginName;
}
int Screenlock::pluginTypes()
{
return pluginType;
}
QWidget *Screenlock::pluginUi()
{
if (mFirstLoad) {
mFirstLoad = false;
screenlockui = new ScreenlockUi();
if (screenlockInterface->isValid()) { // åˆ¤æ–æœ�务是å�¦å˜åœ¨
QDBusMessage message = screenlockInterface->call("ping"); // 判æ–dbus路径是å�¦å˜åœ¨
if (message.type() == QDBusMessage::ErrorMessage
&& message.errorMessage().contains("No such object path", Qt::CaseInsensitive)) {
qWarning() << screenlockInterface << ":" << message.errorMessage();
} else {
QDBusConnection::sessionBus().connect(
"org.ukui.ScreenSaver",
"/Screenlock",
"org.ukui.ScreenSaver.session.Screenlock",
"changed",
this,
SLOT(dataChanged(QString)));
initContent();
connectUiSignals();
connectToServer();
}
} else {
qCritical() << "org.ukui.ScreenSaver.session.Screenlock DBus error:" << screenlockInterface->lastError();
}
} else {
screenlockui->resize(screenlockui->size() - QSize(1, 1));
screenlockui->resize(screenlockui->size() + QSize(1, 1));
}
return screenlockui;
}
const QString Screenlock::name() const
{
return QStringLiteral("Screenlock");
}
bool Screenlock::isShowOnHomePage() const
{
return true;
}
QIcon Screenlock::icon() const
{
return QIcon::fromTheme("ukui-lock-screen-symbolic");
}
bool Screenlock::isEnable() const
{
return true;
}
void Screenlock::dataChanged(const QString &key)
{
if (toChangeKey != key) {
if (key == "showOnLogin") {
initShowOnLogin();
} else if (key == "wallpaper") {
initWallpaper();
}
}
toChangeKey = "";
}
void Screenlock::convertPixmapSlot(const QString &filename, int num) {
QPixmap qPixmap = QPixmap(filename);
if (qPixmap.isNull()){
QFile file(filename);
qint64 fileSize = file.size();
if (fileSize <= 100000000 && file.open(QIODevice::ReadOnly)){
qPixmap.loadFromData(file.readAll());
file.close();
}
}
QSize IMAGE_SIZE(166, 110);
QPixmap pixmap = qPixmap.scaled(IMAGE_SIZE);
QString tmpFile = filename;
tmpFile.replace("/", "-");
QFile wallpaperFile;
wallpaperFile.setFileName(LOCAL_WALLPAPER_PATH + QString::number(num) + tmpFile);
QFileInfo fileinfo = QFileInfo(tmpFile);
pixmap.save(&wallpaperFile, fileinfo.suffix().toUtf8().data());
}
void Screenlock::loadPictureInfo() {
if (m_previewPictures.size() != m_sourcePictures.size()) {
qWarning() << "picturePathList.size():" << m_previewPictures.size() << " != sourcePathList.size():" << m_sourcePictures.size();
return;
}
QDir dir(LOCAL_WALLPAPER_PATH);
QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Dirs);
qDebug() << Q_FUNC_INFO << "fileInfoList size" << fileInfoList.size() << "m_sourcePictures size" << m_sourcePictures.size();
if ((fileInfoList.size() - 1) == m_sourcePictures.size()) {
qDebug() << Q_FUNC_INFO << "equal file num, skip load";
m_picInfoList.clear();
for (int i = 0; i < m_previewPictures.size(); ++i) {
m_picInfoList.append(m_previewPictures.at(i));
}
return;
}
int num = 0;
for (QString filename : m_sourcePictures) {
m_watcher.setFuture(QtConcurrent::run([=, filename, num]() {
convertPixmapSlot(filename, num);
}));
num++;
}
}
void Screenlock::loadPictureInfoSlot() {
screenlockui->setPictures(m_previewPictures, m_sourcePictures);
}
void Screenlock::initContent()
{
loadPictureInfo();
if (!m_picInfoList.empty()) {
loadPictureInfoSlot();
} else {
QObject::connect(&m_watcher, &QFutureWatcher::finished, [=]() {
QTimer::singleShot(300, [=]() {
loadPictureInfoSlot();
});
});
}
initWallpaper();
initShowOnLogin();
initLockDatetimeEnable();
}
void Screenlock::initLockDatetimeEnable()
{
screenlockui->setLockDatetimeEnable(screenlockInterface->property("lockDatetimeEnable").toBool());
}
void Screenlock::initShowOnLogin()
{
screenlockui->setShowOnLogin(screenlockInterface->property("showOnLogin").toBool());
}
void Screenlock::initWallpaper()
{
screenlockui->setPicture(screenlockInterface->property("wallpaper").toString());
}
QString Screenlock::getDefaultAppId(const char *contentType)
{
QString localfile = QDir::homePath() + LOCAL_CONFIG_DIR + "mimeapps.list";
QString systemfile = SYSTEM_CONFIG_DIR + QString("ukui-mimeapps.list");
if (QFile(localfile).exists()) {
QSettings* mimeappFile = new QSettings(localfile, QSettings::IniFormat);
QString str = mimeappFile->value(QString("Default Applications/%1").arg(contentType)).toString();
if (!str.isEmpty()) {
if (QFile(SYSTEM_CONFIG_DIR +str).exists()) {
return str;
} else {
return QString("");
}
}
delete mimeappFile;
mimeappFile = nullptr;
}
if (QFile(systemfile).exists()) {
QSettings* mimeappFile = new QSettings(systemfile, QSettings::IniFormat);
QString str = mimeappFile->value(QString("Default Applications/%1").arg(contentType)).toString();
if (!str.isEmpty()) {
if (QFile(SYSTEM_CONFIG_DIR +str).exists()) {
return str;
} else {
return QString("");
}
}
delete mimeappFile;
mimeappFile = nullptr;
}
return QString("");
}
void Screenlock::connectUiSignals()
{
connect(screenlockui, &ScreenlockUi::showOnLoginChanged, this, [=](bool b) {
toChangeKey = "showOnLogin";
screenlockInterface->call("setShowOnLogin", b);
UkccCommon::buriedSettings(
name(),
QString("Show picture of screenlock on screenlogin"),
QString("settings"),
UkccCommon::boolToString(b));
});
connect(screenlockui, &ScreenlockUi::lockDatetimeEnableChanged, this, [=](bool b) {
toChangeKey = "lockDatetimeEnable";
screenlockInterface->call("setLockDatetimeEnable", b);
UkccCommon::buriedSettings(
name(),
QString("The date and time are displayed"),
QString("settings"),
UkccCommon::boolToString(b));
});
connect(screenlockui, &ScreenlockUi::pictureChanged, this, [=](QString file) {
toChangeKey = "wallpaper";
screenlockInterface->call("setWallpaper", file);
});
connect(screenlockui, &ScreenlockUi::localButtonClicked, this, [=]() { showLocalWpDialog(); });
connect(screenlockui, &ScreenlockUi::onlineButtonClicked, this, [=]() {
bool openUrl = QDesktopServices::openUrl(QUrl(QLatin1String("https://www.ubuntukylin.com/wallpaper.html")));
if(!openUrl) {
QMessageBox *msg = new QMessageBox(screenlockui);
msg->setIcon(QMessageBox::Icon::Critical);
msg->setText(tr("Cannot access online images, please check the system's default browser settings."));
msg->addButton(tr("Cancel"), QMessageBox::RejectRole);
msg->addButton(tr("Set up the browser"), QMessageBox::AcceptRole);
connect(msg, &QMessageBox::accepted, this, [=]() {
QProcess::startDetached(
"ukui-control-center",
QStringList() << "-m"
<< "Defaultapp");
});
msg->exec();
}
UkccCommon::buriedSettings(name(), QString("onlineBtnonlineButton"), QString("clicked"));
});
connect(screenlockui, &ScreenlockUi::resetButtonClicked, this, [=]() {
screenlockInterface->call("resetDefault");
UkccCommon::buriedSettings(name(), QString("resetBtn"), QString("clicked"));
});
connect(screenlockui, &ScreenlockUi::toSetMonitor, this, [=]() {
UkccCommon::buriedSettings(name(), "setBtn(Monitor Off)", QString("clicked"));
QProcess::startDetached(
"ukui-control-center",
QStringList() << "-m"
<< "Power");
});
connect(screenlockui, &ScreenlockUi::toSetScreensaver, this, [=]() {
UkccCommon::buriedSettings(name(), "setBtn(Screensaver)", QString("clicked"));
QProcess::startDetached(
"ukui-control-center",
QStringList() << "-m"
<< "Screensaver");
});
}
void Screenlock::showLocalWpDialog()
{
QStringList filters;
filters << tr("Wallpaper files(*.jpg *.jpeg *.bmp *.dib *.png *.jfif *.jpe *.gif *.tif *.tiff *.wdp)");
QFileDialog fd;
QList usb_list = fd.sidebarUrls();
int sidebarNum = 8; // æœ€å¤§æ·»åŠ U盘数,å�¯ä»¥è‡ªå·±å®šä¹‰
QString home_path = QDir::homePath().section("/", -1, -1);
QString mnt = "/media/" + home_path + "/";
QDir mntDir(mnt);
mntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList file_list = mntDir.entryInfoList();
QList mntUrlList;
for (int i = 0; i < sidebarNum && i < file_list.size(); ++i) {
QFileInfo fi = file_list.at(i);
mntUrlList << QUrl("file://" + fi.filePath());
}
QFileSystemWatcher m_fileSystemWatcher(&fd);
m_fileSystemWatcher.addPath("/media/" + home_path + "/");
connect(
&m_fileSystemWatcher,
&QFileSystemWatcher::directoryChanged,
&fd,
[=, &sidebarNum, &mntUrlList, &usb_list, &fd](const QString path) {
QDir m_wmntDir(path);
m_wmntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList m_wfilist = m_wmntDir.entryInfoList();
mntUrlList.clear();
for (int i = 0; i < sidebarNum && i < m_wfilist.size(); ++i) {
QFileInfo m_fi = m_wfilist.at(i);
mntUrlList << QUrl("file://" + m_fi.filePath());
}
fd.setSidebarUrls(usb_list + mntUrlList);
fd.update();
});
connect(&fd, &QFileDialog::finished, &fd, [=, &usb_list, &fd]() { fd.setSidebarUrls(usb_list); });
fd.setDirectory(QString(const_cast(g_get_user_special_dir(G_USER_DIRECTORY_PICTURES))));
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setViewMode(QFileDialog::List);
fd.setNameFilters(filters);
fd.setFileMode(QFileDialog::ExistingFile);
fd.setWindowTitle(tr("select custom wallpaper file"));
fd.setLabelText(QFileDialog::Accept, tr("Select"));
fd.setLabelText(QFileDialog::LookIn, tr("Position: "));
fd.setLabelText(QFileDialog::FileName, tr("FileName: "));
fd.setLabelText(QFileDialog::FileType, tr("FileType: "));
fd.setLabelText(QFileDialog::Reject, tr("Cancel"));
fd.setSidebarUrls(usb_list + mntUrlList);
if (fd.exec() != QDialog::Accepted) {
return;
}
QString selectedfile;
selectedfile = fd.selectedFiles().first();
screenlockInterface->call("setWallpaper", selectedfile);
UkccCommon::buriedSettings(name(), QString("browserLocalwpBtn"), QString("clicked"));
}
void Screenlock::connectToServer()
{
QThread *NetThread = new QThread;
MThread *NetWorker = new MThread;
NetWorker->moveToThread(NetThread);
connect(NetThread, &QThread::started, NetWorker, &MThread::run);
connect(NetWorker, &MThread::keychangedsignal, this, &Screenlock::keyChangedSlot);
connect(NetThread, &QThread::finished, NetWorker, &MThread::deleteLater);
NetThread->start();
}
void Screenlock::keyChangedSlot(const QString &key)
{
if (key == "ukui-screensaver") {
if (!bIsCloudService) {
bIsCloudService = true;
}
initShowOnLogin();
initWallpaper();
}
}
ukui-screensaver/src/ukccplugins/screensaver/ 0000775 0001750 0001750 00000000000 15254241235 020434 5 ustar feng feng ukui-screensaver/src/ukccplugins/screensaver/screensaverui.cpp 0000664 0001750 0001750 00000133123 15254241235 024021 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screensaverui.h"
#include "commonfunc.h"
#include
#include
#include
#define DEFAULT_PHOTO_PATH "/usr/share/backgrounds"
#define LOCAL_WALLPAPER_PATH (QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/ukui-control-center/wallpaperData/"))
ScreensaverUi::ScreensaverUi()
{
setAttribute(Qt::WA_DeleteOnClose);
uiLayout = new QVBoxLayout(this);
uiLayout->setSpacing(8);
uiLayout->setContentsMargins(0, 0, 0, 0);
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // �许自由拉伸
uiLayout->setSizeConstraint(QLayout::SetMinAndMaxSize ); // æ—¢å…�è®¸å¸ƒå±€æ ¹æ�®å†…容自动调整,å�ˆä¸�会阻æ¢çª—å�£æ‹‰ä¼¸
uiLayout->setContentsMargins(0, 0, 0, 0); // 移除边�
initUi();
sendSignals();
}
ScreensaverUi::~ScreensaverUi()
{
}
void ScreensaverUi::initUi()
{
initPreview();
initBasisSettings();
initThumbnailSaver();
initWeatherSettings();
initMusicSettings();
initPhotoSettings();
initPhotoSource();
initSetting();
uiLayout->addStretch();
}
void ScreensaverUi::initPreview()
{
screensaverTitle = new KLabel(this);
screensaverTitle->setContentsMargins(16, 0, 0, 0);
previewFrame = new UkccFrame(this);
previewLayout = new QHBoxLayout(previewFrame);
previewWidget = new PreviewWidget(this);
uiLayout->addWidget(screensaverTitle);
uiLayout->addWidget(previewFrame);
//~ contents_path /Screensaver/Screensaver
screensaverTitle->setText(tr("Screensaver"));
previewWidget->setFixedSize(276, 160);
QVBoxLayout *leftLayout = new QVBoxLayout();
leftLayout->setContentsMargins(0, 8, 0, 0);
leftLayout->addWidget(previewWidget);
leftLayout->addStretch();
previewLayout->addLayout(leftLayout);
QHBoxLayout *layout = new QHBoxLayout(previewWidget);
layout->setContentsMargins(0, 0, 0, 0);
}
void ScreensaverUi::initThumbnailSaver()
{
m_thumbnailSaverGroup = new SettingGroup(this);
m_thumbnailSaverGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
m_thumbnailFrame = new UkccFrame(this);
m_thumbnailFrame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
UkccFrame *saverFrame = new UkccFrame(m_thumbnailSaverGroup, UkccFrame::Top);
QHBoxLayout *topLayout = new QHBoxLayout(saverFrame);
KLabel *selectSaverLabel = new KLabel(saverFrame);
selectSaverLabel->setText(tr("Select Screensaver"));
topLayout->addWidget(selectSaverLabel);
topLayout->addStretch();
m_thumbnailLayout = new FlowLayout(m_thumbnailFrame, 8, 8, 8);
QWidget *saverWidget = new QWidget();
QVBoxLayout *saverLayout = new QVBoxLayout(saverWidget);
saverLayout->setContentsMargins(0, 0, 0, 0);
saverLayout->setSpacing(4);
m_defaulSaverWidget = new SaverThumbnailWidget(this, true);
KLabel *saverLabel = new KLabel(m_thumbnailFrame);
saverLabel->setFixedWidth(m_defaulSaverWidget->width());
saverLabel->setAlignment(Qt::AlignCenter);
saverLabel->setText("UKUI");
saverLayout->addWidget(m_defaulSaverWidget);
saverLayout->addWidget(saverLabel);
m_thumbnailLayout->addWidget(saverWidget);
QWidget *weatherWidget = new QWidget();
QVBoxLayout *weatherLayout = new QVBoxLayout(weatherWidget);
weatherLayout->setContentsMargins(0, 0, 0, 0);
weatherLayout->setSpacing(4);
m_weatherThumbnailWidget = new WeatherThumbnailWidget(this, true);
KLabel *weatherLabel = new KLabel(m_thumbnailFrame);
weatherLabel->setFixedWidth(m_weatherThumbnailWidget->width());
weatherLabel->setAlignment(Qt::AlignCenter);
weatherLabel->setText(tr("Weather"));
weatherLayout->addWidget(m_weatherThumbnailWidget);
weatherLayout->addWidget(weatherLabel);
m_thumbnailLayout->addWidget(weatherWidget);
QWidget *musicWidget = new QWidget();
QVBoxLayout *musicLayout = new QVBoxLayout(musicWidget);
musicLayout->setContentsMargins(0, 0, 0, 0);
musicLayout->setSpacing(4);
m_musicWidget = new MusicThumbnailWidget(this, true);
KLabel *musicLabel = new KLabel(m_thumbnailFrame);
musicLabel->setFixedWidth(m_musicWidget->width());
musicLabel->setAlignment(Qt::AlignCenter);
musicLabel->setText(tr("Music"));
musicLayout->addWidget(m_musicWidget);
musicLayout->addWidget(musicLabel);
m_thumbnailLayout->addWidget(musicWidget);
QWidget *albunWidget = new QWidget();
QVBoxLayout *albunLayout = new QVBoxLayout(albunWidget);
albunLayout->setContentsMargins(0, 0, 0, 0);
albunLayout->setSpacing(4);
m_albunWidget = new AlbumThumbnailWidget(this, true);
KLabel *albunLabel = new KLabel(m_thumbnailFrame);
albunLabel->setFixedWidth(m_albunWidget->width());
albunLabel->setAlignment(Qt::AlignCenter);
albunLabel->setText(tr("Albun"));
albunLayout->addWidget(m_albunWidget);
albunLayout->addWidget(albunLabel);
m_thumbnailLayout->addWidget(albunWidget);
// mainLayout->addWidget(selectSaverLabel);
// mainLayout->addLayout(m_thumbnailLayout);
m_thumbnailSaverGroup->addWidget(saverFrame);
m_thumbnailSaverGroup->addWidget(m_thumbnailFrame);
uiLayout->addWidget(m_thumbnailSaverGroup);
}
void ScreensaverUi::initBasisSettings()
{
m_basisGroup = new KBackgroundGroup(this);
m_basisGroup->setFixedHeight(275);
initIdleTimeFrame();
initScreenlockFrame();
initSaverDatetimeFrame();
initBreakTimeFrame();
previewLayout->addWidget(m_basisGroup);
}
void ScreensaverUi::initIdleTimeFrame()
{
QWidget *idleTimeWidget = new QWidget(m_basisGroup);
QHBoxLayout *idleTimeLayout = new QHBoxLayout(idleTimeWidget);
KLabel *idleTimeLabel = new KLabel(idleTimeWidget);
idleTimeLayout->setContentsMargins(16, 0, 16, 0);
idleTimeLayout->addWidget(idleTimeLabel);
m_idleTimeBox = new QComboBox(idleTimeWidget);
idleTimeLayout->addStretch();
idleTimeLayout->addWidget(m_idleTimeBox);
//~ contents_path /Screensaver/Idle time
idleTimeLabel->setText(tr("Idle time"));
m_basisGroup->addWidget(idleTimeWidget);
}
void ScreensaverUi::initSaverDatetimeFrame()
{
QWidget *saverDatetimeWidget = new QWidget(m_basisGroup);
QHBoxLayout *saverDatetimeLayout = new QHBoxLayout(saverDatetimeWidget);
KLabel *saverDatetimeLabel = new KLabel(saverDatetimeWidget);
saverDatetimeLayout->setContentsMargins(16, 0, 16, 0);
saverDatetimeLayout->addWidget(saverDatetimeLabel);
m_saverDatetimeBtn = new KSwitchButton(saverDatetimeWidget);
saverDatetimeLayout->addStretch();
saverDatetimeLayout->addWidget(m_saverDatetimeBtn);
//~ contents_path /Screensaver/The date and time are displayed
saverDatetimeLabel->setText(tr("The date and time are displayed"));
m_basisGroup->addWidget(saverDatetimeWidget);
}
void ScreensaverUi::initBreakTimeFrame()
{
QWidget *showTimeFrame = new QWidget(m_basisGroup);
QHBoxLayout *showTimeLayout = new QHBoxLayout(showTimeFrame);
KLabel *showTimeLabel = new KLabel(showTimeFrame);
showTimeLayout->setContentsMargins(16, 0, 16, 0);
showTimeLayout->addWidget(showTimeLabel);
//æ·»åŠ ä¼‘æ�¯æ—¶é—´æ˜¾ç¤ºæŒ‰é’®
showCustomTimeBtn = new KSwitchButton(showTimeFrame);
showUkuiTimeBtn = new KSwitchButton(showTimeFrame);
showTimeLayout->addStretch();
showTimeLayout->addWidget(showCustomTimeBtn);
showTimeLayout->addWidget(showUkuiTimeBtn);
//~ contents_path /Screensaver/Show rest time
showTimeLabel->setText(tr("Show rest time"));
m_basisGroup->addWidget(showTimeFrame);
}
void ScreensaverUi::initScreenlockFrame()
{
QWidget *lockFrame = new QWidget(m_basisGroup);
QHBoxLayout *lockLayout = new QHBoxLayout(lockFrame);
KLabel *lockLabel = new KLabel();
//~ contents_path /Screensaver/Lock screen when screensaver boot
lockLabel->setText(tr("Lock screen when screensaver boot"));
lockLayout->setContentsMargins(16, 0, 16, 0);
lockLayout->addWidget(lockLabel);
lockButton = new KSwitchButton(lockFrame);
lockLayout->addStretch();
lockLayout->addWidget(lockButton);
m_basisGroup->addWidget(lockFrame);
}
void ScreensaverUi::initWeatherSettings()
{
m_weatherFrame = new UkccFrame(this, UkccFrame::BorderRadiusStyle::Around, true);
QHBoxLayout *weatherSettingsLayout = new QHBoxLayout(m_weatherFrame);
KLabel *weatherSettingsLabel = new KLabel();
weatherSettingsLayout->setContentsMargins(16, 0, 16, 0);
weatherSettingsLayout->addWidget(weatherSettingsLabel);
m_weatherSettingBtn = new QPushButton(m_weatherFrame);
m_weatherSettingBtn->setText(tr("Go to App Settings"));
m_localLabel = new KLabel(m_weatherFrame);
QPixmap localIcon = QIcon::fromTheme("mark-location-symbolic").pixmap(QSize(16, 16));
m_localLabel->setPixmap(localIcon);
m_localLabel->setMinimumWidth(80);
weatherSettingsLayout->addStretch();
weatherSettingsLayout->addWidget(m_localLabel);
weatherSettingsLayout->addWidget(m_weatherSettingBtn);
weatherSettingsLabel->setFixedWidth(220);
//~ contents_path /Screensaver/Show rest time
weatherSettingsLabel->setText(tr("Current position"));
uiLayout->addWidget(m_weatherFrame);
}
void ScreensaverUi::initMusicSettings()
{
m_musicSaverGroup = new SettingGroup(this);
UkccFrame *followSystemFrame = new UkccFrame(m_musicSaverGroup, UkccFrame::BorderRadiusStyle::Top, true);
QHBoxLayout *followSystemLayout = new QHBoxLayout(followSystemFrame);
followSystemLayout->setContentsMargins(16, 0, 16, 0);
followSystemLayout->setSpacing(8);
//~ contents_path /Screensaver/Prioritize the list of songs from the Music app
m_followSystemBtn = new QRadioButton(tr("Prioritize the list of songs from the Music app"), followSystemFrame);
followSystemLayout->addWidget(m_followSystemBtn);
followSystemLayout->addStretch();
UkccFrame *musicSourceFrame = new UkccFrame(m_musicSaverGroup, UkccFrame::BorderRadiusStyle::Bottom, true);
QHBoxLayout *sourceLayout = new QHBoxLayout(musicSourceFrame);
//~ contents_path /Screensaver/Priority playlists
m_customMusicBtn = new QRadioButton(tr("Priority playlists"), musicSourceFrame);
m_musicPathLine = new QLineEdit(musicSourceFrame);
m_musicSourceBtn = new QPushButton(musicSourceFrame);
m_musicSourceBtn->setText(tr("Select the folder"));
sourceLayout->setContentsMargins(16, 0, 16, 0);
sourceLayout->setSpacing(8);
sourceLayout->addWidget(m_customMusicBtn);
sourceLayout->addWidget(m_musicPathLine);
sourceLayout->addWidget(m_musicSourceBtn);
m_musicPathLine->setMinimumWidth(252);
m_musicPathLine->setReadOnly(true);
m_musicSourceBtn->adjustSize();
m_musicSourceBtn->raise();
m_musicSaverGroup->addWidget(followSystemFrame);
m_musicSaverGroup->addWidget(musicSourceFrame);
uiLayout->addWidget(m_musicSaverGroup);
}
void ScreensaverUi::initPhotoSettings()
{
m_PhotoSettingGroup = new SettingGroup(this);
//~ contents_path /Screensaver/Switch mode
m_photoSwitchWidget = new RadioButtonWidget(tr("Switch mode"), m_PhotoSettingGroup, UkccFrame::Top);
m_orderBtn = new QRadioButton(tr("In order"), m_photoSwitchWidget);
m_randomBtn = new QRadioButton(tr("Random"), m_photoSwitchWidget);
m_photoSwitchWidget->addButton(m_orderBtn, 0);
m_photoSwitchWidget->addButton(m_randomBtn, 1, true);
//~ contents_path /Screensaver/Switching frequency
m_photoFrequencyWidget = new ComboxWidget(tr("Switching frequency"), m_PhotoSettingGroup);
m_PhotoSettingGroup->addWidget(m_photoSwitchWidget);
m_PhotoSettingGroup->addWidget(m_photoFrequencyWidget);
uiLayout->addWidget(m_PhotoSettingGroup);
}
void ScreensaverUi::initPhotoSource()
{
m_photoSourceGroup = new SettingGroup(this);
UkccFrame *imageSourceFrame = new UkccFrame(m_photoSourceGroup, UkccFrame::Top, false);
imageSourceFrame->setMinimumHeight(50);
QHBoxLayout *topLayout = new QHBoxLayout(imageSourceFrame);
topLayout->setContentsMargins(16, 0, 16, 0);
KLabel *sourceLabel = new KLabel(m_photoSourceFrame);
//~ contents_path /Screensaver/Image source
sourceLabel->setText(tr("Image source"));
m_photoSourceBtn = new QPushButton(tr("Add image folder"), m_photoSourceFrame);
m_photoSourceBtn->setIcon(QIcon::fromTheme("list-add-symbolic"));
topLayout->addWidget(sourceLabel);
topLayout->addStretch();
topLayout->addWidget(m_photoSourceBtn);
m_photoSourceFrame = new UkccFrame(m_photoSourceGroup, UkccFrame::Bottom, false);
m_photoSourceLayout = new FlowLayout(m_photoSourceFrame, -1, 8);
m_photoSourceGroup->addWidget(imageSourceFrame);
m_photoSourceGroup->addWidget(m_photoSourceFrame);
uiLayout->addWidget(m_photoSourceGroup);
}
void ScreensaverUi::initSetting()
{
screensaverGroup = new SettingGroup(this);
//~ contents_path /Screensaver/Screensaver program
programWidget = new ComboxWidget(tr("Screensaver program"), screensaverGroup);
customizeGroup = new SettingGroup(screensaverGroup);
uiLayout->addWidget(screensaverGroup);
screensaverGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
screensaverGroup->addWidget(programWidget);
screensaverGroup->addWidget(customizeGroup);
initSourceFrame();
initSwitchModeFrame();
initSwitchTimeFrame();
initCustomTextFrame();
initTextPositionFrame();
}
void ScreensaverUi::initSourceFrame()
{
UkccFrame *screensaverSourceFrame = new UkccFrame(customizeGroup, UkccFrame::BorderRadiusStyle::None, true);
QHBoxLayout *sourceLayout = new QHBoxLayout(screensaverSourceFrame);
KLabel *sourceLabel = new KLabel();
sourcePathLine = new QLineEdit();
sourceButton = new QPushButton();
sourceLayout->setContentsMargins(16, 0, 16, 0);
sourceLayout->addWidget(sourceLabel);
sourceLayout->addWidget(sourcePathLine);
sourceLayout->addWidget(sourceButton);
//~ contents_path /Screensaver/Screensaver source
sourceLabel->setText(tr("Screensaver source"));
sourceLabel->setFixedWidth(220);
sourcePathLine->setMinimumWidth(252);
sourcePathLine->setReadOnly(true);
sourceButton->adjustSize();
sourceButton->setText(tr("Select"));
sourceButton->raise();
customizeGroup->addWidget(screensaverSourceFrame);
}
void ScreensaverUi::initSwitchModeFrame()
{
UkccFrame *pictureSwitchFrame = new UkccFrame(customizeGroup, UkccFrame::BorderRadiusStyle::Around, true);
QHBoxLayout *randomLayout = new QHBoxLayout(pictureSwitchFrame);
KLabel *randomLabel = new KLabel();
QRadioButton *radioOrder = new QRadioButton();
QRadioButton *radioRand = new QRadioButton();
switchModeGroup = new QButtonGroup();
switchModeGroup->addButton(radioOrder, 0);
switchModeGroup->addButton(radioRand, 1);
radioOrder->setFixedWidth(220);
radioRand->adjustSize();
radioOrder->setText(tr("Ordinal"));
radioRand->setText(tr("Random"));
randomLayout->setContentsMargins(16, 0, 16, 0);
randomLayout->addWidget(randomLabel);
randomLayout->addWidget(radioOrder);
randomLayout->addWidget(radioRand);
//~ contents_path /Screensaver/Random switching
randomLabel->setText(tr("Random switching"));
randomLabel->setFixedWidth(220);
randomLayout->addStretch();
customizeGroup->addWidget(pictureSwitchFrame);
}
void ScreensaverUi::initSwitchTimeFrame()
{
UkccFrame *timeSetFrame = new UkccFrame(customizeGroup, UkccFrame::BorderRadiusStyle::Around, true);
QHBoxLayout *timeSetLayout = new QHBoxLayout();
KLabel *timeSetLabel = new KLabel();
switchTimeComboBox = new QComboBox();
timeSetFrame->setLayout(timeSetLayout);
timeSetLayout->setContentsMargins(16, 0, 16, 0);
timeSetLayout->addWidget(timeSetLabel);
timeSetLayout->addWidget(switchTimeComboBox);
//~ contents_path /Screensaver/Switching time
timeSetLabel->setText(tr("Switching time"));
timeSetLabel->setFixedWidth(220);
switchTimeComboBox->setMinimumWidth(340);
customizeGroup->addWidget(timeSetFrame);
}
void ScreensaverUi::initCustomTextFrame()
{
UkccFrame *showTextFrame = new UkccFrame(customizeGroup, UkccFrame::BorderRadiusStyle::Around, true);
QHBoxLayout *showTextLayout = new QHBoxLayout();
KLabel *showLabel = new KLabel();
textLineEdit = new QLineEdit(); //用户输入文å—
showTextFrame->setLayout(showTextLayout);
showTextLayout->setContentsMargins(16, 6, 15, 8);
showTextLayout->addWidget(showLabel);
showTextLayout->addWidget(textLineEdit);
//~ contents_path /Screensaver/Text(up to 30 characters):
showLabel->setText(tr("Text(up to 30 characters):"));
showLabel->setFixedWidth(220);
textLineEdit->setMaxLength(30);
customizeGroup->addWidget(showTextFrame);
}
void ScreensaverUi::initTextPositionFrame()
{
UkccFrame *showTextSetFrame = new UkccFrame(customizeGroup, UkccFrame::BorderRadiusStyle::Around, true);
QHBoxLayout *textSetLayout = new QHBoxLayout(showTextSetFrame);
KLabel *textSetLabel = new KLabel(showTextSetFrame);
QRadioButton *radioRandom = new QRadioButton(this);
QRadioButton *radioCenter = new QRadioButton(this);
textPositionGroup = new QButtonGroup();
textPositionGroup->addButton(radioRandom, 0);
textPositionGroup->addButton(radioCenter, 1);
showTextSetFrame->setFixedHeight(60);
textSetLayout->addWidget(textSetLabel);
textSetLayout->setContentsMargins(16,0,16,0);
//~ contents_path /Screensaver/Text position
textSetLabel->setText(tr("Text position"));
textSetLabel->setFixedWidth(220);
radioRandom->setFixedWidth(220);
radioCenter->adjustSize();
textSetLayout->addWidget(radioRandom);
textSetLayout->addWidget(radioCenter);
textSetLayout->addStretch();
radioCenter->setText(tr("Centered"));
radioRandom->setText(tr("Randow(Bubble text)"));
customizeGroup->addWidget(showTextSetFrame);
}
void ScreensaverUi::setIdleTimeOptions(const QStringList &textList, const QList &dataList)
{
if (textList.size() == dataList.size()) {
m_idleTimeBox->clear();
for (int i = 0; i < textList.size(); ++i) {
m_idleTimeBox->addItem(textList.at(i), dataList.at(i));
}
}
}
void ScreensaverUi::setScreensaverOptions(const QStringList &textList, const QStringList &dataList)
{
if (textList.size() == dataList.size()) {
programWidget->comboBox()->clear();
for (int i = 0; i < textList.size(); ++i) {
programWidget->comboBox()->addItem(textList.at(i), dataList.at(i));
}
}
}
void ScreensaverUi::setSwitchTimeOptions(const QStringList &textList, const QList &dataList)
{
if (textList.size() == dataList.size()) {
switchTimeComboBox->clear();
for (int i = 0; i < textList.size(); ++i) {
switchTimeComboBox->addItem(textList.at(i), dataList.at(i));
}
}
}
void ScreensaverUi::setPhotoSwitchTimeOptions(const QStringList &textList, const QList &dataList)
{
if (textList.size() == dataList.size()) {
m_photoFrequencyWidget->comboBox()->clear();
for (int i = 0; i < textList.size(); ++i) {
m_photoFrequencyWidget->comboBox()->addItem(textList.at(i), dataList.at(i));
}
}
}
void ScreensaverUi::setIdleTime(int time)
{
for (int i = 0; i < m_idleTimeBox->count(); ++i) {
if (time == m_idleTimeBox->itemData(i)) {
m_idleTimeBox->blockSignals(true);
m_idleTimeBox->setCurrentIndex(i);
m_idleTimeBox->blockSignals(false);
}
}
}
void ScreensaverUi::setScreensaver(QString type)
{
for (int i = 0; i < programWidget->comboBox()->count(); ++i) {
if (type == programWidget->comboBox()->itemData(i)) {
programWidget->comboBox()->blockSignals(true);
programWidget->comboBox()->setCurrentIndex(i);
programWidget->comboBox()->blockSignals(false);
}
}
if (type == "ukui") {
customizeGroup->setVisible(false);
showUkuiTimeBtn->setVisible(true);
showCustomTimeBtn->setVisible(false);
m_bCustomSaver = false;
} else if (type == "custom") {
customizeGroup->setVisible(true);
showUkuiTimeBtn->setVisible(false);
showCustomTimeBtn->setVisible(true);
m_bCustomSaver = true;
}
}
void ScreensaverUi::updatePreview(QWidget *w)
{
for (QObject *o : previewWidget->children()) {
if (o->objectName() == "screensaverWidget") {
delete o;
o = nullptr;
}
}
w->setObjectName("screensaverWidget");
previewWidget->layout()->addWidget(w);
previewWidget->update();
}
void ScreensaverUi::closePreview()
{
if (!previewWidget) {
return;
}
for (QObject *o : previewWidget->children()) {
if (o->objectName() == "screensaverWidget") {
delete o;
o = nullptr;
}
}
previewWidget->update();
}
void ScreensaverUi::setSourcePath(const QString &text)
{
if (sourcePathLine == nullptr) {
return;
}
QFontMetrics fontMetrics(sourcePathLine->font());
int fontSize = fontMetrics.horizontalAdvance(text);
if (fontSize > sourcePathLine->width()) {
sourcePathLine->setText(fontMetrics.elidedText(text, Qt::ElideRight, sourcePathLine->width()));
sourcePathLine->setToolTip(text);
} else {
sourcePathLine->setText(text);
sourcePathLine->setToolTip("");
}
}
void ScreensaverUi::setSwitchRandom(const bool &b)
{
switchModeGroup->blockSignals(true);
if (b) {
switchModeGroup->button(1)->setChecked(true);
} else {
switchModeGroup->button(0)->setChecked(true);
}
switchModeGroup->blockSignals(false);
}
void ScreensaverUi::setSwitchTime(const int &time)
{
for (int i = 0; i < switchTimeComboBox->count(); ++i) {
if (time == switchTimeComboBox->itemData(i)) {
switchTimeComboBox->blockSignals(true);
switchTimeComboBox->setCurrentIndex(i);
switchTimeComboBox->blockSignals(false);
}
}
}
void ScreensaverUi::setPhotoSwitchTime(const int &time)
{
for (int i = 0; i < m_photoFrequencyWidget->comboBox()->count(); ++i) {
if (time == m_photoFrequencyWidget->comboBox()->itemData(i)) {
m_photoFrequencyWidget->comboBox()->blockSignals(true);
m_photoFrequencyWidget->comboBox()->setCurrentIndex(i);
m_photoFrequencyWidget->comboBox()->blockSignals(false);
}
}
}
void ScreensaverUi::setCustomText(const QString &text)
{
textLineEdit->blockSignals(true);
textLineEdit->setText(text);
textLineEdit->blockSignals(false);
}
void ScreensaverUi::setTextCentered(const bool &b)
{
textPositionGroup->blockSignals(true);
if (b) {
textPositionGroup->button(1)->setChecked(true);
} else {
textPositionGroup->button(0)->setChecked(true);
}
textPositionGroup->blockSignals(false);
}
void ScreensaverUi::setShowUkuiTime(const bool &b)
{
showUkuiTimeBtn->blockSignals(true);
showUkuiTimeBtn->setChecked(b);
showUkuiTimeBtn->blockSignals(false);
}
void ScreensaverUi::setShowCustomTime(const bool &b)
{
showCustomTimeBtn->blockSignals(true);
showCustomTimeBtn->setChecked(b);
showCustomTimeBtn->blockSignals(false);
}
void ScreensaverUi::setLockscreen(const bool &b)
{
lockButton->blockSignals(true);
lockButton->setChecked(b);
lockButton->blockSignals(false);
}
void ScreensaverUi::setThumbnailBackground(QString background)
{
QString thumbnailPath = mapToThumbnailPath(background);
m_defaulSaverWidget->setBackground(loadFromFile(thumbnailPath));
QPixmap scaleBackground = scaleBlurPixmap(m_defaulSaverWidget->width(), m_defaulSaverWidget->height(), thumbnailPath);
m_weatherThumbnailWidget->setBackground(scaleBackground);
m_musicWidget->setBackground(scaleBackground);
m_albunWidget->setBackground(scaleBackground);
m_albunWidget->setDefaultPhoto(loadFromFile(thumbnailPath));
}
void ScreensaverUi::setSubMode(int mode)
{
if (mode == 3) { // 相册模�
m_photoSourceGroup->setMinimumHeight(200); // 设置一个��的最�高度
} else {
m_photoSourceGroup->setMinimumHeight(0); // 其他模���自动高度
}
switch (mode) {
case 0:
m_defaulSaverWidget->setSelectStatus(true);
m_weatherThumbnailWidget->setSelectStatus(false);
m_musicWidget->setSelectStatus(false);
m_albunWidget->setSelectStatus(false);
if (m_bCustomSaver) {
customizeGroup->setVisible(true);
}
programWidget->setVisible(true);
m_weatherFrame->setVisible(false);
m_musicSaverGroup->setVisible(false);
m_PhotoSettingGroup->setVisible(false);
m_photoSourceGroup->setVisible(false);
break;
case 1:
m_defaulSaverWidget->setSelectStatus(false);
m_weatherThumbnailWidget->setSelectStatus(true);
m_musicWidget->setSelectStatus(false);
m_albunWidget->setSelectStatus(false);
programWidget->setVisible(false);
customizeGroup->setVisible(false);
m_weatherFrame->setVisible(true);
m_musicSaverGroup->setVisible(false);
m_PhotoSettingGroup->setVisible(false);
m_photoSourceGroup->setVisible(false);
break;
case 2:
m_defaulSaverWidget->setSelectStatus(false);
m_weatherThumbnailWidget->setSelectStatus(false);
m_musicWidget->setSelectStatus(true);
m_albunWidget->setSelectStatus(false);
programWidget->setVisible(false);
customizeGroup->setVisible(false);
m_weatherFrame->setVisible(false);
m_musicSaverGroup->setVisible(true);
m_PhotoSettingGroup->setVisible(false);
m_photoSourceGroup->setVisible(false);
break;
case 3:
m_defaulSaverWidget->setSelectStatus(false);
m_weatherThumbnailWidget->setSelectStatus(false);
m_musicWidget->setSelectStatus(false);
m_albunWidget->setSelectStatus(true);
programWidget->setVisible(false);
customizeGroup->setVisible(false);
m_weatherFrame->setVisible(false);
m_musicSaverGroup->setVisible(false);
m_PhotoSettingGroup->setVisible(true);
m_photoSourceGroup->setVisible(true);
break;
default:
break;
}
}
void ScreensaverUi::setCurrentPosition(QString position)
{
m_localLabel->setText(position);
m_localLabel->adjustSize();
}
void ScreensaverUi::setMusicFollowSystem(const bool &b)
{
m_followSystemBtn->setChecked(b);
m_customMusicBtn->setChecked(!b);
}
void ScreensaverUi::setMusicPath(QString path)
{
if (m_musicPathLine == nullptr) {
return;
}
QFontMetrics fontMetrics(m_musicPathLine->font());
int fontSize = fontMetrics.horizontalAdvance(path);
if (fontSize > m_musicPathLine->width()) {
m_musicPathLine->setText(fontMetrics.elidedText(path, Qt::ElideRight, m_musicPathLine->width()));
m_musicPathLine->setToolTip(path);
} else {
m_musicPathLine->setText(path);
m_musicPathLine->setToolTip("");
}
}
void ScreensaverUi::setPhotoCycleMode(int mode)
{
if (mode == 0) {
m_orderBtn->setChecked(true);
m_randomBtn->setChecked(false);
} else {
m_orderBtn->setChecked(false);
m_randomBtn->setChecked(true);
}
}
void ScreensaverUi::setSaverDatetimeEnable(const bool &b)
{
m_saverDatetimeBtn->blockSignals(true);
m_saverDatetimeBtn->setChecked(b);
m_saverDatetimeBtn->blockSignals(false);
}
void ScreensaverUi::setPhotoPath(QStringList paths)
{
QSet oldSet = QSet(m_currentPhotoSource.begin(), m_currentPhotoSource.end());
QSet newSet = QSet(paths.begin(), paths.end());
QSet deleteSet = oldSet - newSet;
QSet addSet = newSet - oldSet;
QStringList deleteSource(deleteSet.begin(), deleteSet.end());
QStringList addSource(addSet.begin(), addSet.end());
if (!deleteSource.isEmpty()) {
for (const QString& folderPath : deleteSource) {
for (int i = 0; i < m_photoSourceLayout->count(); ++i) {
QLayoutItem* item = m_photoSourceLayout->itemAt(i);
if (item && item->widget()) {
if (item->widget() && folderPath == item->widget()->objectName()) {
m_photoSourceLayout->removeItem(item);
item->widget()->deleteLater();
}
}
}
}
}
int bgIndex = addSource.indexOf(DEFAULT_PHOTO_PATH);
if (bgIndex != -1) {
addSource.move(bgIndex, 0);
}
qDebug() << "m_currentPhotoSource = " << paths;
if (!addSource.isEmpty()) {
for (const QString& folderPath : addSource) {
QString imagePath =getFirstImageFileIterator(folderPath);
if (!imagePath.isEmpty()) {
bool bSystemCorver = (folderPath == DEFAULT_PHOTO_PATH) ? true : false;
QPixmap coverPixmap;
if (bSystemCorver) {
QString thumbnailPath = mapToThumbnailPath(imagePath);
coverPixmap = loadFromFile(thumbnailPath);
} else {
coverPixmap = loadFromFile(imagePath);
}
QWidget *photoCorverWidget = new QWidget(m_photoSourceFrame);
PhotoCorver *photoCorver = new PhotoCorver(photoCorverWidget, bSystemCorver);
photoCorver->setBackground(coverPixmap);
photoCorverWidget->setObjectName(folderPath);
photoCorver->setObjectName(folderPath);
connect(photoCorver, &PhotoCorver::photoCorverLeftClicked, this, [=]() {
Q_EMIT photoSelectPathChanged(folderPath);
});
connect(photoCorver, &PhotoCorver::openFileFolderClicked, this, [=]() {
Q_EMIT openFileFolderClicked(folderPath);
});
connect(photoCorver, &PhotoCorver::removePathClicked, this, [=]() {
if (!bSystemCorver) {
Q_EMIT removePhotoPathClicked(folderPath);
}
});
QVBoxLayout *photoCorverLayout = new QVBoxLayout(photoCorverWidget);
photoCorverLayout->setContentsMargins(0, 0, 0, 0);
photoCorverLayout->setSpacing(4);
KLabel *photoCorverLabel = new KLabel(photoCorverWidget);
photoCorverLabel->setFixedWidth(photoCorver->width());
if (bSystemCorver) {
photoCorverLabel->setText(tr("System wallpaper gallery"));
photoCorverLabel->setAlignment(Qt::AlignCenter);//å±…ä¸
} else {
QDir dir(folderPath);
photoCorverLabel->setText(dir.dirName());
QFontMetrics fm(photoCorverLabel->font());
if (fm.horizontalAdvance(dir.dirName()) <= photoCorverLabel->width()) {
photoCorverLabel->setAlignment(Qt::AlignCenter);//å±…ä¸
}
}
photoCorverLayout->addWidget(photoCorver);
photoCorverLayout->addWidget(photoCorverLabel);
m_photoSourceLayout->addWidget(photoCorverWidget);
}
}
}
m_currentPhotoSource = paths;
}
void ScreensaverUi::setPhotoSelectPath(QString path)
{
for (int i = 0; i < m_photoSourceLayout->count(); ++i) {
QLayoutItem* item = m_photoSourceLayout->itemAt(i);
if (item && item->widget()) {
if (item->widget() && path == item->widget()->objectName()) {
PhotoCorver* photoCover = item->widget()->findChild();
if (photoCover) {
photoCover->setClickStatus(true);
}
} else {
PhotoCorver* photoCover = item->widget()->findChild();
if (photoCover) {
photoCover->setClickStatus(false);
}
}
}
}
if (path == DEFAULT_PHOTO_PATH) {
path = LOCAL_WALLPAPER_PATH;
}
m_albunWidget->setDefaultPath(path);
}
void ScreensaverUi::sendSignals()
{
connect(m_idleTimeBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) {
Q_UNUSED(index)
Q_EMIT idleTimeChanged(m_idleTimeBox->currentData().toInt());
});
connect(programWidget->comboBox(), QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) {
Q_UNUSED(index)
QString type = programWidget->comboBox()->currentData().toString();
Q_EMIT screensaverChanged(type);
if (type == "ukui") {
customizeGroup->setVisible(false);
showUkuiTimeBtn->setVisible(true);
showCustomTimeBtn->setVisible(false);
m_bCustomSaver = false;
} else if (type == "custom") {
customizeGroup->setVisible(true);
showUkuiTimeBtn->setVisible(false);
showCustomTimeBtn->setVisible(true);
m_bCustomSaver = true;
}
});
connect(sourceButton, &QPushButton::clicked, this, [=]() {
QString filter;
filter = tr("Wallpaper files(*.jpg *.jpeg *.bmp *.dib *.png *.jfif *.jpe *.gif *.tif *.tiff *.wdp *.svg)");
QFileDialog fd(this);
QList usb_list = fd.sidebarUrls();
int sidebarNum = 8;// æœ€å¤§æ·»åŠ U盘数,å�¯ä»¥è‡ªå·±å®šä¹‰
QString home_path = QDir::homePath().section("/", -1, -1);
QString mnt = "/media/" + home_path + "/";
QDir mntDir(mnt);
mntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList file_list = mntDir.entryInfoList();
QList mntUrlList;
for (int i = 0; i < sidebarNum && i < file_list.size(); ++i) {
QFileInfo fi = file_list.at(i);
mntUrlList << QUrl("file://" + fi.filePath());
}
QFileSystemWatcher m_fileSystemWatcher(&fd);
m_fileSystemWatcher.addPath("/media/" + home_path + "/");
connect(&m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, &fd,
[=, &sidebarNum, &mntUrlList, &usb_list, &fd](const QString path) {
QDir m_wmntDir(path);
m_wmntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList m_wfilist = m_wmntDir.entryInfoList();
mntUrlList.clear();
for (int i = 0; i < sidebarNum && i < m_wfilist.size(); ++i) {
QFileInfo m_fi = m_wfilist.at(i);
mntUrlList << QUrl("file://" + m_fi.filePath());
}
fd.setSidebarUrls(usb_list + mntUrlList);
fd.update();
});
connect(&fd, &QFileDialog::finished, &fd, [=, &usb_list, &fd]() {
fd.setSidebarUrls(usb_list);
});
fd.setDirectory(QString(sourcePathLine->text()));
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setViewMode(QFileDialog::List);
fd.setNameFilter(filter);
fd.setFileMode(QFileDialog::Directory);
fd.setWindowTitle(tr("select custom screensaver dir"));
fd.setLabelText(QFileDialog::Accept, tr("Select"));
fd.setLabelText(QFileDialog::LookIn, tr("Position: "));
fd.setLabelText(QFileDialog::FileName, tr("FileName: "));
fd.setLabelText(QFileDialog::FileType, tr("FileType: "));
fd.setLabelText(QFileDialog::Reject, tr("Cancel"));
fd.setSidebarUrls(usb_list + mntUrlList);
if (fd.exec() != QDialog::Accepted) {
return;
}
QString selectedfile;
selectedfile = fd.selectedFiles().first();
if(selectedfile != "") { //�点击��消】时
setSourcePath(selectedfile);
Q_EMIT customPathChanged(selectedfile);
}
});
connect(switchModeGroup, &QButtonGroup::idClicked, this, [=](int id) {
if (id == 0) {
Q_EMIT switchRandomChanged(false);
} else {
Q_EMIT switchRandomChanged(true);
}
});
connect(switchTimeComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) {
Q_UNUSED(index)
Q_EMIT switchTimeChanged(switchTimeComboBox->currentData().toInt());
});
connect(m_photoFrequencyWidget->comboBox(), QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index) {
Q_UNUSED(index)
Q_EMIT photoSwitchTimeChanged(m_photoFrequencyWidget->comboBox()->currentData().toInt());
});
connect(textLineEdit, &QLineEdit::textChanged, this, [=](){
Q_EMIT customTextChanged(textLineEdit->text());
});
connect(textPositionGroup, &QButtonGroup::idClicked, this, [=](int id) {
if (id == 0) {
Q_EMIT textCenteredChanged(false);
} else {
Q_EMIT textCenteredChanged(true);
}
});
connect(showUkuiTimeBtn, &KSwitchButton::stateChanged, this, [=]() {
Q_EMIT showUkuiTimeChanged(showUkuiTimeBtn->isChecked());
});
connect(showCustomTimeBtn, &KSwitchButton::stateChanged, this, [=]() {
Q_EMIT showCustomChanged(showCustomTimeBtn->isChecked());
});
connect(lockButton, &KSwitchButton::stateChanged, this, [=]() {
Q_EMIT lockscreenChanged(lockButton->isChecked());
});
connect(m_saverDatetimeBtn, &KSwitchButton::stateChanged, this, [=]() {
Q_EMIT saverDatetimeEnableChanged(m_saverDatetimeBtn->isChecked());
});
connect(m_defaulSaverWidget, &SaverThumbnailWidget::defaultSaverModeClicked, this, [=]() {
subModeChanged(0);
setSubMode(0);
});
connect(m_weatherThumbnailWidget, &WeatherThumbnailWidget::weatherModeClicked, this, [=]() {
subModeChanged(1);
setSubMode(1);
});
connect(m_musicWidget, &MusicThumbnailWidget::musicModeClicked, this, [=]() {
subModeChanged(2);
setSubMode(2);
});
connect(m_albunWidget, &AlbumThumbnailWidget::albumModeClicked, this, [=]() {
subModeChanged(3);
setSubMode(3);
});
connect(m_weatherSettingBtn, &QPushButton::clicked, this, [=]() {
QProcess::startDetached("kylin-weather", QStringList("showmainwindow"));
});
connect(m_followSystemBtn, &QRadioButton::clicked, this, [=]() {
if (m_followSystemBtn->isChecked()) {
musicFollowSystemChanged(m_followSystemBtn->isChecked());
m_customMusicBtn->setChecked(!m_followSystemBtn->isChecked());
} else {
m_followSystemBtn->setChecked(true);
}
});
connect(m_customMusicBtn, &QRadioButton::clicked, this, [=]() {
if (m_customMusicBtn->isChecked()) {
musicFollowSystemChanged(!m_customMusicBtn->isChecked());
m_followSystemBtn->setChecked(!m_customMusicBtn->isChecked());
} else {
m_customMusicBtn->setChecked(true);
}
});
connect(m_orderBtn, &QRadioButton::clicked, this, [=]() {
int mode = m_orderBtn->isChecked() ? 1 : 0;
photoCycleModeChanged(!mode);
m_randomBtn->setChecked(!m_orderBtn->isChecked());
});
connect(m_randomBtn, &QRadioButton::clicked, this, [=]() {
int mode = m_randomBtn->isChecked() ? 1 : 0;
photoCycleModeChanged(mode);
m_orderBtn->setChecked(!m_randomBtn->isChecked());
});
connect(m_musicSourceBtn, &QPushButton::clicked, this, [=]() {
QString filter;
filter = tr("Music files(*.mp3 *.wav *.ogg *.flac *.aac *.m4a *.wma *.opus *.aiff .ape)");
QFileDialog fd(this);
QList usb_list = fd.sidebarUrls();
int sidebarNum = 8;// æœ€å¤§æ·»åŠ U盘数,å�¯ä»¥è‡ªå·±å®šä¹‰
QString home_path = QDir::homePath().section("/", -1, -1);
QString mnt = "/media/" + home_path + "/";
QDir mntDir(mnt);
mntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList file_list = mntDir.entryInfoList();
QList mntUrlList;
for (int i = 0; i < sidebarNum && i < file_list.size(); ++i) {
QFileInfo fi = file_list.at(i);
mntUrlList << QUrl("file://" + fi.filePath());
}
QFileSystemWatcher m_fileSystemWatcher(&fd);
m_fileSystemWatcher.addPath("/media/" + home_path + "/");
connect(&m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, &fd,
[=, &sidebarNum, &mntUrlList, &usb_list, &fd](const QString path) {
QDir m_wmntDir(path);
m_wmntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList m_wfilist = m_wmntDir.entryInfoList();
mntUrlList.clear();
for (int i = 0; i < sidebarNum && i < m_wfilist.size(); ++i) {
QFileInfo m_fi = m_wfilist.at(i);
mntUrlList << QUrl("file://" + m_fi.filePath());
}
fd.setSidebarUrls(usb_list + mntUrlList);
fd.update();
});
connect(&fd, &QFileDialog::finished, &fd, [=, &usb_list, &fd]() {
fd.setSidebarUrls(usb_list);
});
fd.setDirectory(QString(sourcePathLine->text()));
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setViewMode(QFileDialog::List);
fd.setNameFilter(filter);
fd.setFileMode(QFileDialog::Directory);
fd.setWindowTitle(tr("select screensaver music dir"));
fd.setLabelText(QFileDialog::Accept, tr("Select"));
fd.setLabelText(QFileDialog::LookIn, tr("Position: "));
fd.setLabelText(QFileDialog::FileName, tr("FileName: "));
fd.setLabelText(QFileDialog::FileType, tr("FileType: "));
fd.setLabelText(QFileDialog::Reject, tr("Cancel"));
fd.setSidebarUrls(usb_list + mntUrlList);
if (fd.exec() != QDialog::Accepted) {
return;
}
QString selectedfile;
selectedfile = fd.selectedFiles().first();
if(selectedfile != "") { //�点击��消】时
setMusicPath(selectedfile);
Q_EMIT musicPathChanged(selectedfile);
}
});
connect(m_photoSourceBtn, &QPushButton::clicked, this, [=]() {
bool bPhotoSourceBtnShow = m_photoSourceLayout->count() > 49 ? true : false;
if (bPhotoSourceBtnShow) {
QMessageBox msg(this);
msg.setIcon(QMessageBox::Icon::Information);
msg.setIconPixmap(QIcon::fromTheme("dialog-info").pixmap(24,24));
msg.setText(tr("The maximum limit for the number of images in the folder has been reached; you can remove some before continuing to add more."));
msg.exec();
} else {
QString filter;
filter = tr("Wallpaper files(*.jpg *.jpeg *.bmp *.dib *.png *.jfif *.jpe *.gif *.tif *.tiff *.wdp *.svg)");
QFileDialog fd(this);
QList usb_list = fd.sidebarUrls();
int sidebarNum = 8;// æœ€å¤§æ·»åŠ U盘数,å�¯ä»¥è‡ªå·±å®šä¹‰
QString home_path = QDir::homePath().section("/", -1, -1);
QString mnt = "/media/" + home_path + "/";
QDir mntDir(mnt);
mntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList file_list = mntDir.entryInfoList();
QList mntUrlList;
for (int i = 0; i < sidebarNum && i < file_list.size(); ++i) {
QFileInfo fi = file_list.at(i);
mntUrlList << QUrl("file://" + fi.filePath());
}
QFileSystemWatcher m_fileSystemWatcher(&fd);
m_fileSystemWatcher.addPath("/media/" + home_path + "/");
connect(&m_fileSystemWatcher, &QFileSystemWatcher::directoryChanged, &fd,
[=, &sidebarNum, &mntUrlList, &usb_list, &fd](const QString path) {
QDir m_wmntDir(path);
m_wmntDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList m_wfilist = m_wmntDir.entryInfoList();
mntUrlList.clear();
for (int i = 0; i < sidebarNum && i < m_wfilist.size(); ++i) {
QFileInfo m_fi = m_wfilist.at(i);
mntUrlList << QUrl("file://" + m_fi.filePath());
}
fd.setSidebarUrls(usb_list + mntUrlList);
fd.update();
});
connect(&fd, &QFileDialog::finished, &fd, [=, &usb_list, &fd]() {
fd.setSidebarUrls(usb_list);
});
fd.setDirectory(QString(sourcePathLine->text()));
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setViewMode(QFileDialog::List);
fd.setNameFilter(filter);
fd.setFileMode(QFileDialog::Directory);
fd.setWindowTitle(tr("select custom screensaver dir"));
fd.setLabelText(QFileDialog::Accept, tr("Select"));
fd.setLabelText(QFileDialog::LookIn, tr("Position: "));
fd.setLabelText(QFileDialog::FileName, tr("FileName: "));
fd.setLabelText(QFileDialog::FileType, tr("FileType: "));
fd.setLabelText(QFileDialog::Reject, tr("Cancel"));
fd.setSidebarUrls(usb_list + mntUrlList);
if (fd.exec() != QDialog::Accepted) {
return;
}
QString selectedfile;
selectedfile = fd.selectedFiles().first();
if(selectedfile != "") { //�点击��消】时
Q_EMIT photoSourceChanged(selectedfile);
}
}
});
}
ukui-screensaver/src/ukccplugins/screensaver/photocorver.h 0000664 0001750 0001750 00000003254 15254241235 023163 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef PHOTOCORVER_H
#define PHOTOCORVER_H
#include
#include
#include
#include
#include
#include "../../screensaver/masklable.h"
class PhotoCorver : public QLabel
{
Q_OBJECT
public:
explicit PhotoCorver(QWidget *parent = nullptr, bool isSystemCorver = false, bool isScreensaver = true);
void setBackground(QPixmap background);
void setClickStatus(bool state);
protected:
void paintEvent(QPaintEvent *event);
bool eventFilter(QObject *watched, QEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void contextMenuEvent(QContextMenuEvent *event);
Q_SIGNALS:
void photoCorverLeftClicked();
void openFileFolderClicked();
void removePathClicked();
private:
QPixmap m_background;
bool m_bHoverStatus = false;
bool m_bSelectStatus = false;
MaskLable *m_maskLabel = nullptr;
QMenu *m_rightClickMenu = nullptr;
bool m_bSystemCorver = false;
bool m_bScreensaver = true;
};
#endif // PHOTOCORVER_H
ukui-screensaver/src/ukccplugins/screensaver/CMakeLists.txt 0000664 0001750 0001750 00000004515 15254241235 023201 0 ustar feng feng pkg_check_modules(QGS REQUIRED gsettings-qt6)
pkg_check_modules(GIO2.0 REQUIRED gio-2.0)
pkg_check_modules(GIOUNIX2.0 REQUIRED gio-unix-2.0)
pkg_check_modules(KYSDKQTWIDGETS REQUIRED kysdk-qtwidgets)
pkg_check_modules(KYSDKDIAGNOSTICS REQUIRED kysdk-diagnostics)
include_directories(${PROJECT_BINARY_DIR})
include_directories(${PROJECT_SOURCE_DIR}/Common)
include_directories(
${QGS_INCLUDE_DIRS}
${GIO2.0_INCLUDE_DIRS}
${GIOUNIX2.0_INCLUDE_DIRS}
${KYSDKQTWIDGETS_INCLUDE_DIRS}
${KYSDKDIAGNOSTICS_INCLUDE_DIRS}
${KYSDKSYSTIME_INCLUDE_DIRS}
/usr/include/ukcc
)
set(EXTRA_LIBS
${EXTRA_LIBS}
${QGS_LIBRARIES}
${GIO2.0_LIBRARIES}
${GIOUNIX2.0_LIBRARIES}
${KYSDKQTWIDGETS_LIBRARIES}
${KYSDKDIAGNOSTICS_LIBRARIES}
${KYSDKSYSTIME_LIBRARIES}
-lukcc
)
qt6_add_resources(screensaver_Plugin_SRC
)
qt6_wrap_cpp(screensaver_Plugin_SRC
previewwidget.h
screensaver.h
screensaverpluginso.h
screensaverui.h
photocorver.h
../../screensaver/albumthumbnailwidget.h
../../screensaver/saverthumbnailwidget.h
../../screensaver/weatherthumbnailwidget.h
../../screensaver/musicthumbnailwidget.h
../../screensaver/customalbumviewer.h
../../screensaver/masklable.h
../../screensaver/timethumbnailwidget.h
../../screensaver/weatherwidget.h
../../screensaver/adaptivelabel.h
../../common/commonfunc.h
../../widgets/customlabel.h
)
set(screensaver_Plugin_SRC
${screensaver_Plugin_SRC}
previewwidget.cpp
screensaver.cpp
screensaverui.cpp
photocorver.cpp
../../screensaver/albumthumbnailwidget.cpp
../../screensaver/saverthumbnailwidget.cpp
../../screensaver/weatherthumbnailwidget.cpp
../../screensaver/musicthumbnailwidget.cpp
../../screensaver/customalbumviewer.cpp
../../screensaver/masklable.cpp
../../screensaver/timethumbnailwidget.cpp
../../screensaver/weatherwidget.cpp
../../screensaver/adaptivelabel.cpp
../../common/commonfunc.cpp
../../widgets/customlabel.cpp
)
add_library(screensaver SHARED ${screensaver_Plugin_SRC})
target_link_libraries(screensaver Qt6::Widgets Qt6::DBus Qt6::Svg ${EXTRA_LIBS})
install(TARGETS
screensaver
DESTINATION lib/${CMAKE_LIBRARY_ARCHITECTURE}/ukui-control-center)
ukui-screensaver/src/ukccplugins/screensaver/photocorver.cpp 0000664 0001750 0001750 00000007172 15254241235 023521 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "photocorver.h"
#include
#include
#include
#include
PhotoCorver::PhotoCorver(QWidget *parent, bool isSystemCorver, bool isScreensaver)
: QLabel{parent},
m_bSystemCorver(isSystemCorver),
m_bScreensaver(isScreensaver)
{
if (isScreensaver){
setFixedSize(201, 113);
} else {
setFixedSize(198, 134);
}
installEventFilter(this);
m_maskLabel = new MaskLable(this, true);
m_maskLabel->setGeometry(0, 0, this->width(), this->height());
m_maskLabel->hide();
}
void PhotoCorver::setBackground(QPixmap background)
{
m_background = background;
repaint();
}
void PhotoCorver::setClickStatus(bool state)
{
m_bSelectStatus = state;
m_maskLabel->setVisible(m_bSelectStatus);
}
bool PhotoCorver::eventFilter(QObject *watched, QEvent *event)
{
if (parentWidget() && !parentWidget()->isEnabled()) {
event->ignore();
return QWidget::eventFilter(watched, event);
}
if (event->type() == QEvent::Enter) {
m_maskLabel->show();
} else if (event->type() == QEvent::Leave) {
if (!m_bSelectStatus) {
m_maskLabel->hide();
}
}
return QWidget::eventFilter(watched, event);
}
void PhotoCorver::mouseReleaseEvent(QMouseEvent *event)
{
if (parentWidget() && !parentWidget()->isEnabled()) {
event->ignore();
return;
}
if (event->button() == Qt::LeftButton) {
m_bSelectStatus = true;
m_maskLabel->show();
Q_EMIT photoCorverLeftClicked();
}
QWidget::mouseReleaseEvent(event);
}
void PhotoCorver::contextMenuEvent(QContextMenuEvent *event)
{
if (parentWidget() && !parentWidget()->isEnabled()) {
event->ignore();
return;
}
if (!m_bSelectStatus) {
m_maskLabel->hide();
}
if (!m_bSystemCorver) {
if (!m_rightClickMenu) {
m_rightClickMenu = new QMenu(this);
QAction *openFileAction = new QAction(tr("Right open the file location"), m_rightClickMenu);
connect(openFileAction, &QAction::triggered, this, [&]{
Q_EMIT openFileFolderClicked();
});
QAction *deleteAction = new QAction(tr("Remove the file"), m_rightClickMenu);
connect(deleteAction, &QAction::triggered, this, [&]{
Q_EMIT removePathClicked();
});
m_rightClickMenu->addActions({openFileAction, deleteAction});
}
m_rightClickMenu->exec(event->globalPos());
}
}
void PhotoCorver::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.fillRect(rect(), palette().color(QPalette::Base));
QRect bgRect = QRect(4, 4, width() - 8, height() - 8);
QPainterPath path;
path.addRoundedRect(bgRect, 8, 8);
painter.setClipPath(path);
painter.drawPixmap(bgRect, m_background, m_background.rect());
}
ukui-screensaver/src/ukccplugins/screensaver/screensaverui.h 0000664 0001750 0001750 00000014704 15254241235 023471 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENSAVERUI_H
#define SCREENSAVERUI_H
#include
#include
#include
#include
#include
#include
#include "screensaverpluginso.h"
#include "previewwidget.h"
#include "photocorver.h"
#include "../../screensaver/albumthumbnailwidget.h"
#include "../../screensaver/saverthumbnailwidget.h"
#include "../../screensaver/weatherthumbnailwidget.h"
#include "../../screensaver/musicthumbnailwidget.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace kdk;
class ScreensaverUi : public QWidget
{
Q_OBJECT
public:
ScreensaverUi();
~ScreensaverUi();
void setIdleTimeOptions(const QStringList &textList, const QList &dataList);
void setScreensaverOptions(const QStringList &textList, const QStringList &dataList);
void setSwitchTimeOptions(const QStringList &textList, const QList &dataList);
void setPhotoSwitchTimeOptions(const QStringList &textList, const QList &dataList);
void updatePreview(QWidget *w);
void closePreview();
void setSourcePath(const QString &text);
void setSwitchRandom(const bool &b);
void setSwitchTime(const int &time);
void setPhotoSwitchTime(const int &time);
void setCustomText(const QString &text);
void setTextCentered(const bool &b);
void setShowUkuiTime(const bool &b);
void setShowCustomTime(const bool &b);
void setLockscreen(const bool &b);
void setThumbnailBackground(QString background);
void setSubMode(int mode);
void setCurrentPosition(QString position);
void setMusicFollowSystem(const bool &b);
void setMusicPath(QString path);
void setPhotoCycleMode(int mode);
void setPhotoPath(QStringList paths);
void setPhotoSelectPath(QString path);
void setSaverDatetimeEnable(const bool &b);
// void setPhotoSource();
public:
void setIdleTime(int time);
void setScreensaver(QString type);
private:
void initUi();
void initThumbnailSaver();
void initPreview();
void initBasisSettings();
void initWeatherSettings();
void initMusicSettings();
void initPhotoSettings();
void initPhotoSource();
void initSetting();
void initSourceFrame();
void initSwitchModeFrame();
void initSwitchTimeFrame();
void initCustomTextFrame();
void initIdleTimeFrame();
void initTextPositionFrame();
void initBreakTimeFrame();
void initScreenlockFrame();
void initSaverDatetimeFrame();
void sendSignals();
private:
QVBoxLayout *uiLayout = nullptr;
bool m_bCustomSaver = false;
QStringList m_currentPhotoSource;
private:
KLabel *screensaverTitle = nullptr;
UkccFrame *previewFrame = nullptr;
QHBoxLayout *previewLayout = nullptr;
PreviewWidget *previewWidget = nullptr;
SettingGroup *screensaverGroup = nullptr;
QComboBox *m_idleTimeBox = nullptr;
ComboxWidget *programWidget = nullptr;
SettingGroup *customizeGroup = nullptr;
KBackgroundGroup *m_basisGroup = nullptr;
SettingGroup *m_thumbnailSaverGroup = nullptr;
UkccFrame *m_thumbnailFrame = nullptr;
FlowLayout *m_thumbnailLayout = nullptr;
MusicThumbnailWidget *m_musicWidget = nullptr;
AlbumThumbnailWidget *m_albunWidget = nullptr;
SaverThumbnailWidget *m_defaulSaverWidget = nullptr;
WeatherThumbnailWidget *m_weatherThumbnailWidget = nullptr;
UkccFrame *m_weatherFrame = nullptr;
SettingGroup *m_musicSaverGroup = nullptr;
SettingGroup *m_PhotoSettingGroup = nullptr;
RadioButtonWidget *m_photoSwitchWidget = nullptr;
ComboxWidget *m_photoFrequencyWidget = nullptr;
SettingGroup *m_photoSourceGroup = nullptr;
UkccFrame *m_photoSourceFrame = nullptr;
private:
QLineEdit *sourcePathLine = nullptr;
QPushButton *sourceButton = nullptr;
QButtonGroup *switchModeGroup = nullptr;
QComboBox *switchTimeComboBox = nullptr;
QLineEdit *textLineEdit = nullptr;
QButtonGroup *textPositionGroup = nullptr;
KSwitchButton *showCustomTimeBtn = nullptr;
KSwitchButton *showUkuiTimeBtn = nullptr;
KSwitchButton *lockButton = nullptr;
KSwitchButton *m_saverDatetimeBtn = nullptr;
QPushButton *m_weatherSettingBtn = nullptr;
KLabel *m_localLabel = nullptr;
QRadioButton *m_followSystemBtn = nullptr;
QRadioButton *m_customMusicBtn = nullptr;
QLineEdit *m_musicPathLine = nullptr;
QPushButton *m_musicSourceBtn = nullptr;
QRadioButton *m_orderBtn = nullptr;
QRadioButton *m_randomBtn = nullptr;
QPushButton *m_photoSourceBtn = nullptr;
FlowLayout *m_photoSourceLayout =nullptr;
Q_SIGNALS:
void idleTimeChanged(int time);
void screensaverChanged(QString type);
void customPathChanged(QString path);
void switchRandomChanged(bool b);
void switchTimeChanged(int time);
void photoSwitchTimeChanged(int time);
void customTextChanged(QString text);
void textCenteredChanged(bool b);
void showUkuiTimeChanged(bool b);
void showCustomChanged(bool b);
void lockscreenChanged(bool b);
void saverDatetimeEnableChanged(bool b);
void subModeChanged(int mode);
void musicPathChanged(QString path);
void musicFollowSystemChanged(bool b);
void photoCycleModeChanged(int mode);
void photoCycleInterval(int time);
void photoSourceChanged(QString path);
void photoSelectPathChanged(QString path);
void removePhotoPathClicked(QString path);
void openFileFolderClicked(QString path);
};
#endif // SCREENSAVERUI_H
ukui-screensaver/src/ukccplugins/screensaver/screensaver.h 0000664 0001750 0001750 00000006052 15254241235 023130 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENSAVER_H
#define SCREENSAVER_H
#include
#include
#include
#include
#include "screensaverpluginso.h"
#include
#include "screensaverui.h"
#include
#include
using namespace ukcc;
using namespace kdk;
class Screensaver : public QWidget, CommonInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.ukcc.CommonInterface")
Q_INTERFACES(CommonInterface)
public:
Screensaver();
~Screensaver();
QString plugini18nName() Q_DECL_OVERRIDE;
int pluginTypes() Q_DECL_OVERRIDE;
QWidget * pluginUi() Q_DECL_OVERRIDE;
const QString name() const Q_DECL_OVERRIDE;
void plugin_leave()Q_DECL_OVERRIDE;
bool isShowOnHomePage() const Q_DECL_OVERRIDE;
QIcon icon() const Q_DECL_OVERRIDE;
bool isEnable() const Q_DECL_OVERRIDE;
virtual QString translationPath() const {
return QStringLiteral("/usr/share/ukui-screensaver/ukccplugins/i18n/%1.ts");
}
public:
void initOptions();
void initContent();
void initPreview();
void initIdleTime();
void initScreensaver();
void initCustomSource();
void initSwicthMode();
void initSwitchTime();
void initPhotoSwitchTime();
void initCustomText();
void initTextPosition();
void initShowBreakTimeUkui();
void initShowBreakTimeCustom();
void initLockscreen();
void initSubMode();
void initPosition();
void initPlaySettings();
void initMusicPath();
void initPhothPath();
void initPhothSelectPath();
void initPhotoCycleMode();
void initWeatherLocal();
void initBackground();
void initSaverDatetimeEnable();
void connectUiSignals();
void loadPictureInfo();
void convertPixmapSlot(const QString &filename, int num);
private:
void preInitialize();
void connectToServer();
private Q_SLOTS:
void keyChangedSlot(const QString &key);
void dataChanged(const QString &key);
private:
QString pluginName;
bool mFirstLoad;
int pluginType;
std::unique_ptr screensaverPtr;
private:
ScreensaverUi *screensaverUi = nullptr;
QDBusInterface *screensaverInterface = nullptr;
QString toChangeKey;
QList m_picInfoList;
QFutureWatcher m_watcher;
QStringList m_previewPictures;
QStringList m_sourcePictures;
};
#endif // SCREENSAVER_H
ukui-screensaver/src/ukccplugins/screensaver/screensaver.cpp 0000664 0001750 0001750 00000052151 15254241235 023464 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "screensaver.h"
#include
#include
#include
#include
#include
#define PREENTRY_TIME "preentryTime"
#define SCREENSAVER_TYPE "screensaverType"
#define SHOWTIME_UKUI "showBreakTimeUkui"
#define SHOWTIME_CUSTOM "showBreakTimeCustom"
#define SCREENLOCK_ENABLED "screenLockEnabled"
#define CUSTOM_PATH "customPath"
#define SWITCH_RANDOW "switchRandom"
#define CYCLE_TIME "cycleTime"
#define CUSTOM_TEXT "customText"
#define CUSTOM_TEXT_CENTERED "customTextCentered"
#define SUB_MODE "subMode"
#define FOLLOW_SYSTEM "followSystem"
#define MUSIC_PATH "musicPath"
#define PHOTO_PATH "photoPath"
#define PHOTO_SELECT_PATH "photoSelectPath"
#define PHOTO_REMOVE_PATH "photoRemovePath"
#define PHOTO_CYCLE_MODE "photoCycleMode"
#define PHOTO_CYCLE_INTERVAL "photoCycleInterval"
#define WEATHER_DATA "weatherData"
#define BACKGROUND "background"
#define DEFAULT_PHOTO_PATH "/usr/share/backgrounds"
#define LOCAL_WALLPAPER_PATH (QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/ukui-control-center/wallpaperData/"))
#define SAVER_DATETIME_ENADLE "saverDatetimeEnable"
Screensaver::Screensaver() : mFirstLoad(true)
{
QTranslator *translator = new QTranslator(this);
QLocale locale;
translator->load("/usr/share/ukui-screensaver/ukccplugins/i18n_qm/" + locale.name() + ".qm");
QApplication::installTranslator(translator);
pluginName = tr("Screensaver");
pluginType = PERSONALIZED;
// QtConcurrent::run([=] { preInitialize(); });
screensaverInterface = new QDBusInterface(
"org.ukui.ScreenSaver",
"/Screensaver",
"org.ukui.ScreenSaver.session.Screensaver",
QDBusConnection::sessionBus(),
this);
if (!screensaverInterface->isValid()) {
qCritical() << "org.ukui.ScreenSaver.session.ScreenSaver DBus error:" << screensaverInterface->lastError();
return;
}
QDBusMessage message = screensaverInterface->call("ping"); // 判æ–dbus路径是å�¦å˜åœ¨
if (message.type() == QDBusMessage::ErrorMessage
&& message.errorMessage().contains("No such object path", Qt::CaseInsensitive)) {
qCritical() << screensaverInterface << ":" << message.errorMessage();
}
}
Screensaver::~Screensaver()
{
if (!mFirstLoad) {
screensaverUi->deleteLater();
screensaverUi = nullptr;
}
}
QString Screensaver::plugini18nName()
{
return pluginName;
}
int Screensaver::pluginTypes()
{
return pluginType;
}
void Screensaver::preInitialize()
{
QPluginLoader pluginLoader("/usr/lib/ukui-screensaver/libscreensaver-default.so");
pluginLoader.load();
QObject *plugin = pluginLoader.instance();
screensaverPtr = nullptr;
if (plugin) {
screensaverPtr = std::unique_ptr(qobject_cast(plugin));
} else {
qWarning() << "pluginLoader '/usr/lib/ukui-screensaver/libscreensaver-default.so' failed";
}
m_previewPictures = screensaverInterface->property("previewWallpapers").toStringList();
m_sourcePictures = screensaverInterface->property("sourceWallpapers").toStringList();
m_picInfoList.clear();
}
QWidget *Screensaver::pluginUi()
{
if (mFirstLoad) {
preInitialize();
mFirstLoad = false;
loadPictureInfo();
screensaverUi = new ScreensaverUi;
initOptions();
initContent();
connectUiSignals();
connectToServer();
} else {
QTimer::singleShot(0, [&]{
initPreview();
});
}
return screensaverUi;
}
const QString Screensaver::name() const
{
return QStringLiteral("Screensaver");
}
void Screensaver::plugin_leave()
{
if (screensaverUi) {
screensaverUi->closePreview();
}
return;
}
bool Screensaver::isShowOnHomePage() const
{
return true;
}
QIcon Screensaver::icon() const
{
return QIcon::fromTheme("ukui-screensaver-symbolic");
}
bool Screensaver::isEnable() const
{
return true;
}
void Screensaver::dataChanged(const QString &key)
{
if (key != toChangeKey) {
if (key == PREENTRY_TIME) {
initIdleTime();
} else if (key == SCREENSAVER_TYPE) {
initScreensaver();
} else if (key == CUSTOM_PATH) {
initCustomSource();
} else if (key == SWITCH_RANDOW) {
initSwicthMode();
} else if (key == CYCLE_TIME) {
initSwitchTime();
} else if (key == CUSTOM_TEXT) {
initCustomText();
} else if (key == CUSTOM_TEXT_CENTERED) {
initTextPosition();
} else if (key == SHOWTIME_UKUI) {
initShowBreakTimeUkui();
} else if (key == SHOWTIME_CUSTOM) {
initShowBreakTimeCustom();
} else if (key == SCREENLOCK_ENABLED) {
initLockscreen();
} else if (key == BACKGROUND) {
initBackground();
} else if (key == WEATHER_DATA) {
initWeatherLocal();
} else if (key == SUB_MODE) {
initSubMode();
} else if (key == FOLLOW_SYSTEM) {
initPlaySettings();
} else if (key == MUSIC_PATH) {
initMusicPath();
} else if (key == PHOTO_PATH) {
initPhothPath();
} else if (key == PHOTO_SELECT_PATH) {
initPhothSelectPath();
} else if (key == PHOTO_CYCLE_MODE) {
initPhotoCycleMode();
} else if (key == PHOTO_CYCLE_INTERVAL) {
initPhotoSwitchTime();
}
}
toChangeKey = "";
}
void Screensaver::initOptions()
{
QStringList textList = {};
QList dataList = {};
QStringList dataList2 = {};
textList.clear();
textList << tr("5min") << tr("10min") << tr("15min") << tr("30min") << tr("1hour") << tr("Never");
dataList.clear();
dataList << 5 << 10 << 15 << 30 << 60 << -1;
#ifdef OPENKYLIN
textList.insert(0, tr("1min"));
dataList.insert(0, 1);
#endif
screensaverUi->setIdleTimeOptions(textList, dataList);
textList.clear();
textList << tr("UKUI") << tr("Customize");
dataList2.clear();
dataList2 << "ukui"
<< "custom";
screensaverUi->setScreensaverOptions(textList, dataList2);
textList.clear();
textList << tr("1min") << tr("5min") << tr("10min") << tr("30min");
dataList.clear();
dataList << 60 << 300 << 600 << 1800;
screensaverUi->setSwitchTimeOptions(textList, dataList);
textList.clear();
textList << tr("1min") << tr("5min") << tr("10min") << tr("30min");
dataList.clear();
dataList << 60 << 300 << 600 << 1800;
screensaverUi->setPhotoSwitchTimeOptions(textList, dataList);
}
void Screensaver::initContent()
{
initIdleTime();
initScreensaver();
initCustomSource();
initSwicthMode();
initSwitchTime();
initPhotoSwitchTime();
initCustomText();
initTextPosition();
initShowBreakTimeUkui();
initShowBreakTimeCustom();
initLockscreen();
initSubMode();
initPlaySettings();
initMusicPath();
initPhothPath();
initPhotoCycleMode();
initWeatherLocal();
initBackground();
initPhothSelectPath();
initSaverDatetimeEnable();
}
void Screensaver::convertPixmapSlot(const QString &filename, int num) {
QPixmap qPixmap = QPixmap(filename);
if (qPixmap.isNull()){
QFile file(filename);
qint64 fileSize = file.size();
if (fileSize <= 100000000 && file.open(QIODevice::ReadOnly)){
qPixmap.loadFromData(file.readAll());
file.close();
}
}
QSize IMAGE_SIZE(166, 110);
QPixmap pixmap = qPixmap.scaled(IMAGE_SIZE);
QString tmpFile = filename;
tmpFile.replace("/", "-");
QFile wallpaperFile;
wallpaperFile.setFileName(LOCAL_WALLPAPER_PATH + QString::number(num) + tmpFile);
QFileInfo fileinfo = QFileInfo(tmpFile);
pixmap.save(&wallpaperFile, fileinfo.suffix().toUtf8().data());
}
void Screensaver::loadPictureInfo() {
if (m_previewPictures.size() != m_sourcePictures.size()) {
qWarning() << "picturePathList.size():" << m_previewPictures.size() << " != sourcePathList.size():" << m_sourcePictures.size();
return;
}
QDir dir(LOCAL_WALLPAPER_PATH);
QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Dirs);
qDebug() << Q_FUNC_INFO << "fileInfoList size" << fileInfoList.size() << "m_sourcePictures size" << m_sourcePictures.size();
if ((fileInfoList.size() - 1) == m_sourcePictures.size()) {
qDebug() << Q_FUNC_INFO << "equal file num, skip load";
m_picInfoList.clear();
for (int i = 0; i < m_previewPictures.size(); ++i) {
m_picInfoList.append(m_previewPictures.at(i));
}
return;
}
int num = 0;
for (QString filename : m_sourcePictures) {
m_watcher.setFuture(QtConcurrent::run([=, filename, num]() {
convertPixmapSlot(filename, num);
}));
num++;
}
}
void Screensaver::initPreview()
{
if (screensaverPtr) {
qInfo() << "screensaverPtr can be used";
QWidget *widget = screensaverPtr->createWidget(false, nullptr, screensaverUi);
widget->show();
screensaverUi->updatePreview(widget);
} else {
qInfo() << "screensaverPtr can not be used";
}
}
void Screensaver::initIdleTime()
{
int time = screensaverInterface->property(PREENTRY_TIME).toInt();
screensaverUi->setIdleTime(time);
}
void Screensaver::initScreensaver()
{
QString type = screensaverInterface->property(SCREENSAVER_TYPE).toString();
screensaverUi->setScreensaver(type);
initPreview();
}
void Screensaver::initCustomSource()
{
QString path = screensaverInterface->property(CUSTOM_PATH).toString();
screensaverUi->setSourcePath(path);
}
void Screensaver::initSwicthMode()
{
bool random = screensaverInterface->property(SWITCH_RANDOW).toBool();
screensaverUi->setSwitchRandom(random);
}
void Screensaver::initSwitchTime()
{
int time = screensaverInterface->property(CYCLE_TIME).toInt();
screensaverUi->setSwitchTime(time);
}
void Screensaver::initPhotoSwitchTime()
{
int time = screensaverInterface->property(PHOTO_CYCLE_INTERVAL).toInt();
screensaverUi->setPhotoSwitchTime(time);
}
void Screensaver::initCustomText()
{
QString text = screensaverInterface->property(CUSTOM_TEXT).toString();
screensaverUi->setCustomText(text);
}
void Screensaver::initTextPosition()
{
bool centered = screensaverInterface->property(CUSTOM_TEXT_CENTERED).toBool();
screensaverUi->setTextCentered(centered);
}
void Screensaver::initShowBreakTimeUkui()
{
bool b = screensaverInterface->property(SHOWTIME_UKUI).toBool();
screensaverUi->setShowUkuiTime(b);
}
void Screensaver::initShowBreakTimeCustom()
{
bool b = screensaverInterface->property(SHOWTIME_CUSTOM).toBool();
screensaverUi->setShowCustomTime(b);
}
void Screensaver::initLockscreen()
{
bool b = screensaverInterface->property(SCREENLOCK_ENABLED).toBool();
screensaverUi->setLockscreen(b);
}
void Screensaver::initSubMode()
{
int b = screensaverInterface->property(SUB_MODE).toInt();
screensaverUi->setSubMode(b);
}
void Screensaver::initPlaySettings()
{
bool b = screensaverInterface->property(FOLLOW_SYSTEM).toBool();
screensaverUi->setMusicFollowSystem(b);
}
void Screensaver::initMusicPath()
{
QString path = screensaverInterface->property(MUSIC_PATH).toString();
screensaverUi->setMusicPath(path);
}
void Screensaver::initPhothPath()
{
QStringList b = screensaverInterface->property(PHOTO_PATH).toStringList();
screensaverUi->setPhotoPath(b);
}
void Screensaver::initPhothSelectPath()
{
QString b = screensaverInterface->property(PHOTO_SELECT_PATH).toString();
if (b.isEmpty()) {
b = DEFAULT_PHOTO_PATH;
}
screensaverUi->setPhotoSelectPath(b);
}
void Screensaver::initPhotoCycleMode()
{
int b = screensaverInterface->property(PHOTO_CYCLE_MODE).toInt();
screensaverUi->setPhotoCycleMode(b);
}
void Screensaver::initWeatherLocal()
{
QString weather = screensaverInterface->property(WEATHER_DATA).toString();
QStringList weatherInfoList = weather.split(",");
if (weatherInfoList.count() > 3) {
screensaverUi->setCurrentPosition(weatherInfoList.at(2));
} else {
qInfo() << "weather error!!!!" << weatherInfoList;
}
}
void Screensaver::initBackground()
{
QString background = screensaverInterface->property(BACKGROUND).toString();
screensaverUi->setThumbnailBackground(background);
}
void Screensaver::initSaverDatetimeEnable()
{
bool saverDateTimeEnable = screensaverInterface->property(SAVER_DATETIME_ENADLE).toBool();
screensaverUi->setSaverDatetimeEnable(saverDateTimeEnable);
}
void Screensaver::connectUiSignals()
{
QDBusConnection::sessionBus().connect(
"org.ukui.ScreenSaver",
"/Screensaver",
"org.ukui.ScreenSaver.session.Screensaver",
"changed",
this,
SLOT(dataChanged(QString)));
connect(screensaverUi, &ScreensaverUi::idleTimeChanged, this, [=](int time) {
toChangeKey = PREENTRY_TIME;
screensaverInterface->call("setPreentryTime", time);
UkccCommon::buriedSettings(name(), QString("Idle time"), QString("select"), QString::number(time));
});
connect(screensaverUi, &ScreensaverUi::screensaverChanged, this, [=](QString type) {
toChangeKey = SCREENSAVER_TYPE;
screensaverInterface->call("setScreensaverType", type);
UkccCommon::buriedSettings(name(), QString("Screensaver program"), QString("select"), type);
});
connect(screensaverUi, &ScreensaverUi::customPathChanged, this, [=](QString path) {
toChangeKey = CUSTOM_PATH;
screensaverInterface->call("setCustomPath", path);
UkccCommon::buriedSettings(name(), QString("Screensaver source Select"), QString("select"), path);
});
connect(screensaverUi, &ScreensaverUi::switchRandomChanged, this, [=](bool b) {
toChangeKey = SWITCH_RANDOW;
screensaverInterface->call("setSwitchRandom", b);
UkccCommon::buriedSettings(name(), QString("Random switching"), QString("settings"), b ? "Random" : "Ordinal");
});
connect(screensaverUi, &ScreensaverUi::switchTimeChanged, this, [=](int time) {
toChangeKey = CYCLE_TIME;
screensaverInterface->call("setCycleTime", time);
UkccCommon::buriedSettings(name(), QString("Switching time"), QString("select"), QString::number(time));
});
connect(screensaverUi, &ScreensaverUi::photoSwitchTimeChanged, this, [=](int time) {
toChangeKey = PHOTO_CYCLE_INTERVAL;
screensaverInterface->call("setPhotoCycleInterval", time);
UkccCommon::buriedSettings(name(), QString("Photo switching time"), QString("select"), QString::number(time));
});
connect(screensaverUi, &ScreensaverUi::customTextChanged, this, [=](QString text) {
toChangeKey = CUSTOM_TEXT;
screensaverInterface->call("setCustomText", text);
UkccCommon::buriedSettings(name(), QString("Text(up to 30 characters):"), QString("settings"), text);
});
connect(screensaverUi, &ScreensaverUi::textCenteredChanged, this, [=](bool b) {
toChangeKey = CUSTOM_TEXT_CENTERED;
screensaverInterface->call("setCustomTextCentered", b);
UkccCommon::buriedSettings(
name(), QString("Text position"), QString("settings"), b ? "Centered" : "Randow(Bubble text)");
});
connect(screensaverUi, &ScreensaverUi::showUkuiTimeChanged, this, [=](bool b) {
toChangeKey = SHOWTIME_UKUI;
screensaverInterface->call("setShowBreakTimeUkui", b);
UkccCommon::buriedSettings(
name(), QString("custom Show rest time"), QString("settings"), UkccCommon::boolToString(b));
});
connect(screensaverUi, &ScreensaverUi::showCustomChanged, this, [=](bool b) {
toChangeKey = SHOWTIME_CUSTOM;
screensaverInterface->call("setShowBreakTimeCustom", b);
UkccCommon::buriedSettings(
name(), QString("ukui Show rest time"), QString("settings"), UkccCommon::boolToString(b));
});
connect(screensaverUi, &ScreensaverUi::lockscreenChanged, this, [=](bool b) {
toChangeKey = SCREENLOCK_ENABLED;
screensaverInterface->call("setScreenLockEnabled", b);
UkccCommon::buriedSettings(
name(), QString("Lock screen when screensaver boot"), QString("settings"), UkccCommon::boolToString(b));
});
connect(screensaverUi, &ScreensaverUi::saverDatetimeEnableChanged, this, [=](bool b) {
toChangeKey = SAVER_DATETIME_ENADLE;
screensaverInterface->call("setSaverDatetimeEnable", b);
UkccCommon::buriedSettings(
name(), QString("The date and time are displayedt"), QString("settings"), UkccCommon::boolToString(b));
});
// 如果在dbus端监å�¬gsetting的改å�˜ä¿¡å�·ï¼Œå†�å�‘é€�changedä¿¡å�·ï¼Œæ¤æ—¶å†�去initPreviewå�¯èƒ½ä¼šå¼‚常
// å› ä¸ºç•Œé�¢ç«¯ç¨‹åº�æ¤æ—¶åŽ»è¯»å�–gsetting的值å�¯èƒ½è¿˜æ˜¯ä¿®æ”¹å‰�的值,该问题应该是qgsetting的设计逻辑问题
// å› æ¤è¿™é‡ŒåŽ»ç›‘å�¬gsetting的改å�˜è€Œä¸�是dbusçš„changed
QGSettings *mScreensaverGsettings = nullptr;
if (!mScreensaverGsettings) {
const QByteArray id("org.ukui.screensaver");
if (QGSettings::isSchemaInstalled(id)) {
mScreensaverGsettings = new QGSettings(id, QByteArray(), this);
}
connect(mScreensaverGsettings, &QGSettings::changed, this, [=](QString key) {
if (key == "mode") {
initPreview();
}
});
}
connect(screensaverUi, &ScreensaverUi::subModeChanged, this, [=](int mode) {
toChangeKey = SUB_MODE;
screensaverInterface->call("setSubMode", mode);
UkccCommon::buriedSettings(
name(), QString("ScreenSaver subMode changed"), QString("settings"), UkccCommon::boolToString(mode));
});
connect(screensaverUi, &ScreensaverUi::musicFollowSystemChanged, this, [=](bool b) {
toChangeKey = FOLLOW_SYSTEM;
screensaverInterface->call("setMusicFollowSystem", b);
UkccCommon::buriedSettings(name(), QString("Screensaver music follow system changed"), QString("settings"), UkccCommon::boolToString(b));
});
connect(screensaverUi, &ScreensaverUi::musicPathChanged, this, [=](QString path) {
toChangeKey = MUSIC_PATH;
screensaverInterface->call("setMusicPath", path);
UkccCommon::buriedSettings(name(), QString("Screensaver music path Select"), QString("select"), path);
});
connect(screensaverUi, &ScreensaverUi::photoCycleModeChanged, this, [=](int mode) {
toChangeKey = PHOTO_CYCLE_MODE;
screensaverInterface->call("setPhotoCycleMode", mode);
UkccCommon::buriedSettings(
name(), QString("ScreenSaver photo cucle mode changed"), QString("settings"), UkccCommon::boolToString(mode));
});
connect(screensaverUi, &ScreensaverUi::photoSourceChanged, this, [=](QString path) {
toChangeKey = PHOTO_PATH;
screensaverInterface->call("setPhotoCustomPath", path);
UkccCommon::buriedSettings(name(), QString("Screensaver photo path changed"), QString("select"), path);
initPhothPath();
});
connect(screensaverUi, &ScreensaverUi::photoSelectPathChanged, this, [=](QString path) {
toChangeKey = PHOTO_SELECT_PATH;
screensaverInterface->call("setSelectPhotoPath", path);
UkccCommon::buriedSettings(name(), QString("Screensaver select photo path changed"), QString("select"), path);
initPhothSelectPath();
});
connect(screensaverUi, &ScreensaverUi::removePhotoPathClicked, this, [=](QString path) {
toChangeKey = PHOTO_REMOVE_PATH;
screensaverInterface->call("removePhotoPath", path);
UkccCommon::buriedSettings(name(), QString("Screensaver remove photo path"), QString("remove"), path);
initPhothPath();
initPhothSelectPath();
});
connect(screensaverUi, &ScreensaverUi::openFileFolderClicked, this, [=](QString path) {
screensaverInterface->call("openFileFolder", path);
UkccCommon::buriedSettings(name(), QString("Screensaver open photo path folder"), QString("open"), path);
});
}
void Screensaver::connectToServer()
{
QThread *NetThread = new QThread;
MThread *NetWorker = new MThread;
NetWorker->moveToThread(NetThread);
connect(NetThread, &QThread::started, NetWorker, &MThread::run);
connect(NetWorker, &MThread::keychangedsignal, this, &Screensaver::keyChangedSlot);
connect(NetThread, &QThread::finished, NetWorker, &MThread::deleteLater);
NetThread->start();
}
void Screensaver::keyChangedSlot(const QString &key)
{
if (key == "ukui-screensaver") {
initContent();
}
}
ukui-screensaver/src/ukccplugins/screensaver/screensaverpluginso.h 0000664 0001750 0001750 00000003074 15254241235 024712 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SCREENSAVERPLUGINSO_H
#define SCREENSAVERPLUGINSO_H
#include
class ScreensaverPlugin
{
public:
virtual ~ScreensaverPlugin() {}
//�件实例的�称
virtual QString name() const = 0;
//创建UI的实例
virtual QWidget* createWidget(bool isScreensaver, QPixmap *background, QWidget* parent) = 0;
//获得�件的展示�称
virtual QString displayName() const = 0;
};
//定义了在QT系统ä¸è¯¥æŽ¥å�£çš„全局唯一的ID
//实现该SDK的�件也�定义相�的ID
//接å�£çš„IDä¸åŒ…å�«äº†ç‰ˆæœ¬ä¿¡æ�¯,通过该ID我们å�¯ä»¥åŒºåˆ«ä¸�å�Œç‰ˆæœ¬çš„SDKå’Œæ�’ä»¶
//Q_DECLARE_INTERFACEå®�将类型和IDå…³è�”èµ·æ�¥,è¿™æ ·QTå°±å�¯ä»¥éªŒè¯�åŠ è½½çš„æ�’件是å�¦å�¯ä»¥è½¬æ�¢æˆ�MyPluginInterface类型
#define interface_iid "org.ukui.screensaver.screensaver-default1.0.0"
Q_DECLARE_INTERFACE(ScreensaverPlugin, interface_iid)
#endif // SCREENSAVERPLUGINSO_H
ukui-screensaver/src/ukccplugins/screensaver/previewwidget.cpp 0000664 0001750 0001750 00000003032 15254241235 024023 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "previewwidget.h"
#include
PreviewWidget::PreviewWidget(QWidget *parent):QWidget(parent)
{
}
PreviewWidget::~PreviewWidget()
{
}
void PreviewWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
p.setRenderHint(QPainter::SmoothPixmapTransform);
p.setPen(Qt::transparent);
p.setBrush(QColor(0, 0, 0, 0));
p.drawRoundedRect(rect().adjusted(0, 0, 0, 0), 10, 10);
}
void PreviewWidget::mousePressEvent(QMouseEvent *e)
{
if (parentWidget() && !parentWidget()->isEnabled()) {
e->ignore();
return ;
}
if(e->button() == Qt::LeftButton) {
previewScreensaver();
}
}
void PreviewWidget::previewScreensaver()
{
static QProcess *viewProcess = new QProcess();
viewProcess->start("ukui-screensaver-command --screensaver");
}
ukui-screensaver/src/ukccplugins/screensaver/previewwidget.h 0000664 0001750 0001750 00000002076 15254241137 023500 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef PREVIEWWIDGET_H
#define PREVIEWWIDGET_H
#include
#include
#include
class PreviewWidget : public QWidget
{
Q_OBJECT
public:
PreviewWidget(QWidget *parent = nullptr);
~PreviewWidget();
void previewScreensaver();
protected:
void paintEvent(QPaintEvent *e);
private:
void mousePressEvent(QMouseEvent *e);
};
#endif // PREVIEWWIDGET_H
ukui-screensaver/src/lock-backend/ 0000775 0001750 0001750 00000000000 15254241235 016102 5 ustar feng feng ukui-screensaver/src/lock-backend/switchuserutils.h 0000664 0001750 0001750 00000004763 15254241235 021546 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef SWITCHUSERUTILS_H
#define SWITCHUSERUTILS_H
#include
/**
* @brief
* 用户显示接�信�结构体
*/
typedef struct UserDisplayIfInfo_s
{
QString strSessionPath; /**< 用户显示会�路径 */
QString strSeatPath; /**< 用户Seat路径 */
QString strUserName; /**< 用户� */
} UserDisplayIfInfo;
/**
* @brief
* 切�用户�元
*/
class SwitchUserUtils
{
public:
/**
* @brief
* æž„é€ å‡½æ•°
*/
SwitchUserUtils();
/**
* @brief
* ��接�:获�当�进程执行所在用户�
* @return QString 用户�
*/
static QString GetCurUserName();
/**
* @brief
* ��接�:通过用户�获�用户id
* @param strUserName
* @return int
*/
static int GetUidByName(QString strUserName);
/**
* @brief
* ��接�:获�用户显示接�信�
* @param strUserName 用户�
* @return UserDisplayIfInfo 显示接�信�
*/
static UserDisplayIfInfo GetUserUDII(QString strUserName);
/**
* @brief
* ��接�:切�用户会�
* @param seatPath 用户会�所在的lightdm seat路径
* @param toUDII �将切�的用户lightdm显示信�
* @return int 0:激活其他会�;1:切�到登录指定用户;2:切�到登录并选择用户;<0:切�异常
*/
static int SwitchToUserSession(QString seatPath, UserDisplayIfInfo &toUDII);
/**
* @brief
* ��接�:切�到用户的��切�用户界�
* @return bool true: 切��功;false:失败
*/
static bool SwitchToUserLock();
/**
* @brief CanSwitchUser 当å‰�å��叿˜¯å�¦å…�许切æ�¢ç”¨æˆ·
* @return bool true:�许,�则��许
*/
static bool CanSwitchUser();
};
#endif // SWITCHUSERUTILS_H
ukui-screensaver/src/lock-backend/dbusupperinterface.cpp 0000664 0001750 0001750 00000346334 15254241235 022515 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "dbusupperinterface.h"
#include "lightdmhelper.h"
#include "authpamthread.h"
#include "../../src/dbusifs/login1helper.h"
#include "../../src/common/definetypes.h"
#include "../../src/common/configuration.h"
#include "../../src/lock-backend/gsettingshelper.h"
#include "../../src/dbusifs/usdhelper.h"
#include
#include
#include
#include
#include
#include
#include
#include "../../src/QtSingleApplication/qtlocalpeer.h"
#include "../../src/lock-backend/switchuserutils.h"
#include "../../src/lock-backend/pamauthenticate.h"
#include "../../src/dbusifs/upowerhelper.h"
#include "../../src/dbusifs/accountshelper.h"
#include "../../src/dbusifs/sessionhelper.h"
#include "../../src/dbusifs/systemupgradehelper.h"
#include "../../src/lock-backend/sessionwatcher.h"
#include "../../src/dbusifs/freedesktophelper.h"
#include "../../src/lock-backend/bioauthenticate.h"
#include "../../src/common/kyrsac.h"
#include "../../src/dbusifs/kglobalaccelhelper.h"
#include "../../src/lock-backend/personalizeddata.h"
#ifdef SUPPORT_TABLET_MODE
#include "../../src/dbusifs/libinputswitchevent.h"
#endif
#include "../../src/dbusifs/uniauthservice.h"
#include "../../src/dbusifs/greeterconfig.h"
#include "../../src/dbusifs/networkmanagerhelper.h"
#include "../../src/dbusifs/filemanagerhelper.h"
#include
#define CONFIG_FILE "/usr/share/ukui-greeter/ukui-greeter.conf"
DbusUpperInterface::DbusUpperInterface(QObject *parent) : QObject(parent)
{
m_bLockState = false;
m_bSlpState = false;
}
DbusUpperInterface::~DbusUpperInterface()
{
// æ–开所有信å�·ï¼Œç”¨disconnect的方法直接æ–开没有效果
// disconnect(this, nullptr, nullptr, nullptr);
// æ��å‰�手动管ç�†è¿žæŽ¥å¹¶é€�个æ–å¼€conect,é�¿å…�在æž�æž„æ—¶å› ä¸ºä¿¡å�·æ§½çš„连接导致访问到已销æ¯�的对象
for (const auto &connection : m_connections) {
QObject::disconnect(connection);
}
}
void DbusUpperInterface::init()
{
initData();
initConnections();
inhibit();
}
void DbusUpperInterface::initData()
{
syslog(LOG_INFO, "[ukui-screensaver-backend] DbusUpperInterface initData begin!!");
m_config = Configuration::instance(this);
m_accountsHelper = QSharedPointer(new AccountsHelper(this));
m_lightDmHelper = QSharedPointer(new LightDMHelper(m_accountsHelper, m_config, this));
m_login1Helper = QSharedPointer(new Login1Helper(this));
m_gsettingsHelper = QSharedPointer(new GSettingsHelper(this));
#ifdef ENABLE_BIO_BACKEND
m_bioAuth = QSharedPointer(new BioAuthenticate(this));
#endif
m_pamAuth = QSharedPointer(new PamAuthenticate(m_lightDmHelper, this));
m_usdHelper = QSharedPointer(new UsdHelper(this));
m_upowerHelper = QSharedPointer(new UpowerHelper(this));
m_sessionHelper = QSharedPointer(new SessionHelper(m_login1Helper, this));
m_systemsUpgradeHelper = QSharedPointer(new SystemUpgradeHelper(this));
if (!isGreeterMode()) {
m_sessionWatcher = QSharedPointer(new SessionWatcher(m_gsettingsHelper, this));
}
m_kglobalHelper = QSharedPointer(new KglobalAccelHelper(this));
#ifdef SUPPORT_TABLET_MODE
m_libinputSwitchEvent = QSharedPointer(new LibinputSwitchEvent(this));
#endif
m_networkManagerHelper = QSharedPointer(new NetWorkManagerHelper(this));
m_fileManagerHelper = QSharedPointer(new FileManagerHelper(this));
if (!isGreeterMode()) {
m_config->initShareConfig();
m_config->setShareConfigValue("timeType", m_gsettingsHelper->GetUkccPluginsConf(KEY_HOUR_SYSTEM).toInt());
m_config->setShareConfigValue("dateType", m_gsettingsHelper->GetUkccPluginsConf(KEY_DATE).toString());
m_config->setShareConfigValue(
"fontSize", m_gsettingsHelper->GetThemeStyleConf(KEY_SYSTEM_FONT_SIZE).toDouble());
m_config->setShareConfigValue("themeColor", m_gsettingsHelper->GetThemeStyleConf(KEY_THEME_COLOR).toString());
}
syslog(LOG_INFO, "[ukui-screensaver-backend] DbusUpperInterface initData end!!");
}
void DbusUpperInterface::initConnections()
{
if (m_lightDmHelper) {
m_connections.append(connect(
m_lightDmHelper.get(), &LightDMHelper::usersInfoChanged, this, &DbusUpperInterface::onUsersInfoChanged));
m_connections.append(connect(
m_lightDmHelper.get(),
&LightDMHelper::currentSessionChanged,
this,
&DbusUpperInterface::onCurrentSessionChanged));
}
if (m_login1Helper) {
m_connections.append(
connect(m_login1Helper.get(), &Login1Helper::requestLock, this, &DbusUpperInterface::onLogin1ReqLock));
m_connections.append(
connect(m_login1Helper.get(), &Login1Helper::requestUnlock, this, &DbusUpperInterface::onLogin1ReqUnLock));
m_connections.append(connect(
m_login1Helper.get(), &Login1Helper::PrepareForSleep, this, &DbusUpperInterface::onLogin1PrepareForSleep));
m_connections.append(connect(
m_login1Helper.get(),
&Login1Helper::sessionActiveChanged,
this,
&DbusUpperInterface::onLogin1SessionActiveChanged));
m_connections.append(connect(
m_login1Helper.get(),
&Login1Helper::blockInhibitedChanged,
this,
&DbusUpperInterface::onBlockInhibitedChanged));
}
if (m_gsettingsHelper) {
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::lockScreenConfigChanged,
this,
&DbusUpperInterface::onLockScreenConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::screenSaverConfigChanged,
this,
&DbusUpperInterface::onScreenSaverConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::powerManagerConfigChanged,
this,
&DbusUpperInterface::onPowerManagerConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::mateBgConfigChanged,
this,
&DbusUpperInterface::onMateBgConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::ukccPluginsConfigChanged,
this,
&DbusUpperInterface::onUkccPluginsConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::themeStyleConfigChanged,
this,
&DbusUpperInterface::onThemeStyleConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::sessionConfigChanged,
this,
&DbusUpperInterface::onSessionConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::keyboardConfigChanged,
this,
&DbusUpperInterface::onKeyboardConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::usdMediaKeysConfigChanged,
this,
&DbusUpperInterface::onUsdMediaKeysConfigChanged));
m_connections.append(connect(
m_gsettingsHelper.get(),
&GSettingsHelper::usdMediaStateKeysConfigChanged,
this,
&DbusUpperInterface::onUsdMediaStateKeysConfigChanged));
}
#ifdef ENABLE_BIO_BACKEND
if (m_bioAuth) {
m_connections.append(connect(
m_bioAuth.get(), &BioAuthenticate::bioAuthShowMessage, this, &DbusUpperInterface::onBioAuthShowMessage));
m_connections.append(connect(
m_bioAuth.get(),
&BioAuthenticate::bioServiceStatusChanged,
this,
&DbusUpperInterface::onBioServiceStatusChanged));
m_connections.append(connect(
m_bioAuth.get(), &BioAuthenticate::bioDeviceChanged, this, &DbusUpperInterface::onBioDeviceChanged));
m_connections.append(connect(
m_bioAuth.get(), &BioAuthenticate::bioAuthStateChanged, this, &DbusUpperInterface::onBioAuthStateChanged));
m_connections.append(connect(
m_bioAuth.get(), &BioAuthenticate::bioAuthFrameData, this, &DbusUpperInterface::onBioAuthFrameData));
m_connections.append(connect(
m_bioAuth.get(), &BioAuthenticate::bioAuthCompleted, this, &DbusUpperInterface::onBioAuthCompleted));
if (m_pamAuth) {
m_connections.append(connect(
m_pamAuth.get(),
&PamAuthenticate::authenticationComplete,
m_bioAuth.get(),
&BioAuthenticate::onPamAuthComplete));
}
}
#endif
if (m_pamAuth) {
m_connections.append(
connect(m_pamAuth.get(), &PamAuthenticate::showMessage, this, &DbusUpperInterface::onPamShowMessage));
m_connections.append(
connect(m_pamAuth.get(), &PamAuthenticate::showPrompt, this, &DbusUpperInterface::onPamShowPrompt));
m_connections.append(connect(
m_pamAuth.get(), &PamAuthenticate::showBinaryPrompt, this, &DbusUpperInterface::onPamShowBinaryPrompt));
m_connections.append(connect(
m_pamAuth.get(), &PamAuthenticate::authenticationComplete, this, &DbusUpperInterface::onPamAuthCompleted));
}
if (m_upowerHelper) {
m_connections.append(connect(
m_upowerHelper.get(), &UpowerHelper::upowerServiceReady, this, &DbusUpperInterface::onUPowerServiceReady));
m_connections.append(connect(
m_upowerHelper.get(),
&UpowerHelper::batteryStatusChanged,
this,
&DbusUpperInterface::onBatteryStatusChanged));
m_connections.append(
connect(m_upowerHelper.get(), &UpowerHelper::batteryChanged, this, &DbusUpperInterface::onBatteryChanged));
m_connections.append(connect(
m_upowerHelper.get(), &UpowerHelper::lidStateChanged, this, &DbusUpperInterface::onLidStateChanged));
}
if (m_sessionWatcher) {
m_connections.append(connect(
m_sessionWatcher.get(), &SessionWatcher::sessionIdle, this, &DbusUpperInterface::onSessionIdleReceived));
m_connections.append(connect(m_sessionWatcher.get(), &SessionWatcher::sessionIdle, this, [=]() {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "SessionIdle";
QDBusConnection::sessionBus().send(message);
}));
m_connections.append(connect(
m_sessionWatcher.get(), &SessionWatcher::sessionIdleExit, this, &DbusUpperInterface::onSessionIdleExit));
}
if (m_sessionHelper) {
m_connections.append(connect(
m_sessionHelper.get(),
&SessionHelper::blockLogoutInhibitedChanged,
this,
&DbusUpperInterface::onBlockLogoutInhibitedChanged));
}
m_connections.append(connect(
&m_procLockDialog,
SIGNAL(finished(int, QProcess::ExitStatus)),
this,
SLOT(onLockDialogProcExit(int, QProcess::ExitStatus))));
#ifdef SUPPORT_TABLET_MODE
if (m_libinputSwitchEvent) {
m_connections.append(connect(
m_libinputSwitchEvent.get(),
&LibinputSwitchEvent::tabletModeStatusChanged,
this,
&DbusUpperInterface::onTabletModeChanged));
}
#endif
m_connections.append(connect(
GreeterConfig::instance(),
&GreeterConfig::screensaverDatetimeChanged,
this,
&DbusUpperInterface::onScreensaverDatetimeChanged));
m_connections.append(connect(
GreeterConfig::instance(),
&GreeterConfig::lockScreenDatetimeEnableChanged,
this,
&DbusUpperInterface::onScreenlockDatetimeChanged));
}
void DbusUpperInterface::onNameLost(const QString &serviceName)
{
if (serviceName == "cn.kylinos.ScreenSaver")
exit(0);
}
void DbusUpperInterface::GetInitData(QJsonObject &reqObj, QJsonObject &retObj)
{
Q_UNUSED(reqObj);
retObj["UsersInfo"] = GenerateUserInfoList();
retObj["SessionsInfo"] = GenerateSessionInfoList();
retObj["IsSessionActive"] = m_login1Helper->isSessionActive();
retObj["DefAuthUser"] = GetDefaultAuthUser();
retObj["CurUserName"] = GetCurrentUser();
retObj["CurSession"] = GetCurrentSession();
retObj["AgreementInfo"] = GenerateAgreementInfo();
retObj["CapsLock"] = m_gsettingsHelper->GetKeyboardConf(KEY_CAPSLOCK_STATUS).toBool();
retObj["MediaKeyAreaScreenShot"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_AREA_SCREENSHOT).toString();
retObj["MediaKeyAreaScreenShot2"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_AREA_SCREENSHOT2).toString();
retObj["MediaKeyScreenShot"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_SCREEN_SHOT).toString();
retObj["MediaKeyScreenShot2"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_SCREEN_SHOT2).toString();
retObj["MediaKeyWinScreenShot"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_WINDOW_SCREENSHOT).toString();
retObj["MediaKeyRfkillState"] = m_gsettingsHelper->GetUsdMediaKeys(KEY_RFKILL_STATE).toInt();
retObj["PowerButton"] = m_gsettingsHelper->GetPowerManagerConf(KEY_BUTTON_POWER).toString();
retObj["ScreenSaverMode"] = m_gsettingsHelper->GetLockScreenConf(KEY_MODE).toString();
retObj["ScreenSaverThemes"] = getSaverTheme();
retObj["ImageTransitionEffect"] = m_gsettingsHelper->GetLockScreenConf(KEY_IMAGE_TRANSITION_EFFECT).toInt();
retObj["ImageSwitchInterval"] = m_gsettingsHelper->GetLockScreenConf(KEY_IMAGE_SWITCH_INTERVAL).toInt();
retObj["BatteryArgs"] = GenerateBatteryArgsList();
retObj["BatteryIconName"] = getBatteryIconName();
retObj["IsBattery"] = getIsBattery();
retObj["SleepLockCheck"] = getSleepLockCheck();
retObj["ShutdownLockCheck"] = getShutdownLockcheck();
retObj["LogoutLockCheck"] = getLogoutLockCheck();
retObj["LockTimeout"] = m_gsettingsHelper->GetLockScreenConf(KEY_LOCK_TIMEOUT).toInt();
retObj["IdleDelay"] = m_gsettingsHelper->GetLockScreenConf(KEY_IDLE_DELAY).toInt();
retObj["LockEnable"] = m_gsettingsHelper->GetLockScreenConf(KEY_LOCK_ENABLED).toBool();
retObj["SleepActivationEnable"] = m_gsettingsHelper->GetLockScreenConf(KEY_SLEEP_ACTIVATION_ENABLED).toBool();
retObj["SystemFontSize"] = m_gsettingsHelper->GetThemeStyleConf(KEY_SYSTEM_FONT_SIZE).toInt();
retObj["SystemFont"] = m_gsettingsHelper->GetThemeStyleConf(KEY_SYSTEM_FONT).toString();
retObj["TabletMode"] = getCurTabletMode();
retObj["LogoutMusic"] = m_gsettingsHelper->GetSessionConf(KEY_SESSION_LOGOUT_MUSIC).toBool();
retObj["PoweroffMusic"] = m_gsettingsHelper->GetSessionConf(KEY_SESSION_POWEROFF_MUSIC).toBool();
retObj["LockDatetimeEnable"] = GetLockDatetimeEnable();
retObj["CanSwitchUser"] = GetCanSwitchUser();
}
bool DbusUpperInterface::GetSlpState()
{
return ((m_procLockDialog.state() != QProcess::NotRunning) && m_bSlpState);
}
void DbusUpperInterface::LockStartupMode()
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "StartupLock";
QDBusConnection::sessionBus().send(message);
emitLockState(true);
return;
}
qDebug() << "LockStartupMode requested";
m_bLockState = false;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("XMODIFIERS", "@im=fcitx");
env.insert("QT_IM_MODULE", "fcitx");
m_procLockDialog.setEnvironment(env.toStringList());
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--lock-startup");
emitLockState(true);
}
bool DbusUpperInterface::GetBlankState()
{
return m_bBlankState;
}
bool DbusUpperInterface::GetLockState()
{
if (m_procLockDialog.state() == QProcess::NotRunning && !checkScreenDialogRunning()) {
return false;
} else {
return m_bLockState;
}
return false;
}
void DbusUpperInterface::Lock()
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "CmdLock";
QDBusConnection::sessionBus().send(message);
emitLockState(true);
return;
}
qDebug() << "Lock requested";
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--lock");
emitLockState(true);
}
void DbusUpperInterface::SwitchUser()
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "CmdSwitchUser";
QDBusConnection::sessionBus().send(message);
emitLockState(true);
return;
}
qDebug() << "SwitchUser requested";
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--switchuser");
emitLockState(true);
}
void DbusUpperInterface::SwitchToUser(QString strUserName)
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << QString("CmdSwitchToUser&%1").arg(strUserName);
QDBusConnection::sessionBus().send(message);
emitLockState(true);
return;
}
qDebug() << "SwitchToUser requested:" << strUserName;
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--switchtouser" << QString("%1").arg(strUserName));
emitLockState(true);
}
bool DbusUpperInterface::CheckAppVersion()
{
return true;
}
void DbusUpperInterface::SessionTools()
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "CmdSessionTools";
QDBusConnection::sessionBus().send(message);
emitLockState(false, true);
return;
}
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--session-tools");
emitLockState(false, true);
}
void DbusUpperInterface::AppBlockWindow(QString actionType, bool isHardInhibit)
{
QStringList lockcheck;
if (actionType == "PowerOff" || actionType == "Reboot" || actionType == "Logout") {
if (isHardInhibit) {
lockcheck = m_sessionHelper->getLockCheckStatus("shutdown");
} else {
lockcheck = m_sessionHelper->getLockCheckStatus("logout");
}
} else if (actionType == "Suspend" || actionType == "Hibernate") {
lockcheck = m_sessionHelper->getLockCheckStatus("sleep");
}
qDebug() << "lockCheck = " << lockcheck;
if (lockcheck.isEmpty()) {
return;
}
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
if (isHardInhibit) {
if (actionType == "Reboot")
message << "CmdRestartAppBlock";
else if (actionType == "PowerOff")
message << "CmdPowerOffAppBlock";
else if (actionType == "Suspend")
message << "CmdSuspendAppBlock";
else if (actionType == "Hibernate")
message << "CmdHibernateAppBlock";
else if (actionType == "Logout")
message << "CmdLogoutAppBlock";
else
return;
} else {
if (actionType == "Reboot")
message << "CmdRestartAppSoftBlock";
else if (actionType == "PowerOff")
message << "CmdPowerOffAppSoftBlock";
else if (actionType == "Logout")
message << "CmdLogoutAppSoftBlock";
else
return;
}
QDBusConnection::sessionBus().send(message);
emitLockState(false, true);
return;
}
if (actionType != "Reboot" && actionType != "PowerOff" && actionType != "Suspend" && actionType != "Hibernate"
&& actionType != "Logout")
return;
m_bLockState = false;
QString cmd;
cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--app-block" << QString("%1").arg(actionType));
emitLockState(false, true);
}
void DbusUpperInterface::MultiUserBlockWindow(QString actionType)
{
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
if (actionType == "Reboot")
message << "CmdRestartMulTiUserBlock";
else if (actionType == "PowerOff")
message << "CmdPowerOffMulTiUserBlock";
else
return;
QDBusConnection::sessionBus().send(message);
emitLockState(false, true);
return;
}
if (actionType != "Reboot" && actionType != "PowerOff")
return;
m_bLockState = false;
QString cmd;
cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--multiusers-block" << QString("%1").arg(actionType));
emitLockState(false, true);
}
void DbusUpperInterface::Suspend()
{
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("sleep");
if (lockCheckList.count() == 0) {
doPrepareForSleep(true, "Suspend");
} else {
AppBlockWindow("Suspend");
}
}
}
void DbusUpperInterface::Hibernate()
{
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("sleep");
if (lockCheckList.count() == 0) {
doPrepareForSleep(true, "Hibernate");
} else {
AppBlockWindow("Hibernate");
}
}
}
void DbusUpperInterface::Reboot()
{
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("shutdown");
if (lockCheckList.count() == 0) {
QStringList logoutLockCheckList = m_sessionHelper->getLockCheckStatus("logout");
if (logoutLockCheckList.count() == 0) {
if (m_lightDmHelper && m_lightDmHelper->getLoginUserCount() > 1) {
MultiUserBlockWindow("Reboot");
} else {
m_sessionHelper->doAction("Reboot");
}
} else {
AppBlockWindow("Logout", false);
}
} else {
AppBlockWindow("Reboot");
}
}
}
void DbusUpperInterface::PowerOff()
{
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("shutdown");
if (lockCheckList.count() == 0) {
QStringList logoutLockCheckList = m_sessionHelper->getLockCheckStatus("logout");
if (logoutLockCheckList.count() == 0) {
if (m_lightDmHelper && m_lightDmHelper->getLoginUserCount() > 1) {
MultiUserBlockWindow("PowerOff");
} else {
m_sessionHelper->doAction("PowerOff");
}
} else {
AppBlockWindow("Logout", false);
}
} else {
AppBlockWindow("PowerOff");
}
}
}
void DbusUpperInterface::Logout()
{
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("shutdown");
if (lockCheckList.count() == 0) {
QStringList logoutLockCheckList = m_sessionHelper->getLockCheckStatus("logout");
if (logoutLockCheckList.count() == 0) {
m_sessionHelper->doAction("Logout");
} else {
AppBlockWindow("Logout", false);
}
} else {
AppBlockWindow("Logout");
}
}
}
void DbusUpperInterface::UnLock()
{
qDebug() << "manual unlcok!!";
if (m_login1Helper) {
m_login1Helper->Unlock();
} else {
if (m_procLockDialog.state() != QProcess::NotRunning)
m_procLockDialog.kill();
}
}
bool DbusUpperInterface::LockByBlank(int nType)
{
qDebug() << "LockByBlank:" << nType;
bool isNeedLock = true;
if (!checkStatus(SESSION_STATUS_SCREENCLOSE)) {
qDebug() << "m_nStatus:" << m_nStatus << " can't do screenclose lock!";
if (nType == 0) {
int closeDisplayTime = m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_DISPLAY_AC).toInt();
int nIdleDelay = m_gsettingsHelper->GetScreenSaverConf(KEY_IDLE_DELAY).toInt();
bool isCloseActive = m_gsettingsHelper->GetScreenSaverConf(KEY_CLOSE_ACTIVATION_ENABLED).toBool();
qDebug() << "DelayState:" << closeDisplayTime << nIdleDelay << isCloseActive;
if (-1 == closeDisplayTime || !isCloseActive)
return false;
if (-1 != nIdleDelay && closeDisplayTime == nIdleDelay * 60) { // ��与关�时间一致
if (!m_gsettingsHelper->GetScreenSaverConf(KEY_LOCK_ENABLED).toBool()) { // 仅�动��
isNeedLock = false;
}
} else {
return false;
}
} else {
qDebug() << "Don't need blank lock:" << nType;
return false;
}
}
if (isNeedLock) {
qDebug() << "LockByBlank ---";
m_bLockState = false;
m_bSlpState = false;
if (m_gsettingsHelper->GetLockScreenConf(KEY_LOCK_TIMEOUT).toInt() != -1 && isNeedLock) {
// 空闲关å±�且关å±�时间与ç�¡çœ 时间一致时直接é”�定
if (nType == 0
&& ((m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_DISPLAY_AC).toInt()
== m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt())
&& m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt() != -1)) {
qDebug() << "close delay same with sleep delay then lock!";
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
QString strParam = QString("CloseLock&delay=%1&hasLock=%2").arg(1000).arg(isNeedLock ? 1 : 0);
message << strParam;
QDBusConnection::sessionBus().send(message);
} else {
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--blank" << "--delay" << QString("%1").arg(1000) << "--has-lock" << QString("%1").arg(isNeedLock ? 1 : 0));
}
emitLockState(true);
} else {
delayLockScreen();
}
} else {
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
QString strParam = QString("CloseLock&delay=%1&hasLock=%2").arg(2000).arg(isNeedLock ? 1 : 0);
message << strParam;
QDBusConnection::sessionBus().send(message);
} else {
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--blank" << "--delay" << QString("%1").arg(2000) << "--has-lock" << QString("%1").arg(isNeedLock ? 1 : 0));
}
emitLockState(true);
}
return true;
} else {
return false;
}
}
void DbusUpperInterface::SetLockState()
{
m_bLockState = true;
}
void DbusUpperInterface::ClearLockState()
{
m_bLockState = false;
}
void DbusUpperInterface::onShowBlankScreensaver()
{
if (GetLockState())
return;
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "SleepLock";
QDBusConnection::sessionBus().send(message);
return;
}
qDebug() << "lock and show screensaver";
m_bLockState = false;
m_bSlpState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--blank");
emitLockState(true);
}
void DbusUpperInterface::ShowScreensaver()
{
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
if (!m_bLockState) {
emitLockState(true);
}
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "Screensaver";
QDBusConnection::sessionBus().send(message);
return;
}
qDebug() << "only show screensaver";
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--screensaver");
emitLockState(true);
}
void DbusUpperInterface::LockScreensaver()
{
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
if (!m_bLockState) {
emitLockState(true);
}
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "ScreensaverLock";
QDBusConnection::sessionBus().send(message);
return;
}
m_bSlpState = true;
qDebug() << "lock and show screensaver";
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--lock-screensaver");
emitLockState(true);
}
bool DbusUpperInterface::checkScreenDialogRunning()
{
bool isRunning = false;
QString strDisplay = "";
if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") {
strDisplay = QLatin1String(getenv("WAYLAND_DISPLAY"));
} else {
strDisplay = QLatin1String(getenv("DISPLAY"));
}
QString id = QString("ukui-screensaver-dialog" + strDisplay);
QtLocalPeer *lPeer = new QtLocalPeer(this, id);
isRunning = lPeer->isClient();
delete lPeer;
return isRunning;
}
void DbusUpperInterface::emitLockState(bool val, bool isSessionTools)
{
qDebug() << "emitLockState state = " << val << isSessionTools;
if (val != m_bBlockShortcutState && m_kglobalHelper) {
m_kglobalHelper->blockShortcut(val);
m_bBlockShortcutState = val;
qDebug() << " block all shortcut "
<< "blockShortcut states = " << m_bBlockShortcutState;
}
if (!isSessionTools) {
static bool s_isLocked = false;
QDBusMessage message;
if (val && !s_isLocked) {
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "lock");
QDBusConnection::sessionBus().send(message);
s_isLocked = true;
} else if (!val && s_isLocked) {
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "unlock");
QDBusConnection::sessionBus().send(message);
s_isLocked = false;
}
}
}
QString DbusUpperInterface::GetInformation(QString strJson)
{
QJsonParseError jsonParseError;
QJsonObject retObj;
retObj["Ret"] = 0;
retObj["Message"] = "Success";
qDebug() << "Json:" << strJson;
const QJsonDocument jsonDoc = QJsonDocument::fromJson(strJson.toUtf8(), &jsonParseError);
if (jsonParseError.error != QJsonParseError::NoError) {
retObj["Ret"] = -1;
retObj["Message"] = "Parse Request json failed!!";
qWarning() << "Parse request json failed!!";
} else {
QJsonObject rootObj = jsonDoc.object();
if (rootObj.isEmpty()) {
retObj["Ret"] = -1;
retObj["Message"] = "Request Json is null!!";
qWarning() << "Request Json is null!!";
} else {
int cmdId = rootObj.value("CmdId").toInt();
qInfo() << "CmdId: " << cmdId;
switch (cmdId) {
case LOCK_CMD_ID_GET_USERINFO_LIST:
retObj["CmdId"] = cmdId;
retObj["Content"] = GenerateUserInfoList();
break;
case LOCK_CMD_ID_GET_DEFAULT_AUTH_USER:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetDefaultAuthUser();
break;
case LOCK_CMD_ID_GET_CURRENT_USER:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetCurrentUser();
break;
case LOCK_CMD_ID_GET_SESSIONS_LIST:
retObj["CmdId"] = cmdId;
retObj["Content"] = GenerateSessionInfoList();
break;
case LOCK_CMD_ID_GET_CURRENT_SESSION:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetCurrentSession();
break;
case LOCK_CMD_ID_LOGIN1_IS_SESSION_ACTIVE:
retObj["CmdId"] = cmdId;
retObj["Content"] = m_login1Helper->isSessionActive();
break;
case LOCK_CMD_ID_GET_AGREEMENT:
retObj["CmdId"] = cmdId;
retObj["Content"] = GenerateAgreementInfo();
break;
case LOCK_CMD_ID_GSETTINGS_GET_LOCKSCREEN_CONF:
retObj["CmdId"] = cmdId;
GetLockScreenConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_SCREENSAVER_CONF:
retObj["CmdId"] = cmdId;
GetScreenSaverConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_DEFAULT_PHOTOPATH:
retObj["CmdId"] = cmdId;
retObj["Content"] = getSaverPhotoPath(KEY_PHOTO_DEFAULT_PATH);
break;
case LOCK_CMD_ID_GSETTINGS_GET_CUSTOM_PHOTOPATH:
retObj["CmdId"] = cmdId;
retObj["Content"] = getSaverPhotoPath(KEY_PHOTO_CUSTOM_PATH);
break;
case LOCK_CMD_ID_GSETTINGS_GET_POWERMANAGER_CONF:
retObj["CmdId"] = cmdId;
GetPowerManagerConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_MATEBG_CONF:
retObj["CmdId"] = cmdId;
GetMateBgConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_UKCCPLUGINS_CONF:
retObj["CmdId"] = cmdId;
GetUkccPluginsConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_THEMESTYLE_CONF:
retObj["CmdId"] = cmdId;
GetThemeStyleConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_SESSION_CONF:
retObj["CmdId"] = cmdId;
GetSessionConf(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_KEYBOARD_CONF:
retObj["CmdId"] = cmdId;
GetKeyboardConf(rootObj, retObj);
break;
case LOCK_CMD_ID_PAMAUTH_IS_AUTHENTICATED:
retObj["CmdId"] = cmdId;
IsPamAuthenticated(rootObj, retObj);
break;
case LOCK_CMD_ID_PAMAUTH_IS_INAUTHTICATION:
retObj["CmdId"] = cmdId;
IsPamInAuthentication(rootObj, retObj);
break;
case LOCK_CMD_ID_PAMAUTH_GET_AUTHUSER:
retObj["CmdId"] = cmdId;
PamAuthenticationUser(rootObj, retObj);
break;
case LOCK_CMD_ID_PAMAUTH_GET_AUTOLOGINUSERHINT:
retObj["CmdId"] = cmdId;
GetAutologinUserHint(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_USD_MEDIAKEYS_CONF:
retObj["CmdId"] = cmdId;
GetUsdMediaKeys(rootObj, retObj);
break;
case LOCK_CMD_ID_GSETTINGS_GET_USD_MEDIA_STATE_KEYS_CONF:
retObj["CmdId"] = cmdId;
GetUsdMediaStateKeys(rootObj, retObj);
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANHIBERNATE:
retObj["CmdId"] = cmdId;
if (m_login1Helper)
retObj["Content"] = m_login1Helper->isCanHibernate();
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANPOWEROFF:
retObj["CmdId"] = cmdId;
if (m_login1Helper)
retObj["Content"] = m_login1Helper->isCanPowerOff();
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANREBOOT:
retObj["CmdId"] = cmdId;
if (m_login1Helper)
retObj["Content"] = m_login1Helper->isCanReboot();
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANSUSPEND:
retObj["CmdId"] = cmdId;
if (m_login1Helper)
retObj["Content"] = m_login1Helper->isCanSuspend();
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANLOGOUT:
retObj["CmdId"] = cmdId;
if (m_sessionHelper)
retObj["Content"] = m_sessionHelper->canAction(PowerLogout);
break;
case LOCK_CMD_ID_LOGIN1_GET_POWER_MANAGER_CANLOCKSCREEN:
retObj["CmdId"] = cmdId;
if (m_sessionHelper)
retObj["Content"] = m_sessionHelper->canAction(PowerMonitorOff);
break;
case LOCK_CMD_ID_SYSTEM_UPGRADE_CHECK:
retObj["CmdId"] = cmdId;
if (m_systemsUpgradeHelper)
retObj["Content"] = m_systemsUpgradeHelper->checkSystemUpgrade();
break;
case LOCK_CMD_ID_UPOWER_BATTERY_STATUS:
retObj["CmdId"] = cmdId;
retObj["Content"] = getBatteryIconName();
break;
case LOCK_CMD_ID_UPOWER_IS_BATTERY:
retObj["CmdId"] = cmdId;
retObj["Content"] = getIsBattery();
break;
case LOCK_CMD_ID_UPOWER_BATTERY:
retObj["CmdId"] = cmdId;
retObj["Content"] = GenerateBatteryArgsList();
break;
case LOCK_CMD_ID_SESSION_GET_LOGOUT_LOCKCHECK:
retObj["CmdId"] = cmdId;
retObj["Content"] = getLogoutLockCheck();
break;
case LOCK_CMD_ID_SESSION_GET_SLEEP_LOCKCHECK:
retObj["CmdId"] = cmdId;
retObj["Content"] = getSleepLockCheck();
break;
case LOCK_CMD_ID_SESSION_GET_SHUTDOWN_LOCKCHECK:
retObj["CmdId"] = cmdId;
retObj["Content"] = getShutdownLockcheck();
break;
case LOCK_CMD_ID_LOCK_SCREEN_GET_THEMES:
retObj["CmdId"] = cmdId;
retObj["Content"] = getSaverTheme();
break;
case LOCK_CMD_ID_BIOAUTH_GET_AVAILABLE_DEVICES:
retObj["CmdId"] = cmdId;
BioGetAvailableDevices(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_GET_DISABLED_DEVICES:
retObj["CmdId"] = cmdId;
BioGetDisabledDevices(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_GET_STATE:
retObj["CmdId"] = cmdId;
BioGetBioAuthState(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_GET_CURDEVICE:
retObj["CmdId"] = cmdId;
BioGetCurBioInfo(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_FIND_DEVICE_BY_ID:
retObj["CmdId"] = cmdId;
BioFindDeviceById(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_FIND_DEVICE_BY_NAME:
retObj["CmdId"] = cmdId;
BioFindDeviceByName(rootObj, retObj);
break;
case LOCK_CMD_ID_BIOAUTH_GET_DEFAULT_DEVICE:
retObj["CmdId"] = cmdId;
BioGetDefaultDevice(rootObj, retObj);
break;
case LOCK_CMD_ID_GET_PUBLIC_KEY:
retObj["CmdId"] = cmdId;
retObj["Content"] = getPublicEncrypt();
break;
case LOCK_CMD_ID_TABLET_MODE:
retObj["CmdId"] = cmdId;
retObj["Content"] = getCurTabletMode();
break;
case LOCK_CMD_ID_NETWORK_CONNECT_STATE:
retObj["CmdId"] = cmdId;
retObj["Content"] = getNetworkConnectState();
break;
case LOCK_CMD_ID_GET_WEATHER_DATA:
retObj["CmdId"] = cmdId;
GetWeatherKeys(rootObj, retObj);
break;
case LOCK_CMD_ID_GET_INIT_DATA:
retObj["CmdId"] = cmdId;
GetInitData(rootObj, retObj);
break;
case LOCK_CMD_ID_GET_SAVER_DATETIME_ENABLE_DATA:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetSaverDatetimeEnable();
break;
case LOCK_CMD_ID_GET_LOCK_DATETIME_ENABLE_DATA:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetLockDatetimeEnable();
break;
case LOCK_CMD_ID_CAN_SWITCH_USER:
retObj["CmdId"] = cmdId;
retObj["Content"] = GetCanSwitchUser();
break;
default:
qInfo() << "�支�的CmdId";
retObj["Ret"] = -2;
retObj["Message"] = "Unsupported CmdId!!";
break;
}
}
}
return QString(QJsonDocument(retObj).toJson());
}
int DbusUpperInterface::SetInformation(QString strJson)
{
QJsonParseError jsonParseError;
int nRet = 0;
const QJsonDocument jsonDoc = QJsonDocument::fromJson(strJson.toUtf8(), &jsonParseError);
if (jsonParseError.error != QJsonParseError::NoError) {
qWarning() << "Parse info json failed!!";
nRet = -1;
} else {
QJsonObject rootObj = jsonDoc.object();
if (rootObj.isEmpty()) {
qWarning() << "Info Json is null!!";
nRet = -1;
} else {
int cmdId = rootObj.value("CmdId").toInt();
qInfo() << "CmdId: " << cmdId;
switch (cmdId) {
case LOCK_CMD_ID_SET_USER:
nRet = SetCurrentUser(rootObj);
break;
case LOCK_CMD_ID_SWITCH_TO_USER:
nRet = switchToUser(rootObj);
break;
case LOCK_CMD_ID_SET_SESSION:
nRet = SetCurrentSession(rootObj);
break;
case LOCK_CMD_ID_START_SESSION:
nRet = StartSession(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_LOCKSCREEN_CONF:
nRet = SetLockScreenConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_SCREENSAVER_CONF:
nRet = SetScreenSaverConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_POWERMANAGER_CONF:
nRet = SetPowerManagerConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_MATEBG_CONF:
nRet = SetMateBgConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_UKCCPLUGINS_CONF:
nRet = SetUkccPluginsConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_THEMESTYLE_CONF:
nRet = SetThemeStyleConf(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_SESSION_CONF:
nRet = SetSessionConf(rootObj);
break;
case LOCK_CMD_ID_PAMAUTH_AUTHENTICATE:
nRet = PamAuthenticateUser(rootObj);
break;
case LOCK_CMD_ID_PAMAUTH_RESPOND:
nRet = PamRespond(rootObj);
break;
case LOCK_CMD_ID_PAMAUTH_AUTHENTICATE_CANCEL:
nRet = PamAuthenticateCancel(rootObj);
break;
case LOCK_CMD_ID_USD_MEDIAKEYS:
nRet = usdExternalDoAction(rootObj);
break;
case LOCK_CMD_ID_LOGIN1_SET_POWER_MANAGER:
nRet = SetPowerManager(rootObj);
break;
case LOCK_CMD_ID_LOCK_STATE_CHANGED:
nRet = lockStateChanged(rootObj);
break;
case LOCK_CMD_ID_BIOAUTH_STARTAUTH:
nRet = BioStartAuth(rootObj);
break;
case LOCK_CMD_ID_BIOAUTH_STOPAUTH:
nRet = BioStopAuth(rootObj);
break;
case LOCK_CMD_ID_KWIN_BLOCK_SHORTCUT:
nRet = blockShortcut(rootObj);
break;
case LOCK_CMD_ID_GSETTINGS_SET_USD_MEDIA_STATE_KEYS_CONF:
nRet = SetUsdMediaStateKeys(rootObj);
break;
case LOCK_CMD_ID_SET_SAVER_DATETIME_ENABLE_DATA:
SetSaverDatetimeEnable(rootObj.value("Content").toBool());
break;
case LOCK_CMD_ID_SET_LOCK_DATETIME_ENABLE_DATA:
SetLockDatetimeEnable(rootObj.value("Content").toBool());
break;
default:
qInfo() << "�支�的CmdId";
nRet = -2;
break;
}
}
}
return nRet;
}
QJsonObject DbusUpperInterface::GenerateAgreementInfo()
{
QSettings settings(CONFIG_FILE, QSettings::IniFormat);
QJsonObject objAgreementInfo;
if (settings.contains("Greeter/showLoginPrompt")) {
objAgreementInfo["showLoginPrompt"] = settings.value("Greeter/showLoginPrompt").toBool();
}
if (settings.contains("Greeter/hideTitle")) {
objAgreementInfo["hideTitle"] = settings.value("Greeter/hideTitle").toBool();
}
if (settings.contains("Greeter/promptTitle")) {
QString promptTitle = settings.value("Greeter/promptTitle").toString();
objAgreementInfo["promptTitle"] = promptTitle;
}
if (settings.contains("Greeter/promptText")) {
QString promptText = settings.value("Greeter/promptText").toString();
objAgreementInfo["promptText"] = promptText;
}
if (settings.contains("Greeter/promptTextFilePath")) {
QString promptTextFilePath = settings.value("Greeter/promptTextFilePath").toString();
objAgreementInfo["promptTextFilePath"] = promptTextFilePath;
}
return objAgreementInfo;
}
QJsonArray DbusUpperInterface::GenerateUserInfoList()
{
QJsonArray jsonArray;
if (m_lightDmHelper) {
QList usersInfo = m_lightDmHelper->getUsersInfo();
for (auto userInfo : usersInfo) {
QJsonObject objUserInfo;
objUserInfo["uid"] = (double)userInfo->uid();
objUserInfo["name"] = userInfo->name();
objUserInfo["fullName"] = userInfo->fullName();
objUserInfo["loggedIn"] = userInfo->isLoggedIn();
objUserInfo["backGround"] = userInfo->backGround();
objUserInfo["lang"] = userInfo->lang();
objUserInfo["headImg"] = userInfo->headImage();
objUserInfo["systemAccount"] = userInfo->isSystemAccount();
KylinUserDatePtr ptr = KYLINUSERDATAMNG::instance()->GetUserPtr(userInfo->name());
if (nullptr != ptr) {
if (!ptr->backgroundPath().isEmpty()) {
objUserInfo["greeterBackGround"] = ptr->backgroundPath();
}
objUserInfo["dateType"] = ptr->dateType();
objUserInfo["fontSize"] = ptr->fontSize();
objUserInfo["timeType"] = ptr->timeType();
objUserInfo["color"] = ptr->color();
}
if (isCurUserSelf(userInfo->name()) && m_gsettingsHelper) {
QString strBackground = m_gsettingsHelper->GetLockScreenConf(KEY_BACKGROUND).toString();
if (!strBackground.isEmpty() && QFile(strBackground).exists()) {
objUserInfo["greeterBackGround"] = strBackground;
}
}
jsonArray.append(objUserInfo);
}
}
return jsonArray;
}
int DbusUpperInterface::GetLoggedInUsersCount()
{
int loggedinUsersCount = 0;
if (m_lightDmHelper) {
QList usersInfo = m_lightDmHelper->getUsersInfo();
if (!usersInfo.isEmpty()) {
for (auto user : usersInfo) {
if (user->isLoggedIn()) {
loggedinUsersCount++;
}
}
}
}
return loggedinUsersCount;
}
QJsonArray DbusUpperInterface::GenerateBatteryArgsList()
{
QJsonArray jsonArray;
if (m_upowerHelper) {
QStringList batteryArgs = m_upowerHelper->getBatteryArgs();
for (auto battery : batteryArgs) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = battery;
jsonArray.append(objBatteryInfo);
}
}
return jsonArray;
}
QJsonArray DbusUpperInterface::getSleepLockCheck()
{
QJsonArray jsonArray;
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("sleep");
for (auto lockcheck : lockCheckList) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = lockcheck;
jsonArray.append(objBatteryInfo);
}
}
return jsonArray;
}
QJsonArray DbusUpperInterface::getLogoutLockCheck()
{
QJsonArray jsonArray;
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("logout");
for (auto lockcheck : lockCheckList) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = lockcheck;
jsonArray.append(objBatteryInfo);
}
}
return jsonArray;
}
QJsonArray DbusUpperInterface::getShutdownLockcheck()
{
QJsonArray jsonArray;
if (m_sessionHelper) {
QStringList lockCheckList = m_sessionHelper->getLockCheckStatus("shutdown");
for (auto lockcheck : lockCheckList) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = lockcheck;
jsonArray.append(objBatteryInfo);
}
}
return jsonArray;
}
QJsonArray DbusUpperInterface::getSaverTheme()
{
QJsonArray jsonArray;
if (m_gsettingsHelper) {
QStringList themeList = m_gsettingsHelper->GetLockScreenConf(KEY_THEMES).toStringList();
for (auto list : themeList) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = list;
jsonArray.append(objBatteryInfo);
}
}
return jsonArray;
}
QString DbusUpperInterface::getBatteryIconName()
{
QString iconName;
if (m_upowerHelper) {
iconName = m_upowerHelper->getBatteryIconName();
}
return iconName;
}
bool DbusUpperInterface::getIsBattery()
{
bool isBattery = false;
if (m_upowerHelper) {
isBattery = m_upowerHelper->getIsBattery();
}
return isBattery;
}
QString DbusUpperInterface::GetDefaultAuthUser()
{
QString strUserName = "";
if (!isGreeterMode()) {
strUserName = getenv("USER");
} else {
// 获å�–lightdmä¼ è¿‡æ�¥çš„被选ä¸çš„用户
WillLoginUserInfo willSwitchUser = UniAuthService::instance()->getWillSwitchUser();
bool selectManualLogin = GreeterConfig::instance()->getSelectManualLoginDefault();
QString selectedUser = "";
if (willSwitchUser.strUserName.isEmpty()
|| !UniAuthService::instance()->isUserNameValid(willSwitchUser.strUserName)) {
qDebug() << "WillSwitchUser is NULL or invalid:" << willSwitchUser.strUserName;
selectedUser = m_lightDmHelper->selectUserHint();
}
UniAuthService::instance()->SwitchToGreeterUser("");
if (!willSwitchUser.strUserName.isEmpty()) {
strUserName = willSwitchUser.strUserName;
qDebug() << "WillSwitchUser:" << strUserName;
} else if (!selectedUser.isEmpty()) {
qDebug() << "SelectUserHint: " << selectedUser << selectManualLogin;
if (!selectManualLogin) {
if (m_lightDmHelper->findUserByName(selectedUser)) {
strUserName = selectedUser;
} else {
qDebug() << "SlelectUerHint invalid:" << selectedUser;
}
}
}
if (!strUserName.isEmpty()) {
// do nothing
} else if (selectManualLogin && m_lightDmHelper->findUserByName("*login")) {
qDebug() << "Select Manual login";
strUserName = "*login";
} else if (m_lightDmHelper->selectGuestHint()) {
qDebug() << "SelectGuest";
strUserName = "*guest";
} else if (m_lightDmHelper->getUsersInfo().count() == 1) { // 如果å�ªæœ‰ä¸€ä¸ªç”¨æˆ·,默认选ä¸
strUserName = m_lightDmHelper->getUsersInfo()[0]->name();
} else {
QString lastLoginUser = UniAuthService::instance()->GetLastLoginUser();
if (m_lightDmHelper->findUserByName(lastLoginUser)) {
strUserName = lastLoginUser;
} else {
if (m_lightDmHelper->getUsersInfo().count() > 0) {
strUserName = m_lightDmHelper->getUsersInfo()[0]->name();
} else {
qWarning() << "Have no user to select!!";
}
}
}
}
return strUserName;
}
int DbusUpperInterface::StartSession(const QJsonObject &objInfo)
{
Q_UNUSED(objInfo);
m_lightDmHelper->startSession();
return 0;
}
QString DbusUpperInterface::GetCurrentSession()
{
return m_lightDmHelper->session();
}
int DbusUpperInterface::SetCurrentSession(const QJsonObject &objInfo)
{
int nRet = -1;
QString strSessionName = objInfo.value("Content").toString();
if (!strSessionName.isEmpty()) {
if (m_lightDmHelper->setSession(strSessionName)) {
nRet = 0;
}
}
return nRet;
}
void DbusUpperInterface::onCurrentSessionChanged(QString strSession)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_CURRENT_SESSION_CHANGED;
retObj["Content"] = strSession;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
QJsonArray DbusUpperInterface::GenerateSessionInfoList()
{
QJsonArray jsonArray;
if (m_lightDmHelper) {
QList sessionsInfo = m_lightDmHelper->getSessionsInfo();
for (auto session : sessionsInfo) {
QJsonObject objSessionInfo;
objSessionInfo["key"] = session;
jsonArray.append(objSessionInfo);
}
}
return jsonArray;
}
QString DbusUpperInterface::GetCurrentUser()
{
return m_lightDmHelper->getCurrentUser();
}
int DbusUpperInterface::SetCurrentUser(const QJsonObject &objInfo)
{
int nRet = -1;
QString strUserName = objInfo.value("Content").toString();
if (!strUserName.isEmpty()) {
if (m_lightDmHelper->setCurrentUser(strUserName)) {
nRet = 0;
if (m_accountsHelper) {
QString strSession = m_accountsHelper->getUserSessionByName(strUserName);
if (!strSession.isEmpty()) {
m_lightDmHelper->setSession(strSession);
}
}
}
}
if (nRet >= 0) {
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_CURRENT_USER_CHANGED;
retObj["Content"] = GetCurrentUser();
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
return nRet;
}
bool DbusUpperInterface::getCurTabletMode()
{
bool tabletMode = false;
#ifdef SUPPORT_TABLET_MODE
if (m_libinputSwitchEvent) {
tabletMode = m_libinputSwitchEvent->geInitDevicesStatus();
}
#endif
return tabletMode;
}
int DbusUpperInterface::getNetworkConnectState()
{
int state = -1;
if (m_networkManagerHelper) {
state = m_networkManagerHelper->getNetWorkConnectStatus();
}
return state;
}
bool DbusUpperInterface::GetSaverDatetimeEnable()
{
QString currentUser = GetCurrentUser();
if (currentUser.isEmpty()) {
currentUser = qgetenv("USER");
}
return GreeterConfig::instance()->getScreensaverDatetimeEnable(currentUser);
}
void DbusUpperInterface::SetSaverDatetimeEnable(bool enable)
{
GreeterConfig::instance()->setScreensaverDatetimeEnable(enable);
}
bool DbusUpperInterface::GetLockDatetimeEnable()
{
QString currentUser = GetCurrentUser();
if (currentUser.isEmpty()) {
currentUser = qgetenv("USER");
}
return GreeterConfig::instance()->getLockScreenDatetimeEnable(currentUser);
}
void DbusUpperInterface::SetLockDatetimeEnable(bool enable)
{
GreeterConfig::instance()->setLockScreenDatetimeEnable(enable);
}
int DbusUpperInterface::switchToUser(const QJsonObject &objInfo)
{
int nRet = -1;
QString strUserName = objInfo.value("Content").toString();
if (!strUserName.isEmpty()) {
QString strSwitchSeatPath = "";
QString strDesUserName = strUserName;
QString strCurUserName = SwitchUserUtils::GetCurUserName();
if (strCurUserName.isEmpty()) {
qDebug() << "GetCurUserName failed!";
nRet = 1;
} else {
UserDisplayIfInfo curUdii = SwitchUserUtils::GetUserUDII(strCurUserName);
UserDisplayIfInfo desUdii = { "" };
if (!strDesUserName.isEmpty()) {
desUdii = SwitchUserUtils::GetUserUDII(strDesUserName);
if (desUdii.strUserName.isEmpty()) {
desUdii.strUserName = strDesUserName;
}
}
if (!curUdii.strSeatPath.isEmpty()) {
strSwitchSeatPath = curUdii.strSeatPath;
}
if (!desUdii.strSeatPath.isEmpty()) {
strSwitchSeatPath = desUdii.strSeatPath;
}
if (strSwitchSeatPath.isEmpty()) {
qWarning() << "switch user: switch seat path invalid!";
nRet = 1;
} else {
nRet = SwitchUserUtils::SwitchToUserSession(strSwitchSeatPath, desUdii);
qDebug() << "Switch user result:" << nRet;
}
}
}
return nRet;
}
bool DbusUpperInterface::GetCanSwitchUser()
{
return SwitchUserUtils::CanSwitchUser();
}
void DbusUpperInterface::onUsersInfoChanged()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_USERINFO_CHANGED;
retObj["Content"] = GenerateUserInfoList();
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
bool DbusUpperInterface::SendUpdateInfoSig(QString strJson)
{
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "UpdateInformation");
message << strJson;
return QDBusConnection::sessionBus().send(message);
}
void DbusUpperInterface::onLogin1ReqLock()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_REQ_LOCK;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
// LockScreensaver();
// 调用å±�ä¿�会导致在两个已登录用户切é”�å±�,会出现å±�ä¿�界é�¢ï¼Œå› æ¤æ”¹ä¸ºè°ƒç”¨é”�å±�
Lock();
}
void DbusUpperInterface::onLogin1ReqUnLock()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_REQ_UNLOCK;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::doPrepareForSleep(bool isSleep, QString strAction /*= ""*/)
{
qInfo() << "doPrepareForSleep begin:" << isSleep << strAction;
m_strAction = strAction;
if (isSleep) {
if (!checkStatus(SESSION_STATUS_SLEEPED)) {
uninhibit();
if (!strAction.isEmpty() && m_sessionHelper) {
m_sessionHelper->doAction(strAction);
}
qInfo() << "doPrepareForSleep done:" << isSleep;
return;
}
if (m_bBlankState) {
qDebug() << "Is blank state";
qInfo() << "doPrepareForSleep done:" << isSleep;
return;
}
stopDelayLockScreen(false);
m_bBlankState = true;
if (checkScreenDialogRunning() || GetLockState() || GetSlpState()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
message << "SleepLock";
QDBusConnection::sessionBus().send(message);
} else {
this->onShowBlankScreensaver();
}
if (m_bLockState) {
uninhibit();
if (!strAction.isEmpty() && m_sessionHelper) {
m_sessionHelper->doAction(strAction);
}
qInfo() << "doPrepareForSleep done:" << isSleep;
} else {
if (!m_timer) {
m_timer = new QTimer(this);
qDebug() << "m_bLockState " << m_bLockState;
auto connection = connect(m_timer, &QTimer::timeout, this, &DbusUpperInterface::handleTimeout);
m_connections.append(connection);
}
m_timer->start(200);
}
} else {
m_nStatus &= ~SESSION_STATUS_SLEEPED;
m_bBlankState = false;
inhibit();
qInfo() << "doPrepareForSleep done:" << isSleep;
}
}
void DbusUpperInterface::handleTimeout()
{
m_timerCount += 1;
if (m_bLockState || m_timerCount > 20) {
m_timer->stop();
m_timerCount = 0;
uninhibit();
if (!m_strAction.isEmpty() && m_sessionHelper) {
m_sessionHelper->doAction(m_strAction);
}
qInfo() << "doPrepareForSleep done: true timeout";
}
}
void DbusUpperInterface::onLogin1PrepareForSleep(bool isSleep)
{
qInfo() << "onLogin1PrepareForSleep:" << isSleep;
doPrepareForSleep(isSleep);
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_PREPAREFORSLEEP;
retObj["IsSleep"] = isSleep;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onLogin1SessionActiveChanged(bool isActive)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_SESSION_ACTIVE_CHANGED;
retObj["IsActive"] = isActive;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBlockLogoutInhibitedChanged()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_BLOCKLOGOUTINHIBITED_CHANGED;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBlockInhibitedChanged(QString blockInhibited)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_LOGIN1_BLOCKINHIBITED_CHANGED;
retObj["BlockInhibited"] = blockInhibited;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBatteryStatusChanged(QString iconName)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_UPOWER_BATTERY_STATUS;
retObj["IconName"] = iconName;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onSessionIdleReceived()
{
if (!checkStatus(SESSION_STATUS_SCREENSAVER)) {
qDebug() << "m_nStatus:" << m_nStatus << " can't do screensaver!";
return;
}
if (m_procLockDialog.state() != QProcess::NotRunning)
return;
qDebug() << "emit SessionIdle";
m_bLockState = false;
QString cmd = QString("/usr/bin/ukui-screensaver-dialog");
qDebug() << cmd;
m_procLockDialog.start(cmd, QStringList() << "--session-idle");
emitLockState(true);
}
void DbusUpperInterface::onSessionIdleExit()
{
m_nStatus &= ~SESSION_STATUS_SCREENSAVER;
m_nStatus &= ~SESSION_STATUS_SCREENCLOSE;
stopDelayLockScreen();
}
void DbusUpperInterface::delayLockScreen()
{
if (!m_timerLock) {
m_timerLock = new QTimer(this);
m_connections.append(connect(m_timerLock, &QTimer::timeout, this, &DbusUpperInterface::onLockScreenTimeout));
}
int nLockTimeout = m_gsettingsHelper->GetLockScreenConf(KEY_LOCK_TIMEOUT).toInt();
qDebug() << "LockTimeout:" << nLockTimeout;
if (nLockTimeout != -1) {
stopDelayLockScreen();
if (m_procLockDialog.state() != QProcess::NotRunning || checkScreenDialogRunning()) {
QDBusMessage message;
message = QDBusMessage::createSignal(SS_DBUS_PATH, SS_DBUS_INTERFACE, "SecondRunParam");
QString strParam = QString("CloseLock&delay=%1&hasLock=1").arg(nLockTimeout * 1000);
message << strParam;
QDBusConnection::sessionBus().send(message);
} else {
QString cmd
= QString("/usr/bin/ukui-screensaver-dialog --blank --delay %1 --has-lock 1").arg(nLockTimeout * 1000);
qDebug() << cmd;
m_procLockDialog.start(cmd);
}
emitLockState(true);
m_timerLock->start(m_gsettingsHelper->GetLockScreenConf(KEY_LOCK_TIMEOUT).toInt() * 1000);
}
}
void DbusUpperInterface::stopDelayLockScreen(bool withUnlock /*= true*/)
{
if (m_timerLock && m_timerLock->isActive()) {
if (withUnlock) {
UnLock();
}
m_timerLock->stop();
}
}
void DbusUpperInterface::onLockScreenTimeout()
{
m_timerLock->stop();
}
void DbusUpperInterface::onBatteryChanged(QStringList batteryArgs)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_UPOWER_BATTERY;
QJsonArray jsonArray;
for (auto args : batteryArgs) {
QJsonObject objBatteryInfo;
objBatteryInfo["key"] = args;
jsonArray.append(objBatteryInfo);
}
retObj["Content"] = jsonArray;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onUPowerServiceReady()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_UPOWER_SERVICE_READY;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onLidStateChanged(bool isClosed)
{
if (!isClosed) {
if (m_gsettingsHelper->GetPowerManagerConf(KEY_LOCK_BLANKSCREEN).toBool()) {
m_nStatus &= ~SESSION_STATUS_SCREENCLOSE;
}
stopDelayLockScreen();
}
}
void DbusUpperInterface::onLockScreenConfigChanged(QString strKey, QVariant value)
{
if (strKey == KEY_BACKGROUND) {
onUsersInfoChanged();
}
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_LOCKSCREEN_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onScreenSaverConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_SCREENSAVER_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onPowerManagerConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_POWERMANAGER_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onMateBgConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_MATEBG_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onUkccPluginsConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_UKCCPLUGINS_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
if (strKey == KEY_DATE) {
m_config->setShareConfigValue("dateType", value.toString());
} else if (strKey == KEY_HOUR_SYSTEM) {
m_config->setShareConfigValue("timeType", value.toInt());
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onThemeStyleConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_THEMESTYLE_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
if (strKey == KEY_SYSTEM_FONT_SIZE) {
m_config->setShareConfigValue("fontSize", value.toDouble());
} else if (strKey == KEY_THEME_COLOR) {
m_config->setShareConfigValue("themeColor", value.toString());
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onSessionConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_SESSION_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onKeyboardConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_KEYBOARD_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onUsdMediaKeysConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_USD_MEDIAKEYS_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onUsdMediaStateKeysConfigChanged(QString strKey, QVariant value)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_GSETTINGS_USD_MEDIA_STATE_KEYS_CONF_CHANGED;
retObj["Key"] = strKey;
switch (value.type()) {
case QVariant::Bool:
retObj["Value"] = value.toBool();
break;
case QVariant::Int:
retObj["Value"] = value.toInt();
break;
case QVariant::String:
retObj["Value"] = value.toString();
break;
case QVariant::UInt:
retObj["Value"] = value.toDouble();
break;
case QVariant::Double:
retObj["Value"] = value.toDouble();
break;
default:
return;
}
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::GetScreenSaverConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetScreenSaverConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
QJsonArray DbusUpperInterface::getSaverPhotoPath(QString key)
{
QJsonArray jsonArray;
if (m_gsettingsHelper) {
QStringList pathList = m_gsettingsHelper->GetScreenSaverConf(key).toStringList();
for (auto list : pathList) {
QJsonObject objPathInfo;
objPathInfo["key"] = list;
jsonArray.append(objPathInfo);
}
}
return jsonArray;
}
int DbusUpperInterface::SetScreenSaverConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetScreenSaverConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetLockScreenConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetLockScreenConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetLockScreenConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetLockScreenConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetPowerManagerConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetPowerManagerConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetPowerManagerConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetPowerManagerConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetMateBgConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetMateBgConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetMateBgConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetMateBgConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetUkccPluginsConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetUkccPluginsConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetUkccPluginsConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetUkccPluginsConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetThemeStyleConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetThemeStyleConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetThemeStyleConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetThemeStyleConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetSessionConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetSessionConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetSessionConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetSessionConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetKeyboardConf(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetKeyboardConf(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetKeyboardConf(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetKeyboardConf(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::onLockDialogProcExit(int exitCode, QProcess::ExitStatus exitStatus)
{
qInfo() << "ukui-screensaver-dialog is exited,exitCode is " << exitCode;
if (exitStatus == QProcess::CrashExit)
qWarning() << m_procLockDialog.errorString();
emitLockState(false);
m_bLockState = false;
}
bool DbusUpperInterface::checkStatus(int nStatus)
{
if (!m_gsettingsHelper) {
return false;
}
switch (nStatus) {
case SESSION_STATUS_SLEEPED: {
m_nStatus |= nStatus;
if (!m_gsettingsHelper->GetLockScreenConf(KEY_SLEEP_ACTIVATION_ENABLED).toBool()) {
return false;
}
} break;
case SESSION_STATUS_SCREENCLOSE: {
m_nStatus |= nStatus;
if ((m_nStatus & SESSION_STATUS_SLEEPED)
|| !m_gsettingsHelper->GetLockScreenConf(KEY_CLOSE_ACTIVATION_ENABLED).toBool()) {
return false;
}
if (((m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt()
== m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_DISPLAY_AC).toInt())
&& m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt() != -1)
&& !m_gsettingsHelper->GetLockScreenConf(KEY_SLEEP_ACTIVATION_ENABLED).toBool()) {
qDebug() << "Sleep same with Close and Sleep disable!";
return false;
}
} break;
case SESSION_STATUS_SCREENSAVER: {
m_nStatus |= nStatus;
if ((m_nStatus & SESSION_STATUS_SLEEPED) || (m_nStatus & SESSION_STATUS_SCREENCLOSE)) {
return false;
}
if (((m_gsettingsHelper->GetLockScreenConf(KEY_IDLE_DELAY).toInt() * 60
== m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt())
&& m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_COMPUTER_AC).toInt() != -1)
&& !m_gsettingsHelper->GetLockScreenConf(KEY_SLEEP_ACTIVATION_ENABLED).toBool()) {
qDebug() << "Sleep same with idle and Sleep disable!";
return false;
}
if (((m_gsettingsHelper->GetLockScreenConf(KEY_IDLE_DELAY).toInt() * 60
== m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_DISPLAY_AC).toInt())
&& m_gsettingsHelper->GetPowerManagerConf(KEY_SLEEP_DISPLAY_AC).toInt()
!= -1) /* && !m_gsettingsHelper->GetLockScreenConf(KEY_CLOSE_ACTIVATION_ENABLED).toBool()*/) {
qDebug() << "Close same with idle do nothing!";
return false;
}
} break;
default:
return false;
}
return true;
}
void DbusUpperInterface::inhibit()
{
if (m_inhibitFileDescriptor.isValid()) {
return;
}
QDBusMessage message = QDBusMessage::createMethodCall(
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
QStringLiteral("Inhibit"));
message.setArguments(QVariantList({ QStringLiteral("sleep"),
"Screen Locker Backend",
"Ensuring that the screen gets locked before going to sleep",
QStringLiteral("delay") }));
QDBusPendingReply reply = QDBusConnection::systemBus().call(message);
if (!reply.isValid()) {
return;
}
reply.value().swap(m_inhibitFileDescriptor);
}
void DbusUpperInterface::uninhibit()
{
if (!m_inhibitFileDescriptor.isValid()) {
return;
}
m_inhibitFileDescriptor = QDBusUnixFileDescriptor();
}
void DbusUpperInterface::IsPamInAuthentication(QJsonObject &reqObj, QJsonObject &retObj)
{
Q_UNUSED(reqObj);
if (m_pamAuth) {
retObj["Content"] = m_pamAuth->inAuthentication();
} else {
retObj["Content"] = false;
}
}
void DbusUpperInterface::IsPamAuthenticated(QJsonObject &reqObj, QJsonObject &retObj)
{
Q_UNUSED(reqObj);
if (m_pamAuth) {
retObj["Content"] = m_pamAuth->isAuthenticated();
} else {
retObj["Content"] = false;
}
}
void DbusUpperInterface::PamAuthenticationUser(QJsonObject &reqObj, QJsonObject &retObj)
{
Q_UNUSED(reqObj);
if (m_pamAuth) {
retObj["Content"] = m_pamAuth->authenticationUser();
} else {
retObj["Content"] = "";
}
}
int DbusUpperInterface::PamAuthenticateUser(const QJsonObject &objInfo)
{
int nRet = -1;
QVariant varUserName = objInfo.value("UserName");
if (varUserName.isValid() && m_pamAuth) {
m_pamAuth->authenticate(varUserName.toString());
nRet = 0;
}
return nRet;
}
void DbusUpperInterface::GetAutologinUserHint(QJsonObject &reqObj, QJsonObject &retObj)
{
Q_UNUSED(reqObj);
if (m_pamAuth) {
retObj["Content"] = m_pamAuth->autologinUserHint();
} else {
retObj["Content"] = "";
}
}
int DbusUpperInterface::PamAuthenticateCancel(const QJsonObject &objInfo)
{
Q_UNUSED(objInfo);
int nRet = -1;
if (m_pamAuth) {
m_pamAuth->cancelAuthentication();
nRet = 0;
}
return 0;
}
int DbusUpperInterface::PamRespond(const QJsonObject &objInfo)
{
int nRet = -1;
QVariant varRespond = objInfo.value("Content");
if (varRespond.isValid() && m_pamAuth) {
QString strDecrypt = varRespond.toString();
if (strDecrypt != BIOMETRIC_IGNORE && !priKey.isEmpty()) {
QByteArray buffer;
QByteArray byteEncrypt = QByteArray::fromBase64(strDecrypt.toLatin1());
if (rsac.decryptData(byteEncrypt, buffer, priKey)) {
strDecrypt = buffer;
}
}
m_pamAuth->respond(strDecrypt);
nRet = 0;
}
return nRet;
}
void DbusUpperInterface::onPamShowMessage(QString strMsg, int type)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_PAMAUTH_SHOWMESSAGE;
retObj["Message"] = strMsg;
retObj["MsgType"] = type;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onPamShowPrompt(QString strPrompt, int type)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_PAMAUTH_SHOWPROMPT;
retObj["Prompt"] = strPrompt;
retObj["PromptType"] = type;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onPamShowBinaryPrompt(QVariant value, int type)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_PAMAUTH_SHOWPBINARYROMPT;
retObj["BinaryPromptType"] = type;
retObj["BinaryVal"] = value.toJsonValue();
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onPamAuthCompleted()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_PAMAUTH_AUTH_COMPLETED;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioAuthShowMessage(QString strMsg)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_SHOW_MESSAGE;
retObj["Message"] = strMsg;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioAuthStateChanged(int nState)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_AUTHSTATE_CHANGED;
retObj["State"] = nState;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioServiceStatusChanged(bool bValid)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_SERVICE_STATUS_CHANGED;
retObj["IsValid"] = bValid;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioDeviceChanged()
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_DEVICE_CHANGED;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioAuthFrameData(QString strData)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_FRAME_DATA;
retObj["Data"] = strData;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onBioAuthCompleted(int nUid, bool isSuccess, int nError, int nMaxFailedTime, int nFailedTime)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_BIOAUTH_COMPLETE;
retObj["UId"] = nUid;
retObj["IsSuccess"] = isSuccess;
retObj["ErrorNo"] = nError;
retObj["MaxFailedTime"] = nMaxFailedTime;
retObj["FailedTime"] = nFailedTime;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onTabletModeChanged(bool tabletMode)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_TABLET_MODE_CHANGED;
retObj["mode"] = tabletMode;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onNetWorkConnectStateChanged(int state)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_NETWORK_CONNECT_STATE_CHANGED;
retObj["state"] = state;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onScreensaverDatetimeChanged(bool isEnable, QString strUserName)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_SET_SAVER_DATETIME_ENABLE_DATA_CHANGED;
retObj["enable"] = isEnable;
retObj["username"] = strUserName;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::onScreenlockDatetimeChanged(bool isEnable, QString strUserName)
{
QJsonObject retObj;
retObj["CmdId"] = LOCK_CMD_ID_SET_LOCK_DATETIME_ENABLE_DATA_CHANGED;
retObj["enable"] = isEnable;
retObj["username"] = strUserName;
SendUpdateInfoSig(QString(QJsonDocument(retObj).toJson()));
}
void DbusUpperInterface::BioGetAvailableDevices(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
QVariant varUserId = reqObj.value("UserId");
if (varUserId.isValid() && m_bioAuth) {
DeviceMap bioDevInfos = m_bioAuth->getAvailableDevices(varUserId.toInt());
QJsonArray objArray;
DeviceMap::iterator itValidDev = bioDevInfos.begin();
for (; itValidDev != bioDevInfos.end(); itValidDev++) {
QJsonObject objDevInfo;
objDevInfo["id"] = itValidDev.value()->id;
objDevInfo["ShortName"] = itValidDev.value()->shortName;
objDevInfo["FullName"] = itValidDev.value()->fullName;
objDevInfo["DriverEnable"] = itValidDev.value()->driverEnable;
objDevInfo["DeviceNum"] = itValidDev.value()->deviceNum;
objDevInfo["DeviceType"] = itValidDev.value()->deviceType;
objDevInfo["StorageType"] = itValidDev.value()->storageType;
objDevInfo["EigType"] = itValidDev.value()->eigType;
objDevInfo["VerifyType"] = itValidDev.value()->verifyType;
objDevInfo["IdentifyType"] = itValidDev.value()->identifyType;
objDevInfo["BusType"] = itValidDev.value()->busType;
objDevInfo["DeviceStatus"] = itValidDev.value()->deviceStatus;
objDevInfo["OpsStatus"] = itValidDev.value()->OpsStatus;
objArray.append(objDevInfo);
}
retObj["Content"] = objArray;
} else {
retObj["Content"] = QJsonArray();
}
#endif
}
void DbusUpperInterface::BioGetDisabledDevices(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
QVariant varUserId = reqObj.value("UserId");
if (varUserId.isValid() && m_bioAuth) {
QList disabledInfos = m_bioAuth->getDisabledDevices(varUserId.toInt());
QJsonArray objArray;
for (auto devType : disabledInfos) {
objArray.append(devType);
}
retObj["Content"] = objArray;
} else {
retObj["Content"] = QJsonArray();
}
#endif
}
void DbusUpperInterface::BioGetBioAuthState(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
Q_UNUSED(reqObj);
if (m_bioAuth) {
retObj["Content"] = m_bioAuth->getBioAuthState();
} else {
retObj["Content"] = BIOAUTH_IDLE;
}
#endif
}
void DbusUpperInterface::BioGetCurBioInfo(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
Q_UNUSED(reqObj);
if (m_bioAuth) {
DeviceInfo bioDevInfo = m_bioAuth->getCurBioInfo();
QJsonObject objDevInfo;
objDevInfo["id"] = bioDevInfo.id;
objDevInfo["ShortName"] = bioDevInfo.shortName;
objDevInfo["FullName"] = bioDevInfo.fullName;
objDevInfo["DriverEnable"] = bioDevInfo.driverEnable;
objDevInfo["DeviceNum"] = bioDevInfo.deviceNum;
objDevInfo["DeviceType"] = bioDevInfo.deviceType;
objDevInfo["StorageType"] = bioDevInfo.storageType;
objDevInfo["EigType"] = bioDevInfo.eigType;
objDevInfo["VerifyType"] = bioDevInfo.verifyType;
objDevInfo["IdentifyType"] = bioDevInfo.identifyType;
objDevInfo["BusType"] = bioDevInfo.busType;
objDevInfo["DeviceStatus"] = bioDevInfo.deviceStatus;
objDevInfo["OpsStatus"] = bioDevInfo.OpsStatus;
retObj["Content"] = objDevInfo;
} else {
retObj["Content"] = QJsonObject();
}
#endif
}
void DbusUpperInterface::BioGetDefaultDevice(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
qDebug() << "BioGetDefaultDevice:" << reqObj;
QVariant varUserId = reqObj.value("UserId");
QVariant varUserName = reqObj.value("UserName");
if (varUserId.isValid() && varUserName.isValid() && m_bioAuth) {
if (reqObj.contains("DevType")) {
QVariant varDevType = reqObj.value("DevType");
retObj["Content"]
= m_bioAuth->getDefaultDevice(varUserId.toInt(), varUserName.toString(), varDevType.toInt());
} else {
retObj["Content"] = m_bioAuth->getDefaultDevice(varUserId.toInt(), varUserName.toString());
}
} else {
retObj["Content"] = "";
}
#endif
}
void DbusUpperInterface::BioFindDeviceById(QJsonObject &reqObj, QJsonObject &retObj)
{
#ifdef ENABLE_BIO_BACKEND
QVariant varUserId = reqObj.value("UserId");
QVariant varDevId = reqObj.value("DevId");
if (varUserId.isValid() && varDevId.isValid() && m_bioAuth) {
DeviceInfoPtr ptrDevInfo = m_bioAuth->findDeviceById(varUserId.toInt(), varDevId.toInt());
QJsonObject objDevInfo;
if (ptrDevInfo) {
objDevInfo["id"] = ptrDevInfo->id;
objDevInfo["ShortName"] = ptrDevInfo->shortName;
objDevInfo["FullName"] = ptrDevInfo->fullName;
objDevInfo["DriverEnable"] = ptrDevInfo->driverEnable;
objDevInfo["DeviceNum"] = ptrDevInfo->deviceNum;
objDevInfo["DeviceType"] = ptrDevInfo->deviceType;
objDevInfo["StorageType"] = ptrDevInfo->storageType;
objDevInfo["EigType"] = ptrDevInfo->eigType;
objDevInfo["VerifyType"] = ptrDevInfo->verifyType;
objDevInfo["IdentifyType"] = ptrDevInfo->identifyType;
objDevInfo["BusType"] = ptrDevInfo->busType;
objDevInfo["DeviceStatus"] = ptrDevInfo->deviceStatus;
objDevInfo["OpsStatus"] = ptrDevInfo->OpsStatus;
}
retObj["Content"] = objDevInfo;
} else {
retObj["Content"] = QJsonObject();
}
#endif
}
void DbusUpperInterface::initPublicEncrypt()
{
m_initEncrypt = QtConcurrent::run([=]() {
if (pubKey.isEmpty()) {
rsac.genKeyPair(priKey, pubKey, 2048);
}
});
}
QString DbusUpperInterface::getPublicEncrypt()
{
if (pubKey.isEmpty()) {
initPublicEncrypt();
m_initEncrypt.waitForFinished();
}
if (pubKey.isEmpty()) {
rsac.genKeyPair(priKey, pubKey, 2048);
}
return QString(pubKey);
}
bool DbusUpperInterface::sendPassword(const QString username, QByteArray password)
{
if (priKey.isEmpty())
return false;
QByteArray decryptText;
rsac.decryptData(password, decryptText, priKey); // 解密
if (GetLockState()) {
if (m_pamAuth && m_pamAuth->inAuthentication() && (m_pamAuth->authenticationUser() == username)) {
m_pamAuth->respond(QString(decryptText));
} else if (m_pamAuth) {
m_pamAuth->authenticate(username);
QTimer::singleShot(100, this, [=]() { m_pamAuth->respond(QString(decryptText)); });
}
}
return true;
}
void DbusUpperInterface::BioFindDeviceByName(QJsonObject &reqObj, QJsonObject &retObj)
{
QVariant varUserId = reqObj.value("UserId");
QVariant varDevName = reqObj.value("DevName");
if (varUserId.isValid() && varDevName.isValid() && m_bioAuth) {
DeviceInfoPtr ptrDevInfo = m_bioAuth->findDeviceByName(varUserId.toInt(), varDevName.toString());
QJsonObject objDevInfo;
if (ptrDevInfo) {
objDevInfo["id"] = ptrDevInfo->id;
objDevInfo["ShortName"] = ptrDevInfo->shortName;
objDevInfo["FullName"] = ptrDevInfo->fullName;
objDevInfo["DriverEnable"] = ptrDevInfo->driverEnable;
objDevInfo["DeviceNum"] = ptrDevInfo->deviceNum;
objDevInfo["DeviceType"] = ptrDevInfo->deviceType;
objDevInfo["StorageType"] = ptrDevInfo->storageType;
objDevInfo["EigType"] = ptrDevInfo->eigType;
objDevInfo["VerifyType"] = ptrDevInfo->verifyType;
objDevInfo["IdentifyType"] = ptrDevInfo->identifyType;
objDevInfo["BusType"] = ptrDevInfo->busType;
objDevInfo["DeviceStatus"] = ptrDevInfo->deviceStatus;
objDevInfo["OpsStatus"] = ptrDevInfo->OpsStatus;
}
retObj["Content"] = objDevInfo;
} else {
retObj["Content"] = QJsonObject();
}
}
int DbusUpperInterface::BioStartAuth(const QJsonObject &objInfo)
{
int nRet = -1;
QVariant varUserId = objInfo.value("UserId");
QVariant varDevId = objInfo.value("DevId");
if (varUserId.isValid() && varDevId.isValid() && m_bioAuth) {
m_bioAuth->startAuth(varUserId.toInt(), varDevId.toInt());
nRet = 0;
}
return nRet;
}
int DbusUpperInterface::BioStopAuth(const QJsonObject &objInfo)
{
Q_UNUSED(objInfo);
int nRet = -1;
if (m_bioAuth) {
m_bioAuth->stopAuth();
nRet = 0;
}
return nRet;
}
void DbusUpperInterface::GetUsdMediaKeys(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetUsdMediaKeys(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
void DbusUpperInterface::GetUsdMediaStateKeys(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetUsdMediaStateKeys(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
int DbusUpperInterface::SetUsdMediaStateKeys(const QJsonObject &objInfo)
{
int nRet = -1;
QString strKey = objInfo.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = objInfo.value("Value").toVariant();
if (value.isValid()) {
if (m_gsettingsHelper->SetUsdMediaStateKeys(strKey, value)) {
nRet = 0;
}
}
}
return nRet;
}
void DbusUpperInterface::GetWeatherKeys(QJsonObject &reqObj, QJsonObject &retObj)
{
QString strKey = reqObj.value("Key").toString();
if (!strKey.isEmpty()) {
QVariant value = m_gsettingsHelper->GetWeatherKeys(strKey);
switch (value.type()) {
case QVariant::Bool:
retObj[strKey] = value.toBool();
return;
case QVariant::Int:
retObj[strKey] = value.toInt();
return;
case QVariant::String:
retObj[strKey] = value.toString();
qDebug() << retObj[strKey];
return;
case QVariant::UInt:
retObj[strKey] = value.toDouble();
return;
case QVariant::Double:
retObj[strKey] = value.toDouble();
return;
default:
break;
}
}
retObj["Ret"] = -2;
retObj["Message"] = "Key is invalid!!";
}
bool DbusUpperInterface::usdExternalDoAction(const QJsonObject &objInfo)
{
int nRet = -1;
int actionType = objInfo.value("Content").toInt();
if (m_usdHelper->usdExternalDoAction(actionType)) {
nRet = 0;
}
return nRet;
}
bool DbusUpperInterface::blockShortcut(const QJsonObject &objInfo)
{
int nRet = -1;
bool isBlock = objInfo.value("Content").toBool();
if (m_kglobalHelper->blockShortcut(isBlock)) {
nRet = 0;
}
return nRet;
}
bool DbusUpperInterface::lockStateChanged(const QJsonObject &objInfo)
{
bool state = objInfo.value("Content").toBool();
bool isSessionTools = objInfo.value("SessionTools").toBool();
if (m_bLockState != state && !isSessionTools) {
m_bLockState = state;
}
emitLockState(state, isSessionTools);
return m_bLockState;
}
int DbusUpperInterface::SetPowerManager(const QJsonObject &objInfo)
{
int nRet = -1;
QString strFuncName = objInfo.value("Content").toString();
bool isForceExecute = objInfo.value("Force").toBool();
bool isSessionTools = objInfo.value("IsSessionTools").toBool(false);
if (!strFuncName.isEmpty()) {
qWarning() << __LINE__ << __FUNCTION__ << strFuncName << isForceExecute;
if (strFuncName != "UpgradeThenRestart" && strFuncName != "UpgradeThenShutdown" && m_sessionHelper) {
if (!isGreeterMode()) {
if (!isForceExecute && !isSessionTools) {
if (strFuncName == "Hibernate" || strFuncName == "Suspend") {
QStringList sleepLockcheck = m_sessionHelper->getLockCheckStatus("sleep");
if (!sleepLockcheck.isEmpty()) {
AppBlockWindow(strFuncName);
return -1;
}
}
if (strFuncName == "Reboot" || strFuncName == "PowerOff" || strFuncName == "Logout") {
QStringList shutdownLockcheck = m_sessionHelper->getLockCheckStatus("shutdown");
if (shutdownLockcheck.count() > 0) {
AppBlockWindow(strFuncName);
return -1;
}
QStringList logoutLockcheck = m_sessionHelper->getLockCheckStatus("logout");
if (logoutLockcheck.count() > 0) {
qDebug() << "logoutlockcheck";
AppBlockWindow(strFuncName, false);
return -1;
}
if (GetLoggedInUsersCount() > 1 && strFuncName != "Logout") {
qDebug() << "multiuserblockwindow";
if (strFuncName == "Reboot") {
MultiUserBlockWindow("Reboot");
} else if (strFuncName == "PowerOff") {
MultiUserBlockWindow("PowerOff");
}
return -1;
}
}
}
// 当å˜åœ¨å¤šç”¨æˆ·ä¸”å˜åœ¨è½¯é˜»å¡žçš„æƒ…况下,且用户选择的是关机或é‡�å�¯ï¼Œå¹¶ä¸”用户在软阻塞场景下点击了确认按钮
if (strFuncName == "RebootSoftBlock" || strFuncName == "PoweroffSoftBlock") {
if (strFuncName == "RebootSoftBlock") {
strFuncName = "Reboot";
} else if (strFuncName == "PoweroffSoftBlock") {
strFuncName = "PowerOff";
}
if (GetLoggedInUsersCount() > 1) {
qDebug() << "multiuserblockwindow";
if (strFuncName == "Reboot") {
MultiUserBlockWindow("Reboot");
} else if (strFuncName == "PowerOff") {
MultiUserBlockWindow("PowerOff");
}
return -1;
}
}
qDebug() << "doaction test" << strFuncName;
if (!isForceExecute) {
m_sessionHelper->doAction(strFuncName);
} else {
if (m_login1Helper) {
m_login1Helper->setPowerManager(strFuncName);
} else {
m_sessionHelper->doAction(strFuncName);
}
}
} else if (m_login1Helper) {
m_login1Helper->setPowerManager(strFuncName);
}
} else if (strFuncName == "UpgradeThenRestart" && m_systemsUpgradeHelper) {
m_systemsUpgradeHelper->doUpgradeThenRboot();
} else if (strFuncName == "UpgradeThenShutdown" && m_systemsUpgradeHelper) {
m_systemsUpgradeHelper->doUpgradeThenShutdown();
}
nRet = 0;
}
return nRet;
}
bool DbusUpperInterface::ShowFolder(QStringList paths)
{
int nRet = -1;
if (m_fileManagerHelper->showFolders(paths)) {
nRet = 0;
}
return nRet;
}
QSharedPointer DbusUpperInterface::getGSettingsInstance()
{
return m_gsettingsHelper;
}
void DbusUpperInterface::CheckTurnOnScreen()
{
if (m_sessionWatcher && m_sessionWatcher->isSessionIdle()) {
QProcess *procTurnOn = new QProcess(this);
auto finishedSignal = static_cast(&QProcess::finished);
connect(procTurnOn, finishedSignal, this, [=](int exitCode, QProcess::ExitStatus exitStatus) {
qDebug() << procTurnOn->arguments() << "finished:" << exitCode << exitStatus;
procTurnOn->deleteLater();
});
if ("wayland" == qgetenv("XDG_SESSION_TYPE")) {
QProcessEnvironment procEnv = QProcessEnvironment::systemEnvironment();
procEnv.insert("QT_QPA_PLATFORM", "wayland");
procTurnOn->setProcessEnvironment(procEnv);
procTurnOn->start("kscreen-doctor", { "--dpms", "on" });
} else {
procTurnOn->start("xset", { "dpms", "force", "on" });
}
m_sessionWatcher->simulateSessionActive();
qDebug() << "The display is turned on" << qgetenv("XDG_SESSION_TYPE");
} else {
qDebug() << "session not in idle";
}
}
ukui-screensaver/src/lock-backend/org.ukui.ScreenSaver.xml 0000664 0001750 0001750 00000003762 15254241235 022616 0 ustar feng feng
ukui-screensaver/src/lock-backend/pamauthenticate.h 0000664 0001750 0001750 00000004653 15254241235 021437 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef PAMAUTHENTICATE_H
#define PAMAUTHENTICATE_H
#include
#include
#include
#include "lightdmhelper.h"
#include
typedef struct pam_message PAM_MESSAGE;
typedef struct pam_response PAM_RESPONSE;
class AuthPamThread;
class QSocketNotifier;
class PamAuthenticate : public QObject
{
Q_OBJECT
public:
explicit PamAuthenticate(QSharedPointer helper, QObject *parent = nullptr);
public:
bool inAuthentication() const;
bool isAuthenticated() const;
QString authenticationUser() const;
QString autologinUserHint() const;
public Q_SLOTS:
void authenticate(const QString &username = QString());
void respond(const QString &response);
void cancelAuthentication();
Q_SIGNALS:
void showMessage(QString text, int type);
void showPrompt(QString text, int type);
void showBinaryPrompt(QVariant value,int type);
void authenticationComplete();
private Q_SLOTS:
void onSockRead();
void onLDMShowMessage(QString strMsg, QLightDM::Greeter::MessageType type);
void onLDMShowPrompt(QString strPrompt, QLightDM::Greeter::PromptType type);
private:
void _respond(const struct pam_response *response);
bool isJsonString(const QString &str);
private:
QSharedPointer m_lightdmHelper = nullptr;
bool m_isInAuthentication = false;
bool m_isAuthenticated = false;
bool m_isOtherUser = false;
AuthPamThread *m_threadAuthPam = nullptr;
QSocketNotifier *m_socketNotifier = nullptr;
int m_nPrompts = 0;
QStringList m_responseList;
QList m_messageList;
int m_fdToParent[2];
int m_fdToChild[2];
QString m_strUserName;
bool hasSendBiometricPam = false;
};
#endif // PAMAUTHENTICATE_H
ukui-screensaver/src/lock-backend/main.cpp 0000664 0001750 0001750 00000013575 15254241137 017546 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "qtsinglecoreapplication.h"
#include "utils.h"
#include "dbusupperinterface.h"
#include "screensaveradaptor.h"
#include "personalizeddata.h"
#include "msysdbus.h"
#include "../ukccplugins/sessiondbus/screenlockinterface.h"
#include "../ukccplugins/sessiondbus/screensaverinterface.h"
#include
int main(int argc, char *argv[])
{
syslog(LOG_INFO, "[ukui-screensaver-backend] startup!!");
initUkuiLog4qt("ukui-screensaver-backend");
// ��或关机时�被session关掉
qunsetenv("SESSION_MANAGER");
QString strDisplay = "";
if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") {
strDisplay = QLatin1String(getenv("WAYLAND_DISPLAY"));
} else {
strDisplay = QLatin1String(getenv("DISPLAY"));
}
QString singleId = QString("ukui-screensaver-backend" + strDisplay);
QtSingleCoreApplication a(singleId, argc, argv);
if (a.isRunning()) {
qDebug() << "There is an instance running";
return 0;
}
qInfo() << "ukui screensaver backend Started!!";
// 会�管�器退出时,���端也退出
prctl(PR_SET_PDEATHSIG, SIGKILL);
// 命令行�数解�
QCommandLineParser parser;
parser.setApplicationDescription(QCoreApplication::translate("main", "Backend for the ukui ScreenSaver."));
parser.addHelpOption();
parser.addVersionOption();
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
QCommandLineOption lockStartupOption(
QStringLiteral("lock-startup"), QCoreApplication::translate("main", "lock the screen by startup"));
parser.addOptions({ lockStartupOption });
parser.process(a.arguments());
// 检查该程�是�已�有实例在�行
QDBusInterface *checkInterface = new QDBusInterface(
"org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", QDBusConnection::sessionBus());
QDBusReply ret = checkInterface->call("NameHasOwner", "cn.kylinos.ScreenSaver");
if (ret.value()) {
qDebug() << "There is an instance running";
return EXIT_FAILURE;
}
// 注册DBus
syslog(LOG_INFO, "[ukui-screensaver-backend] DbusUpperInterface initing!!");
DbusUpperInterface interface;
syslog(LOG_INFO, "[ukui-screensaver-backend] DbusUpperInterface inited!!");
ScreenSaverAdaptor adaptor(&interface);
QDBusConnection service = QDBusConnection::sessionBus();
QString sessionDbus = SS_DBUS_SERVICE;
if (!service.registerService(sessionDbus)) {
QString displayNum = QString(qgetenv("DISPLAY")).replace(":", "").replace(".", "_");
sessionDbus = QString("%1%2").arg(QString(SS_DBUS_SERVICE)).arg(displayNum);
if (!service.registerService(sessionDbus)) {
qDebug() << service.lastError().message();
return EXIT_FAILURE;
}
}
if (!service.registerObject(
SS_DBUS_PATH,
SS_DBUS_SERVICE,
&adaptor,
QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)) {
qDebug() << service.lastError().message();
return EXIT_FAILURE;
}
// 注册控制���件接��务
if (!isGreeterMode()) {
ScreenlockInterface *lockInterface = new ScreenlockInterface(&interface, &interface);
if (!service.registerObject(
SL_SESSION_DBUS_PATH,
lockInterface,
QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllProperties
| QDBusConnection::ExportAllSignals)) {
qDebug() << service.lastError().message();
return EXIT_FAILURE;
}
ScreensaverInterface *saverInterface = new ScreensaverInterface(&interface, &interface);
if (!service.registerObject(
SS_SESSION_DBUS_PATH,
saverInterface,
QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllProperties
| QDBusConnection::ExportAllSignals)) {
qDebug() << service.lastError().message();
return EXIT_FAILURE;
}
}
qDebug() << service.baseService();
QObject::connect(checkInterface, SIGNAL(NameLost(QString)), &interface, SLOT(onNameLost(QString)));
if (parser.isSet(lockStartupOption)) {
syslog(LOG_INFO, "[ukui-screensaver-backend] lock startup mode begin!!");
interface.LockStartupMode();
syslog(LOG_INFO, "[ukui-screensaver-backend] lock startup mode end!!");
}
interface.init();
MSysDbus m_sysDbus(&interface);
QString displayNum = QString(qgetenv("DISPLAY")).replace(":", "").replace(".", "_");
QString sysService = "org.ukui.screensaver._" + displayNum;
if (!QDBusConnection::systemBus().registerService("org.ukui.screensaver")) {
qDebug() << "registerService failed";
}
QDBusConnection::systemBus().registerObject(
"/", "org.ukui.screensaver", &m_sysDbus, QDBusConnection::ExportAllSlots);
syslog(LOG_INFO, "[ukui-screensaver-backend] application event loop begin!!");
return a.exec();
}
ukui-screensaver/src/lock-backend/proxymodel.cpp 0000664 0001750 0001750 00000006473 15254241137 021023 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "proxymodel.h"
#include
KyUsersModel::KyUsersModel(QObject *parent) : QAbstractListModel(parent), m_abstractListModel(nullptr) {}
QVariant KyUsersModel::data(const QModelIndex &index, int role) const
{
return m_abstractListModel->index(index.row(), 0).data(role);
}
int KyUsersModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return sourceRowCount();
}
QHash KyUsersModel::roleNames() const
{
return m_abstractListModel == nullptr ? QHash() : m_abstractListModel->roleNames();
}
void KyUsersModel::setSourceModel(QAbstractListModel *sourceModel)
{
if (m_abstractListModel) {
disconnect(
m_abstractListModel,
SIGNAL(rowsInserted(const QModelIndex &, int, int)),
this,
SLOT(onSourceRowsInserted(const QModelIndex &, int, int)));
disconnect(
m_abstractListModel,
SIGNAL(rowsRemoved(const QModelIndex &, int, int)),
this,
SLOT(onSourceRowsRemoved(const QModelIndex &, int, int)));
disconnect(
m_abstractListModel,
SIGNAL(dataChanged(QModelIndex, QModelIndex)),
this,
SLOT(onSourceDataChanged(const QModelIndex &, const QModelIndex &)));
}
m_abstractListModel = sourceModel;
beginResetModel();
endResetModel();
connect(
m_abstractListModel,
SIGNAL(rowsInserted(const QModelIndex &, int, int)),
this,
SLOT(onSourceRowsInserted(const QModelIndex &, int, int)));
connect(
m_abstractListModel,
SIGNAL(rowsRemoved(const QModelIndex &, int, int)),
this,
SLOT(onSourceRowsRemoved(const QModelIndex &, int, int)));
connect(
m_abstractListModel,
SIGNAL(dataChanged(QModelIndex, QModelIndex)),
this,
SLOT(onSourceDataChanged(const QModelIndex &, const QModelIndex &)));
}
int KyUsersModel::sourceRowCount() const
{
return m_abstractListModel == nullptr ? 0 : m_abstractListModel->rowCount();
}
void KyUsersModel::onSourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
dataChanged(createIndex(topLeft.row(), 0), createIndex(bottomRight.row(), 0));
Q_EMIT userInfoChanged();
}
void KyUsersModel::onSourceRowsInserted(const QModelIndex &parent, int start, int end)
{
Q_UNUSED(parent);
beginInsertRows(parent, start, end);
endInsertRows();
Q_EMIT userInfoChanged();
}
void KyUsersModel::onSourceRowsRemoved(const QModelIndex &parent, int start, int end)
{
Q_UNUSED(parent);
beginRemoveRows(parent, start, end);
endRemoveRows();
Q_EMIT userInfoChanged();
}
ukui-screensaver/src/lock-backend/bioauthenticate.h 0000664 0001750 0001750 00000006240 15254241137 021426 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef BIOAUTHENTICATE_H
#define BIOAUTHENTICATE_H
#include
#include
#include
#include "../../src/common/biodefines.h"
class BiometricHelper;
class FreedesktopHelper;
class UniAuthService;
class BioAuthenticate : public QObject
{
Q_OBJECT
public:
explicit BioAuthenticate(QObject *parent = nullptr);
DeviceMap getAvailableDevices(int nUid);
QList getDisabledDevices(int nUid);
inline BIOAUTH_STATE getBioAuthState()
{
return m_bioauthState;
}
inline DeviceInfo getCurBioInfo()
{
return m_deviceInfo;
}
DeviceInfoPtr findDeviceById(int nUid, int nDevId);
DeviceInfoPtr findDeviceByName(int nUid, QString strDevName);
void startAuth(int uid, int nDevId);
void stopAuth();
QString getDefaultDevice(int nUid, QString strUserName);
QString getDefaultDevice(int nUid, QString strUserName, int bioType);
public Q_SLOTS:
void onServiceStatusChanged(const QString &strService, bool bActive);
void onBioDeviceChanged(int drvid, int action, int devNum);
void onStatusChanged(int drvid, int status);
void onFrameWritten(int drvid);
void onIdentifyComplete(QDBusPendingCallWatcher *watcher);
void onBioAuthComplete(bool isSuccess, int nError);
void onPamAuthComplete();
void onBioAuthTimer();
Q_SIGNALS:
void bioServiceStatusChanged(bool bValid);
void bioDeviceChanged();
void bioAuthShowMessage(QString strMsg);
void bioAuthStateChanged(int nState);
void bioAuthFrameData(QString strData);
void bioAuthCompleted(int nUid, bool isSuccess, int nError, int nMaxFailedTime, int nFailedTime);
private:
void initBioService();
void initConncetions();
bool getBioAuthEnable(QString strUserName, int nType);
void checkAvailableBioInfo(int nUid);
void clearBioData();
void SetExtraInfo(QString extra_info, QString info_type);
void startBioAuth(unsigned uTimeout = 1000);
void _startAuth();
private:
BiometricHelper *m_biometricHelper = nullptr;
FreedesktopHelper *m_systemFdHelper = nullptr;
QMap m_mapDevices; // 用户�用的设备
DeviceInfo m_deviceInfo;
BIOAUTH_STATE m_bioauthState;
int m_fdFrame = -1;
int m_nUid = -1;
bool m_isStopped = false; // 是å�¦è¢«å¼ºåˆ¶ç»ˆæ¢
int m_maxFailedTimes;
QMap> m_mapDisableDev;
QMap> m_failedTimes;
QTimer *m_bioTimer;
int m_fTimeoutTimes = 0;
QList m_listPriority;
};
#endif // BIOAUTHENTICATE_H
ukui-screensaver/src/lock-backend/CSingleton.h 0000664 0001750 0001750 00000002664 15254241137 020331 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef KYSINGLETON_H
#define KYSINGLETON_H
template
class KySingleTon
{
public:
// 创建�例实例
template
static T *instance(Args &&... args)
{
if (m_pSingleInstance == nullptr) {
m_pSingleInstance = new T(std::forward(args)...);
}
return m_pSingleInstance;
}
// 获��例
static T *getInstance()
{
return m_pSingleInstance;
}
// åˆ é™¤å�•例
static void destroyInstance()
{
delete m_pSingleInstance;
m_pSingleInstance = nullptr;
}
private:
KySingleTon();
virtual ~KySingleTon();
private:
static T *m_pSingleInstance;
};
template
T *KySingleTon::m_pSingleInstance = nullptr;
#endif
ukui-screensaver/src/lock-backend/gsettingshelper.h 0000664 0001750 0001750 00000014370 15254241235 021467 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef GSETTINGSHELPER_H
#define GSETTINGSHELPER_H
#include
#include
#include
class GSettingsHelper : public QObject
{
Q_OBJECT
public:
explicit GSettingsHelper(QObject *parent = nullptr);
virtual ~GSettingsHelper();
public:
QVariant GetLockScreenConf(QString strKey);
bool SetLockScreenConf(QString strKey, QVariant value);
QVariant ResetLockScreenConf(QString strKey);
QVariant GetScreenSaverConf(QString strKey);
bool SetScreenSaverConf(QString strKey, QVariant value);
QVariant ResetScreenSaverConf(QString strKey);
QVariant GetPowerManagerConf(QString strKey);
bool SetPowerManagerConf(QString strKey, QVariant value);
QVariant GetMateBgConf(QString strKey);
bool SetMateBgConf(QString strKey, QVariant value);
QVariant GetUkccPluginsConf(QString strKey);
bool SetUkccPluginsConf(QString strKey, QVariant value);
QVariant GetThemeStyleConf(QString strKey);
bool SetThemeStyleConf(QString strKey, QVariant value);
QVariant GetSessionConf(QString strKey);
bool SetSessionConf(QString strKey, QVariant value);
QVariant GetKeyboardConf(QString strKey);
bool SetKeyboardConf(QString strKey, QVariant value);
QVariant GetUsdMediaKeys(QString strKey);
QVariant GetUsdMediaStateKeys(QString strKey);
bool SetUsdMediaStateKeys(QString strKey, QVariant value);
QVariant GetWeatherKeys(QString strKey);
public Q_SLOTS:
void onLockScreenConfigChanged(QString strKey);
void onScreenSaverConfigChanged(QString strKey);
void onPowerManagerConfigChanged(QString strKey);
void onMateBgConfigChanged(QString strKey);
void onUkccPluginsConfigChanged(QString strKey);
void onThemeStyleConfigChanged(QString strKey);
void onSessionConfigChanged(QString strKey);
void onKeyboardConfigChanged(QString strKey);
void onUsdMediaKeysConfigChanged(QString strKey);
void onUsdMediaStateKeysConfigChanged(QString strKey);
void onWeatherKeysConfigChanged(QString strKey);
Q_SIGNALS:
void lockScreenConfigChanged(QString strKey, QVariant value);
void screenSaverConfigChanged(QString strKey, QVariant value);
void powerManagerConfigChanged(QString strKey, QVariant value);
void mateBgConfigChanged(QString strKey, QVariant value);
void ukccPluginsConfigChanged(QString strKey, QVariant value);
void themeStyleConfigChanged(QString strKey, QVariant value);
void sessionConfigChanged(QString strKey, QVariant value);
void keyboardConfigChanged(QString strKey, QVariant value);
void usdMediaKeysConfigChanged(QString strKey, QVariant value);
void usdMediaStateKeysConfigChanged(QString strKey, QVariant value);
void idleLockConfigChanged(int idleLock);
void weatherKeysConfigChanged(QString strKey, QVariant value);
private:
bool initLockScreen();
bool initScreenSaver();
bool initPowerManager();
bool initMateBg();
bool initUkccPlugins();
bool initThemeStyle();
bool initSession();
bool initKeyboard();
bool initUsdMediaKeys();
bool initUsdMediaStateKeys();
bool initWeatherKeys();
private:
QGSettings *m_gsLockScreen = nullptr;
QGSettings *m_gsScreenSaver = nullptr;
QGSettings *m_gsPowerManager = nullptr;
QGSettings *m_gsMateBg = nullptr;
QGSettings *m_gsUkccPlugins = nullptr;
QGSettings *m_gsThemeStyle = nullptr;
QGSettings *m_gsSession = nullptr;
QGSettings *m_gsKeyboard = nullptr;
QGSettings *m_gsUsdMediaKeys = nullptr;
QGSettings *m_gsUsdMediaStateKeys = nullptr;
QGSettings *m_gsWeatherKeys = nullptr;
bool m_bShowRestTime = false;
bool m_bShowCustomRestTime = false;
bool m_bShowUkuiRestTime = false;
int m_nCycleTime = 1;
bool m_bAutomaticSwitchingEnable = false;
QString m_strBackgroundPath;
QString m_strMyText;
bool m_bTextIsCenter = true;
bool m_bShowMessageEnable = false;
int m_nMessageNum = 0;
QString m_strVideoFormat;
QString m_strVideoPath;
int m_nVideoSize = 0;
int m_nVideoWidth = 0;
int m_nVideoHeight = 0;
int m_nSubMode = -1;
int m_nWeatherPosition = 0;
QString m_sMusicPath;
int m_nPhotoCycleMode = -1;
int m_nPhotoCycleInterval = -1;
QStringList m_sDefaultPhotoPath;
QStringList m_sCustomPhptoPath;
QString m_sSelectPhotoPath;
bool m_bMusicFollowSystem;
QString m_sUrlAddress;
int m_nIdleDelay = -1;
int m_nIdleLock = -1;
bool m_bIdleActivationEnable = false;
bool m_bIdleLockEnable = false;
int m_nLockTimeout = -1;
bool m_bCloseActivationEnable = false;
bool m_bSleepActivationEnable = false;
bool m_bLockEnable = false;
QString m_strBackground;
bool m_bLockSuspend = false;
bool m_bLockHibernate = false;
bool m_bLockBlankScreen = false;
int m_nSleepComputeAc = -1;
int m_nSleepDisplayAc = -1;
QString m_strButtonLidAc;
QString m_strButtonPower;
QString m_strPicFileName;
QString m_strPicOptions;
QString m_strPrimaryColor;
int m_nHourSystem = 0;
QString m_strDateType;
double m_lfFontSize = 0.0;
QString m_strThemeColor;
QString m_font;
int m_menuTransparency = 0;
QString m_styleName;
int m_nSessionIdle = -1;
bool m_nSessionLogout = false;
bool m_nSessionPoweroff = false;
bool m_capsState = false;
QString m_areaScreenShot;
QString m_areaScreenShot2;
QString m_screenShot;
QString m_screenShot2;
QString m_windowScreenshot;
QString m_saverMode;
QStringList m_saverTheme;
int m_imageTSEffect;
int m_imageSwitchInterval;
int m_rfkillState = -1;
QString m_sWeatherData;
};
#endif // GSETTINGSHELPER_H
ukui-screensaver/src/lock-backend/pamauthenticate.cpp 0000664 0001750 0001750 00000037737 15254241235 022003 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include "pamauthenticate.h"
#include "../../src/common/global_utils.h"
#include "authpamthread.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
PamAuthenticate::PamAuthenticate(QSharedPointer helper, QObject *parent)
: QObject(parent), m_lightdmHelper(helper)
{
m_fdToParent[0] = -1;
m_fdToParent[1] = -1;
m_fdToChild[0] = -1;
m_fdToChild[1] = -1;
connect(
m_lightdmHelper.get(),
SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
this,
SLOT(onLDMShowMessage(QString, QLightDM::Greeter::MessageType)));
connect(
m_lightdmHelper.get(),
SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)),
this,
SLOT(onLDMShowPrompt(QString, QLightDM::Greeter::PromptType)));
connect(m_lightdmHelper.get(), SIGNAL(authenticationComplete()), this, SIGNAL(authenticationComplete()));
}
bool PamAuthenticate::inAuthentication() const
{
if (m_isOtherUser)
return m_lightdmHelper->inAuthentication();
else {
return m_isInAuthentication;
}
}
bool PamAuthenticate::isAuthenticated() const
{
if (m_isOtherUser)
return m_lightdmHelper->isAuthenticated();
else {
return m_isAuthenticated;
}
}
QString PamAuthenticate::authenticationUser() const
{
if (m_isOtherUser)
return m_lightdmHelper->authenticationUser();
else {
return m_strUserName;
}
}
QString PamAuthenticate::autologinUserHint() const
{
return m_lightdmHelper->autologinUserHint();
}
void PamAuthenticate::authenticate(const QString &username)
{
m_isOtherUser = (getenv("USER") != username);
if (username == "*guest") {
m_lightdmHelper->authenticateAsGuest();
hasSendBiometricPam = false;
} else if (m_isOtherUser) {
m_lightdmHelper->authenticate(username);
hasSendBiometricPam = false;
} else {
cancelAuthentication();
m_strUserName = username;
if (pipe(m_fdToParent) || pipe(m_fdToChild))
qDebug() << "create pipe failed: " << strerror(errno);
m_threadAuthPam = new AuthPamThread();
m_threadAuthPam->startAuthPam(m_fdToChild[0], m_fdToParent[1], username);
m_isInAuthentication = true;
m_socketNotifier = new QSocketNotifier(m_fdToParent[0], QSocketNotifier::Read);
connect(m_socketNotifier, &QSocketNotifier::activated, this, &PamAuthenticate::onSockRead);
}
}
void PamAuthenticate::respond(const QString &response)
{
if (m_isOtherUser) {
if (response == BIOMETRIC_IGNORE && !hasSendBiometricPam) {
return;
}
m_lightdmHelper->respond(response);
} else {
m_nPrompts--;
m_responseList.push_back(response);
if (m_nPrompts == 0) {
// å�‘é€�å“�应到å�进程
int j = 0;
PAM_RESPONSE *resp = (PAM_RESPONSE *)calloc(m_messageList.size(), sizeof(PAM_RESPONSE));
// �应的数�和消�的数�一致,如果消�类型�是PROMPT,则�应是空的
for (int i = 0; i < m_messageList.size(); i++) {
struct pam_message message = m_messageList[i];
PAM_RESPONSE *r = &resp[i];
if (message.msg_style == PAM_PROMPT_ECHO_OFF || message.msg_style == PAM_PROMPT_ECHO_ON
|| (message.msg_style == PAM_BINARY_PROMPT && j < m_responseList.count())) {
int respLength = m_responseList[j].length() + 1;
r->resp = (char *)malloc(sizeof(char) * respLength);
memcpy(r->resp, m_responseList[j].toLocal8Bit().data(), respLength);
j++;
}
}
_respond(resp);
free(resp);
m_messageList.clear();
m_responseList.clear();
} else if (m_nPrompts < 0) {
// 当m_nPromptså°�于0时,需é‡�置为0。å�¦åˆ™åœ¨ä¸‹ä¸€æ¬¡æ”¶åˆ°pam消æ�¯æ—¶ï¼Œä¼šé©¬ä¸Šå�‘é€�一个空å“�应,导致密ç �为空错误æ��示
m_nPrompts = 0;
m_responseList.clear();
}
}
}
void PamAuthenticate::cancelAuthentication()
{
if (m_isOtherUser)
m_lightdmHelper->cancelAuthentication();
else {
if (m_threadAuthPam) {
m_messageList.clear();
m_responseList.clear();
m_isAuthenticated = false;
m_isInAuthentication = false;
m_nPrompts = 0;
if (m_socketNotifier) {
disconnect(m_socketNotifier, &QSocketNotifier::activated, this, &PamAuthenticate::onSockRead);
delete m_socketNotifier;
m_socketNotifier = nullptr;
}
if (m_fdToParent[1] >= 0) {
close(m_fdToParent[1]);
m_fdToParent[1] = -1;
}
if (m_fdToChild[1] >= 0) {
close(m_fdToChild[1]);
m_fdToChild[1] = -1;
}
m_threadAuthPam->stopAuthPam();
delete m_threadAuthPam;
m_threadAuthPam = nullptr;
if (m_fdToParent[0] >= 0) {
close(m_fdToParent[0]);
m_fdToParent[0] = -1;
}
if (m_fdToChild[0] >= 0) {
close(m_fdToChild[0]);
m_fdToChild[0] = -1;
}
}
}
}
static void writeData(int fd, const void *buf, ssize_t count)
{
if (write(fd, buf, count) != count)
qDebug() << "write to parent failed: " << strerror(errno);
}
static void writeString(int fd, const char *data)
{
int length = data ? strnlen(data, 1024) : -1;
writeData(fd, &length, sizeof(length));
if (data)
writeData(fd, data, sizeof(char) * length);
}
static int readData(int fd, void *buf, size_t count)
{
ssize_t nRead = read(fd, buf, count);
if (nRead < 0)
qDebug() << "read data failed: " << strerror(errno);
return nRead;
}
static char *readString(int fd)
{
int length;
if (readData(fd, &length, sizeof(length)) <= 0)
return NULL;
if (length <= 0)
length = 0;
char *value = (char *)malloc(sizeof(char) * (length + 1));
readData(fd, value, length);
value[length] = '\0';
return value;
}
void PamAuthenticate::onSockRead()
{
// qDebug() << "has message";
int msgLength;
int authComplete = 0;
readData(m_fdToParent[0], &authComplete, sizeof(authComplete));
if (authComplete) {
int authRet = -1;
if (readData(m_fdToParent[0], (void *)&authRet, sizeof(authRet)) <= 0)
qDebug() << "get authentication result failed: " << strerror(errno);
qDebug() << "result: " << authRet;
m_isAuthenticated = (authRet == PAM_SUCCESS);
m_isInAuthentication = false;
if (m_socketNotifier) {
m_socketNotifier->deleteLater();
m_socketNotifier = nullptr;
}
Q_EMIT authenticationComplete();
} else {
readData(m_fdToParent[0], &msgLength, sizeof(msgLength));
// qDebug() << "message length: " << msgLength;
for (int i = 0; i < msgLength; i++) {
// 读�message
struct pam_message message;
pamc_bp_t binary_prompt;
const char *auth_mode;
int idata;
int pic_len;
const unsigned char *pic_buf;
const char *str_data;
int msgType = -1;
QString binaryString;
int binaryNum;
QByteArray binaryArray;
QPair pair;
readData(m_fdToParent[0], &message.msg_style, sizeof(message.msg_style));
if (message.msg_style == PAM_BINARY_PROMPT) {
int length;
if (readData(m_fdToParent[0], &length, sizeof(length)) <= 0) {
continue;
}
if (length <= 0)
length = 0;
readData(m_fdToParent[0], &binary_prompt, length);
switch (binary_prompt->control) {
case 0x10: {
msgType = BinaryPromptAuthType;
auth_mode = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(auth_mode);
pair.first = msgType;
pair.second = binaryString;
break;
}
case 0x11: {
msgType = BinaryPromptNumber;
idata = *(int *)PAM_BP_RDATA(binary_prompt);
binaryNum = idata;
pair.first = msgType;
pair.second = binaryNum;
break;
}
case 0x12: {
msgType = BinaryPromptMessage;
str_data = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(str_data);
pair.first = msgType;
pair.second = binaryString;
break;
}
case 0x13: {
msgType = BinaryPromptImage;
pic_len = binary_prompt->length - PAM_BP_MIN_SIZE;
pic_buf = PAM_BP_RDATA(binary_prompt);
binaryArray = QByteArray(reinterpret_cast(pic_buf), pic_len);
pair.first = msgType;
pair.second = (QString)binaryArray.toBase64();
break;
}
case 0x14: {
msgType = BinaryPromptQrcodeStr;
str_data = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(str_data);
pair.first = msgType;
pair.second = binaryString;
break;
}
case 0x15: {
msgType = BinaryPromptPromptMessage;
str_data = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(str_data);
pair.first = msgType;
pair.second = binaryString;
break;
}
case 0x16: {
msgType = BinaryPromptErrorMessage;
str_data = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(str_data);
pair.first = msgType;
pair.second = binaryString;
break;
}
case 0x17: {
msgType = BinaryPromptEmergMsg;
str_data = (const char *)PAM_BP_RDATA(binary_prompt);
binaryString = QString::fromUtf8(str_data);
pair.first = msgType;
pair.second = binaryString;
break;
}
default: {
break;
}
}
} else {
message.msg = readString(m_fdToParent[0]);
qDebug() << message.msg;
m_messageList.push_back(message);
}
switch (message.msg_style) {
case PAM_PROMPT_ECHO_OFF:
m_nPrompts++;
Q_EMIT showPrompt(message.msg, PamAuth::PromptTypeSecret);
break;
case PAM_PROMPT_ECHO_ON:
m_nPrompts++;
Q_EMIT showPrompt(message.msg, PamAuth::PromptTypeQuestion);
break;
case PAM_ERROR_MSG:
Q_EMIT showMessage(message.msg, PamAuth::MessageTypeError);
break;
case PAM_TEXT_INFO:
Q_EMIT showMessage(message.msg, PamAuth::MessageTypeInfo);
break;
case PAM_BINARY_PROMPT: {
m_nPrompts++;
m_messageList.push_back(message);
Q_EMIT showBinaryPrompt(pair.second, pair.first);
break;
}
}
}
if (m_nPrompts == 0) {
// �需��应,��一个空的
PAM_RESPONSE *response = (PAM_RESPONSE *)calloc(m_messageList.size(), sizeof(PAM_RESPONSE));
_respond(response);
free(response);
m_messageList.clear();
}
}
}
void PamAuthenticate::_respond(const PAM_RESPONSE *response)
{
for (int i = 0; i < m_messageList.size(); i++) {
const PAM_RESPONSE *resp = &response[i];
writeData(m_fdToChild[1], (const void *)&resp->resp_retcode, sizeof(resp->resp_retcode));
writeString(m_fdToChild[1], resp->resp);
}
}
void PamAuthenticate::onLDMShowMessage(QString strMsg, QLightDM::Greeter::MessageType type)
{
Q_EMIT showMessage(strMsg, type);
}
void PamAuthenticate::onLDMShowPrompt(QString strPrompt, QLightDM::Greeter::PromptType type)
{
if (strPrompt == BIOMETRIC_PAM) {
hasSendBiometricPam = true;
} else {
hasSendBiometricPam = false;
}
if (isJsonString(strPrompt)) {
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(strPrompt.toUtf8(), &error);
if (error.error == QJsonParseError::NoError && jsonDoc.isObject()) {
QJsonObject jsonObj = jsonDoc.object();
if (jsonObj.contains("type")) {
int type = jsonObj["type"].toInt();
switch (type) {
case BinaryPromptNumber: {
if (jsonObj.contains("binaryInt")) {
int number = jsonObj["binaryInt"].toInt();
Q_EMIT showBinaryPrompt(number, type);
return;
}
break;
}
case BinaryPromptAuthType:
case BinaryPromptMessage:
case BinaryPromptQrcodeStr:
case BinaryPromptErrorMessage:
case BinaryPromptEmergMsg:
case BinaryPromptPromptMessage: {
if (jsonObj.contains("binaryStr")) {
QString str = jsonObj["binaryStr"].toString();
Q_EMIT showBinaryPrompt(str, type);
return;
}
break;
}
case BinaryPromptImage: {
qDebug() << "binaryPrompt image";
Q_EMIT showBinaryPrompt("", type);
return;
}
default:
break;
}
}
}
}
Q_EMIT showPrompt(strPrompt, type);
}
bool PamAuthenticate::isJsonString(const QString &str)
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &error);
return (error.error == QJsonParseError::NoError) && !doc.isNull();
}
ukui-screensaver/src/lock-backend/proxymodel.h 0000664 0001750 0001750 00000003101 15254241137 020451 0 ustar feng feng /* proxymodel.h
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301, USA.
**/
#ifndef PROXYMODEL_H
#define PROXYMODEL_H
#include
class KyUsersModel : public QAbstractListModel
{
Q_OBJECT
public:
KyUsersModel(QObject *parent = 0);
QVariant data(const QModelIndex &index, int role) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
QHash roleNames() const;
void setSourceModel(QAbstractListModel *sourceModel);
public Q_SLOTS:
void onSourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
void onSourceRowsInserted(const QModelIndex &parent, int start, int end);
void onSourceRowsRemoved(const QModelIndex &parent, int start, int end);
Q_SIGNALS:
void userInfoChanged();
private:
QAbstractListModel *m_abstractListModel;
int sourceRowCount() const;
};
#endif // PROXYMODEL_H
ukui-screensaver/src/lock-backend/personalizeddata.h 0000664 0001750 0001750 00000007515 15254241137 021615 0 ustar feng feng /*
* Copyright (C) 2023 KylinSoftCo., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#ifndef PERSONALIZEDDATA_H
#define PERSONALIZEDDATA_H
#include
#include
#include