From 4e81b4e8dee50bbe7a510ca3f11069e2c6fc4c90 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 18 Jun 2023 12:19:43 -0700
Subject: [PATCH] Added SDL_HINT_VIDEO_X11_SCALING_FACTOR to allow overriding
the content scale on X11 (thanks Andres!)
---
include/SDL3/SDL_hints.h | 7 ++++++
src/video/x11/SDL_x11modes.c | 45 +++++++++++++++++++++++-------------
2 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h
index e475619769b6..5beea2635dbd 100644
--- a/include/SDL3/SDL_hints.h
+++ b/include/SDL3/SDL_hints.h
@@ -1938,6 +1938,13 @@ extern "C" {
*/
#define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID"
+/**
+ * \brief A variable forcing the scaling factor for X11 windows
+ *
+ * This variable can be set to a floating point value in the range 1.0-10.0f
+ */
+#define SDL_HINT_VIDEO_X11_SCALING_FACTOR "SDL_VIDEO_X11_SCALING_FACTOR"
+
/**
* \brief A variable controlling whether the X11 XRandR extension should be used.
*
diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c
index fea113963e62..b624023295b9 100644
--- a/src/video/x11/SDL_x11modes.c
+++ b/src/video/x11/SDL_x11modes.c
@@ -164,29 +164,42 @@ static float GetGlobalContentScale(SDL_VideoDevice *_this)
static double scale_factor = 0.0;
if (scale_factor <= 0.0) {
- /* First try the settings portal via D-Bus for the text scaling factor (aka 'Global Scale' on KDE) */
+
+ /* First use the forced scaling factor specified by the app/user */
+ const char *hint = SDL_GetHint(SDL_HINT_VIDEO_X11_SCALING_FACTOR);
+ if (hint && *hint) {
+ double value = SDL_atof(hint);
+ if (value >= 1.0f && value <= 10.0f) {
+ scale_factor = value;
+ }
+ }
+
+ /* Next try the settings portal via D-Bus for the text scaling factor (aka 'Global Scale' on KDE) */
#ifdef SDL_USE_LIBDBUS
- DBusMessage *reply;
- SDL_DBusContext *dbus = SDL_DBus_GetContext();
-
- if (dbus) {
- if ((reply = ReadDBusSetting(dbus, SCALE_FACTOR_KEY))) {
- if (ParseDBusReply(dbus, reply, DBUS_TYPE_DOUBLE, &scale_factor)) {
- /* If the setting exists, register a listener for scale changes. */
- dbus->bus_add_match(dbus->session_conn,
- "type='signal', interface='"SCALE_FACTOR_INTERFACE"',"
- "member='"SCALE_FACTOR_SIGNAL_NAME"', arg0='"SCALE_FACTOR_NAMESPACE"',"
- "arg1='"SCALE_FACTOR_KEY"'", NULL);
- dbus->connection_add_filter(dbus->session_conn, &DBus_MessageFilter, &scale_factor, NULL);
- dbus->connection_flush(dbus->session_conn);
+ if (scale_factor <= 0.0)
+ {
+ DBusMessage *reply;
+ SDL_DBusContext *dbus = SDL_DBus_GetContext();
+
+ if (dbus) {
+ if ((reply = ReadDBusSetting(dbus, SCALE_FACTOR_KEY))) {
+ if (ParseDBusReply(dbus, reply, DBUS_TYPE_DOUBLE, &scale_factor)) {
+ /* If the setting exists, register a listener for scale changes. */
+ dbus->bus_add_match(dbus->session_conn,
+ "type='signal', interface='"SCALE_FACTOR_INTERFACE"',"
+ "member='"SCALE_FACTOR_SIGNAL_NAME"', arg0='"SCALE_FACTOR_NAMESPACE"',"
+ "arg1='"SCALE_FACTOR_KEY"'", NULL);
+ dbus->connection_add_filter(dbus->session_conn, &DBus_MessageFilter, &scale_factor, NULL);
+ dbus->connection_flush(dbus->session_conn);
+ }
+ dbus->message_unref(reply);
}
- dbus->message_unref(reply);
}
}
+#endif
/* If that failed, try "Xft.dpi" from the XResourcesDatabase... */
if (scale_factor <= 0.0)
-#endif
{
SDL_VideoData *data = _this->driverdata;
Display *display = data->display;