implemented X11 resizing
This commit is contained in:
parent
a365499455
commit
501ff149cf
|
@ -243,13 +243,23 @@ void FramelessHelper::updateHoverStates(const QPoint& pos)
|
|||
void FramelessHelper::startMove(QMouseEvent* event)
|
||||
{
|
||||
#ifdef Q_OS_LINUX
|
||||
Utilities::sendX11ButtonRelease(m_window, event->globalPos());
|
||||
Utilities::sendX11ButtonReleaseEvent(m_window, event->globalPos());
|
||||
Utilities::startX11Moving(m_window, event->globalPos());
|
||||
event->accept();
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
void FramelessHelper::startResize(QMouseEvent* event, Qt::WindowFrameSection frameSection)
|
||||
{
|
||||
#ifdef Q_OS_LINUX
|
||||
Utilities::sendX11ButtonReleaseEvent(m_window, event->globalPos());
|
||||
Utilities::startX11Resizing(m_window, event->globalPos(), frameSection);
|
||||
event->accept();
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
|
||||
{
|
||||
bool filterOut = false;
|
||||
|
@ -277,6 +287,7 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event)
|
|||
auto ev = static_cast<QMouseEvent *>(event);
|
||||
if (isHoverResizeHandler()) {
|
||||
// Start system resize
|
||||
startResize(ev, m_hoveredFrameSection);
|
||||
filterOut = true;
|
||||
} else if (isInTitlebarArea(ev->pos())) {
|
||||
// Start system move
|
||||
|
|
|
@ -83,6 +83,7 @@ public:
|
|||
void updateHoverStates(const QPoint& pos);
|
||||
|
||||
void startMove(QMouseEvent* event);
|
||||
void startResize(QMouseEvent* event, Qt::WindowFrameSection frameSection);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *object, QEvent *event) override;
|
||||
|
|
|
@ -59,8 +59,10 @@ FRAMELESSHELPER_API void updateQtFrameMargins(QWindow *window, const bool enable
|
|||
#endif
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
FRAMELESSHELPER_API void sendX11ButtonRelease(QWindow *w, const QPoint &pos);
|
||||
FRAMELESSHELPER_API void sendX11ButtonReleaseEvent(QWindow *w, const QPoint &pos);
|
||||
FRAMELESSHELPER_API void sendX11MoveResizeEvent(QWindow *w, const QPoint &pos, int section);
|
||||
FRAMELESSHELPER_API void startX11Moving(QWindow *w, const QPoint &pos);
|
||||
FRAMELESSHELPER_API void startX11Resizing(QWindow *w, const QPoint &pos, Qt::WindowFrameSection frameSection);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ bool Utilities::showSystemMenu(const WId winId, const QPointF &pos)
|
|||
return false;
|
||||
}
|
||||
|
||||
void Utilities::sendX11ButtonRelease(QWindow *w, const QPoint &pos)
|
||||
void Utilities::sendX11ButtonReleaseEvent(QWindow *w, const QPoint &pos)
|
||||
{
|
||||
QPoint clientPos = w->mapFromGlobal(pos);
|
||||
Display *display = QX11Info::display();
|
||||
|
@ -177,7 +177,7 @@ void Utilities::sendX11ButtonRelease(QWindow *w, const QPoint &pos)
|
|||
XFlush(display);
|
||||
}
|
||||
|
||||
void Utilities::startX11Moving(QWindow *w, const QPoint &pos)
|
||||
void Utilities::sendX11MoveResizeEvent(QWindow *w, const QPoint &pos, int section)
|
||||
{
|
||||
Display *display = QX11Info::display();
|
||||
int screen = QX11Info::appScreen();
|
||||
|
@ -197,14 +197,56 @@ void Utilities::startX11Moving(QWindow *w, const QPoint &pos)
|
|||
event.xclient.format = 32;
|
||||
event.xclient.data.l[0] = pos.x();
|
||||
event.xclient.data.l[1] = pos.y();
|
||||
event.xclient.data.l[2] = _NET_WM_MOVERESIZE_MOVE;
|
||||
event.xclient.data.l[2] = section;
|
||||
event.xclient.data.l[3] = Button1;
|
||||
event.xclient.data.l[4] = 0; /* unused */
|
||||
event.xclient.data.l[4] = 0;
|
||||
if (XSendEvent(display, rootWindow,
|
||||
False, SubstructureRedirectMask | SubstructureNotifyMask, &event) == 0)
|
||||
qWarning() << "Cant send Move event.";
|
||||
qWarning("Cant send Move or Resize event.");
|
||||
XFlush(display);
|
||||
}
|
||||
|
||||
void Utilities::startX11Moving(QWindow *w, const QPoint &pos)
|
||||
{
|
||||
sendX11MoveResizeEvent(w, pos, _NET_WM_MOVERESIZE_MOVE);
|
||||
}
|
||||
|
||||
void Utilities::startX11Resizing(QWindow *w, const QPoint &pos, Qt::WindowFrameSection frameSection)
|
||||
{
|
||||
int section = -1;
|
||||
|
||||
switch (frameSection)
|
||||
{
|
||||
case Qt::LeftSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_LEFT;
|
||||
break;
|
||||
case Qt::TopLeftSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_TOPLEFT;
|
||||
break;
|
||||
case Qt::TopSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_TOP;
|
||||
break;
|
||||
case Qt::TopRightSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_TOPRIGHT;
|
||||
break;
|
||||
case Qt::RightSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_RIGHT;
|
||||
break;
|
||||
case Qt::BottomRightSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT;
|
||||
break;
|
||||
case Qt::BottomSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_BOTTOM;
|
||||
break;
|
||||
case Qt::BottomLeftSection:
|
||||
section = _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (section != -1)
|
||||
sendX11MoveResizeEvent(w, pos, section);
|
||||
}
|
||||
|
||||
FRAMELESSHELPER_END_NAMESPACE
|
Loading…
Reference in New Issue