Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/core/rootsurfacecontainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ class RootSurfaceContainer : public SurfaceContainer
void destroyForSurface(SurfaceWrapper *wrapper);

SeatSurfaceManager *getSeatContainer(WSeat *seat) const;
const QMap<WSeat*, SeatSurfaceManager*> &seatContainers() const { return m_seatContainers; }
WSeat *getDefaultSeat() const;
SeatSurfaceManager *getSeatContainerOrDefault(WSeat *seat = nullptr) const;

Expand Down
21 changes: 19 additions & 2 deletions src/seat/helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1832,6 +1832,21 @@ void Helper::fakePressSurfaceBottomRightToReszie(SurfaceWrapper *surface)
Q_EMIT surface->resizeRequested(Qt::BottomEdge | Qt::RightEdge);
}

bool Helper::beforeHandleEvent(WSeat *seat, WSurface *watched, QObject *,
QObject *, QInputEvent *event)
{
auto eventType = event->type();
if (eventType != QEvent::MouseMove && eventType != QEvent::HoverMove)
return false;

auto *container = m_rootSurfaceContainer->getSeatContainer(seat);
if (container && container->moveResizeState().surface
&& container->moveResizeState().surface->surface() == watched)
return true;

return false;
}

bool Helper::beforeDisposeEvent(WSeat *seat, QWindow *targetWindow, QInputEvent *event)
{
if (!m_instance || !m_renderWindow || !m_backend) {
Expand Down Expand Up @@ -1957,10 +1972,12 @@ bool Helper::beforeDisposeEvent(WSeat *seat, QWindow *targetWindow, QInputEvent
// Per-seat move/resize handling
const auto *seatContainer = m_rootSurfaceContainer->getSeatContainer(seat);
if (seatContainer && seatContainer->moveResizeState().surface) {
if (Q_LIKELY(event->type() == QEvent::MouseMove || event->type() == QEvent::TouchUpdate)) {
if (Q_LIKELY(event->type() == QEvent::MouseMove
|| event->type() == QEvent::HoverMove
|| event->type() == QEvent::TouchUpdate)) {
auto cursor = seat->cursor();
Q_ASSERT(cursor);
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
auto *ev = static_cast<QSinglePointEvent *>(event);

const auto &moveResizeState = seatContainer->moveResizeState();
auto ownsOutput = moveResizeState.surface->ownsOutput();
Expand Down
2 changes: 2 additions & 0 deletions src/seat/helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ private Q_SLOTS:
void setCursorPosition(const QPointF &position);

bool beforeDisposeEvent(WSeat *seat, QWindow *window, QInputEvent *event) override;
bool beforeHandleEvent(WSeat *seat, WSurface *watched, QObject *shellObject,
QObject *eventObject, QInputEvent *event) override;
bool afterHandleEvent(WSeat *seat, WSurface *watched, QObject *shellObject,
QObject *eventObject, QInputEvent *event) override;
bool unacceptedEvent(WSeat *seat, QWindow *window, QInputEvent *event) override;
Expand Down
7 changes: 7 additions & 0 deletions src/surface/seatsurfacemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,15 @@
}
}

void SeatSurfaceManager::beginMoveResize(SurfaceWrapper *surface, Qt::Edges edges)

Check warning on line 95 in src/surface/seatsurfacemanager.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'beginMoveResize' is never used.
{
// Guard against re-entry: beginMoveResizeForSeat() may invoke this again
// with the same surface+edges. Without this early return, the subsequent
// endMoveResize() call would briefly clear the state, causing the
// surface to lose its move/resize tracking.
if (m_moveResizeState.surface == surface && m_moveResizeState.edges == edges)
return;

if (m_moveResizeState.surface)
endMoveResize();

Expand Down
Loading