From f1319b90dbb650ae1ab8193643743f883dbd520a Mon Sep 17 00:00:00 2001 From: Tsic Liu Date: Wed, 16 Oct 2024 17:02:24 +0800 Subject: [PATCH] feat: use treeland wallpper color as dock themeType log: as title --- panels/dock/CMakeLists.txt | 9 ++++- panels/dock/waylanddockhelper.cpp | 56 ++++++++++++++++++++++++++++++- panels/dock/waylanddockhelper.h | 29 ++++++++++++++-- 3 files changed, 90 insertions(+), 4 deletions(-) diff --git a/panels/dock/CMakeLists.txt b/panels/dock/CMakeLists.txt index bdc2c7ea7..aa98d3417 100644 --- a/panels/dock/CMakeLists.txt +++ b/panels/dock/CMakeLists.txt @@ -7,8 +7,9 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined") configure_file(environments.h.in environments.h @ONLY) find_package(PkgConfig REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} ${REQUIRED_QT_VERSION} COMPONENTS Core DBus Gui Qml WaylandCompositor Widgets) +find_package(Qt${QT_VERSION_MAJOR} ${REQUIRED_QT_VERSION} COMPONENTS Core DBus Gui Qml WaylandCompositor Widgets WaylandClient) find_package(DdeTrayLoader REQUIRED) +find_package(TreeLandProtocols REQUIRED) pkg_check_modules(WaylandClient REQUIRED IMPORTED_TARGET wayland-client) file( @@ -60,8 +61,14 @@ add_library(dockpanel SHARED ${dock_panel_sources} ) +qt_generate_wayland_protocol_client_sources(dockpanel + FILES + ${TREELAND_PROTOCOLS_DATA_DIR}/treeland-wallpaper-color-v1.xml +) + target_link_libraries(dockpanel PRIVATE PkgConfig::WaylandClient + Qt${QT_VERSION_MAJOR}::WaylandClient dde-shell-frame ) diff --git a/panels/dock/waylanddockhelper.cpp b/panels/dock/waylanddockhelper.cpp index a19c0da47..ffcd5448d 100644 --- a/panels/dock/waylanddockhelper.cpp +++ b/panels/dock/waylanddockhelper.cpp @@ -3,12 +3,33 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "waylanddockhelper.h" +#include "constants.h" +#include "dockpanel.h" namespace dock { -WaylandDockHelper::WaylandDockHelper(DockPanel* panel) +WaylandDockHelper::WaylandDockHelper(DockPanel *panel) : DockHelper(panel) + , m_panel(panel) { + m_wallpaperColorManager.reset(new WallpaperColorManager(this)); + connect(m_panel, &DockPanel::rootObjectChanged, this, [this]() { + m_wallpaperColorManager->watchScreen(dockScreenName()); + }); + + connect(m_panel, &DockPanel::dockScreenChanged, this, [this]() { + m_wallpaperColorManager->watchScreen(dockScreenName()); + }); + + connect(m_wallpaperColorManager.get(), &WallpaperColorManager::activeChanged, this, [this]() { + if (m_panel->rootObject() != nullptr) { + m_wallpaperColorManager->watchScreen(dockScreenName()); + } + }); + + if (m_panel->rootObject() != nullptr) { + m_wallpaperColorManager->watchScreen(dockScreenName()); + } } void WaylandDockHelper::updateDockTriggerArea() @@ -20,4 +41,37 @@ HideState WaylandDockHelper::hideState() { return Show; } + +QString WaylandDockHelper::dockScreenName() +{ + if (m_panel->dockScreen()) + return m_panel->dockScreen()->name(); + + return {}; +} + +void WaylandDockHelper::setDockColorTheme(const ColorTheme &theme) +{ + m_panel->setColorTheme(theme); +} + +WallpaperColorManager::WallpaperColorManager(WaylandDockHelper *helper) + : QWaylandClientExtensionTemplate(treeland_wallpaper_color_manager_v1_interface.version) + , m_helper(helper) +{ +} + +void WallpaperColorManager::treeland_wallpaper_color_manager_v1_output_color(const QString &output, uint32_t isDark) +{ + if (output == m_helper->dockScreenName()) { + m_helper->setDockColorTheme(isDark ? Dark : Light); + } +} + +void WallpaperColorManager::watchScreen(const QString &screeName) +{ + if (isActive() && !screeName.isEmpty()) { + watch(screeName); + } +} } diff --git a/panels/dock/waylanddockhelper.h b/panels/dock/waylanddockhelper.h index 25ae485ef..10342577a 100644 --- a/panels/dock/waylanddockhelper.h +++ b/panels/dock/waylanddockhelper.h @@ -3,10 +3,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "dockhelper.h" -#include "dsglobal.h" +#include "dockpanel.h" +#include "qwayland-treeland-wallpaper-color-v1.h" +#include namespace dock { +class WallpaperColorManager; class WaylandDockHelper : public DockHelper { Q_OBJECT @@ -15,8 +18,30 @@ class WaylandDockHelper : public DockHelper WaylandDockHelper(DockPanel* panel); HideState hideState() override; + void setDockColorTheme(const ColorTheme &theme); + QString dockScreenName(); + public Q_SLOTS: void updateDockTriggerArea() override; + +private: + DockPanel *m_panel; + QScopedPointer m_wallpaperColorManager; }; -} +class WallpaperColorManager : public QWaylandClientExtensionTemplate, public QtWayland::treeland_wallpaper_color_manager_v1 +{ + Q_OBJECT +public: + explicit WallpaperColorManager(WaylandDockHelper *helper); + + void watchScreen(const QString &screeName); + void treeland_wallpaper_color_manager_v1_output_color(const QString &output, uint32_t isDark) override; + +Q_SIGNALS: + void wallpaperColorChanged(uint32_t isDark); + +private: + WaylandDockHelper *m_helper; +}; +}