@@ -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