@@ -158,7 +158,7 @@ void WaylandDockHelper::setDockColorTheme(const ColorTheme &theme)
158158 m_panel->setColorTheme (theme);
159159}
160160
161- bool WaylandDockHelper::moveXEmbedWindow (uint32_t wid, double dx, double dy)
161+ bool WaylandDockHelper::moveXEmbedWindow (uint32_t wid, double dx, double dy, QQuickWindow *anchorWindow )
162162{
163163 // Update dock wl_surface if needed
164164 if (!m_dockWlSurface && m_panel->window ()) {
@@ -168,14 +168,43 @@ bool WaylandDockHelper::moveXEmbedWindow(uint32_t wid, double dx, double dy)
168168 }
169169 }
170170
171- if (!m_ddeShellManager || !m_ddeShellManager->isActive () || !m_dockWlSurface) {
171+ struct ::wl_surface *anchorSurface = m_dockWlSurface;
172+
173+ if (anchorWindow) {
174+ auto waylandWindow = dynamic_cast <QtWaylandClient::QWaylandWindow*>(anchorWindow->handle ());
175+ if (waylandWindow && waylandWindow->waylandSurface ()) {
176+ anchorSurface = waylandWindow->waylandSurface ()->object ();
177+ }
178+ }
179+
180+ if (!m_ddeShellManager || !m_ddeShellManager->isActive () || !anchorSurface) {
172181 qWarning () << " WaylandDockHelper::moveXEmbedWindow: not ready, manager active:"
173182 << (m_ddeShellManager && m_ddeShellManager->isActive ())
174- << " surface:" << (m_dockWlSurface != nullptr );
183+ << " surface:" << (anchorSurface != nullptr );
175184 return false ;
176185 }
177186
178- m_ddeShellManager->setXWindowPositionRelative (wid, m_dockWlSurface, dx, dy);
187+ struct wl_callback *cb = m_ddeShellManager->setXWindowPositionRelative (wid, anchorSurface, dx, dy);
188+
189+ // Register wl_callback listener — result arrives asynchronously
190+ if (!cb) {
191+ qWarning () << " WaylandDockHelper::moveXEmbedWindow: setXWindowPositionRelative returned null callback" ;
192+ Q_EMIT xembedWindowMoveResult (wid, false );
193+ return true ;
194+ }
195+
196+ struct CallbackData { uint32_t wid; WaylandDockHelper *helper; };
197+ static struct wl_callback_listener s_callbackListener = {
198+ .done = [](void *data, wl_callback *callback, uint32_t callback_data) {
199+ auto *d = static_cast <CallbackData *>(data);
200+ bool success = (callback_data == 0 );
201+ Q_EMIT d->helper ->xembedWindowMoveResult (d->wid , success);
202+ wl_callback_destroy (callback);
203+ delete d;
204+ }
205+ };
206+ wl_callback_add_listener (cb, &s_callbackListener, new CallbackData{wid, this });
207+
179208 return true ;
180209}
181210
0 commit comments