Skip to content

Commit 729c624

Browse files
committed
feat(dock): integrate optional event logging support
Add conditional event logging support for dock-related modules and wire the required build detection and package dependency. The implementation keeps the logging integration optional when the event logger headers are unavailable. Refactor event logging code to reduce duplication and fix a UI-blocking issue: extract shared logDockConfig() helper in DockSettings and updateAndLogTrayPluginList() helper in DockDBusProxy, unify visiblePluginList/visiblePluginCount into VisiblePluginStats, simplify timer wiring, and move dpkg-query off the UI thread using QtConcurrent::run with pre-start in the constructor. feat(dock): 集成可选事件日志支持 为 dock 相关模块添加条件事件日志支持,并接入所需的构建检测与包依赖。 该实现会在缺少事件日志头文件时保持日志集成可选。 重构事件日志代码以减少重复并修复 UI 阻塞问题:在 DockSettings 中 提取 logDockConfig() 辅助方法,在 DockDBusProxy 中提取 updateAndLogTrayPluginList() 辅助方法,将 visiblePluginList 和 visiblePluginCount 统一为 VisiblePluginStats,简化定时器连接, 并使用 QtConcurrent::run 将 dpkg-query 移至后台线程,在构造函数 中预启动以确保首次使用时结果已就绪。 PMS: TASK-388657
1 parent 1fee1e8 commit 729c624

12 files changed

Lines changed: 247 additions & 5 deletions

CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ find_package(ICU 74.2 REQUIRED COMPONENTS uc i18n io)
6161
find_package(WaylandProtocols REQUIRED)
6262
find_package(PkgConfig REQUIRED)
6363

64+
# Check if dde-api eventlogger.hpp exists
65+
# Unset cache to force re-detection every time
66+
unset(DDE_API_EVENTLOGGER_INCLUDE_DIR CACHE)
67+
find_path(DDE_API_EVENTLOGGER_INCLUDE_DIR NAMES dde-api/eventlogger.hpp PATHS /usr/include)
68+
if(DDE_API_EVENTLOGGER_INCLUDE_DIR)
69+
set(HAVE_DDE_API_EVENTLOGGER ON)
70+
message(STATUS "Found dde-api eventlogger.hpp: ${DDE_API_EVENTLOGGER_INCLUDE_DIR}")
71+
else()
72+
message(STATUS "dde-api eventlogger.hpp not found, event logging will be disabled")
73+
endif()
74+
6475
qt_policy(SET QTP0001 NEW)
6576

6677
try_compile(COMPILE_RESULT

debian/control

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Build-Depends:
66
debhelper-compat (= 13),
77
cmake,
88
dde-application-manager-api (>= 1.2.48),
9+
dde-api-dev (>> 6.0.39),
910
dde-tray-loader-dev (> 2.0.24),
1011
extra-cmake-modules,
1112
libdtk6core-bin,

panels/dock/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ target_link_libraries(dockpanel PRIVATE
7575
dde-shell-dock
7676
)
7777

78+
if (HAVE_DDE_API_EVENTLOGGER)
79+
target_compile_definitions(dockpanel PRIVATE HAVE_DDE_API_EVENTLOGGER)
80+
endif()
81+
7882
if (BUILD_WITH_X11)
7983
target_compile_definitions(dockpanel PRIVATE BUILD_WITH_X11=)
8084
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb xcb-aux xcb-res xcb-ewmh)

panels/dock/dockdbusproxy.cpp

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
#include "dockdbusproxy.h"
1010

1111
#include <QObject>
12+
#include <QJsonObject>
13+
14+
#ifdef HAVE_DDE_API_EVENTLOGGER
15+
#include <dde-api/eventlogger.hpp>
16+
#endif
1217

1318
#include <DWindowManagerHelper>
1419
#include <appletbridge.h>
@@ -17,6 +22,9 @@ DGUI_USE_NAMESPACE
1722
DS_USE_NAMESPACE
1823
namespace {
1924
constexpr auto DockVersionV1 = "1.0";
25+
#ifdef HAVE_DDE_API_EVENTLOGGER
26+
constexpr qint64 EVENT_LOGGER_TRAY_PLUGIN_LIST = 1000610007;
27+
#endif
2028

2129
QList<DS_NAMESPACE::DAppletDock *> dockApplets(dock::DockPanel *panel)
2230
{
@@ -32,6 +40,28 @@ QList<DS_NAMESPACE::DAppletDock *> dockApplets(dock::DockPanel *panel)
3240
}
3341
return list;
3442
}
43+
44+
#ifdef HAVE_DDE_API_EVENTLOGGER
45+
struct VisiblePluginStats {
46+
int count = 0;
47+
QString list;
48+
};
49+
50+
VisiblePluginStats visiblePluginStats(const DockItemInfos &itemInfos)
51+
{
52+
QStringList pluginNames;
53+
int count = 0;
54+
for (const DockItemInfo &itemInfo : itemInfos) {
55+
if (itemInfo.visible) {
56+
++count;
57+
if (!itemInfo.name.isEmpty())
58+
pluginNames.append(itemInfo.name);
59+
}
60+
}
61+
pluginNames.removeDuplicates();
62+
return { count, pluginNames.join(QStringLiteral(",")) };
63+
}
64+
#endif
3565
}
3666
namespace dock {
3767
DockDBusProxy::DockDBusProxy(DockPanel* parent)
@@ -40,6 +70,13 @@ DockDBusProxy::DockDBusProxy(DockPanel* parent)
4070
, m_trayApplet(nullptr)
4171
{
4272
registerPluginInfoMetaType();
73+
#ifdef HAVE_DDE_API_EVENTLOGGER
74+
DDE_EventLogger::EventLogger::instance().init("org.deepin.dde.shell", false);
75+
m_trayPluginListLogTimer.setSingleShot(true);
76+
m_trayPluginListLogTimer.setInterval(1000);
77+
connect(&m_trayPluginListLogTimer, &QTimer::timeout,
78+
this, &DockDBusProxy::logTrayPluginList);
79+
#endif
4380

4481
connect(DockSettings::instance(), &DockSettings::pluginsVisibleChanged, this, [this] (const QVariantMap &pluginsVisible) {
4582
updateDockPluginsVisible(pluginsVisible);
@@ -75,6 +112,12 @@ DockDBusProxy::DockDBusProxy(DockPanel* parent)
75112
timer->stop();
76113
timer->deleteLater();
77114
connect(m_trayApplet, SIGNAL(pluginsChanged()), this, SIGNAL(pluginsChanged()));
115+
#ifdef HAVE_DDE_API_EVENTLOGGER
116+
connect(this, &DockDBusProxy::pluginsChanged, this, [this] {
117+
m_trayPluginListLogTimer.start();
118+
}, Qt::UniqueConnection);
119+
m_trayPluginListLogTimer.start();
120+
#endif
78121
}
79122
});
80123
timer->start();
@@ -255,6 +298,41 @@ DockItemInfos DockDBusProxy::plugins()
255298
return iteminfos;
256299
}
257300

301+
#ifdef HAVE_DDE_API_EVENTLOGGER
302+
bool DockDBusProxy::updateAndLogTrayPluginList(const DockItemInfos &itemInfos)
303+
{
304+
const auto stats = visiblePluginStats(itemInfos);
305+
if (stats.count == m_visiblePluginCount) {
306+
return false;
307+
}
308+
m_visiblePluginCount = stats.count;
309+
310+
DDE_EventLogger::EventLogger::instance().writeEventLog(
311+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_TRAY_PLUGIN_LIST, QStringLiteral("taskmanager_config"), {
312+
{QStringLiteral("tray_plugin_list"), stats.list}
313+
}));
314+
qDebug() << "EventLogger: tray_plugin_list:" << stats.list;
315+
return true;
316+
}
317+
318+
void DockDBusProxy::logTrayPluginList()
319+
{
320+
updateAndLogTrayPluginList(plugins());
321+
}
322+
323+
void DockDBusProxy::logTrayPluginListChange(const QString &changedItemKey, bool visible)
324+
{
325+
DockItemInfos itemInfos = plugins();
326+
for (DockItemInfo &itemInfo : itemInfos) {
327+
if (itemInfo.itemKey == changedItemKey) {
328+
itemInfo.visible = visible;
329+
break;
330+
}
331+
}
332+
updateAndLogTrayPluginList(itemInfos);
333+
}
334+
#endif
335+
258336
void DockDBusProxy::ReloadPlugins()
259337
{
260338
parent()->ReloadPlugins();
@@ -274,13 +352,19 @@ void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &item
274352
pluginsVisible[itemKey] = visible;
275353
DockSettings::instance()->setPluginsVisible(pluginsVisible);
276354
Q_EMIT pluginVisibleChanged(itemKey, visible);
355+
#ifdef HAVE_DDE_API_EVENTLOGGER
356+
logTrayPluginListChange(itemKey, visible);
357+
#endif
277358
return;
278359
}
279360
}
280361

281362
if (m_trayApplet) {
282363
Q_EMIT pluginVisibleChanged(itemKey, visible);
283364
QMetaObject::invokeMethod(m_trayApplet, "setItemOnDock", Qt::QueuedConnection, settingKey, itemKey, visible);
365+
#ifdef HAVE_DDE_API_EVENTLOGGER
366+
logTrayPluginListChange(itemKey, visible);
367+
#endif
284368
}
285369
}
286370

@@ -340,4 +424,3 @@ void DockDBusProxy::setLocked(bool newLocked)
340424
}
341425

342426
}
343-

panels/dock/dockdbusproxy.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <QObject>
1616
#include <QDBusContext>
1717
#include <QDBusArgument>
18+
#include <QTimer>
1819

1920
/** this class used for old dock api compatible
2021
* it will forward old dbus call to new implementation
@@ -88,9 +89,18 @@ class DockDBusProxy final: public QObject, public QDBusContext
8889
DockPanel* parent() const;
8990
QString getAppID(const QString &desktopfile);
9091
void updateDockPluginsVisible(const QVariantMap &pluginsVisible);
92+
#ifdef HAVE_DDE_API_EVENTLOGGER
93+
bool updateAndLogTrayPluginList(const DockItemInfos &itemInfos);
94+
void logTrayPluginList();
95+
void logTrayPluginListChange(const QString &changedItemKey, bool visible);
96+
#endif
9197

9298
DS_NAMESPACE::DAppletProxy *m_oldDockApplet;
9399
DS_NAMESPACE::DAppletProxy *m_trayApplet;
100+
#ifdef HAVE_DDE_API_EVENTLOGGER
101+
QTimer m_trayPluginListLogTimer;
102+
int m_visiblePluginCount = -1;
103+
#endif
94104
};
95105
}
96106

panels/dock/docksettings.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -9,6 +9,16 @@
99
#include <QTimer>
1010
#include <QLoggingCategory>
1111

12+
#ifdef HAVE_DDE_API_EVENTLOGGER
13+
#include <QJsonObject>
14+
#include <dde-api/eventlogger.hpp>
15+
16+
// Event IDs for dock settings (10-digit numbers)
17+
// 1000600010: shell_pos + shell_dock_mode (merged output)
18+
// 1000600011: merge_app_model_on + tray_plugin_list (used in taskmanagersettings) + icon_theme (used in dde-appearance)
19+
constexpr qint64 EVENT_LOGGER_DOCK_CONFIG = 1000610006;
20+
#endif
21+
1222
Q_LOGGING_CATEGORY(dockSettingsLog, "org.deepin.dde.shell.dock.docksettings")
1323

1424
const static QString keyPosition = "Position";
@@ -82,6 +92,21 @@ static QString itemAlignment2String(const ItemAlignment& alignment)
8292
return "center";
8393
}
8494

95+
#ifdef HAVE_DDE_API_EVENTLOGGER
96+
void DockSettings::logDockConfig(std::optional<Position> pos, std::optional<ItemAlignment> align, const QString &reason) const
97+
{
98+
QJsonObject payload;
99+
if (pos)
100+
payload.insert(QStringLiteral("shell_pos"), position2String(*pos));
101+
if (align)
102+
payload.insert(QStringLiteral("shell_dock_mode"), itemAlignment2String(*align));
103+
104+
DDE_EventLogger::EventLogger::instance().writeEventLog(
105+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_DOCK_CONFIG, QStringLiteral("dock_config"), payload));
106+
qCInfo(dockSettingsLog) << "EventLogger: dock config" << reason << payload;
107+
}
108+
#endif
109+
85110
static ItemAlignment string2ItenAlignment(const QString& alignmentStr)
86111
{
87112
if (alignmentStr == "left")
@@ -136,6 +161,12 @@ DockSettings::DockSettings(QObject* parent)
136161
{
137162
m_writeTimer->setSingleShot(true);
138163
m_writeTimer->setInterval(1000);
164+
#ifdef HAVE_DDE_API_EVENTLOGGER
165+
DDE_EventLogger::EventLogger::instance().init("org.deepin.dde.shell", false);
166+
qCInfo(dockSettingsLog) << "EventLogger initialized";
167+
#else
168+
qCInfo(dockSettingsLog) << "EventLogger not available (dde-api eventlogger.hpp not found)";
169+
#endif
139170
init();
140171
}
141172

@@ -151,6 +182,11 @@ void DockSettings::init()
151182
m_showInPrimary = m_dockConfig->value(keyShowInPrimary).toBool();
152183
m_locked = m_dockConfig->value(keyLocked).toBool();
153184

185+
// Log dock config on startup - merge shell_pos and shell_dock_mode into one log entry
186+
#ifdef HAVE_DDE_API_EVENTLOGGER
187+
logDockConfig(m_dockPosition, m_alignment, QStringLiteral("on startup"));
188+
#endif
189+
154190
connect(m_dockConfig.data(), &DConfig::valueChanged, this, [this](const QString& key){
155191
if (keyDockSize == key) {
156192
auto size = m_dockConfig->value(keyDockSize).toUInt();
@@ -237,6 +273,9 @@ void DockSettings::setPosition(const Position& position)
237273
m_dockPosition = position;
238274
Q_EMIT positionChanged(m_dockPosition);
239275
addWriteJob(positionJob);
276+
#ifdef HAVE_DDE_API_EVENTLOGGER
277+
logDockConfig(position, std::nullopt, QStringLiteral("position changed"));
278+
#endif
240279
}
241280

242281
ItemAlignment DockSettings::itemAlignment()
@@ -251,6 +290,9 @@ void DockSettings::setItemAlignment(const ItemAlignment& alignment)
251290
m_alignment = alignment;
252291
Q_EMIT itemAlignmentChanged(m_alignment);
253292
addWriteJob(itemAlignmentJob);
293+
#ifdef HAVE_DDE_API_EVENTLOGGER
294+
logDockConfig(std::nullopt, alignment, QStringLiteral("itemAlignment changed"));
295+
#endif
254296
}
255297

256298
IndicatorStyle DockSettings::indicatorStyle()

panels/dock/docksettings.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2023-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -10,6 +10,7 @@
1010
#include <QObject>
1111
#include <DConfig>
1212
#include <QScopedPointer>
13+
#include <optional>
1314

1415
DCORE_USE_NAMESPACE
1516

@@ -62,6 +63,9 @@ class DockSettings : public QObject
6263
void init();
6364

6465
void addWriteJob(WriteJob job);
66+
#ifdef HAVE_DDE_API_EVENTLOGGER
67+
void logDockConfig(std::optional<Position> pos, std::optional<ItemAlignment> align, const QString &reason) const;
68+
#endif
6569
inline void checkWriteJob();
6670

6771
Q_SIGNALS:

panels/dock/multitaskview/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,15 @@ qt_generate_wayland_protocol_client_sources(dock-multitaskview
2828
target_link_libraries(dock-multitaskview PRIVATE
2929
PkgConfig::WaylandClient
3030
Qt${QT_VERSION_MAJOR}::WaylandClient
31+
Qt${QT_VERSION_MAJOR}::Concurrent
3132
dde-shell-frame
3233
dde-shell-dock
3334
)
3435

36+
if (HAVE_DDE_API_EVENTLOGGER)
37+
target_compile_definitions(dock-multitaskview PRIVATE HAVE_DDE_API_EVENTLOGGER)
38+
endif()
39+
3540
ds_install_package(PACKAGE org.deepin.ds.dock.multitaskview TARGET dock-multitaskview)
3641
ds_handle_package_translation(PACKAGE org.deepin.ds.dock.multitaskview)
3742

0 commit comments

Comments
 (0)