kiran-qt5-integration/0006-feat-cursor-theme-When-the-cursor-theme-changes-let-.patch

141 lines
5.4 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 48fbb1db8230eb551e5be92e3b75a3d3e71b3a46 Mon Sep 17 00:00:00 2001
From: liuxinhao <liuxinhao@kylinsec.com.cn>
Date: Mon, 7 Aug 2023 18:54:31 +0800
Subject: [PATCH] feat(cursor theme): When the cursor theme changes, let the Qt
application cursor reload
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 当光标主题变更时,让Qt应用重新加载光标主题
Related #11637
---
common/src/kiran-appearance-monitor.cpp | 15 +++++++++++++++
common/src/kiran-appearance-monitor.h | 5 +++++
platformtheme/kiran-theme.cpp | 10 +++++++++-
platformtheme/kiran-theme.h | 1 +
4 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/common/src/kiran-appearance-monitor.cpp b/common/src/kiran-appearance-monitor.cpp
index 7af4f9d..b279d55 100644
--- a/common/src/kiran-appearance-monitor.cpp
+++ b/common/src/kiran-appearance-monitor.cpp
@@ -118,6 +118,10 @@ KiranAppearanceMonitor::KiranAppearanceMonitor(QObject *parent)
connect(m_displayIface, &KiranDisplayProxy::window_scaling_factorChanged,
this, &KiranAppearanceMonitor::handleWindowScaleFactorChanged);
+ m_polishCursorTimer.setInterval(500);
+ m_polishCursorTimer.setSingleShot(true);
+
+ connect(&m_polishCursorTimer,&QTimer::timeout,this,&KiranAppearanceMonitor::handleCursorThemeChanged);
}
KiranAppearanceMonitor *KiranAppearanceMonitor::instance()
@@ -257,6 +261,17 @@ void KiranAppearanceMonitor::handleThemeSettingChanged(int type, const QString &
emit gtkThemeChanged(m_gtkThemeName);
}
}
+ else if(type==APPEARANCE_THEME_TYPE_CURSOR)
+ {
+ // 延迟通知,让QXcbCursor更新主题
+ // 若未变化光标,qt5.15之前都需要合入修复补丁
+ m_polishCursorTimer.start();
+ }
+}
+
+void KiranAppearanceMonitor::handleCursorThemeChanged()
+{
+ emit cursorThemeChanged();
}
QString KiranAppearanceMonitor::gtkTheme() const
diff --git a/common/src/kiran-appearance-monitor.h b/common/src/kiran-appearance-monitor.h
index 54b3a97..8d7033f 100644
--- a/common/src/kiran-appearance-monitor.h
+++ b/common/src/kiran-appearance-monitor.h
@@ -15,6 +15,7 @@
#include <QObject>
#include <QFont>
+#include <QTimer>
class KiranDisplayProxy;
class KiranAppearanceProxy;
@@ -39,6 +40,7 @@ signals:
void scaleFactorChanged(int factor);
void iconThemeChanged(QString iconTheme);
void gtkThemeChanged(QString gtkTheme);
+ void cursorThemeChanged();
private:
static bool parseFontValue(const QString& font,QString& fontName,int& fontSize);
@@ -47,6 +49,7 @@ private slots:
void handleFontSettingChanged(int type,const QString& fontValue);
void handleWindowScaleFactorChanged(int scaleFactor);
void handleThemeSettingChanged(int type,const QString& themeName);
+ void handleCursorThemeChanged();
private:
QString m_appFontName = "Noto Sans CJK";
@@ -59,6 +62,8 @@ private:
QString m_iconTheme = "hicolor";
QString m_gtkThemeName = "kiran";
+
+ QTimer m_polishCursorTimer;
KiranDisplayProxy* m_displayIface;
KiranAppearanceProxy* m_appearanceIface;
};
\ No newline at end of file
diff --git a/platformtheme/kiran-theme.cpp b/platformtheme/kiran-theme.cpp
index 9fec043..86eb2e1 100644
--- a/platformtheme/kiran-theme.cpp
+++ b/platformtheme/kiran-theme.cpp
@@ -132,6 +132,7 @@ void KiranTheme::init()
QObject::connect(m_settingsMonitor, &KiranAppearanceMonitor::titleBarFontChanged, this, &KiranTheme::handleTitleBarFontChanged);
QObject::connect(m_settingsMonitor, &KiranAppearanceMonitor::iconThemeChanged, this, &KiranTheme::handleIconThemeChanged);
QObject::connect(m_settingsMonitor, &KiranAppearanceMonitor::scaleFactorChanged, this, &KiranTheme::handleScaleFactorChanged);
+ QObject::connect(m_settingsMonitor, &KiranAppearanceMonitor::cursorThemeChanged, this, &KiranTheme::handleCursorThemeChanged);
// 不从KiranAppearanceMonitor接受主题变更事件修改为接受KiranPalette的主题变更信号能监听到系统主题变更以及应用程序手动指定主题
//QObject::connect(m_settingsMonitor, &KiranAppearanceMonitor::gtkThemeChanged, this, &KiranTheme::handleThemeChanged);
@@ -291,6 +292,13 @@ void KiranTheme::handleScaleFactorChanged(int factor)
}
}
+void KiranTheme::handleCursorThemeChanged()
+{
+ // 强制让窗口更新光标
+ QApplication::setOverrideCursor(QCursor());
+ QApplication::restoreOverrideCursor();
+}
+
bool KiranTheme::enableRealTimeScaling()
{
static bool enable = !qEnvironmentVariableIsSet("QT_DEVICE_PIXEL_RATIO") &&
@@ -335,7 +343,7 @@ void KiranTheme::handleThemeChanged()
{
// NOTE: SchemeLoader会接收KiranAppearanceMonitor的GTK主题改变信号重新加载配色方案
// 此处只需等到下一个事件循环通知QGuiApplication重新更新palette
-
+
// clang-format off
QTimer::singleShot(0, [this] {
// 此事件会促使QGuiApplication重新从QPlatformTheme中获取系统级别的QPalette
diff --git a/platformtheme/kiran-theme.h b/platformtheme/kiran-theme.h
index e7ebe94..243789c 100644
--- a/platformtheme/kiran-theme.h
+++ b/platformtheme/kiran-theme.h
@@ -50,6 +50,7 @@ private slots:
void handleScaleFactorChanged(int factor);
void handleScreenAdded(QScreen* screen);
void handleThemeChanged();
+ void handleCursorThemeChanged();
private:
KiranAppearanceMonitor* m_settingsMonitor;
--
2.33.0