44
55#pragma once
66
7+ #include < QMap>
78#include < QPointer>
89#include < QtWaylandCompositor/QWaylandCompositor>
910#include < QtWaylandCompositor/QWaylandQuickExtension>
@@ -65,6 +66,11 @@ class PluginManager : public QWaylandCompositorExtensionTemplate<PluginManager>,
6566
6667 Q_INVOKABLE void updateDockOverflowState (int state);
6768 Q_INVOKABLE void setPopupMinHeight (int height);
69+
70+ // Called from QML when moveXEmbedWindowRequested is handled
71+ // wid: the XEmbed window ID from the original request
72+ // result: true = success, false = error
73+ Q_INVOKABLE void notifyXEmbedWindowMoveResult (uint32_t wid, bool result);
6874
6975 uint32_t dockPosition () const ;
7076 void setDockPosition (uint32_t dockPosition);
@@ -92,6 +98,9 @@ class PluginManager : public QWaylandCompositorExtensionTemplate<PluginManager>,
9298 void messageRequest (PluginSurface *, const QString &msg);
9399 void dockSizeChanged ();
94100 void requestShutdown (const QString &type);
101+ // Signal emitted when XEmbed window move is requested
102+ // Parameters: wid (window ID), pluginId, itemKey, dx (relative x offset), dy (relative y offset)
103+ void moveXEmbedWindowRequested (uint32_t wid, const QString &pluginId, const QString &itemKey, double dx, double dy);
95104
96105private Q_SLOTS :
97106 void onFontChanged ();
@@ -103,6 +112,7 @@ private Q_SLOTS:
103112 virtual void plugin_manager_v1_request_message (Resource *resource, const QString &plugin_id, const QString &item_key, const QString &msg) override ;
104113 virtual void plugin_manager_v1_create_popup_at (Resource *resource, const QString &plugin_id, const QString &item_key, int32_t type, int32_t x, int32_t y, struct ::wl_resource *surface, uint32_t id) override ;
105114 virtual void plugin_manager_v1_create_plugin (Resource *resource, const QString &plugin_id, const QString &item_key, const QString &display_name, int32_t plugin_flags, int32_t type, int32_t size_policy, struct ::wl_resource *surface, uint32_t id) override ;
115+ virtual void plugin_manager_v1_move_xembed_window (Resource *resource, uint32_t xembed_winid, const QString &plugin_id, const QString &item_key, uint32_t callback) override ;
106116
107117private:
108118 static QJsonObject getRootObj (const QString &jsonStr);
@@ -113,14 +123,24 @@ private Q_SLOTS:
113123 QString popupMinHeightMsg () const ;
114124 using PluginSurfaceCallback = std::function<void (Resource *)>;
115125 void foreachPluginSurface (PluginSurfaceCallback callback);
126+ PluginSurface* findPluginSurface (const QString &pluginId, const QString &itemKey) const ;
116127
117128private:
129+ struct PendingXEmbedCallback {
130+ uint32_t callback;
131+ struct ::wl_resource *resource; // Store resource instead of client for lifecycle safety
132+ };
133+
118134 QList<PluginSurface*> m_pluginSurfaces;
119135
120136 uint32_t m_dockPosition = 0 ;
121137 uint32_t m_dockColorTheme = 0 ;
122138 QSize m_dockSize;
123139 int m_popupMinHeight = 0 ;
140+
141+ // Map of pending XEmbed callbacks: wid -> callback info
142+ // Supports multiple concurrent requests from different clients
143+ QMap<uint32_t , PendingXEmbedCallback> m_pendingXEmbedCallbacks;
124144};
125145
126146class PluginSurface : public QWaylandShellSurfaceTemplate <PluginSurface>, public QtWaylandServer::plugin
@@ -173,6 +193,9 @@ class PluginSurface : public QWaylandShellSurfaceTemplate<PluginSurface>, public
173193 Q_INVOKABLE void updatePluginGeometry (const QRect &geometry);
174194 Q_INVOKABLE void setGlobalPos (const QPoint &pos);
175195
196+ // Position relative to the dock window, set from QML via updatePluginGeometry
197+ QPoint itemPosition () const ;
198+
176199 int margins () const ;
177200 void setMargins (int newMargins);
178201
@@ -211,6 +234,7 @@ class PluginSurface : public QWaylandShellSurfaceTemplate<PluginSurface>, public
211234 int m_margins = 0 ;
212235 int m_height;
213236 int m_width;
237+ QPoint m_itemPosition; // Position relative to dock window, for XEmbed window positioning
214238};
215239
216240class PluginPopup : public QWaylandShellSurfaceTemplate <PluginPopup>, public QtWaylandServer::plugin_popup
0 commit comments