Skip to content

Commit 1c2d742

Browse files
committed
feat: call move_xembed_window api we added
Log:
1 parent 058940d commit 1c2d742

5 files changed

Lines changed: 40 additions & 3 deletions

File tree

plugins/application-tray/xembedprotocolhandler.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,23 @@ QPoint XembedProtocolHandler::updateEmbedWindowPosForGetInputEvent()
302302
{
303303
// update pos
304304
if (qgetenv("XDG_SESSION_TYPE") == "wayland") {
305-
// Get `plugin_id` and `item_key` from EmbedPlugin.
306305
auto plugin = Plugin::EmbedPlugin::get(window()->windowHandle());
307-
// use move_xembed_window to move m_containerWid to plugin_id.
308-
// TODO: ...?
306+
307+
QEventLoop loop;
308+
connect(plugin, &Plugin::EmbedPlugin::xembedWindowMoved, &loop, &QEventLoop::quit);
309+
QTimer timer;
310+
timer.setSingleShot(true);
311+
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
312+
timer.start(3000);
313+
314+
plugin->requestMoveXembedWindow(m_containerWid);
315+
loop.exec();
316+
317+
if (timer.isActive()) {
318+
timer.stop();
319+
} else {
320+
qDebug() << "requestMoveXembedWindow() timeout";
321+
}
309322
} else {
310323
QPoint p = UTIL->getMousePos();
311324
UTIL->moveX11Window(m_containerWid, p.x(), p.y());

src/tray-wayland-integration/plugin.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ class EmbedPlugin : public QObject
8181
void pluginTypeChanged();
8282
void pluginFlagsChanged();
8383
void pluginSizePolicyChanged();
84+
void xembedWindowMoved();
8485
void requestMessage(const QString &msg);
86+
void requestMoveXembedWindow(uint32_t xembedWinId);
8587
void pluginRecvMouseEvent(int type);
8688
void rawGlobalPosChanged();
8789
void pluginRequestShutdown(const QString &type);

src/tray-wayland-integration/pluginmanagerintegration.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <qwayland-plugin-manager-v1.h>
1010
#include <QtWaylandClient/private/qwaylandwindow_p.h>
11+
#include <wayland-client-protocol.h>
1112

1213
namespace Plugin {
1314
PluginManagerIntegration::PluginManagerIntegration()
@@ -48,9 +49,18 @@ void PluginManagerIntegration::requestMessage(const QString &plugin_id, const QS
4849
request_message(plugin_id, item_key, msg);
4950
}
5051

52+
static const wl_callback_listener xembedWindowMovedListener = {
53+
[](void *data, struct wl_callback *callback, uint32_t time) {
54+
Q_UNUSED(time);
55+
wl_callback_destroy(callback);
56+
static_cast<PluginManagerIntegration*>(data)->xembedWindowMovedCallback();
57+
}
58+
};
59+
5160
struct ::wl_callback *PluginManagerIntegration::moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey)
5261
{
5362
auto callback = move_xembed_window(xembedWinId, pluginId, itemKey);
63+
wl_callback_add_listener(callback, &xembedWindowMovedListener, this);
5464
return callback;
5565
}
5666

@@ -95,6 +105,11 @@ void PluginManagerIntegration::plugin_manager_v1_theme_changed(const QString &th
95105
PlatformInterfaceProxy::instance()->setIconThemeName(icon_theme_name.toLocal8Bit());
96106
}
97107

108+
void PluginManagerIntegration::xembedWindowMovedCallback()
109+
{
110+
emit xembedWindowMoved();
111+
}
112+
98113
bool PluginManagerIntegration::tryCreatePopupForSubWindow(QWindow *window)
99114
{
100115
auto parentWindow = window->transientParent();

src/tray-wayland-integration/pluginmanagerintegration_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ class PluginManagerIntegration : public QtWaylandClient::QWaylandShellIntegratio
2222
public:
2323
void requestMessage(const QString &plugin_id, const QString &item_key, const QString &msg);
2424
struct ::wl_callback *moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey);
25+
void xembedWindowMovedCallback();
2526

2627
Q_SIGNALS:
2728
void eventMessage(const QString &msg);
2829
void dockPositionChanged(uint32_t position);
30+
void xembedWindowMoved();
2931
void dockColorThemeChanged(uint32_t colorType);
3032

3133
protected:

src/tray-wayland-integration/pluginsurface.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ PluginSurface::PluginSurface(PluginManagerIntegration *manager, QtWaylandClient:
3333
connect(manager, &PluginManagerIntegration::dockPositionChanged, m_plugin, &EmbedPlugin::dockPositionChanged);
3434
connect(manager, &PluginManagerIntegration::dockColorThemeChanged, m_plugin, &EmbedPlugin::dockColorThemeChanged);
3535
connect(manager, &PluginManagerIntegration::eventMessage, m_plugin, &EmbedPlugin::eventMessage);
36+
connect(manager, &PluginManagerIntegration::xembedWindowMoved, m_plugin, &EmbedPlugin::xembedWindowMoved);
37+
38+
connect(m_plugin, &EmbedPlugin::requestMoveXembedWindow, this, [manager, this](uint32_t xembedWinId) {
39+
manager->moveXembedWindow(xembedWinId, m_plugin->pluginId(), m_plugin->itemKey());
40+
});
3641

3742
connect(m_plugin, &EmbedPlugin::requestMessage, manager, [manager, this](const QString &msg) {
3843
manager->requestMessage(m_plugin->pluginId(), m_plugin->itemKey(), msg);

0 commit comments

Comments
 (0)