5#ifndef SYSTEMWINDOW_P_H
6#define SYSTEMWINDOW_P_H
17#include <QtGui/QWindow>
18#include <QtGui/QMouseEvent>
20#include <QWKCore/private/qwkglobal_p.h>
24 class WindowMoveManipulator :
public QObject {
26 explicit WindowMoveManipulator(QWindow *targetWindow)
27 : QObject(targetWindow), target(targetWindow), operationComplete(false),
28 initialMousePosition(QCursor::pos()),
29 initialWindowPosition(targetWindow->position()) {
30 target->installEventFilter(
this);
34 bool eventFilter(QObject *obj, QEvent *event)
override {
35 if (operationComplete) {
38 switch (event->type()) {
39 case QEvent::MouseMove: {
40 auto mouseEvent =
static_cast<QMouseEvent *
>(event);
41 QPoint delta = getMouseEventGlobalPos(mouseEvent) - initialMousePosition;
42 target->setPosition(initialWindowPosition + delta);
46 case QEvent::MouseButtonRelease: {
47 if (target->y() < 0) {
48 target->setPosition(target->x(), 0);
50 operationComplete =
true;
63 bool operationComplete;
64 QPoint initialMousePosition;
65 QPoint initialWindowPosition;
68 class WindowResizeManipulator :
public QObject {
70 WindowResizeManipulator(QWindow *targetWindow, Qt::Edges edges)
71 : QObject(targetWindow), target(targetWindow), operationComplete(false),
72 initialMousePosition(QCursor::pos()), initialWindowRect(target->geometry()),
74 target->installEventFilter(
this);
78 bool eventFilter(QObject *obj, QEvent *event)
override {
79 if (operationComplete) {
82 switch (event->type()) {
83 case QEvent::MouseMove: {
84 auto mouseEvent =
static_cast<QMouseEvent *
>(event);
85 QPoint globalMousePos = getMouseEventGlobalPos(mouseEvent);
86 QRect windowRect = initialWindowRect;
88 if (resizeEdges & Qt::LeftEdge) {
89 int delta = globalMousePos.x() - initialMousePosition.x();
90 windowRect.setLeft(initialWindowRect.left() + delta);
92 if (resizeEdges & Qt::RightEdge) {
93 int delta = globalMousePos.x() - initialMousePosition.x();
94 windowRect.setRight(initialWindowRect.right() + delta);
96 if (resizeEdges & Qt::TopEdge) {
97 int delta = globalMousePos.y() - initialMousePosition.y();
98 windowRect.setTop(initialWindowRect.top() + delta);
100 if (resizeEdges & Qt::BottomEdge) {
101 int delta = globalMousePos.y() - initialMousePosition.y();
102 windowRect.setBottom(initialWindowRect.bottom() + delta);
105 target->setGeometry(windowRect);
109 case QEvent::MouseButtonRelease: {
110 operationComplete =
true;
123 bool operationComplete;
124 QPoint initialMousePosition;
125 QRect initialWindowRect;
126 Qt::Edges resizeEdges;
135 inline void startSystemMove(QWindow *window) {
137#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
138 std::ignore =
new WindowMoveManipulator(window);
139#elif defined(Q_OS_LINUX)
140 if (window->startSystemMove()) {
143 std::ignore =
new WindowMoveManipulator(window);
145 window->startSystemMove();
149 inline void startSystemResize(QWindow *window, Qt::Edges edges) {
151#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
152 std::ignore =
new WindowResizeManipulator(window, edges);
153#elif defined(Q_OS_MAC) || defined(Q_OS_LINUX)
154 if (window->startSystemResize(edges)) {
157 std::ignore =
new WindowResizeManipulator(window, edges);
159 window->startSystemResize(edges);
QWindowKit namespace.
Definition abstractwindowcontext.cpp:13