Skip to content

Commit ab76f04

Browse files
authored
Set content and UI scales to 1 if the retrieved value is smaller than 1 (#14193)
1 parent d92079f commit ab76f04

File tree

5 files changed

+36
-135
lines changed

5 files changed

+36
-135
lines changed

src/video/x11/SDL_x11modes.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
*/
4949
// #define XRANDR_DISABLED_BY_DEFAULT
5050

51-
float X11_GetGlobalContentScale(SDL_VideoDevice *_this)
51+
float X11_GetGlobalContentScale(Display *display, XSettingsClient *client)
5252
{
5353
double scale_factor = 0.0;
5454

@@ -64,19 +64,18 @@ float X11_GetGlobalContentScale(SDL_VideoDevice *_this)
6464
// If that failed, try "Xft.dpi" from the XResourcesDatabase...
6565
// We attempt to read this directly to get the live value, XResourceManagerString
6666
// is cached per display connection.
67-
if (scale_factor <= 0.0)
68-
{
69-
SDL_VideoData *data = _this->internal;
70-
Display *display = data->display;
67+
if (scale_factor <= 0.0) {
7168
int status, real_format;
7269
Atom real_type;
70+
Atom res_mgr;
7371
unsigned long items_read, items_left;
7472
char *resource_manager;
7573
bool owns_resource_manager = false;
7674

7775
X11_XrmInitialize();
76+
res_mgr = X11_XInternAtom(display, "RESOURCE_MANAGER", False);
7877
status = X11_XGetWindowProperty(display, RootWindow(display, DefaultScreen(display)),
79-
data->atoms.RESOURCE_MANAGER, 0L, 8192L, False, XA_STRING,
78+
res_mgr, 0L, 8192L, False, XA_STRING,
8079
&real_type, &real_format, &items_read, &items_left,
8180
(unsigned char **)&resource_manager);
8281

@@ -112,11 +111,11 @@ float X11_GetGlobalContentScale(SDL_VideoDevice *_this)
112111

113112
// If that failed, try the XSETTINGS keys...
114113
if (scale_factor <= 0.0) {
115-
scale_factor = X11_GetXsettingsIntKey(_this, "Gdk/WindowScalingFactor", -1);
114+
scale_factor = X11_GetXsettingsClientIntKey(client, "Gdk/WindowScalingFactor", -1);
116115

117116
// The Xft/DPI key is stored in increments of 1024th
118117
if (scale_factor <= 0.0) {
119-
int dpi = X11_GetXsettingsIntKey(_this, "Xft/DPI", -1);
118+
int dpi = X11_GetXsettingsClientIntKey(client, "Xft/DPI", -1);
120119
if (dpi > 0) {
121120
scale_factor = (double) dpi / 1024.0;
122121
scale_factor /= 96.0;
@@ -140,6 +139,11 @@ float X11_GetGlobalContentScale(SDL_VideoDevice *_this)
140139
return (float)scale_factor;
141140
}
142141

142+
float X11_GetGlobalContentScaleForDevice(SDL_VideoDevice *_this)
143+
{
144+
return X11_GetGlobalContentScale(_this->internal->display, _this->internal->xsettings_data.xsettings);
145+
}
146+
143147
static bool get_visualinfo(Display *display, int screen, XVisualInfo *vinfo)
144148
{
145149
const char *visual_id = SDL_GetHint(SDL_HINT_VIDEO_X11_VISUALID);
@@ -312,7 +316,7 @@ static SDL_DisplayID X11_AddGenericDisplay(SDL_VideoDevice *_this, bool send_eve
312316
display.name = (char *)"Generic X11 Display"; /* this is just copied and thrown away, it's safe to cast to char* here. */
313317
display.desktop_mode = mode;
314318
display.internal = displaydata;
315-
display.content_scale = X11_GetGlobalContentScale(_this);
319+
display.content_scale = X11_GetGlobalContentScaleForDevice(_this);
316320
return SDL_AddVideoDisplay(&display, send_event);
317321
}
318322

@@ -599,7 +603,7 @@ static bool X11_FillXRandRDisplayInfo(SDL_VideoDevice *_this, Display *dpy, int
599603
display->name = display_name;
600604
}
601605
display->desktop_mode = mode;
602-
display->content_scale = X11_GetGlobalContentScale(_this);
606+
display->content_scale = X11_GetGlobalContentScaleForDevice(_this);
603607
display->internal = displaydata;
604608

605609
return true;

src/video/x11/SDL_x11modes.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#ifndef SDL_x11modes_h_
2424
#define SDL_x11modes_h_
2525

26+
#include "SDL_x11settings.h"
27+
2628
struct SDL_DisplayData
2729
{
2830
int screen;
@@ -62,7 +64,8 @@ extern SDL_PixelFormat X11_GetPixelFormatFromVisualInfo(Display *display, XVisua
6264
extern bool X11_GetDisplayBounds(SDL_VideoDevice *_this, SDL_VideoDisplay *sdl_display, SDL_Rect *rect);
6365
extern bool X11_GetDisplayUsableBounds(SDL_VideoDevice *_this, SDL_VideoDisplay *sdl_display, SDL_Rect *rect);
6466

65-
extern float X11_GetGlobalContentScale(SDL_VideoDevice *_this);
67+
extern float X11_GetGlobalContentScale(Display *display, XSettingsClient *client);
68+
extern float X11_GetGlobalContentScaleForDevice(SDL_VideoDevice *_this);
6669

6770
#ifdef SDL_VIDEO_DRIVER_X11_XRANDR
6871
extern void X11_HandleXRandREvent(SDL_VideoDevice *_this, const XEvent *xevent);

src/video/x11/SDL_x11settings.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
static void UpdateContentScale(SDL_VideoDevice *_this)
3030
{
3131
if (_this) {
32-
float scale_factor = X11_GetGlobalContentScale(_this);
32+
float scale_factor = X11_GetGlobalContentScaleForDevice(_this);
3333
for (int i = 0; i < _this->num_displays; ++i) {
3434
SDL_SetDisplayContentScale(_this->displays[i], scale_factor);
3535
}
@@ -77,15 +77,12 @@ void X11_HandleXsettingsEvent(SDL_VideoDevice *_this, const XEvent *xevent)
7777
}
7878
}
7979

80-
int X11_GetXsettingsIntKey(SDL_VideoDevice *_this, const char *key, int fallback_value) {
81-
SDL_VideoData *data = _this->internal;
82-
SDLX11_SettingsData *xsettings_data = &data->xsettings_data;
80+
int X11_GetXsettingsClientIntKey(XSettingsClient *client, const char *key, int fallback_value) {
8381
XSettingsSetting *setting = NULL;
8482
int res = fallback_value;
8583

86-
87-
if (xsettings_data->xsettings) {
88-
if (xsettings_client_get_setting(xsettings_data->xsettings, key, &setting) != XSETTINGS_SUCCESS) {
84+
if (client) {
85+
if (xsettings_client_get_setting(client, key, &setting) != XSETTINGS_SUCCESS) {
8986
goto no_key;
9087
}
9188

@@ -104,4 +101,8 @@ int X11_GetXsettingsIntKey(SDL_VideoDevice *_this, const char *key, int fallback
104101
return res;
105102
}
106103

104+
int X11_GetXsettingsIntKey(SDL_VideoDevice *_this, const char *key, int fallback_value) {
105+
return X11_GetXsettingsClientIntKey(_this->internal->xsettings_data.xsettings, key, fallback_value);
106+
}
107+
107108
#endif // SDL_VIDEO_DRIVER_X11

src/video/x11/SDL_x11settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,6 @@ extern void X11_QuitXsettings(SDL_VideoDevice *_this);
4040
extern void X11_HandleXsettingsEvent(SDL_VideoDevice *_this, const XEvent *xevent);
4141
extern int X11_GetXsettingsIntKey(SDL_VideoDevice *_this, const char *key, int fallback_value);
4242

43+
extern int X11_GetXsettingsClientIntKey(XSettingsClient *client, const char *key, int fallback_value);
44+
4345
#endif // SDL_x11settings_h_

src/video/x11/SDL_x11toolkit.c

Lines changed: 8 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -192,121 +192,6 @@ static int X11Toolkit_SharedMemoryErrorHandler(Display *d, XErrorEvent *e)
192192
return g_old_error_handler(d, e);
193193
}
194194

195-
int X11Toolkit_SettingsGetInt(XSettingsClient *client, const char *key, int fallback_value) {
196-
XSettingsSetting *setting = NULL;
197-
int res = fallback_value;
198-
199-
if (client) {
200-
if (xsettings_client_get_setting(client, key, &setting) != XSETTINGS_SUCCESS) {
201-
goto no_key;
202-
}
203-
204-
if (setting->type != XSETTINGS_TYPE_INT) {
205-
goto no_key;
206-
}
207-
208-
res = setting->data.v_int;
209-
}
210-
211-
no_key:
212-
if (setting) {
213-
xsettings_setting_free(setting);
214-
}
215-
216-
return res;
217-
}
218-
219-
static float X11Toolkit_GetUIScale(XSettingsClient *client, Display *display)
220-
{
221-
double scale_factor = 0.0;
222-
223-
// First use the forced scaling factor specified by the app/user
224-
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_X11_SCALING_FACTOR);
225-
if (hint && *hint) {
226-
double value = SDL_atof(hint);
227-
if (value >= 1.0f && value <= 10.0f) {
228-
scale_factor = value;
229-
}
230-
}
231-
232-
// If that failed, try "Xft.dpi" from the XResourcesDatabase...
233-
// We attempt to read this directly to get the live value, XResourceManagerString
234-
// is cached per display connection.
235-
if (scale_factor <= 0.0) {
236-
int status, real_format;
237-
Atom real_type;
238-
Atom res_mgr;
239-
unsigned long items_read, items_left;
240-
char *resource_manager;
241-
bool owns_resource_manager = false;
242-
243-
X11_XrmInitialize();
244-
res_mgr = X11_XInternAtom(display, "RESOURCE_MANAGER", False);
245-
status = X11_XGetWindowProperty(display, RootWindow(display, DefaultScreen(display)),
246-
res_mgr, 0L, 8192L, False, XA_STRING,
247-
&real_type, &real_format, &items_read, &items_left,
248-
(unsigned char **)&resource_manager);
249-
250-
if (status == Success && resource_manager) {
251-
owns_resource_manager = true;
252-
} else {
253-
// Fall back to XResourceManagerString. This will not be updated if the
254-
// dpi value is later changed but should allow getting the initial value.
255-
resource_manager = X11_XResourceManagerString(display);
256-
}
257-
258-
if (resource_manager) {
259-
XrmDatabase db;
260-
XrmValue value;
261-
char *type;
262-
263-
db = X11_XrmGetStringDatabase(resource_manager);
264-
265-
// Get the value of Xft.dpi from the Database
266-
if (X11_XrmGetResource(db, "Xft.dpi", "String", &type, &value)) {
267-
if (value.addr && type && SDL_strcmp(type, "String") == 0) {
268-
int dpi = SDL_atoi(value.addr);
269-
scale_factor = dpi / 96.0;
270-
}
271-
}
272-
X11_XrmDestroyDatabase(db);
273-
274-
if (owns_resource_manager) {
275-
X11_XFree(resource_manager);
276-
}
277-
}
278-
}
279-
280-
// If that failed, try the XSETTINGS keys...
281-
if (scale_factor <= 0.0) {
282-
scale_factor = X11Toolkit_SettingsGetInt(client, "Gdk/WindowScalingFactor", -1);
283-
284-
// The Xft/DPI key is stored in increments of 1024th
285-
if (scale_factor <= 0.0) {
286-
int dpi = X11Toolkit_SettingsGetInt(client, "Xft/DPI", -1);
287-
if (dpi > 0) {
288-
scale_factor = (double) dpi / 1024.0;
289-
scale_factor /= 96.0;
290-
}
291-
}
292-
}
293-
294-
// If that failed, try the GDK_SCALE envvar...
295-
if (scale_factor <= 0.0) {
296-
const char *scale_str = SDL_getenv("GDK_SCALE");
297-
if (scale_str) {
298-
scale_factor = SDL_atoi(scale_str);
299-
}
300-
}
301-
302-
// Nothing or a bad value, just fall back to 1.0
303-
if (scale_factor <= 0.0) {
304-
scale_factor = 1.0;
305-
}
306-
307-
return (float)scale_factor;
308-
}
309-
310195
static void X11Toolkit_InitWindowPixmap(SDL_ToolkitWindowX11 *data) {
311196
if (data->pixmap) {
312197
#ifndef NO_SHARED_MEMORY
@@ -467,8 +352,11 @@ static void X11Toolkit_SettingsNotify(const char *name, XSettingsAction action,
467352
}
468353

469354
/* set scale vars */
470-
window->scale = X11Toolkit_GetUIScale(window->xsettings, window->display);
355+
window->scale = X11_GetGlobalContentScale(window->display, window->xsettings);
471356
window->iscale = (int)SDL_ceilf(window->scale);
357+
if (window->scale < 1) {
358+
window->scale = 1;
359+
}
472360
if (SDL_roundf(window->scale) == window->scale) {
473361
window->scale = 0;
474362
}
@@ -728,7 +616,10 @@ SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_Tool
728616
window->xsettings_first_time = true;
729617
window->xsettings = xsettings_client_new(window->display, DefaultScreen(window->display), X11Toolkit_SettingsNotify, NULL, window);
730618
window->xsettings_first_time = false;
731-
window->scale = X11Toolkit_GetUIScale(window->xsettings, window->display);
619+
window->scale = X11_GetGlobalContentScale(window->display, window->xsettings);
620+
if (window->scale < 1) {
621+
window->scale = 1;
622+
}
732623
window->iscale = (int)SDL_ceilf(window->scale);
733624
if (SDL_roundf(window->scale) == window->scale) {
734625
window->scale = 0;

0 commit comments

Comments
 (0)