Skip to content

Commit be31f54

Browse files
authored
feat: add move_xembed_window protocol for later use (#414)
Add move_xembed_window protocol for later use. Call move_xembed_window api we added. Log:
1 parent 23dbe40 commit be31f54

7 files changed

Lines changed: 71 additions & 3 deletions

File tree

plugins/application-tray/xembedprotocolhandler.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "fdoselectionmanager.h"
99

1010
#include "util.h"
11+
#include "plugin.h"
1112

1213
#include <QBitmap>
1314
#include <QWindow>
@@ -300,8 +301,28 @@ QPixmap XembedProtocolHandler::getPixmapFromWidnow()
300301
QPoint XembedProtocolHandler::updateEmbedWindowPosForGetInputEvent()
301302
{
302303
// update pos
303-
QPoint p = UTIL->getMousePos();
304-
UTIL->moveX11Window(m_containerWid, p.x(), p.y());
304+
if (qgetenv("XDG_SESSION_TYPE") == "wayland") {
305+
auto plugin = Plugin::EmbedPlugin::get(window()->windowHandle());
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+
}
322+
} else {
323+
QPoint p = UTIL->getMousePos();
324+
UTIL->moveX11Window(m_containerWid, p.x(), p.y());
325+
}
305326

306327
// make window normal and above for get input
307328
UTIL->setX11WindowInputShape(m_containerWid, QSize(1, 1));

src/protocol/plugin-manager-v1.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,17 @@
109109
<arg name="surface" type="object" interface="wl_surface"/>
110110
<arg name="id" type="new_id" interface="plugin"/>
111111
</request>
112+
113+
<request name="move_xembed_window">
114+
<description summary="request move xembed window to position">
115+
This requests dde-shell to forward a request to the compositor (treeland) to move a xembed window to position.
116+
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.
117+
</description>
118+
<arg name="xembed_winid" type="uint"/>
119+
<arg name="plugin_id" type="string"/>
120+
<arg name="item_key" type="string"/>
121+
<arg name="callback" type="new_id" interface="wl_callback"/>
122+
</request>
112123
</interface>
113124
<interface name="plugin_popup" version="1">
114125
<request name="destroy" type="destructor">

src/tray-wayland-integration/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ add_library(dockpluginmanager SHARED
3939
)
4040

4141
qt_generate_wayland_protocol_client_sources(dockpluginmanager
42-
FILES
42+
NO_INCLUDE_CORE_ONLY
43+
FILES
4344
${CMAKE_CURRENT_SOURCE_DIR}/../protocol/plugin-manager-v1.xml
4445
)
4546

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: 22 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,6 +49,21 @@ 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+
60+
struct ::wl_callback *PluginManagerIntegration::moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey)
61+
{
62+
auto callback = move_xembed_window(xembedWinId, pluginId, itemKey);
63+
wl_callback_add_listener(callback, &xembedWindowMovedListener, this);
64+
return callback;
65+
}
66+
5167
void PluginManagerIntegration::plugin_manager_v1_position_changed(uint32_t dock_position)
5268
{
5369
if (dock_position != m_dockPosition) {
@@ -89,6 +105,11 @@ void PluginManagerIntegration::plugin_manager_v1_theme_changed(const QString &th
89105
PlatformInterfaceProxy::instance()->setIconThemeName(icon_theme_name.toLocal8Bit());
90106
}
91107

108+
void PluginManagerIntegration::xembedWindowMovedCallback()
109+
{
110+
emit xembedWindowMoved();
111+
}
112+
92113
bool PluginManagerIntegration::tryCreatePopupForSubWindow(QWindow *window)
93114
{
94115
auto parentWindow = window->transientParent();
@@ -122,4 +143,5 @@ bool PluginManagerIntegration::tryCreatePopupForSubWindow(QWindow *window)
122143

123144
return false;
124145
}
146+
125147
}

src/tray-wayland-integration/pluginmanagerintegration_p.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#pragma once
66

77
#include "qwayland-plugin-manager-v1.h"
8+
#include <wayland-client-protocol.h>
89

910
#include <QtWaylandClient/private/qwaylandshellintegration_p.h>
1011

@@ -20,10 +21,13 @@ class PluginManagerIntegration : public QtWaylandClient::QWaylandShellIntegratio
2021

2122
public:
2223
void requestMessage(const QString &plugin_id, const QString &item_key, const QString &msg);
24+
struct ::wl_callback *moveXembedWindow(uint32_t xembedWinId, const QString &pluginId, const QString &itemKey);
25+
void xembedWindowMovedCallback();
2326

2427
Q_SIGNALS:
2528
void eventMessage(const QString &msg);
2629
void dockPositionChanged(uint32_t position);
30+
void xembedWindowMoved();
2731
void dockColorThemeChanged(uint32_t colorType);
2832

2933
protected:
@@ -40,5 +44,7 @@ class PluginManagerIntegration : public QtWaylandClient::QWaylandShellIntegratio
4044
private:
4145
uint32_t m_dockPosition;
4246
uint32_t m_dockColorType;
47+
static PluginManagerIntegration *s_instance;
4348
};
49+
4450
}

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)