linuxOS_AP05/buildroot/package/qt5/qt5wayland/0007-qwaylandwindow-Support-setting-window-flags-and-attr.patch
2025-06-02 13:59:07 +08:00

149 lines
3.9 KiB
Diff

From 6ee8c98d0c28146c2f857d0d56cf05b8d77c73fc Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Thu, 7 May 2020 09:12:08 +0800
Subject: [PATCH 07/15] qwaylandwindow: Support setting window flags and attrs
Support setting window flags and attrs through app_id, for example:
app_id = "attrs=alpha:0.5;flags=stay-on-top|stay-on-bottom|no-focus"
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
src/client/qwaylandwindow.cpp | 60 +++++++++++++++++++++++++++++++++++
src/client/qwaylandwindow_p.h | 6 ++++
2 files changed, 66 insertions(+)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index d4a1b7e..b83be29 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -121,6 +121,35 @@ void QWaylandWindow::ensureSize()
mBackingStore->ensureSize();
}
+/* HACK: Set window status through app id */
+void QWaylandWindow::applyWindowStatus()
+{
+ char s[256];
+
+ if (!mShellSurface)
+ return;
+
+ snprintf(s, sizeof(s), "attrs=alpha:%f|", mOpacity);
+
+ strcat(s, ";flags=");
+
+ if (mBlocked)
+ strcat(s, "blocked|");
+ else
+ strcat(s, "-blocked|");
+
+#define SET_FLAG(flag, str) \
+ if (mFlags & (flag)) strcat(s, str "|"); \
+ else strcat(s, "-" str "|");
+
+ SET_FLAG(Qt::WindowStaysOnTopHint, "stay-on-top");
+ SET_FLAG(Qt::WindowStaysOnBottomHint, "stay-on-bottom");
+ SET_FLAG(Qt::WindowDoesNotAcceptFocus, "no-focus");
+ SET_FLAG(Qt::WindowTransparentForInput, "trans-input");
+
+ mShellSurface->setAppId(QLatin1String(s));
+}
+
void QWaylandWindow::initWindow()
{
if (window()->type() == Qt::Desktop)
@@ -459,6 +488,13 @@ void QWaylandWindow::lower()
mShellSurface->lower();
}
+void QWaylandWindow::setOpacity(qreal level)
+{
+ mOpacity = level;
+
+ applyWindowStatus();
+}
+
void QWaylandWindow::setMask(const QRegion &mask)
{
if (mMask == mask)
@@ -487,6 +523,28 @@ void QWaylandWindow::setMask(const QRegion &mask)
mSurface->commit();
}
+bool QWaylandWindow::windowEvent(QEvent *event)
+{
+ switch (event->type()) {
+ case QEvent::WindowBlocked:
+ {
+ mBlocked = true;
+ applyWindowStatus();
+ }
+ break;
+ case QEvent::WindowUnblocked:
+ {
+ mBlocked = false;
+ applyWindowStatus();
+ }
+ break;
+ default:
+ break;
+ }
+
+ return QPlatformWindow::windowEvent(event);
+}
+
void QWaylandWindow::applyConfigureWhenPossible()
{
QMutexLocker resizeLocker(&mResizeLock);
@@ -792,6 +850,8 @@ void QWaylandWindow::setWindowFlags(Qt::WindowFlags flags)
mFlags = flags;
createDecoration();
+
+ applyWindowStatus();
}
bool QWaylandWindow::createDecoration()
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index 01337cf..f1a461b 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -152,8 +152,11 @@ public:
void raise() override;
void lower() override;
+ void setOpacity(qreal level) override;
void setMask(const QRegion &region) override;
+ bool windowEvent(QEvent *event) override;
+
int scale() const;
qreal devicePixelRatio() const override;
@@ -256,12 +259,14 @@ protected:
QRegion mMask;
QRegion mOpaqueArea;
Qt::WindowStates mLastReportedWindowStates = Qt::WindowNoState;
+ qreal mOpacity = 1.0f;
QWaylandShmBackingStore *mBackingStore = nullptr;
QWaylandBuffer *mQueuedBuffer = nullptr;
QRegion mQueuedBufferDamage;
private:
+ void applyWindowStatus();
void setGeometry_helper(const QRect &rect);
void initWindow();
void initializeWlSurface();
@@ -278,6 +283,7 @@ private:
void handleScreensChanged();
void sendRecursiveExposeEvent();
+ bool mBlocked = false;
bool mInResizeFromApplyConfigure = false;
bool lastVisible = false;
QRect mLastExposeGeometry;
--
2.20.1