diff options
author | Ilya Fedin <fedin-ilja2010@ya.ru> | 2022-10-23 00:01:33 +0400 |
---|---|---|
committer | Ilya Fedin <fedin-ilja2010@ya.ru> | 2022-10-23 17:19:05 +0400 |
commit | f3a6f3c502536c0bac7f845d8f1e3179aa1a0365 (patch) | |
tree | aecacfce845c0a646aa5e3cc91d228483a7ba1e4 /src/plugins | |
parent | 47ebd2ae5e40f5d1228edd3a35d0272dcf545585 (diff) | |
download | qtwayland-f3a6f3c502536c0bac7f845d8f1e3179aa1a0365.tar.gz |
Implement window alert with xdg-activation
This is implemented by not specifying serial, as mentioned in
https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/9#note_854977
Tested on KDE Plasma
Change-Id: I4ef0975040bbce581b615b0318f90601e080235c
Reviewed-by: David Edmundson <davidedmundson@kde.org>
Diffstat (limited to 'src/plugins')
4 files changed, 32 insertions, 4 deletions
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp index e921ca46..8efc0408 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1.cpp @@ -23,7 +23,8 @@ QWaylandXdgActivationV1::~QWaylandXdgActivationV1() QWaylandXdgActivationTokenV1 * QWaylandXdgActivationV1::requestXdgActivationToken(QWaylandDisplay *display, - struct ::wl_surface *surface, uint32_t serial, + struct ::wl_surface *surface, + std::optional<uint32_t> serial, const QString &app_id) { auto wl = get_activation_token(); @@ -36,8 +37,8 @@ QWaylandXdgActivationV1::requestXdgActivationToken(QWaylandDisplay *display, if (!app_id.isEmpty()) provider->set_app_id(app_id); - if (display->lastInputDevice()) - provider->set_serial(serial, display->lastInputDevice()->wl_seat()); + if (serial && display->lastInputDevice()) + provider->set_serial(*serial, display->lastInputDevice()->wl_seat()); provider->commit(); return provider; } diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h index d5d18459..2f42d925 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgactivationv1_p.h @@ -47,7 +47,8 @@ public: QWaylandXdgActivationTokenV1 *requestXdgActivationToken(QWaylandDisplay *display, struct ::wl_surface *surface, - uint32_t serial, const QString &app_id); + std::optional<uint32_t> serial, + const QString &app_id); }; QT_END_NAMESPACE diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp index bd5e3fe5..fad8b581 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp @@ -541,6 +541,29 @@ void QWaylandXdgSurface::setXdgActivationToken(const QString &token) } } +void QWaylandXdgSurface::setAlertState(bool enabled) +{ + if (m_alertState == enabled) + return; + + m_alertState = enabled; + + if (!m_alertState) + return; + + auto *activation = m_shell->activation(); + if (!activation) + return; + + const auto tokenProvider = activation->requestXdgActivationToken( + m_shell->m_display, m_window->wlSurface(), std::nullopt, m_appId); + connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, this, + [this, tokenProvider](const QString &token) { + m_shell->activation()->activate(token, m_window->wlSurface()); + tokenProvider->deleteLater(); + }); +} + QString QWaylandXdgSurface::externWindowHandle() { if (!m_toplevel || !m_shell->exporter()) { diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h index d3cdb9d4..dfd61105 100644 --- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h +++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell_p.h @@ -64,6 +64,8 @@ public: bool requestActivate() override; void setXdgActivationToken(const QString &token) override; void requestXdgActivationToken(quint32 serial) override; + void setAlertState(bool enabled) override; + bool isAlertState() const override { return m_alertState; } QString externWindowHandle() override; void setSizeHints(); @@ -132,6 +134,7 @@ private: uint m_appliedConfigureSerial = 0; QString m_activationToken; QString m_appId; + bool m_alertState = false; friend class QWaylandXdgShell; }; |