summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKai Uwe Broulik <kde@privat.broulik.de>2024-03-13 17:39:41 +0100
committerKai Uwe Broulik <kde@privat.broulik.de>2024-04-26 19:31:15 +0100
commitb875b566b23396acc0662ae6c39b503334063052 (patch)
treed9d4140831d25757d30eb2dc987993db2fcefa19
parent2c2763760bcdd8894cfe9d9a1c07f7b022692892 (diff)
QWaylandWindow: requestActivate on show
For simplicitly, a Wayland compositor typically activates a window when it is mapped. However, it does not necessarily have to and might not want to in order to prevent stealing focus. Inttroduce a requestActivateOnShow() on the shell which is called when showing a window and, in case of XDG Shell, will explicitly request activation (unless Qt::WA_ShowWithoutActivating is set) and make use of the existing XDG Activation infrastructure. Change-Id: I69ab5f2cee4540d5baefa5a266f22dbb165e4192 Reviewed-by: David Edmundson <davidedmundson@kde.org>
-rw-r--r--src/client/qwaylandshellsurface_p.h1
-rw-r--r--src/client/qwaylandwindow.cpp3
-rw-r--r--src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp12
-rw-r--r--src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h1
4 files changed, 17 insertions, 0 deletions
diff --git a/src/client/qwaylandshellsurface_p.h b/src/client/qwaylandshellsurface_p.h
index 6499a2bb0..8632efd04 100644
--- a/src/client/qwaylandshellsurface_p.h
+++ b/src/client/qwaylandshellsurface_p.h
@@ -70,6 +70,7 @@ public:
virtual void setWindowPosition(const QPoint &position) { Q_UNUSED(position); }
virtual bool requestActivate() { return false; }
+ virtual bool requestActivateOnShow() { return false; }
virtual void setXdgActivationToken(const QString &token);
virtual void requestXdgActivationToken(quint32 serial);
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 7fc9f398b..081110f83 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -576,6 +576,9 @@ void QWaylandWindow::setVisible(bool visible)
// Don't flush the events here, or else the newly visible window may start drawing, but since
// there was no frame before it will be stuck at the waitForFrameSync() in
// QWaylandShmBackingStore::beginPaint().
+
+ if (mShellSurface)
+ mShellSurface->requestActivateOnShow();
} else {
sendExposeEvent(QRect());
reset();
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
index d65d4e722..c7b95e0d0 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
@@ -662,6 +662,18 @@ bool QWaylandXdgSurface::requestActivate()
return false;
}
+bool QWaylandXdgSurface::requestActivateOnShow()
+{
+ const Qt::WindowType type = m_window->window()->type();
+ if (type == Qt::ToolTip || type == Qt::Popup || type == Qt::SplashScreen)
+ return false;
+
+ if (m_window->window()->property("_q_showWithoutActivating").toBool())
+ return false;
+
+ return requestActivate();
+}
+
void QWaylandXdgSurface::requestXdgActivationToken(quint32 serial)
{
if (auto *activation = m_shell->activation()) {
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
index 22a207a25..fa33259f7 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h
@@ -64,6 +64,7 @@ public:
void propagateSizeHints() override;
void setWindowGeometry(const QRect &rect) override;
bool requestActivate() override;
+ bool requestActivateOnShow() override;
void setXdgActivationToken(const QString &token) override;
void requestXdgActivationToken(quint32 serial) override;
void setAlertState(bool enabled) override;