Skip to content

Commit aa26798

Browse files
committed
More gtk-webview high-dpi setup tweaks
Signed-off-by: falkTX <falktx@falktx.com>
1 parent 5681a67 commit aa26798

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

distrho/extra/WebViewImpl.cpp

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,33 @@ static bool gtk3(Display* const display,
11141114
webkit_web_view_run_javascript_t webkit_web_view_run_javascript = reinterpret_cast<webkit_web_view_run_javascript_t>(dlsym(nullptr, "webkit_web_view_run_javascript"));
11151115
DISTRHO_SAFE_ASSERT_RETURN(webkit_web_view_evaluate_javascript != nullptr || webkit_web_view_run_javascript != nullptr, false);
11161116

1117+
// get desktop scale factor, gtk dpi scaling needs to be based on this one
1118+
XrmInitialize();
1119+
1120+
double desktopScaleFactor = 1.0;
1121+
if (char* const rms = XResourceManagerString(display))
1122+
{
1123+
if (const XrmDatabase db = XrmGetStringDatabase(rms))
1124+
{
1125+
char* type = nullptr;
1126+
XrmValue value = {};
1127+
1128+
if (XrmGetResource(db, "Xft.dpi", "Xft.Dpi", &type, &value)
1129+
&& type != nullptr
1130+
&& std::strcmp(type, "String") == 0
1131+
&& value.addr != nullptr)
1132+
{
1133+
char* end = nullptr;
1134+
const double xftDpi = std::strtod(value.addr, &end);
1135+
if (xftDpi > 0.0 && xftDpi < HUGE_VAL)
1136+
desktopScaleFactor = xftDpi / 96.0;
1137+
}
1138+
1139+
XrmDestroyDatabase(db);
1140+
}
1141+
}
1142+
1143+
// gtk3 does not support fractional scaling, so we round to next integer if fmod >= 0.75
11171144
const int gdkScale = std::fmod(scaleFactor, 1.0) >= 0.75
11181145
? static_cast<int>(scaleFactor + 0.5)
11191146
: static_cast<int>(scaleFactor);
@@ -1124,13 +1151,23 @@ static bool gtk3(Display* const display,
11241151
std::snprintf(scale, 7, "%d", gdkScale);
11251152
setenv("GDK_SCALE", scale, 1);
11261153

1127-
std::snprintf(scale, 7, "%.2f", (1.0 / scaleFactor) * 1.2);
1128-
setenv("GDK_DPI_SCALE", scale, 1);
1154+
if (gdkScale > scaleFactor)
1155+
{
1156+
std::snprintf(scale, 7, "%.2f", 0.5 + ((0.25 - gdkScale + scaleFactor) / 0.25 * 0.0835));
1157+
setenv("GDK_DPI_SCALE", scale, 1);
1158+
}
1159+
else
1160+
{
1161+
std::snprintf(scale, 7, "%.2f", 1.0 / scaleFactor);
1162+
setenv("GDK_DPI_SCALE", scale, 1);
1163+
}
11291164
}
1130-
else if (scaleFactor > 1.0)
1165+
else
11311166
{
1167+
setenv("GDK_SCALE", "1", 1);
1168+
11321169
char scale[8] = {};
1133-
std::snprintf(scale, 7, "%.2f", (1.0 / scaleFactor) * 1.4);
1170+
std::snprintf(scale, 7, "%.2f", (1.0 / desktopScaleFactor) * scaleFactor);
11341171
setenv("GDK_DPI_SCALE", scale, 1);
11351172
}
11361173

@@ -1148,7 +1185,7 @@ static bool gtk3(Display* const display,
11481185
DISTRHO_SAFE_ASSERT_RETURN(window != nullptr, false);
11491186

11501187
gtk_window_set_default_size(GTK_WINDOW(window), width / gdkScale, height / gdkScale);
1151-
gtk_window_move(GTK_WINDOW(window), x, y);
1188+
gtk_window_move(GTK_WINDOW(window), x / gdkScale, y / gdkScale);
11521189

11531190
WebKitSettings* const settings = webkit_settings_new();
11541191
DISTRHO_SAFE_ASSERT_RETURN(settings != nullptr, false);

0 commit comments

Comments
 (0)