代码拉取完成,页面将自动刷新
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。