Skip to content

Commit 11ad726

Browse files
mhduiydeepin-bot[bot]
authored andcommitted
fix(personalization): preserve custom Treeland wallpaper
1. Add a DConfig key to record whether the Treeland desktop wallpaper was customized. 2. Mark the desktop wallpaper as customized after a successful manual wallpaper update. 3. Reset the customized flag when switching global themes after initialization. 4. Skip applying theme wallpapers when the user has customized the desktop wallpaper. Log: Preserve manually customized Treeland desktop wallpapers during theme application. fix(personalization): 保留 Treeland 自定义壁纸 1. 新增 DConfig 配置记录 Treeland 桌面壁纸是否已自定义。 2. 手动设置桌面壁纸成功后标记壁纸已自定义。 3. 初始化后切换全局主题时重置自定义标记。 4. 用户已自定义桌面壁纸时跳过主题壁纸应用。 Log: 在应用主题时保留用户手动设置的 Treeland 桌面壁纸。 PMS: BUG-366837
1 parent 3a59e9d commit 11ad726

3 files changed

Lines changed: 99 additions & 12 deletions

File tree

misc/configs/org.deepin.dde.control-center.personalization.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@
5656
"description": "",
5757
"permissions": "readwrite",
5858
"visibility": "private"
59+
},
60+
"treelandDesktopWallpaperCustomized": {
61+
"value": false,
62+
"serial": 0,
63+
"flags": [],
64+
"name": "treelandDesktopWallpaperCustomized",
65+
"name[zh_CN]": "Treeland桌面壁纸是否已自定义",
66+
"description[zh_CN]": "记录Treeland环境下用户是否手动设置过桌面壁纸",
67+
"description": "Whether the desktop wallpaper was manually customized in Treeland",
68+
"permissions": "readwrite",
69+
"visibility": "private"
5970
}
60-
}
71+
}
6172
}

src/plugin-personalization/operation/treelandworker.cpp

Lines changed: 78 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QDebug>
1414
#include <QDir>
1515
#include <QScreen>
16+
#include <DConfig>
1617

1718
#include "utils.hpp"
1819
#include <qpa/qplatformnativeinterface.h>
@@ -38,10 +39,28 @@
3839

3940
Q_LOGGING_CATEGORY(DdcPersonnalizationTreelandWorker, "dcc-personalization-treeland-woker")
4041

42+
namespace {
43+
constexpr char DccAppId[] = "org.deepin.dde.control-center";
44+
constexpr char PersonalizationConfig[] = "org.deepin.dde.control-center.personalization";
45+
constexpr char TreelandDesktopWallpaperCustomizedKey[] = "treelandDesktopWallpaperCustomized";
46+
47+
QString globalThemeBaseId(QString themeId)
48+
{
49+
if (themeId.endsWith(".light")) {
50+
themeId.chop(6);
51+
} else if (themeId.endsWith(".dark")) {
52+
themeId.chop(5);
53+
}
54+
return themeId;
55+
}
56+
}
57+
4158
TreeLandWorker::TreeLandWorker(PersonalizationModel *model, QObject *parent)
4259
: PersonalizationWorker(model, parent)
4360
{
44-
61+
#ifdef Enable_Treeland
62+
initDConfig();
63+
#endif
4564
}
4665

4766
TreeLandWorker::~TreeLandWorker()
@@ -60,6 +79,29 @@ TreeLandWorker::~TreeLandWorker()
6079

6180
#ifdef Enable_Treeland
6281

82+
void TreeLandWorker::initDConfig()
83+
{
84+
m_dconfig = Dtk::Core::DConfig::create(DccAppId, PersonalizationConfig, QString(), this);
85+
if (!m_dconfig || !m_dconfig->isValid()) {
86+
qCWarning(DdcPersonnalizationTreelandWorker) << "Failed to create personalization DConfig";
87+
return;
88+
}
89+
90+
m_desktopWallpaperCustomized = m_dconfig->value(TreelandDesktopWallpaperCustomizedKey, false).toBool();
91+
}
92+
93+
void TreeLandWorker::setDesktopWallpaperCustomized(bool customized)
94+
{
95+
if (m_desktopWallpaperCustomized == customized) {
96+
return;
97+
}
98+
99+
m_desktopWallpaperCustomized = customized;
100+
if (m_dconfig && m_dconfig->isValid()) {
101+
m_dconfig->setValue(TreelandDesktopWallpaperCustomizedKey, customized);
102+
}
103+
}
104+
63105
void TreeLandWorker::setWallpaperForMonitor(const QString &screen, const QString &url, PersonalizationExport::WallpaperSetOption option, PersonalizationExport::WallpaperSetType type)
64106
{
65107
if (checkWallpaperLockStatus()) {
@@ -79,7 +121,9 @@ void TreeLandWorker::setWallpaperForMonitor(const QString &screen, const QString
79121
void TreeLandWorker::setBackgroundForMonitor(const QString &monitorName, const QString &url, PersonalizationExport::WallpaperSetType type)
80122
{
81123
m_wallpaperWorker->setWantToSetWallpaper(nullptr);
82-
setWallpaper(monitorName, url, WallpaperContext::wallpaper_role_desktop, type);
124+
if (setWallpaper(monitorName, url, WallpaperContext::wallpaper_role_desktop, type)) {
125+
setDesktopWallpaperCustomized(true);
126+
}
83127
}
84128

85129
QString TreeLandWorker::getBackgroundForMonitor(const QString &monitorName)
@@ -118,7 +162,9 @@ void TreeLandWorker::setDefault(const QJsonObject &value)
118162
void TreeLandWorker::setAppearanceTheme(const QString &id, bool keepAuto)
119163
{
120164
qCDebug(DdcPersonnalizationTreelandWorker) << "setAppearanceTheme:" << id;
121-
if (!keepAuto) {
165+
166+
if (!keepAuto) { // 如果是控制中心设置,keepAuto = false
167+
// 控制中心ui显示的深浅色由 dde-appearance 提供,而不是treeland。如果设置为自动,不要把真实的外观显示到 dde-appearance,否则UI就会显示错误
122168
PersonalizationWorker::setAppearanceTheme(id);
123169
}
124170
if (id == ".light" && m_appearanceTheme != PersonalizationAppearanceContext::theme_type::theme_type_light) {
@@ -131,7 +177,13 @@ void TreeLandWorker::setAppearanceTheme(const QString &id, bool keepAuto)
131177
m_appearanceTheme = PersonalizationAppearanceContext::theme_type::theme_type_auto;
132178
m_appearanceContext->set_window_theme_type(PersonalizationAppearanceContext::theme_type::theme_type_auto);
133179
} else {
134-
qWarning() << "error id" << id;
180+
qWarning() << "error id" << id << m_appearanceTheme;
181+
return;
182+
}
183+
184+
if (!keepAuto) {
185+
// 刷新对应外观下的主题
186+
handleGlobalTheme(m_globalTheme);
135187
}
136188
}
137189

@@ -239,6 +291,12 @@ void TreeLandWorker::setGlobalTheme(const QString &themeId)
239291
if (m_globalTheme == themeId) {
240292
return;
241293
}
294+
295+
bool globalThemeChanged = globalThemeBaseId(themeId) != globalThemeBaseId(m_globalTheme);
296+
if (globalThemeChanged) {
297+
setDesktopWallpaperCustomized(false);
298+
}
299+
242300
m_globalTheme = themeId;
243301
handleGlobalTheme(themeId);
244302
PersonalizationWorker::setGlobalTheme(themeId);
@@ -337,12 +395,12 @@ WallpaperContext *TreeLandWorker::getOrCreateWallpaperContext(const QString &mon
337395
return nullptr;
338396
}
339397

340-
void TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url, uint32_t role, uint32_t type)
398+
bool TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url, uint32_t role, uint32_t type)
341399
{
342400
qCDebug(DdcPersonnalizationTreelandWorker) << "setWallpaper:" << monitorName << "url:" << url << "role:" << role << "type:" << type;
343401

344402
if (checkWallpaperLockStatus()) {
345-
return;
403+
return false;
346404
}
347405

348406
QString dest;
@@ -354,7 +412,7 @@ void TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url
354412
}
355413

356414
if (dest.isEmpty())
357-
return;
415+
return false;
358416

359417
auto updateWallpaperMetaData = [monitorName, url](QMap<QString, WallpaperMetaData *> &wallpapers) {
360418
if (!wallpapers.contains(monitorName)) {
@@ -388,18 +446,22 @@ void TreeLandWorker::setWallpaper(const QString &monitorName, const QString &url
388446
}
389447
} else {
390448
qCWarning(DdcPersonnalizationTreelandWorker) << "Failed to get wallpaper context for:" << monitorName;
449+
return false;
391450
}
392451
}
452+
453+
return true;
393454
}
394455

395456
void TreeLandWorker::handleGlobalTheme(const QString &themeId)
396457
{
397458
uint8_t mode = m_appearanceTheme;
398459
ThemeModel *globalTheme = m_model->getGlobalThemeModel();
460+
const QString &baseThemeId = globalThemeBaseId(themeId);
399461

400462
const QMap<QString, QJsonObject> &itemList = globalTheme->getList();
401-
if (itemList.contains(themeId)) {
402-
const QString &themePath = itemList.value(themeId).value("Path").toString();
463+
if (itemList.contains(baseThemeId)) {
464+
const QString &themePath = itemList.value(baseThemeId).value("Path").toString();
403465
KeyFile theme(',');
404466
theme.loadFile(themePath + QDir::separator() + QStringLiteral("index.theme"));
405467
QString defaultTheme = theme.getStr("Deepin Theme", "DefaultTheme");
@@ -424,6 +486,8 @@ void TreeLandWorker::handleGlobalTheme(const QString &themeId)
424486
applyGlobalTheme(theme, defaultTheme, defaultTheme, themePath);
425487
break;
426488
}
489+
default:
490+
qWarning() << "theme mode invalid: " << mode;
427491
}
428492
}
429493
}
@@ -467,7 +531,9 @@ void TreeLandWorker::applyGlobalTheme(KeyFile &theme, const QString &themeName,
467531
return setGlobalItem("AppTheme", TYPEGTK);
468532
}
469533

470-
setGlobalFile("Wallpaper", TYPEWALLPAPER);
534+
if (!m_desktopWallpaperCustomized) {
535+
setGlobalFile("Wallpaper", TYPEWALLPAPER);
536+
}
471537
setGlobalFile("LockBackground", TYPEGREETERBACKGROUND);
472538
setGlobalItem("IconTheme", TYPEICON);
473539
setGlobalItem("CursorTheme", TYPECURSOR);
@@ -552,6 +618,8 @@ void TreeLandWorker::active()
552618
});
553619

554620
PersonalizationWorker::active();
621+
622+
m_globalTheme = m_model->getGlobalThemeModel()->getDefault();
555623
}
556624

557625
PersonalizationManager::PersonalizationManager(QObject *parent)

src/plugin-personalization/operation/treelandworker.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class PersonalizationFontContext;
2929
class WallpaperManager;
3030
class WallpaperContext;
3131

32+
namespace Dtk::Core {
33+
class DConfig;
34+
}
35+
3236
class TreeLandWorker : public PersonalizationWorker
3337
{
3438
Q_OBJECT
@@ -101,17 +105,20 @@ public slots:
101105

102106
private:
103107
WallpaperContext *getOrCreateWallpaperContext(const QString &monitorName);
104-
void setWallpaper(const QString &monitorName, const QString &url, uint32_t role, uint32_t type);
108+
bool setWallpaper(const QString &monitorName, const QString &url, uint32_t role, uint32_t type);
105109
void handleGlobalTheme(const QString &themeId);
106110
void applyGlobalTheme(KeyFile &theme, const QString &themeName, const QString &defaultTheme, const QString &themePath);
107111
void doSetByType(const QString &type, const QString &value);
112+
void initDConfig();
113+
void setDesktopWallpaperCustomized(bool customized);
108114

109115
private:
110116
QScopedPointer<PersonalizationManager> m_personalizationManager;
111117
QScopedPointer<PersonalizationAppearanceContext> m_appearanceContext;
112118
QScopedPointer<PersonalizationCursorContext> m_cursorContext;
113119
QScopedPointer<PersonalizationFontContext> m_fontContext;
114120
QScopedPointer<WallpaperManager> m_wallpaperManager;
121+
Dtk::Core::DConfig *m_dconfig = nullptr;
115122
QMap<QString, WallpaperContext *> m_wallpaperContexts;
116123

117124
QMap<QString, WallpaperMetaData *> m_wallpapers;
@@ -128,6 +135,7 @@ public slots:
128135
int m_opacity;
129136
QString m_globalTheme;
130137
bool m_compactDisplay;
138+
bool m_desktopWallpaperCustomized = false;
131139
#endif
132140
};
133141

0 commit comments

Comments
 (0)