diff options
author | Liang Qi <liang.qi@qt.io> | 2018-02-11 09:13:21 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2018-02-11 09:13:21 +0100 |
commit | 8dd22d9255287bad17823d8738ac05dbffca33ab (patch) | |
tree | 94cc700070d567960260171e7edfad9d587d1b6e /src/plugins/platforms/xcb | |
parent | 7a342372bb1ecbe4146811cff48ede974c7761b5 (diff) | |
parent | 9b800b55c1c4f2b3e6ed365736e357eb31423c95 (diff) |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: Ia443f6eb1c854c99c68127a376b78c1986675a9d
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection.h | 8 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 22 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 32 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.h | 4 |
4 files changed, 41 insertions, 25 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index 98a009b211..2e06292f78 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -520,7 +520,7 @@ public: void xi2UpdateScrollingDevices(); #endif #ifdef XCB_USE_XINPUT22 - bool startSystemResizeForTouchBegin(xcb_window_t window, const QPoint &point, Qt::Corner corner); + bool startSystemMoveResizeForTouchBegin(xcb_window_t window, const QPoint &point, int corner); bool isTouchScreen(int id); #endif #endif @@ -673,12 +673,12 @@ private: #if QT_CONFIG(xinput2) QHash<int, TouchDeviceData> m_touchDevices; #ifdef XCB_USE_XINPUT22 - struct StartSystemResizeInfo { + struct StartSystemMoveResizeInfo { xcb_window_t window = XCB_NONE; uint16_t deviceid; uint32_t pointid; - Qt::Corner corner; - } m_startSystemResizeInfo; + int corner; + } m_startSystemMoveResizeInfo; #endif #endif WindowMapper m_mapper; diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index ba6481082a..39d2857212 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -784,15 +784,15 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo } if (dev->qtTouchDevice->type() == QTouchDevice::TouchScreen && - xiDeviceEvent->event == m_startSystemResizeInfo.window && - xiDeviceEvent->sourceid == m_startSystemResizeInfo.deviceid && - xiDeviceEvent->detail == m_startSystemResizeInfo.pointid) { - QXcbWindow *window = platformWindowFromId(m_startSystemResizeInfo.window); + xiDeviceEvent->event == m_startSystemMoveResizeInfo.window && + xiDeviceEvent->sourceid == m_startSystemMoveResizeInfo.deviceid && + xiDeviceEvent->detail == m_startSystemMoveResizeInfo.pointid) { + QXcbWindow *window = platformWindowFromId(m_startSystemMoveResizeInfo.window); if (window) { XIAllowTouchEvents(static_cast<Display *>(m_xlib_display), xiDeviceEvent->deviceid, xiDeviceEvent->detail, xiDeviceEvent->event, XIRejectTouch); - window->doStartSystemResize(QPoint(x, y), m_startSystemResizeInfo.corner); - m_startSystemResizeInfo.window = XCB_NONE; + window->doStartSystemMoveResize(QPoint(x, y), m_startSystemMoveResizeInfo.corner); + m_startSystemMoveResizeInfo.window = XCB_NONE; } } break; @@ -825,7 +825,7 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo touchPoint.state = Qt::TouchPointStationary; } -bool QXcbConnection::startSystemResizeForTouchBegin(xcb_window_t window, const QPoint &point, Qt::Corner corner) +bool QXcbConnection::startSystemMoveResizeForTouchBegin(xcb_window_t window, const QPoint &point, int corner) { QHash<int, TouchDeviceData>::const_iterator devIt = m_touchDevices.constBegin(); for (; devIt != m_touchDevices.constEnd(); ++devIt) { @@ -834,10 +834,10 @@ bool QXcbConnection::startSystemResizeForTouchBegin(xcb_window_t window, const Q QHash<int, QPointF>::const_iterator pointIt = deviceData.pointPressedPosition.constBegin(); for (; pointIt != deviceData.pointPressedPosition.constEnd(); ++pointIt) { if (pointIt.value().toPoint() == point) { - m_startSystemResizeInfo.window = window; - m_startSystemResizeInfo.deviceid = devIt.key(); - m_startSystemResizeInfo.pointid = pointIt.key(); - m_startSystemResizeInfo.corner = corner; + m_startSystemMoveResizeInfo.window = window; + m_startSystemMoveResizeInfo.deviceid = devIt.key(); + m_startSystemMoveResizeInfo.pointid = pointIt.key(); + m_startSystemMoveResizeInfo.corner = corner; return true; } } diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 89ace781ae..5b05a230e4 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -2640,18 +2640,28 @@ void QXcbWindow::windowEvent(QEvent *event) bool QXcbWindow::startSystemResize(const QPoint &pos, Qt::Corner corner) { + return startSystemMoveResize(pos, corner); +} + +bool QXcbWindow::startSystemMove(const QPoint &pos) +{ + return startSystemMoveResize(pos, 4); +} + +bool QXcbWindow::startSystemMoveResize(const QPoint &pos, int corner) +{ const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE); if (!connection()->wmSupport()->isSupportedByWM(moveResize)) return false; const QPoint globalPos = QHighDpi::toNativePixels(window()->mapToGlobal(pos), window()->screen()); #ifdef XCB_USE_XINPUT22 - if (connection()->startSystemResizeForTouchBegin(m_window, globalPos, corner)) + if (connection()->startSystemMoveResizeForTouchBegin(m_window, globalPos, corner)) return true; #endif - return doStartSystemResize(globalPos, corner); + return doStartSystemMoveResize(globalPos, corner); } -bool QXcbWindow::doStartSystemResize(const QPoint &globalPos, Qt::Corner corner) +bool QXcbWindow::doStartSystemMoveResize(const QPoint &globalPos, int corner) { const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE); xcb_client_message_event_t xev; @@ -2662,12 +2672,16 @@ bool QXcbWindow::doStartSystemResize(const QPoint &globalPos, Qt::Corner corner) xev.format = 32; xev.data.data32[0] = globalPos.x(); xev.data.data32[1] = globalPos.y(); - const bool bottom = corner == Qt::BottomRightCorner || corner == Qt::BottomLeftCorner; - const bool left = corner == Qt::BottomLeftCorner || corner == Qt::TopLeftCorner; - if (bottom) - xev.data.data32[2] = left ? 6 : 4; // bottomleft/bottomright - else - xev.data.data32[2] = left ? 0 : 2; // topleft/topright + if (corner == 4) { + xev.data.data32[2] = 8; // move + } else { + const bool bottom = corner == Qt::BottomRightCorner || corner == Qt::BottomLeftCorner; + const bool left = corner == Qt::BottomLeftCorner || corner == Qt::TopLeftCorner; + if (bottom) + xev.data.data32[2] = left ? 6 : 4; // bottomleft/bottomright + else + xev.data.data32[2] = left ? 0 : 2; // topleft/topright + } xev.data.data32[3] = XCB_BUTTON_INDEX_1; xev.data.data32[4] = 0; xcb_ungrab_pointer(connection()->xcb_connection(), XCB_CURRENT_TIME); diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 65221394ea..957c4e9cbd 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -110,6 +110,7 @@ public: void windowEvent(QEvent *event) override; bool startSystemResize(const QPoint &pos, Qt::Corner corner) override; + bool startSystemMove(const QPoint &pos) override; void setOpacity(qreal level) override; void setMask(const QRegion ®ion) override; @@ -177,7 +178,8 @@ public: QXcbScreen *xcbScreen() const; - bool doStartSystemResize(const QPoint &globalPos, Qt::Corner corner); + bool startSystemMoveResize(const QPoint &pos, int corner); + bool doStartSystemMoveResize(const QPoint &globalPos, int corner); virtual void create(); virtual void destroy(); |