summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb/qxcbwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbwindow.cpp')
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 390628d291..a1ac5c5eb1 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -1670,4 +1670,37 @@ void QXcbWindow::setCursor(xcb_cursor_t cursor)
xcb_flush(xcb_connection());
}
+#ifdef XCB_USE_XLIB
+
+bool QXcbWindow::startSystemResize(const QPoint &pos, Qt::Corner corner)
+{
+ const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE);
+ if (!connection()->wmSupport()->isSupportedByWM(moveResize))
+ return false;
+ XEvent xev;
+ xev.xclient.type = ClientMessage;
+ xev.xclient.message_type = moveResize;
+ Display *display = (Display *)connection()->xlib_display();
+ xev.xclient.display = display;
+ xev.xclient.window = xcb_window();
+ xev.xclient.format = 32;
+ const QPoint globalPos = window()->mapToGlobal(pos);
+ xev.xclient.data.l[0] = globalPos.x();
+ xev.xclient.data.l[1] = globalPos.y();
+ const bool bottom = corner == Qt::BottomRightCorner || corner == Qt::BottomLeftCorner;
+ const bool left = corner == Qt::BottomLeftCorner || corner == Qt::TopLeftCorner;
+ if (bottom)
+ xev.xclient.data.l[2] = left ? 6 : 4; // bottomleft/bottomright
+ else
+ xev.xclient.data.l[2] = left ? 0 : 2; // topleft/topright
+ xev.xclient.data.l[3] = Button1;
+ xev.xclient.data.l[4] = 0;
+ XUngrabPointer(display, CurrentTime);
+ XSendEvent(display, m_screen->root(), False,
+ SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+ return true;
+}
+
+#endif // XCB_USE_XLIB
+
QT_END_NAMESPACE