141 lines
5.4 KiB
Diff
141 lines
5.4 KiB
Diff
|
|
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
|
|||
|
|
|