Skip to content

Commit db6b171

Browse files
heysionIvy233
authored andcommitted
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. Consolidate EventLogger::init() into DockPanel::load() so it runs before any sub-component writes events, and move startup log calls from constructors to init() methods to ensure the logger is ready. Minimize #ifdef HAVE_DDE_API_EVENTLOGGER to only guard the dde-api/eventlogger.hpp include and writeEventLog() calls; logging functions are always compiled and become no-ops when the header is absent. Use find_path with NO_CACHE for better portability. feat(dock): 集成可选事件日志支持 为 dock 相关模块添加条件事件日志支持,并接入所需的构建检测与包依赖。 该实现会在缺少事件日志头文件时保持日志集成可选。 重构事件日志代码以减少重复并修复 UI 阻塞问题:在 DockSettings 中 提取 logDockConfig() 辅助方法,在 DockDBusProxy 中提取 updateAndLogTrayPluginList() 辅助方法,将 visiblePluginList 和 visiblePluginCount 统一为 VisiblePluginStats,简化定时器连接, 并使用 QtConcurrent::run 将 dpkg-query 移至后台线程,在构造函数 中预启动以确保首次使用时结果已就绪。 将 EventLogger::init() 统一到 DockPanel::load() 中,确保在任何 子组件写入事件前完成初始化;将启动日志调用从构造函数移至 init() 方法以保证 logger 已就绪。将 #ifdef HAVE_DDE_API_EVENTLOGGER 缩减至仅包裹 dde-api/eventlogger.hpp 的 include 和 writeEventLog() 调用,日志函数始终编译,在缺少头文件时为空操作。使用 find_path 的 NO_CACHE 提升可移植性。 PMS: TASK-388657
1 parent 61b4c67 commit db6b171

15 files changed

Lines changed: 172 additions & 6 deletions

CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ 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+
find_path(DDE_API_EVENTLOGGER_INCLUDE_DIR NAMES dde-api/eventlogger.hpp NO_CACHE)
66+
if(DDE_API_EVENTLOGGER_INCLUDE_DIR)
67+
set(HAVE_DDE_API_EVENTLOGGER ON)
68+
message(STATUS "Found dde-api eventlogger.hpp: ${DDE_API_EVENTLOGGER_INCLUDE_DIR}")
69+
else()
70+
message(STATUS "dde-api eventlogger.hpp not found, event logging will be disabled")
71+
endif()
72+
6473
qt_policy(SET QTP0001 NEW)
6574

6675
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: 47 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,7 @@ DGUI_USE_NAMESPACE
1722
DS_USE_NAMESPACE
1823
namespace {
1924
constexpr auto DockVersionV1 = "1.0";
25+
constexpr qint64 EVENT_LOGGER_TRAY_PLUGIN_LIST = 1000610007;
2026

2127
QList<DS_NAMESPACE::DAppletDock *> dockApplets(dock::DockPanel *panel)
2228
{
@@ -47,6 +53,7 @@ DockDBusProxy::DockDBusProxy(DockPanel* parent)
4753
connect(parent, &DockPanel::rootObjectChanged, this, [this]() {
4854
auto pluginsVisible = DockSettings::instance()->pluginsVisible();
4955
updateDockPluginsVisible(pluginsVisible);
56+
logInitialPluginState();
5057
});
5158

5259
for (auto *dockApplet : dockApplets(parent)) {
@@ -75,6 +82,7 @@ DockDBusProxy::DockDBusProxy(DockPanel* parent)
7582
timer->stop();
7683
timer->deleteLater();
7784
connect(m_trayApplet, SIGNAL(pluginsChanged()), this, SIGNAL(pluginsChanged()));
85+
logInitialPluginState();
7886
}
7987
});
8088
timer->start();
@@ -255,6 +263,43 @@ DockItemInfos DockDBusProxy::plugins()
255263
return iteminfos;
256264
}
257265

266+
void DockDBusProxy::logInitialPluginState()
267+
{
268+
QStringList visibleItemKeys;
269+
for (const auto &info : plugins()) {
270+
if (info.visible) {
271+
visibleItemKeys.append(info.itemKey);
272+
}
273+
}
274+
275+
#ifdef HAVE_DDE_API_EVENTLOGGER
276+
DDE_EventLogger::EventLogger::instance().writeEventLog(
277+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_TRAY_PLUGIN_LIST, QStringLiteral("dock_init"), {
278+
{QStringLiteral("tray_plugin_list"), visibleItemKeys.join(QStringLiteral(","))}
279+
}));
280+
#endif
281+
}
282+
283+
void DockDBusProxy::logCurrentVisiblePluginList(const QString &changedItemKey, bool changedVisible)
284+
{
285+
QStringList visibleItemKeys;
286+
for (const auto &info : plugins()) {
287+
if (info.itemKey == changedItemKey) {
288+
if (changedVisible)
289+
visibleItemKeys.append(info.itemKey);
290+
} else if (info.visible) {
291+
visibleItemKeys.append(info.itemKey);
292+
}
293+
}
294+
295+
#ifdef HAVE_DDE_API_EVENTLOGGER
296+
DDE_EventLogger::EventLogger::instance().writeEventLog(
297+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_TRAY_PLUGIN_LIST, QStringLiteral("dock_plugins_changed"), {
298+
{QStringLiteral("tray_plugin_list"), visibleItemKeys.join(QStringLiteral(","))}
299+
}));
300+
#endif
301+
}
302+
258303
void DockDBusProxy::ReloadPlugins()
259304
{
260305
parent()->ReloadPlugins();
@@ -274,13 +319,15 @@ void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &item
274319
pluginsVisible[itemKey] = visible;
275320
DockSettings::instance()->setPluginsVisible(pluginsVisible);
276321
Q_EMIT pluginVisibleChanged(itemKey, visible);
322+
logCurrentVisiblePluginList(itemKey, visible);
277323
return;
278324
}
279325
}
280326

281327
if (m_trayApplet) {
282328
Q_EMIT pluginVisibleChanged(itemKey, visible);
283329
QMetaObject::invokeMethod(m_trayApplet, "setItemOnDock", Qt::QueuedConnection, settingKey, itemKey, visible);
330+
logCurrentVisiblePluginList(itemKey, visible);
284331
}
285332
}
286333

@@ -340,4 +387,3 @@ void DockDBusProxy::setLocked(bool newLocked)
340387
}
341388

342389
}
343-

panels/dock/dockdbusproxy.h

Lines changed: 3 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,6 +89,8 @@ class DockDBusProxy final: public QObject, public QDBusContext
8889
DockPanel* parent() const;
8990
QString getAppID(const QString &desktopfile);
9091
void updateDockPluginsVisible(const QVariantMap &pluginsVisible);
92+
void logInitialPluginState();
93+
void logCurrentVisiblePluginList(const QString &changedItemKey = QString(), bool changedVisible = true);
9194

9295
DS_NAMESPACE::DAppletProxy *m_oldDockApplet;
9396
DS_NAMESPACE::DAppletProxy *m_trayApplet;

panels/dock/dockpanel.cpp

Lines changed: 8 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

@@ -24,6 +24,10 @@
2424
#include <QQuickItem>
2525
#include <DGuiApplicationHelper>
2626

27+
#ifdef HAVE_DDE_API_EVENTLOGGER
28+
#include <dde-api/eventlogger.hpp>
29+
#endif
30+
2731
#define SETTINGS DockSettings::instance()
2832

2933
Q_LOGGING_CATEGORY(dockLog, "org.deepin.dde.shell.dock")
@@ -50,6 +54,9 @@ DockPanel::DockPanel(QObject *parent)
5054
bool DockPanel::load()
5155
{
5256
DPanel::load();
57+
#ifdef HAVE_DDE_API_EVENTLOGGER
58+
DDE_EventLogger::EventLogger::instance().init("org.deepin.dde.shell", false);
59+
#endif
5360
return true;
5461
}
5562

panels/dock/docksettings.cpp

Lines changed: 30 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,14 @@
99
#include <QTimer>
1010
#include <QLoggingCategory>
1111

12+
#include <QJsonObject>
13+
#ifdef HAVE_DDE_API_EVENTLOGGER
14+
#include <dde-api/eventlogger.hpp>
15+
#endif
16+
17+
// Event IDs for dock settings (10-digit numbers)
18+
constexpr qint64 EVENT_LOGGER_DOCK_CONFIG = 1000610006;
19+
1220
Q_LOGGING_CATEGORY(dockSettingsLog, "org.deepin.dde.shell.dock.docksettings")
1321

1422
const static QString keyPosition = "Position";
@@ -82,6 +90,21 @@ static QString itemAlignment2String(const ItemAlignment& alignment)
8290
return "center";
8391
}
8492

93+
void DockSettings::logDockConfig(std::optional<Position> pos, std::optional<ItemAlignment> align, const QString &reason) const
94+
{
95+
QJsonObject payload;
96+
if (pos)
97+
payload.insert(QStringLiteral("shell_pos"), position2String(*pos));
98+
if (align)
99+
payload.insert(QStringLiteral("shell_dock_mode"), itemAlignment2String(*align));
100+
101+
#ifdef HAVE_DDE_API_EVENTLOGGER
102+
DDE_EventLogger::EventLogger::instance().writeEventLog(
103+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_DOCK_CONFIG, QStringLiteral("dock_config"), payload));
104+
#endif
105+
qCInfo(dockSettingsLog) << "EventLogger: dock config" << reason << payload;
106+
}
107+
85108
static ItemAlignment string2ItenAlignment(const QString& alignmentStr)
86109
{
87110
if (alignmentStr == "left")
@@ -136,6 +159,7 @@ DockSettings::DockSettings(QObject* parent)
136159
{
137160
m_writeTimer->setSingleShot(true);
138161
m_writeTimer->setInterval(1000);
162+
qCInfo(dockSettingsLog) << "EventLogger initialized";
139163
init();
140164
}
141165

@@ -151,6 +175,9 @@ void DockSettings::init()
151175
m_showInPrimary = m_dockConfig->value(keyShowInPrimary).toBool();
152176
m_locked = m_dockConfig->value(keyLocked).toBool();
153177

178+
// Log dock config on startup - merge shell_pos and shell_dock_mode into one log entry
179+
logDockConfig(m_dockPosition, m_alignment, QStringLiteral("on startup"));
180+
154181
connect(m_dockConfig.data(), &DConfig::valueChanged, this, [this](const QString& key){
155182
if (keyDockSize == key) {
156183
auto size = m_dockConfig->value(keyDockSize).toUInt();
@@ -237,6 +264,7 @@ void DockSettings::setPosition(const Position& position)
237264
m_dockPosition = position;
238265
Q_EMIT positionChanged(m_dockPosition);
239266
addWriteJob(positionJob);
267+
logDockConfig(position, std::nullopt, QStringLiteral("position changed"));
240268
}
241269

242270
ItemAlignment DockSettings::itemAlignment()
@@ -251,6 +279,7 @@ void DockSettings::setItemAlignment(const ItemAlignment& alignment)
251279
m_alignment = alignment;
252280
Q_EMIT itemAlignmentChanged(m_alignment);
253281
addWriteJob(itemAlignmentJob);
282+
logDockConfig(std::nullopt, alignment, QStringLiteral("itemAlignment changed"));
254283
}
255284

256285
IndicatorStyle DockSettings::indicatorStyle()

panels/dock/docksettings.h

Lines changed: 3 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,7 @@ class DockSettings : public QObject
6263
void init();
6364

6465
void addWriteJob(WriteJob job);
66+
void logDockConfig(std::optional<Position> pos, std::optional<ItemAlignment> align, const QString &reason) const;
6567
inline void checkWriteJob();
6668

6769
Q_SIGNALS:

panels/dock/multitaskview/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ target_link_libraries(dock-multitaskview PRIVATE
3232
dde-shell-dock
3333
)
3434

35+
if (HAVE_DDE_API_EVENTLOGGER)
36+
target_compile_definitions(dock-multitaskview PRIVATE HAVE_DDE_API_EVENTLOGGER)
37+
endif()
38+
3539
ds_install_package(PACKAGE org.deepin.ds.dock.multitaskview TARGET dock-multitaskview)
3640
ds_handle_package_translation(PACKAGE org.deepin.ds.dock.multitaskview)
3741

panels/dock/multitaskview/multitaskview.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,35 @@
77
#include "../constants.h"
88

99
#include <QBuffer>
10+
#include <QProcess>
1011

1112
#include <DDciIcon>
1213
#include <DDBusSender>
1314
#include <DWindowManagerHelper>
1415
#include <DGuiApplicationHelper>
1516

17+
#ifdef HAVE_DDE_API_EVENTLOGGER
18+
#include <dde-api/eventlogger.hpp>
19+
#endif
20+
1621
DGUI_USE_NAMESPACE
1722
DCORE_USE_NAMESPACE
1823

24+
namespace {
25+
constexpr qint64 EVENT_LOGGER_KWIN_MULTITASK_VIEW = 1000300000;
26+
constexpr int EventLaunchTypeDockIcon = 2;
27+
28+
QString queryKwinVersion()
29+
{
30+
QProcess process;
31+
process.start(QStringLiteral("dpkg-query"), { QStringLiteral("-W"), QStringLiteral("-f=${Version}"), QStringLiteral("kwin-x11") });
32+
if (!process.waitForFinished(1000) || process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) {
33+
return QString();
34+
}
35+
return QString::fromLocal8Bit(process.readAllStandardOutput()).trimmed();
36+
}
37+
}
38+
1939
namespace dock {
2040

2141
constexpr int KWinOptimalPerformance = 4;
@@ -50,12 +70,20 @@ MultiTaskView::MultiTaskView(QObject *parent)
5070
bool MultiTaskView::init()
5171
{
5272
setSupported(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite());
73+
m_kwinVersion = queryKwinVersion();
5374
DAppletDock::init();
5475
return true;
5576
}
5677

5778
void MultiTaskView::openWorkspace()
5879
{
80+
#ifdef HAVE_DDE_API_EVENTLOGGER
81+
DDE_EventLogger::EventLogger::instance().writeEventLog(
82+
DDE_EventLogger::EventLoggerData(EVENT_LOGGER_KWIN_MULTITASK_VIEW, QStringLiteral("kwin_multitask_view"), {
83+
{QStringLiteral("launch_type"), EventLaunchTypeDockIcon},
84+
{QStringLiteral("kwin_version"), m_kwinVersion}
85+
}));
86+
#endif
5987
if (m_multitaskview) {
6088
m_multitaskview->toggle();
6189
return;

0 commit comments

Comments
 (0)