Skip to content

Commit e443a7b

Browse files
committed
feat: support touch move window
Change-Id: I62743bb492f90c7fa15096abca6d39792794e849
1 parent f19ec24 commit e443a7b

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

src/common/mainwindow.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2502,6 +2502,10 @@ void MainWindow::delayedMouseReleaseHandler()
25022502

25032503
void MainWindow::mouseMoveEvent(QMouseEvent *ev)
25042504
{
2505+
if (_mouseMoved) {
2506+
return Utility::updateMousePointForWindowMove(this->winId(), ev->globalPos() * devicePixelRatio());
2507+
}
2508+
25052509
_mouseMoved = true;
25062510

25072511
if (windowState() == Qt::WindowNoState || isMaximized()) {

src/common/utility.h

+5
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ class Utility
5959
static xcb_atom_t internAtom(const char *name);
6060
static void startWindowSystemMove(quint32 WId);
6161
static void cancelWindowMoveResize(quint32 WId);
62+
63+
// 在触摸屏下移动窗口时,调用 startWindowSystemMove后,窗管无法grab触摸屏的touch update事件
64+
// 导致窗口无法移动。此处跟deepin-wm配合,使用其它方式通知窗管鼠标位置更新了
65+
static void updateMousePointForWindowMove(quint32 WId, const QPoint &globalPos);
66+
6267
static void setFrameExtents(quint32 WId, const QMargins &margins);
6368
static void setRectangles(quint32 WId, const QRegion &region, bool onlyInput = true);
6469
static void setRectangles(quint32 WId, const QVector<xcb_rectangle_t> &rectangles, bool onlyInput = true);

src/common/utility_x11.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,27 @@ void Utility::cancelWindowMoveResize(quint32 WId)
8787
sendMoveResizeMessage(WId, _NET_WM_MOVERESIZE_CANCEL);
8888
}
8989

90+
void Utility::updateMousePointForWindowMove(quint32 WId, const QPoint &globalPos)
91+
{
92+
xcb_client_message_event_t xev;
93+
94+
xev.response_type = XCB_CLIENT_MESSAGE;
95+
xev.type = internAtom("_DEEPIN_MOVE_UPDATE");
96+
xev.window = WId;
97+
xev.format = 32;
98+
xev.data.data32[0] = globalPos.x();
99+
xev.data.data32[1] = globalPos.y();
100+
xev.data.data32[2] = 0;
101+
xev.data.data32[3] = 0;
102+
xev.data.data32[4] = 0;
103+
104+
xcb_send_event(QX11Info::connection(), false, QX11Info::appRootWindow(),
105+
XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY,
106+
(const char *)&xev);
107+
108+
xcb_flush(QX11Info::connection());
109+
}
110+
90111
void Utility::setFrameExtents(quint32 WId, const QMargins &margins)
91112
{
92113
xcb_atom_t frameExtents = internAtom("_GTK_FRAME_EXTENTS");

0 commit comments

Comments
 (0)