summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2022-11-01 14:57:33 +0100
committerLiang Qi <liang.qi@qt.io>2022-11-18 16:19:34 +0100
commita823366f7745c235a752dc01c42276b3fa410937 (patch)
treee7eacb9ec2d37c554f8bd4a2d0ef7c9cf8d0a33a /src
parentf678893f8acd00bd0caca5101858e2a9fdf96a5c (diff)
Add QPlatformTheme::MouseCursorTheme and MouseCursorSize
Also implement in QGenericUnixTheme/QKdeTheme/QGnomeTheme/QGtk3Theme. On Wayland, there is wl_cursor_theme_load() and etc in wayland-cursor.h. On X11/xcb, cursor theme and size are common, either in XCURSOR_THEME and XCURSOR_SIZE envs, or in gsettings for gtk/gnome world. On Windows, cursor theme is part of theme file, see SetWindowTheme in https://learn.microsoft.com/en-gb/windows/win32/api/uxtheme/nf-uxtheme-setwindowtheme . For system settings, for example on Windows 10, Mouse Settings, Additional mouse options, Pointers Tab, Scheme. On macOS, it looks like cursor theme is deprecated. Change-Id: I5821377d966c281fb8330da1f5baa7f0ddf86a9f Reviewed-by: Oliver Wolff <oliver.wolff@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/gui/kernel/qplatformtheme.cpp10
-rw-r--r--src/gui/kernel/qplatformtheme.h4
-rw-r--r--src/gui/platform/unix/qgenericunixthemes.cpp26
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.cpp10
4 files changed, 49 insertions, 1 deletions
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp
index ec4b9c2b86..cdae746ba1 100644
--- a/src/gui/kernel/qplatformtheme.cpp
+++ b/src/gui/kernel/qplatformtheme.cpp
@@ -147,6 +147,12 @@ QT_BEGIN_NAMESPACE
input focus after a touch/mouse release.
This enum value has been added in Qt 6.5.
+ \value MouseCursorTheme (QString) Name of the mouse cursor theme.
+ This enum value has been added in Qt 6.5.
+
+ \value MouseCursorSize (QSize) Size of the mouse cursor.
+ This enum value has been added in Qt 6.5.
+
\sa themeHint(), QStyle::pixelMetric()
*/
@@ -627,6 +633,10 @@ QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint)
return QVariant(5000);
case MenuBarFocusOnAltPressRelease:
return false;
+ case MouseCursorTheme:
+ return QVariant(QString());
+ case MouseCursorSize:
+ return QVariant(QSize(16, 16));
}
return QVariant();
}
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index 1b7fc85c81..326b69c1e7 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -92,7 +92,9 @@ public:
FlickStartDistance,
FlickMaximumVelocity,
FlickDeceleration,
- MenuBarFocusOnAltPressRelease
+ MenuBarFocusOnAltPressRelease,
+ MouseCursorTheme,
+ MouseCursorSize
};
Q_ENUM(ThemeHint)
diff --git a/src/gui/platform/unix/qgenericunixthemes.cpp b/src/gui/platform/unix/qgenericunixthemes.cpp
index 4901433b15..ad229af624 100644
--- a/src/gui/platform/unix/qgenericunixthemes.cpp
+++ b/src/gui/platform/unix/qgenericunixthemes.cpp
@@ -86,6 +86,20 @@ static bool isDBusTrayAvailable() {
}
#endif
+static QString mouseCursorTheme()
+{
+ static QString themeName = qEnvironmentVariable("XCURSOR_THEME");
+ return themeName;
+}
+
+static QSize mouseCursorSize()
+{
+ constexpr int defaultCursorSize = 24;
+ static const int xCursorSize = qEnvironmentVariableIntValue("XCURSOR_SIZE");
+ static const int s = xCursorSize > 0 ? xCursorSize : defaultCursorSize;
+ return QSize(s, s);
+}
+
#ifndef QT_NO_DBUS
static bool checkDBusGlobalMenuAvailable()
{
@@ -290,6 +304,10 @@ QVariant QGenericUnixTheme::themeHint(ThemeHint hint) const
return QVariant(int(X11KeyboardScheme));
case QPlatformTheme::UiEffects:
return QVariant(int(HoverEffect));
+ case QPlatformTheme::MouseCursorTheme:
+ return QVariant(mouseCursorTheme());
+ case QPlatformTheme::MouseCursorSize:
+ return QVariant(mouseCursorSize());
default:
break;
}
@@ -711,6 +729,10 @@ QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(d->cursorBlinkRate);
case QPlatformTheme::UiEffects:
return QVariant(int(HoverEffect));
+ case QPlatformTheme::MouseCursorTheme:
+ return QVariant(mouseCursorTheme());
+ case QPlatformTheme::MouseCursorSize:
+ return QVariant(mouseCursorSize());
default:
break;
}
@@ -983,6 +1005,10 @@ QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
QList<Qt::Key>({ Qt::Key_Space, Qt::Key_Return, Qt::Key_Enter, Qt::Key_Select }));
case QPlatformTheme::PreselectFirstFileInDirectory:
return true;
+ case QPlatformTheme::MouseCursorTheme:
+ return QVariant(mouseCursorTheme());
+ case QPlatformTheme::MouseCursorSize:
+ return QVariant(mouseCursorSize());
default:
break;
}
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
index 11fd492f60..22bf21c06b 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
@@ -101,6 +101,8 @@ QGtk3Theme::QGtk3Theme()
SETTING_CONNECT("gtk-font-name");
SETTING_CONNECT("gtk-application-prefer-dark-theme");
SETTING_CONNECT("gtk-theme-name");
+ SETTING_CONNECT("gtk-cursor-theme-name");
+ SETTING_CONNECT("gtk-cursor-theme-size");
#undef SETTING_CONNECT
/* Set XCURSOR_SIZE and XCURSOR_THEME for Wayland sessions */
@@ -150,6 +152,14 @@ QVariant QGtk3Theme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(gtkSetting("gtk-icon-theme-name"));
case QPlatformTheme::SystemIconFallbackThemeName:
return QVariant(gtkSetting("gtk-fallback-icon-theme"));
+ case QPlatformTheme::MouseCursorTheme:
+ return QVariant(gtkSetting("gtk-cursor-theme-name"));
+ case QPlatformTheme::MouseCursorSize: {
+ int s = gtkSetting<gint>("gtk-cursor-theme-size");
+ if (s > 0)
+ return QVariant(QSize(s, s));
+ return QGnomeTheme::themeHint(hint);
+ }
default:
return QGnomeTheme::themeHint(hint);
}