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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/plugin-qt/wallpaperslideshow/appearancedbusproxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ QString AppearanceDBusProxy::getCurrentWorkspaceBackground()
return QDBusPendingReply<QString>(m_appearanceInterface->asyncCall(QStringLiteral("GetCurrentWorkspaceBackground")));
}

QString AppearanceDBusProxy::getCurrentWorkspaceBackgroundForMonitor(const QString &monitor)
{
return QDBusPendingReply<QString>(m_appearanceInterface->asyncCall(QStringLiteral("GetCurrentWorkspaceBackgroundForMonitor"), QVariant::fromValue(monitor)));
}

void AppearanceDBusProxy::SetGreeterBackground(const QString &url)
{
m_appearanceInterface->asyncCall(QStringLiteral("Set"), QStringLiteral("greeterbackground"), QVariant::fromValue(url));
Expand Down
1 change: 1 addition & 0 deletions src/plugin-qt/wallpaperslideshow/appearancedbusproxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
explicit AppearanceDBusProxy(QObject *parent = nullptr);
void SetCurrentWorkspaceBackgroundForMonitor(const QString &url, const QString &screenName);
QString getCurrentWorkspaceBackground();
QString getCurrentWorkspaceBackgroundForMonitor(const QString &monitor);
void SetGreeterBackground(const QString &url);

public Q_SLOTS:

Check warning on line 23 in src/plugin-qt/wallpaperslideshow/appearancedbusproxy.h

View workflow job for this annotation

GitHub Actions / cppcheck

There is an unknown macro here somewhere. Configuration is required. If Q_SLOTS is a macro then please configure it.
int GetCurrentWorkspace();


Expand Down
2 changes: 2 additions & 0 deletions src/plugin-qt/wallpaperslideshow/commondefine.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const QString APPEARANCE_INTERFACE = "org.deepin.dde.Appearance1";
#define WALLPAPER_SLIDESHOW_PATH "/org/deepin/dde/WallpaperSlideshow"
#define WALLPAPER_SLIDESHOW_INTERFACE "org.deepin.dde.WallpaperSlideshow"

#define WS_CONFIG_PATH utils::GetUserConfigDir() + "/deepin/dde-daemon/appearance/wallpaper-slideshow.json"

#define SCHEME_FILE "file://"

#define WSPOLICYLOGIN "login"
Expand Down
144 changes: 101 additions & 43 deletions src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
#include "commondefine.h"
#include "utils.h"

#include <QDBusPendingReply>

Check warning on line 10 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QDBusPendingReply> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QJsonParseError>

Check warning on line 11 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QJsonParseError> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QJsonObject>

Check warning on line 12 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QJsonObject> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QScreen>

Check warning on line 13 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QScreen> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <DDBusSender>

Check warning on line 14 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <DDBusSender> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <DGuiApplicationHelper>

Check warning on line 15 in src/plugin-qt/wallpaperslideshow/slideshowmanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <DGuiApplicationHelper> not found. Please note: Cppcheck does not need standard library headers to get proper results.

DGUI_USE_NAMESPACE

Expand All @@ -31,22 +32,27 @@

}

bool SlideshowManager::doSetWallpaperSlideShow(const QString &monitorName,const QString &wallpaperSlideShow)
bool SlideshowManager::doSetWallpaperSlideShow(const QString &monitorName, const QString &wallpaperSlideShow)
{
int idx = m_dbusProxy->GetCurrentWorkspace();
if (!isValidScreen(monitorName)) {
qWarning() << "monitor can not found: " << monitorName;
Comment thread
mhduiy marked this conversation as resolved.
return false;
}
QByteArray jsonData = m_wallpaperSlideShow.toUtf8();
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(jsonData, &err);

QJsonDocument doc = QJsonDocument::fromJson(wallpaperSlideShow.toLatin1());
QJsonObject cfgObj = doc.object();
QJsonObject cfgObj;
if (err.error == QJsonParseError::NoError && doc.isObject()) {
cfgObj = doc.object();
}

QString key = QString("%1&&%2").arg(monitorName).arg(idx);
cfgObj[monitorName] = wallpaperSlideShow;

cfgObj[key] = wallpaperSlideShow;
doc.setObject(cfgObj);

QJsonDocument docTmp;
docTmp.setObject(cfgObj);
QString value = docTmp.toJson(QJsonDocument::Compact);
QString value = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));

m_curMonitorSpace = key;
setWallpaperSlideShow(value);
return true;
}
Expand All @@ -70,15 +76,11 @@

QString SlideshowManager::doGetWallpaperSlideShow(QString monitorName)
{
int index = m_dbusProxy->GetCurrentWorkspace();

QJsonDocument doc = QJsonDocument::fromJson(m_wallpaperSlideShow.toLatin1());
QVariantMap tempMap = doc.object().toVariantMap();

QString key = QString("%1&&%2").arg(monitorName).arg(index);

if (tempMap.count(key) == 1) {
return tempMap[key].toString();
if (tempMap.count(monitorName) == 1) {
Comment thread
mhduiy marked this conversation as resolved.
return tempMap[monitorName].toString();
}

return "";
Expand All @@ -100,18 +102,23 @@

QVariantMap config = doc.object().toVariantMap();
for (auto iter : config.toStdMap()) {
const QString screenName = iter.first;
if (screenName.isEmpty()) {
qWarning() << "screenName is empty: " << iter.first;
continue;
}
if (m_wsSchedulerMap.count(iter.first) == 0) {
QSharedPointer<WallpaperScheduler> wallpaperScheduler(
new WallpaperScheduler(std::bind(&SlideshowManager::autoChangeBg, this, std::placeholders::_1, std::placeholders::_2)));
m_wsSchedulerMap[iter.first] = wallpaperScheduler;
}

if (m_wsLoopMap.count(iter.first) == 0) {
m_wsLoopMap[iter.first] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType));
m_wsLoopMap[iter.first] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType[screenName]));
}
m_wsLoopMap[iter.first]->updateWallpaperType(m_wallpaperType);
m_wsLoopMap[iter.first]->updateWallpaperType(m_wallpaperType[screenName]);

if (m_curMonitorSpace == iter.first && WallpaperLoopConfigManger::isValidWSPolicy(iter.second.toString())) {
if (WallpaperLoopConfigManger::isValidWSPolicy(iter.second.toString())) {
Comment thread
mhduiy marked this conversation as resolved.
bool bOk;
int nSec = iter.second.toString().toInt(&bOk);
if (bOk) {
Expand All @@ -129,10 +136,13 @@
void SlideshowManager::loadWSConfig()
{
WallpaperLoopConfigManger wallConfig;
QString fileName = utils::GetUserConfigDir() + "/deepin/dde-daemon/appearance/wallpaper-slideshow.json";
WallpaperLoopConfigManger::WallpaperLoopConfigMap cfg = wallConfig.loadWSConfig(fileName);
WallpaperLoopConfigManger::WallpaperLoopConfigMap cfg = wallConfig.loadWSConfig(WS_CONFIG_PATH);

for (auto monitorSpace : cfg.keys()) {
const QString screenName = monitorSpace;
if (screenName.isEmpty()) {
continue;
}
if (m_wsSchedulerMap.count(monitorSpace) == 0) {
QSharedPointer<WallpaperScheduler> wallpaperScheduler(
new WallpaperScheduler(std::bind(&SlideshowManager::autoChangeBg, this, std::placeholders::_1, std::placeholders::_2)));
Expand All @@ -142,7 +152,7 @@
m_wsSchedulerMap[monitorSpace]->setLastChangeTime(cfg[monitorSpace].lastChange);

if (m_wsLoopMap.count(monitorSpace) == 0) {
m_wsLoopMap[monitorSpace] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType));
m_wsLoopMap[monitorSpace] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType.value(screenName)));
m_wsLoopMap[monitorSpace]->updateWallpaperType(Backgrounds::BT_Custom);
}

Expand Down Expand Up @@ -185,17 +195,7 @@
return;
}

QString strIndex = QString::number(m_dbusProxy->GetCurrentWorkspace());

QStringList monitorlist = monitorSpace.split("&&");
if (monitorlist.size() != 2) {
qWarning() << "monitorSpace format error";
return;
}

if (strIndex == monitorlist.at(1)) {
setMonitorBackground(monitorlist.at(0), file);
}
setMonitorBackground(monitorSpace, file);

saveWSConfig(monitorSpace, date);
}
Expand All @@ -213,14 +213,20 @@

QVariantMap tempMap = doc.object().toVariantMap();
for (auto iter : tempMap.toStdMap()) {
const QString screenName = iter.first.split("&&").first();
if (screenName.isEmpty()) {
qWarning() << "screenName is empty: " << iter.first;
continue;
}

if (m_wsSchedulerMap.count(iter.first) != 1) {
QSharedPointer<WallpaperScheduler> wallpaperScheduler(
new WallpaperScheduler(std::bind(&SlideshowManager::autoChangeBg, this, std::placeholders::_1, std::placeholders::_2)));
m_wsSchedulerMap[iter.first] = wallpaperScheduler;
}

if (!m_wsLoopMap.contains(iter.first)) {
m_wsLoopMap[iter.first] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType));
m_wsLoopMap[iter.first] = QSharedPointer<WallpaperLoop>(new WallpaperLoop(m_wallpaperType.value(screenName)));
}

if (WallpaperLoopConfigManger::isValidWSPolicy(iter.second.toString())) {
Expand All @@ -246,7 +252,38 @@

void SlideshowManager::loadConfig()
{
m_wallpaperSlideShow = m_settingDconfig->value(GSKEYWALLPAPERSLIDESHOW).toString();
QFile::remove(WS_CONFIG_PATH);
Comment thread
mhduiy marked this conversation as resolved.

const QString wallpaperSlideShow = m_settingDconfig->value(GSKEYWALLPAPERSLIDESHOW).toString();

QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(wallpaperSlideShow.toLatin1(), &err);
if (err.error != QJsonParseError::NoError) {
qWarning() << "parse wallpaperSlideShow failed:" << err.errorString();
return;
}

QJsonObject rootObject = doc.object();
QJsonObject newObject;

// 兼容老配置,去掉&&
Comment thread
mhduiy marked this conversation as resolved.
for (auto it = rootObject.begin(); it != rootObject.end(); ++it) {
QString key = it.key();
QJsonValue value = it.value();

if (key.contains("&&")) {
QString newKey = key.split("&&").first();
newObject[newKey] = value;
} else {
newObject[key] = value;
}
}

QJsonDocument newDoc(newObject);
m_wallpaperSlideShow = newDoc.toJson(QJsonDocument::Compact);

m_settingDconfig->setValue(GSKEYWALLPAPERSLIDESHOW, m_wallpaperSlideShow);

onWallpaperChanged();
}

Expand Down Expand Up @@ -329,17 +366,38 @@

void SlideshowManager::onWallpaperChanged()
{
const auto wallpaper = m_dbusProxy->getCurrentWorkspaceBackground();
qDebug() << "wallpaper changed";
Backgrounds::instance()->refreshBackground();

for (auto it = m_wsLoopMap.begin(); it != m_wsLoopMap.end(); ++it) {
it.value()->updateLoopList();
bool update = false;
for (const auto &screen : qApp->screens()) {
if (screen) {
const QString &screenName = screen->name();
const auto &wallpaper = m_dbusProxy->getCurrentWorkspaceBackgroundForMonitor(screenName);
const auto &wallpaperType = Backgrounds::getBackgroundType(wallpaper);

if (m_wallpaperType.value(screenName) != wallpaperType) {
qInfo() << "wallpaperSlideshow type changed: old is " << m_wallpaperType[screenName] << "new: " << wallpaperType << "screen: " << screenName;
m_wallpaperType[screenName] = wallpaperType;
update = true;
}
}
}

auto wallpaperType = Backgrounds::getBackgroundType(wallpaper);
if (wallpaperType != m_wallpaperType) {
qInfo() << "wallpaperSlideshow type changed: old is " << m_wallpaperType << "new: " << wallpaperType;
m_wallpaperType = wallpaperType;
if (update) {
updateWSPolicy(m_wallpaperSlideShow);

for (auto it = m_wsLoopMap.begin(); it != m_wsLoopMap.end(); ++it) {
it.value()->updateLoopList();
}
}
}

bool SlideshowManager::isValidScreen(const QString &screenName)
{
for (auto screen : qApp->screens()) {
if (screen && screen->name() == screenName) {
return true;
}
}
return false;
}
4 changes: 2 additions & 2 deletions src/plugin-qt/wallpaperslideshow/slideshowmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ private slots:
private:
void init();
void loadConfig();
bool isValidScreen(const QString &screenName);

signals:
void propertyChanged(const QString &name, const QVariant &value);
Expand All @@ -52,6 +53,5 @@ private slots:
QMap<QString,QSharedPointer<WallpaperLoop>> m_wsLoopMap;
QSharedPointer<AppearanceDBusProxy> m_dbusProxy;
QString m_wallpaperSlideShow;
QString m_curMonitorSpace;
Backgrounds::BackgroundType m_wallpaperType;
QMap<QString, Backgrounds::BackgroundType> m_wallpaperType;
};
Loading