diff --git a/plugins/application-tray/xembedprotocolhandler.cpp b/plugins/application-tray/xembedprotocolhandler.cpp index f611f7abe..1e820d0ae 100644 --- a/plugins/application-tray/xembedprotocolhandler.cpp +++ b/plugins/application-tray/xembedprotocolhandler.cpp @@ -8,6 +8,7 @@ #include "fdoselectionmanager.h" #include "util.h" +#include "plugin.h" #include #include @@ -300,8 +301,15 @@ QPixmap XembedProtocolHandler::getPixmapFromWidnow() QPoint XembedProtocolHandler::updateEmbedWindowPosForGetInputEvent() { // update pos - QPoint p = UTIL->getMousePos(); - UTIL->moveX11Window(m_containerWid, p.x(), p.y()); + if (qgetenv("XDG_SESSION_TYPE") == "wayland") { + // Get `plugin_id` and `item_key` from EmbedPlugin. + auto plugin = Plugin::EmbedPlugin::get(window()->windowHandle()); + // use move_xembed_window to move m_containerWid to plugin_id. + // TODO: ...? + } else { + QPoint p = UTIL->getMousePos(); + UTIL->moveX11Window(m_containerWid, p.x(), p.y()); + } // make window normal and above for get input UTIL->setX11WindowInputShape(m_containerWid, QSize(1, 1)); diff --git a/src/protocol/plugin-manager-v1.xml b/src/protocol/plugin-manager-v1.xml index 715a1033c..be058761f 100644 --- a/src/protocol/plugin-manager-v1.xml +++ b/src/protocol/plugin-manager-v1.xml @@ -109,6 +109,17 @@ + + + + This requests dde-shell to forward a request to the compositor (treeland) to move a xembed window to position. + dde-shell knows the xembed window's relative position, and then can request treeland to move the window to an absolute position based on a relative position. + + + + + + diff --git a/src/tray-wayland-integration/CMakeLists.txt b/src/tray-wayland-integration/CMakeLists.txt index 8d44aa850..9e17ca561 100644 --- a/src/tray-wayland-integration/CMakeLists.txt +++ b/src/tray-wayland-integration/CMakeLists.txt @@ -39,7 +39,8 @@ add_library(dockpluginmanager SHARED ) qt_generate_wayland_protocol_client_sources(dockpluginmanager - FILES +NO_INCLUDE_CORE_ONLY +FILES ${CMAKE_CURRENT_SOURCE_DIR}/../protocol/plugin-manager-v1.xml ) diff --git a/src/tray-wayland-integration/pluginmanagerintegration.cpp b/src/tray-wayland-integration/pluginmanagerintegration.cpp index a997b6022..fac49e134 100644 --- a/src/tray-wayland-integration/pluginmanagerintegration.cpp +++ b/src/tray-wayland-integration/pluginmanagerintegration.cpp @@ -48,6 +48,12 @@ void PluginManagerIntegration::requestMessage(const QString &plugin_id, const QS request_message(plugin_id, item_key, msg); } +struct ::wl_callback *PluginManagerIntegration::moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey) +{ + auto callback = move_xembed_window(xembedWinId, pluginId, itemKey); + return callback; +} + void PluginManagerIntegration::plugin_manager_v1_position_changed(uint32_t dock_position) { if (dock_position != m_dockPosition) { @@ -122,4 +128,5 @@ bool PluginManagerIntegration::tryCreatePopupForSubWindow(QWindow *window) return false; } + } diff --git a/src/tray-wayland-integration/pluginmanagerintegration_p.h b/src/tray-wayland-integration/pluginmanagerintegration_p.h index 88f53a2a4..d07764fbf 100644 --- a/src/tray-wayland-integration/pluginmanagerintegration_p.h +++ b/src/tray-wayland-integration/pluginmanagerintegration_p.h @@ -5,6 +5,7 @@ #pragma once #include "qwayland-plugin-manager-v1.h" +#include #include @@ -20,6 +21,7 @@ class PluginManagerIntegration : public QtWaylandClient::QWaylandShellIntegratio public: void requestMessage(const QString &plugin_id, const QString &item_key, const QString &msg); + struct ::wl_callback *moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey); Q_SIGNALS: void eventMessage(const QString &msg); @@ -40,5 +42,7 @@ class PluginManagerIntegration : public QtWaylandClient::QWaylandShellIntegratio private: uint32_t m_dockPosition; uint32_t m_dockColorType; + static PluginManagerIntegration *s_instance; }; + }