renderingservertest: Improve focus handling
Properly reset focus when surfaces get added/removed. E.g. when writing in Kate additional surfaces are created for which we do not want to pass focus.
This commit is contained in:
parent
67b1bf7d42
commit
3fc96bdabd
1 changed files with 22 additions and 9 deletions
|
@ -55,6 +55,7 @@ protected:
|
|||
void wheelEvent(QWheelEvent *event) override;
|
||||
|
||||
private:
|
||||
void updateFocus();
|
||||
QList<KWayland::Server::ShellSurfaceInterface*> m_stackingOrder;
|
||||
QPointer<KWayland::Server::SeatInterface> m_seat;
|
||||
};
|
||||
|
@ -82,13 +83,29 @@ void CompositorWindow::surfaceCreated(KWayland::Server::ShellSurfaceInterface *s
|
|||
connect(surface, &ShellSurfaceInterface::destroyed, this,
|
||||
[surface, this] {
|
||||
m_stackingOrder.removeAll(surface);
|
||||
updateFocus();
|
||||
update();
|
||||
}
|
||||
);
|
||||
if (m_seat) {
|
||||
m_seat->setFocusedPointerSurface(surface->surface());
|
||||
m_seat->setFocusedKeyboardSurface(surface->surface());
|
||||
updateFocus();
|
||||
}
|
||||
|
||||
void CompositorWindow::updateFocus()
|
||||
{
|
||||
using namespace KWayland::Server;
|
||||
if (!m_seat || m_stackingOrder.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
auto it = std::find_if(m_stackingOrder.constBegin(), m_stackingOrder.constEnd(),
|
||||
[](ShellSurfaceInterface *s) {
|
||||
return s->surface()->buffer() != nullptr;
|
||||
}
|
||||
);
|
||||
if (it == m_stackingOrder.constEnd()) {
|
||||
return;
|
||||
}
|
||||
m_seat->setFocusedPointerSurface((*it)->surface());
|
||||
m_seat->setFocusedKeyboardSurface((*it)->surface());
|
||||
}
|
||||
|
||||
void CompositorWindow::setSeat(const QPointer< KWayland::Server::SeatInterface > &seat)
|
||||
|
@ -115,9 +132,7 @@ void CompositorWindow::keyPressEvent(QKeyEvent *event)
|
|||
return;
|
||||
}
|
||||
if (!m_seat->focusedKeyboardSurface()) {
|
||||
if (!m_stackingOrder.isEmpty()) {
|
||||
m_seat->setFocusedKeyboardSurface(m_stackingOrder.last()->surface());
|
||||
}
|
||||
updateFocus();
|
||||
}
|
||||
m_seat->setTimestamp(event->timestamp());
|
||||
m_seat->keyPressed(event->nativeScanCode() - 8);
|
||||
|
@ -137,9 +152,7 @@ void CompositorWindow::mouseMoveEvent(QMouseEvent *event)
|
|||
{
|
||||
QWidget::mouseMoveEvent(event);
|
||||
if (!m_seat->focusedPointerSurface()) {
|
||||
if (!m_stackingOrder.isEmpty()) {
|
||||
m_seat->setFocusedPointerSurface(m_stackingOrder.last()->surface());
|
||||
}
|
||||
updateFocus();
|
||||
}
|
||||
m_seat->setTimestamp(event->timestamp());
|
||||
m_seat->setPointerPos(event->localPos().toPoint());
|
||||
|
|
Loading…
Reference in a new issue