Skip to content

Commit

Permalink
Added SDL_HINT_VIDEO_X11_SCALING_FACTOR to allow overriding the conte…
Browse files Browse the repository at this point in the history
…nt scale on X11 (thanks Andres!)
  • Loading branch information
slouken committed Jun 18, 2023
1 parent 210c135 commit 4e81b4e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 16 deletions.
7 changes: 7 additions & 0 deletions include/SDL3/SDL_hints.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
45 changes: 29 additions & 16 deletions src/video/x11/SDL_x11modes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 4e81b4e

Please sign in to comment.