@@ -152,7 +152,7 @@ void WaylandDockHelper::setDockColorTheme(const ColorTheme &theme)
152152 m_panel->setColorTheme (theme);
153153}
154154
155- bool WaylandDockHelper::moveXEmbedWindow (uint32_t wid, double dx, double dy)
155+ bool WaylandDockHelper::moveXEmbedWindow (uint32_t wid, double dx, double dy, QQuickWindow *anchorWindow )
156156{
157157 // Update dock wl_surface if needed
158158 if (!m_dockWlSurface && m_panel->window ()) {
@@ -162,14 +162,43 @@ bool WaylandDockHelper::moveXEmbedWindow(uint32_t wid, double dx, double dy)
162162 }
163163 }
164164
165- if (!m_ddeShellManager || !m_ddeShellManager->isActive () || !m_dockWlSurface) {
165+ struct ::wl_surface *anchorSurface = m_dockWlSurface;
166+
167+ if (anchorWindow) {
168+ auto waylandWindow = dynamic_cast <QtWaylandClient::QWaylandWindow*>(anchorWindow->handle ());
169+ if (waylandWindow && waylandWindow->waylandSurface ()) {
170+ anchorSurface = waylandWindow->waylandSurface ()->object ();
171+ }
172+ }
173+
174+ if (!m_ddeShellManager || !m_ddeShellManager->isActive () || !anchorSurface) {
166175 qWarning () << " WaylandDockHelper::moveXEmbedWindow: not ready, manager active:"
167176 << (m_ddeShellManager && m_ddeShellManager->isActive ())
168- << " surface:" << (m_dockWlSurface != nullptr );
177+ << " surface:" << (anchorSurface != nullptr );
169178 return false ;
170179 }
171180
172- m_ddeShellManager->setXWindowPositionRelative (wid, m_dockWlSurface, dx, dy);
181+ struct wl_callback *cb = m_ddeShellManager->setXWindowPositionRelative (wid, anchorSurface, dx, dy);
182+
183+ // Register wl_callback listener — result arrives asynchronously
184+ if (!cb) {
185+ qWarning () << " WaylandDockHelper::moveXEmbedWindow: setXWindowPositionRelative returned null callback" ;
186+ Q_EMIT xembedWindowMoveResult (wid, false );
187+ return true ;
188+ }
189+
190+ struct CallbackData { uint32_t wid; WaylandDockHelper *helper; };
191+ static struct wl_callback_listener s_callbackListener = {
192+ .done = [](void *data, wl_callback *callback, uint32_t callback_data) {
193+ auto *d = static_cast <CallbackData *>(data);
194+ bool success = (callback_data == 0 );
195+ Q_EMIT d->helper ->xembedWindowMoveResult (d->wid , success);
196+ wl_callback_destroy (callback);
197+ delete d;
198+ }
199+ };
200+ wl_callback_add_listener (cb, &s_callbackListener, new CallbackData{wid, this });
201+
173202 return true ;
174203}
175204
0 commit comments