diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b12d2217..48ba3533b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,15 @@ find_package(ICU 74.2 REQUIRED COMPONENTS uc i18n io) find_package(WaylandProtocols REQUIRED) find_package(PkgConfig REQUIRED) +# Check if dde-api provides EventLogger (header-only) +find_package(DDEAPI QUIET) +if(DDEAPI_FOUND) + set(HAVE_DDE_API_EVENTLOGGER ON) + message(STATUS "Found DDEAPI: EventLogger available") +else() + message(STATUS "DDEAPI not found, event logging will be disabled") +endif() + qt_policy(SET QTP0001 NEW) try_compile(COMPILE_RESULT diff --git a/debian/control b/debian/control index b0f45695f..8a2797d39 100644 --- a/debian/control +++ b/debian/control @@ -6,6 +6,7 @@ Build-Depends: debhelper-compat (= 13), cmake, dde-application-manager-api (>= 1.2.48), + dde-api-dev (>> 6.0.39), dde-tray-loader-dev (> 2.0.24), extra-cmake-modules, libdtk6core-bin, diff --git a/panels/dock/CMakeLists.txt b/panels/dock/CMakeLists.txt index ca8179c12..34825ad34 100644 --- a/panels/dock/CMakeLists.txt +++ b/panels/dock/CMakeLists.txt @@ -75,6 +75,11 @@ target_link_libraries(dockpanel PRIVATE dde-shell-dock ) +if (HAVE_DDE_API_EVENTLOGGER) + target_compile_definitions(dockpanel PRIVATE HAVE_DDE_API_EVENTLOGGER) + target_link_libraries(dockpanel PRIVATE DDEAPI::EventLogger) +endif() + if (BUILD_WITH_X11) target_compile_definitions(dockpanel PRIVATE BUILD_WITH_X11=) pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb xcb-aux xcb-res xcb-ewmh) diff --git a/panels/dock/dockdbusproxy.cpp b/panels/dock/dockdbusproxy.cpp index 7cb7fd04f..b321df5f4 100644 --- a/panels/dock/dockdbusproxy.cpp +++ b/panels/dock/dockdbusproxy.cpp @@ -9,6 +9,11 @@ #include "dockdbusproxy.h" #include +#include + +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif #include #include @@ -17,6 +22,7 @@ DGUI_USE_NAMESPACE DS_USE_NAMESPACE namespace { constexpr auto DockVersionV1 = "1.0"; +constexpr qint64 EVENT_LOGGER_TRAY_PLUGIN_LIST = 1000610007; QList dockApplets(dock::DockPanel *panel) { @@ -75,6 +81,9 @@ DockDBusProxy::DockDBusProxy(DockPanel* parent) timer->stop(); timer->deleteLater(); connect(m_trayApplet, SIGNAL(pluginsChanged()), this, SIGNAL(pluginsChanged())); + QTimer::singleShot(3000, this, [this]() { + logInitialPluginState(); + }); } }); timer->start(); @@ -255,6 +264,43 @@ DockItemInfos DockDBusProxy::plugins() return iteminfos; } +void DockDBusProxy::logInitialPluginState() +{ + QStringList visibleItemKeys; + for (const auto &info : plugins()) { + if (info.visible) { + visibleItemKeys.append(info.itemKey); + } + } + +#ifdef HAVE_DDE_API_EVENTLOGGER + DDE_EventLogger::EventLogger::instance().writeEventLog( + DDE_EventLogger::EventLoggerData(EVENT_LOGGER_TRAY_PLUGIN_LIST, QStringLiteral("dock_init"), { + {QStringLiteral("tray_plugin_list"), visibleItemKeys.join(QStringLiteral(","))} + })); +#endif +} + +void DockDBusProxy::logCurrentVisiblePluginList(const QString &changedItemKey, bool changedVisible) +{ + QStringList visibleItemKeys; + for (const auto &info : plugins()) { + if (info.itemKey == changedItemKey) { + if (changedVisible) + visibleItemKeys.append(info.itemKey); + } else if (info.visible) { + visibleItemKeys.append(info.itemKey); + } + } + +#ifdef HAVE_DDE_API_EVENTLOGGER + DDE_EventLogger::EventLogger::instance().writeEventLog( + DDE_EventLogger::EventLoggerData(EVENT_LOGGER_TRAY_PLUGIN_LIST, QStringLiteral("dock_plugins_changed"), { + {QStringLiteral("tray_plugin_list"), visibleItemKeys.join(QStringLiteral(","))} + })); +#endif +} + void DockDBusProxy::ReloadPlugins() { parent()->ReloadPlugins(); @@ -274,6 +320,7 @@ void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &item pluginsVisible[itemKey] = visible; DockSettings::instance()->setPluginsVisible(pluginsVisible); Q_EMIT pluginVisibleChanged(itemKey, visible); + logCurrentVisiblePluginList(itemKey, visible); return; } } @@ -281,6 +328,7 @@ void DockDBusProxy::setItemOnDock(const QString &settingKey, const QString &item if (m_trayApplet) { Q_EMIT pluginVisibleChanged(itemKey, visible); QMetaObject::invokeMethod(m_trayApplet, "setItemOnDock", Qt::QueuedConnection, settingKey, itemKey, visible); + logCurrentVisiblePluginList(itemKey, visible); } } @@ -340,4 +388,3 @@ void DockDBusProxy::setLocked(bool newLocked) } } - diff --git a/panels/dock/dockdbusproxy.h b/panels/dock/dockdbusproxy.h index addca9537..455c26fc1 100644 --- a/panels/dock/dockdbusproxy.h +++ b/panels/dock/dockdbusproxy.h @@ -15,6 +15,7 @@ #include #include #include +#include /** this class used for old dock api compatible * it will forward old dbus call to new implementation @@ -88,9 +89,10 @@ class DockDBusProxy final: public QObject, public QDBusContext DockPanel* parent() const; QString getAppID(const QString &desktopfile); void updateDockPluginsVisible(const QVariantMap &pluginsVisible); + void logInitialPluginState(); + void logCurrentVisiblePluginList(const QString &changedItemKey = QString(), bool changedVisible = true); DS_NAMESPACE::DAppletProxy *m_oldDockApplet; DS_NAMESPACE::DAppletProxy *m_trayApplet; }; } - diff --git a/panels/dock/dockpanel.cpp b/panels/dock/dockpanel.cpp index 469f5da21..0aaa99a2d 100644 --- a/panels/dock/dockpanel.cpp +++ b/panels/dock/dockpanel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -24,6 +24,10 @@ #include #include +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif + #define SETTINGS DockSettings::instance() Q_LOGGING_CATEGORY(dockLog, "org.deepin.dde.shell.dock") diff --git a/panels/dock/docksettings.cpp b/panels/dock/docksettings.cpp index 0ae5a5c5f..ac78af46f 100644 --- a/panels/dock/docksettings.cpp +++ b/panels/dock/docksettings.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -9,6 +9,14 @@ #include #include +#include +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif + +// Event IDs for dock settings (10-digit numbers) +constexpr qint64 EVENT_LOGGER_DOCK_CONFIG = 1000610006; + Q_LOGGING_CATEGORY(dockSettingsLog, "org.deepin.dde.shell.dock.docksettings") const static QString keyPosition = "Position"; @@ -82,6 +90,21 @@ static QString itemAlignment2String(const ItemAlignment& alignment) return "center"; } +void DockSettings::logDockConfig(std::optional pos, std::optional align, const QString &reason) const +{ + QJsonObject payload; + if (pos) + payload.insert(QStringLiteral("shell_pos"), position2String(*pos)); + if (align) + payload.insert(QStringLiteral("shell_dock_mode"), itemAlignment2String(*align)); + +#ifdef HAVE_DDE_API_EVENTLOGGER + DDE_EventLogger::EventLogger::instance().writeEventLog( + DDE_EventLogger::EventLoggerData(EVENT_LOGGER_DOCK_CONFIG, QStringLiteral("dock_config"), payload)); +#endif + qCInfo(dockSettingsLog) << "EventLogger: dock config" << reason << payload; +} + static ItemAlignment string2ItenAlignment(const QString& alignmentStr) { if (alignmentStr == "left") @@ -136,6 +159,7 @@ DockSettings::DockSettings(QObject* parent) { m_writeTimer->setSingleShot(true); m_writeTimer->setInterval(1000); + qCInfo(dockSettingsLog) << "EventLogger initialized"; init(); } @@ -151,6 +175,9 @@ void DockSettings::init() m_showInPrimary = m_dockConfig->value(keyShowInPrimary).toBool(); m_locked = m_dockConfig->value(keyLocked).toBool(); + // Log dock config on startup - merge shell_pos and shell_dock_mode into one log entry + logDockConfig(m_dockPosition, m_alignment, QStringLiteral("on startup")); + connect(m_dockConfig.data(), &DConfig::valueChanged, this, [this](const QString& key){ if (keyDockSize == key) { auto size = m_dockConfig->value(keyDockSize).toUInt(); @@ -237,6 +264,7 @@ void DockSettings::setPosition(const Position& position) m_dockPosition = position; Q_EMIT positionChanged(m_dockPosition); addWriteJob(positionJob); + logDockConfig(position, std::nullopt, QStringLiteral("position changed")); } ItemAlignment DockSettings::itemAlignment() @@ -251,6 +279,7 @@ void DockSettings::setItemAlignment(const ItemAlignment& alignment) m_alignment = alignment; Q_EMIT itemAlignmentChanged(m_alignment); addWriteJob(itemAlignmentJob); + logDockConfig(std::nullopt, alignment, QStringLiteral("itemAlignment changed")); } IndicatorStyle DockSettings::indicatorStyle() diff --git a/panels/dock/docksettings.h b/panels/dock/docksettings.h index 8635a81e1..f334b09b5 100644 --- a/panels/dock/docksettings.h +++ b/panels/dock/docksettings.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -10,6 +10,7 @@ #include #include #include +#include DCORE_USE_NAMESPACE @@ -62,6 +63,7 @@ class DockSettings : public QObject void init(); void addWriteJob(WriteJob job); + void logDockConfig(std::optional pos, std::optional align, const QString &reason) const; inline void checkWriteJob(); Q_SIGNALS: diff --git a/panels/dock/multitaskview/CMakeLists.txt b/panels/dock/multitaskview/CMakeLists.txt index 9401c534e..158cf4810 100644 --- a/panels/dock/multitaskview/CMakeLists.txt +++ b/panels/dock/multitaskview/CMakeLists.txt @@ -32,6 +32,11 @@ target_link_libraries(dock-multitaskview PRIVATE dde-shell-dock ) +if (HAVE_DDE_API_EVENTLOGGER) + target_compile_definitions(dock-multitaskview PRIVATE HAVE_DDE_API_EVENTLOGGER) + target_link_libraries(dock-multitaskview PRIVATE DDEAPI::EventLogger) +endif() + ds_install_package(PACKAGE org.deepin.ds.dock.multitaskview TARGET dock-multitaskview) ds_handle_package_translation(PACKAGE org.deepin.ds.dock.multitaskview) diff --git a/panels/dock/multitaskview/multitaskview.cpp b/panels/dock/multitaskview/multitaskview.cpp index d7228bbff..750f93a5b 100644 --- a/panels/dock/multitaskview/multitaskview.cpp +++ b/panels/dock/multitaskview/multitaskview.cpp @@ -7,15 +7,26 @@ #include "../constants.h" #include +#include #include #include #include #include +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif + DGUI_USE_NAMESPACE DCORE_USE_NAMESPACE +namespace { +constexpr qint64 EVENT_LOGGER_KWIN_MULTITASK_VIEW = 1000300000; +constexpr int EventLaunchTypeDockIcon = 2; + +} + namespace dock { constexpr int KWinOptimalPerformance = 4; @@ -50,12 +61,32 @@ MultiTaskView::MultiTaskView(QObject *parent) bool MultiTaskView::init() { setSupported(m_kWinEffect && DWindowManagerHelper::instance()->hasComposite()); + queryKwinVersion(); DAppletDock::init(); return true; } +void MultiTaskView::queryKwinVersion() +{ + auto *process = new QProcess(this); + process->start(QStringLiteral("dpkg-query"), { QStringLiteral("-W"), QStringLiteral("-f=${Version}"), QStringLiteral("kwin-x11") }); + connect(process, &QProcess::finished, this, [this, process](int exitCode, QProcess::ExitStatus status) { + if (status == QProcess::NormalExit && exitCode == 0) { + m_kwinVersion = QString::fromLocal8Bit(process->readAllStandardOutput()).trimmed(); + } + process->deleteLater(); + }); +} + void MultiTaskView::openWorkspace() { +#ifdef HAVE_DDE_API_EVENTLOGGER + DDE_EventLogger::EventLogger::instance().writeEventLog( + DDE_EventLogger::EventLoggerData(EVENT_LOGGER_KWIN_MULTITASK_VIEW, QStringLiteral("kwin_multitask_view"), { + {QStringLiteral("launch_type"), EventLaunchTypeDockIcon}, + {QStringLiteral("kwin_version"), m_kwinVersion} + })); +#endif if (m_multitaskview) { m_multitaskview->toggle(); return; diff --git a/panels/dock/multitaskview/multitaskview.h b/panels/dock/multitaskview/multitaskview.h index 77df6490f..14ab24e0d 100644 --- a/panels/dock/multitaskview/multitaskview.h +++ b/panels/dock/multitaskview/multitaskview.h @@ -34,7 +34,9 @@ class MultiTaskView : public DS_NAMESPACE::DAppletDock void iconNameChanged(); private: + void queryKwinVersion(); bool m_kWinEffect = true; + QString m_kwinVersion; QString m_iconName; QScopedPointer m_multitaskview; Dtk::Core::DConfig *m_kWinCompositingConfig = nullptr; diff --git a/panels/dock/taskmanager/CMakeLists.txt b/panels/dock/taskmanager/CMakeLists.txt index 9fcade49d..e15647d6a 100644 --- a/panels/dock/taskmanager/CMakeLists.txt +++ b/panels/dock/taskmanager/CMakeLists.txt @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +# SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. # # SPDX-License-Identifier: GPL-3.0-or-later @@ -102,6 +102,11 @@ target_link_libraries(dock-taskmanager PRIVATE PkgConfig::WaylandClient ) +if (HAVE_DDE_API_EVENTLOGGER) + target_compile_definitions(dock-taskmanager PRIVATE HAVE_DDE_API_EVENTLOGGER) + target_link_libraries(dock-taskmanager PRIVATE DDEAPI::EventLogger) +endif() + if (BUILD_WITH_X11) target_compile_definitions(dock-taskmanager PRIVATE BUILD_WITH_X11=) pkg_check_modules(TaskmanagerXcb REQUIRED IMPORTED_TARGET xcb xcb-res xcb-ewmh xcb-icccm) diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 68d104fe3..3ad7f76b8 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -22,6 +22,10 @@ #include "textcalculator.h" #include "treelandwindowmonitor.h" +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif + #include #include #include @@ -170,6 +174,8 @@ bool TaskManager::load() bool TaskManager::init() { + Settings->logMergeAppModel(!Settings->isWindowSplit()); + auto adaptor = new TaskManagerAdaptor(this); Q_UNUSED(adaptor) QDBusConnection::sessionBus().registerService("org.deepin.ds.Dock.TaskManager"); diff --git a/panels/dock/taskmanager/taskmanagersettings.cpp b/panels/dock/taskmanager/taskmanagersettings.cpp index 9d1f05663..bbc76f83c 100644 --- a/panels/dock/taskmanager/taskmanagersettings.cpp +++ b/panels/dock/taskmanager/taskmanagersettings.cpp @@ -5,13 +5,21 @@ #include "globals.h" #include "taskmanagersettings.h" +#include #include -#include #include #include +#ifdef HAVE_DDE_API_EVENTLOGGER +#include +#endif + +namespace { +constexpr qint64 EVENT_LOGGER_MERGE_APP_MODEL = 1000610011; +} + namespace dock { static inline QString bool2EnableStr(bool enable) { @@ -46,6 +54,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) } else if (TASKMANAGER_WINDOWSPLIT_KEY == key) { m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool(); Q_EMIT windowSplitChanged(); + logMergeAppModel(!m_windowSplit); } else if (TASKMANAGER_DOCKEDELEMENTS_KEY == key) { m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList(); Q_EMIT dockedElementsChanged(); @@ -192,4 +201,15 @@ void TaskManagerSettings::removeDockedElement(const QString &element) saveDockedElements(); } +void TaskManagerSettings::logMergeAppModel(bool mergeAppModelOn) +{ +#ifdef HAVE_DDE_API_EVENTLOGGER + DDE_EventLogger::EventLogger::instance().writeEventLog( + DDE_EventLogger::EventLoggerData(EVENT_LOGGER_MERGE_APP_MODEL, QStringLiteral("taskmanager_config"), { + {QStringLiteral("merge_app_model_on"), mergeAppModelOn ? QStringLiteral("true") : QStringLiteral("false")} + })); +#endif + qDebug() << "EventLogger: merge_app_model_on:" << mergeAppModelOn; +} + } diff --git a/panels/dock/taskmanager/taskmanagersettings.h b/panels/dock/taskmanager/taskmanagersettings.h index 31b360ece..7a0b6e405 100644 --- a/panels/dock/taskmanager/taskmanagersettings.h +++ b/panels/dock/taskmanager/taskmanagersettings.h @@ -42,6 +42,8 @@ class TaskManagerSettings : public QObject QStringList dockedElements() const; bool isDocked(const QString &elementId) const; + void logMergeAppModel(bool mergeAppModelOn); + private: explicit TaskManagerSettings(QObject *parent = nullptr); inline void migrateFromDockedItems();