UNIX: fall back to traditional way.

The startSystemMove and startSystemResize may
return false on some systems, just fallback to
use the old way to move and resize the window.

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2020-11-05 18:25:44 +08:00
parent d06a5ccab9
commit b5e497e6ff
1 changed files with 18 additions and 5 deletions

View File

@ -319,6 +319,7 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
{
Q_ASSERT(object);
Q_ASSERT(event);
QPointF m_pCurMousePos = {};
const auto isWindowTopLevel = [](QObject *window) -> bool {
Q_ASSERT(window);
if (window->isWindowType()) {
@ -486,21 +487,32 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
return false;
};
const auto moveOrResize =
[this, &getWindowEdges, &isResizePermitted, &isInTitlebarArea](const QPointF &globalPoint,
const QPointF &point,
QObject *object) {
[this,
&getWindowEdges,
&isResizePermitted,
&isInTitlebarArea,
&m_pCurMousePos](const QPointF &globalPoint, const QPointF &point, QObject *object) {
Q_ASSERT(object);
QWindow *window = getWindowHandle(object);
if (window) {
const int deltaX = m_pCurMousePos.x() - globalPoint.x();
const int deltaY = m_pCurMousePos.y() - globalPoint.y();
const Qt::Edges edges = getWindowEdges(point, window->width(), window->height());
if (edges == Qt::Edges{}) {
if (isInTitlebarArea(globalPoint, point, object)) {
window->startSystemMove();
if (!window->startSystemMove()) {
// Fallback to the traditional way.
window->setX(window->x() + deltaX);
window->setY(window->y() + deltaY);
}
}
} else {
if (window->windowStates().testFlag(Qt::WindowState::WindowNoState)
&& isResizePermitted(globalPoint, point, object) && getResizable(object)) {
window->startSystemResize(edges);
if (!window->startSystemResize(edges)) {
// Fallback to the traditional way.
window->resize(window->width() + deltaX, window->height() + deltaY);
}
}
}
} else {
@ -568,6 +580,7 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
case QEvent::MouseMove: {
const auto mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent) {
m_pCurMousePos = mouseEvent->screenPos();
QWindow *window = getWindowHandle(object);
if (window) {
if (window->windowStates().testFlag(Qt::WindowState::WindowNoState)