diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp index 43b041d44..3546920ba 100644 --- a/kcms/fonts/fonts.cpp +++ b/kcms/fonts/fonts.cpp @@ -129,9 +129,10 @@ void KFonts::load() void KFonts::save() { auto dpiItem = fontsAASettings()->findItem("forceFontDPI"); + auto dpiWaylandItem = fontsAASettings()->findItem("forceFontDPIWayland"); auto antiAliasingItem = fontsAASettings()->findItem("antiAliasing"); - Q_ASSERT(dpiItem && antiAliasingItem); - if (dpiItem->isSaveNeeded() || antiAliasingItem->isSaveNeeded()) { + Q_ASSERT(dpiItem && dpiWaylandItem && antiAliasingItem); + if (dpiItem->isSaveNeeded() || dpiWaylandItem->isSaveNeeded() || antiAliasingItem->isSaveNeeded()) { emit aliasingChangeApplied(); } diff --git a/kcms/fonts/fontsaasettings.cpp b/kcms/fonts/fontsaasettings.cpp index 9e2683dcd..8953aa5d5 100644 --- a/kcms/fonts/fontsaasettings.cpp +++ b/kcms/fonts/fontsaasettings.cpp @@ -264,6 +264,7 @@ FontsAASettings::FontsAASettings(QObject *parent) addItemInternal("subPixel", defaultSubPixel(), &FontsAASettings::subPixelChanged); addItemInternal("hinting", defaultHinting(), &FontsAASettings::hintingChanged); + connect(this, &FontsAASettings::forceFontDPIWaylandChanged, this, &FontsAASettings::dpiChanged); connect(this, &FontsAASettings::forceFontDPIChanged, this, &FontsAASettings::dpiChanged); } diff --git a/kcms/fonts/fontsaasettingsbase.kcfg b/kcms/fonts/fontsaasettingsbase.kcfg index 22d80c0db..771953885 100644 --- a/kcms/fonts/fontsaasettingsbase.kcfg +++ b/kcms/fonts/fontsaasettingsbase.kcfg @@ -5,6 +5,10 @@ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > + + + 0 + 0 diff --git a/kcms/fonts/package/contents/ui/main.qml b/kcms/fonts/package/contents/ui/main.qml index 64eca5001..a63035bf4 100644 --- a/kcms/fonts/package/contents/ui/main.qml +++ b/kcms/fonts/package/contents/ui/main.qml @@ -362,9 +362,6 @@ KCM.SimpleKCM { RowLayout { Layout.preferredWidth: formLayout.maxImplicitWidth - // We don't want people messing with the font DPI on Wayland; - // they should always be using the global scaling system instead - visible: Qt.platform.pluginName === "xcb" QtControls.CheckBox { id: dpiCheckBox @@ -375,6 +372,13 @@ KCM.SimpleKCM { dpiTwiddledMessage.visible = checked } + // dpiSpinBox will set forceFontDPI or forceFontDPIWayland, + // so only one SettingStateBinding will be activated at a time. + KCM.SettingStateBinding { + configObject: kcm.fontsAASettings + settingName: "forceFontDPIWayland" + extraEnabledConditions: antiAliasingCheckBox.checked && !kcm.fontsAASettings.isAaImmutable + } KCM.SettingStateBinding { configObject: kcm.fontsAASettings settingName: "forceFontDPI" @@ -390,6 +394,13 @@ KCM.SimpleKCM { to: 999 from: 1 + // dpiSpinBox will set forceFontDPI or forceFontDPIWayland, + // so only one SettingStateBinding will be activated at a time. + KCM.SettingStateBinding { + configObject: kcm.fontsAASettings + settingName: "forceFontDPIWayland" + extraEnabledConditions: dpiCheckBox.enabled && dpiCheckBox.checked + } KCM.SettingStateBinding { configObject: kcm.fontsAASettings settingName: "forceFontDPI" diff --git a/kcms/krdb/krdb.cpp b/kcms/krdb/krdb.cpp index e349193e3..4cf641cfd 100644 --- a/kcms/krdb/krdb.cpp +++ b/kcms/krdb/krdb.cpp @@ -438,8 +438,13 @@ void runRdb(uint flags) int dpi; + //even though this sets up the X rdb, we want to use the value the + //user has set to use when under wayland - as X apps will be scaled by the compositor if (KWindowSystem::isPlatformWayland()) { - dpi = 96; // Don't change the default DPI at all under wayland + dpi = cfgfonts.readEntry("forceFontDPIWayland", 0); + if (dpi == 0) { //with wayland we want xwayland to run at 96 dpi (unless set otherwise) as we have wayland scaling on top + dpi = 96; + } } else { dpi = cfgfonts.readEntry("forceFontDPI", 0); } diff --git a/startkde/startplasma-wayland.cpp b/startkde/startplasma-wayland.cpp index 28c59782a..0867c726b 100644 --- a/startkde/startplasma-wayland.cpp +++ b/startkde/startplasma-wayland.cpp @@ -30,6 +30,14 @@ int main(int argc, char **argv) createConfigDirectory(); setupCursor(true); + { + KConfig fonts(QStringLiteral("kcmfonts")); + KConfigGroup group = fonts.group("General"); + auto dpiSetting = group.readEntry("forceFontDPIWayland", 96); + auto dpi = dpiSetting == 0 ? 96 : dpiSetting; + qputenv("QT_WAYLAND_FORCE_DPI", QByteArray::number(dpi)); + } + // Query whether org.freedesktop.locale1 is available. If it is, try to // set XKB_DEFAULT_{MODEL,LAYOUT,VARIANT,OPTIONS} accordingly. {