From 5316cf8d50f8fd94505ac958c247447de4c9e53a Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Sat, 6 Jul 2024 15:37:35 +0200 Subject: [PATCH] rules: add window rule to force tearing on or off This allows the user to override which presentation mode individual apps request --- src/compositor_wayland.cpp | 2 +- src/kcms/rules/rulesmodel.cpp | 5 +++ src/rules.cpp | 80 +++++++++++++++++++---------------- src/rules.h | 4 ++ src/rulesettings.kcfg | 9 ++++ src/window.cpp | 5 +++ src/window.h | 1 + 7 files changed, 68 insertions(+), 38 deletions(-) diff --git a/src/compositor_wayland.cpp b/src/compositor_wayland.cpp index 6f42122ffe..9f16a5e0b7 100644 --- a/src/compositor_wayland.cpp +++ b/src/compositor_wayland.cpp @@ -329,7 +329,7 @@ void WaylandCompositor::composite(RenderLoop *renderLoop) const bool wantsAdaptiveSync = activeWindow && activeWindow->isOnOutput(output) && activeWindow->wantsAdaptiveSync(); const bool vrr = (output->capabilities() & Output::Capability::Vrr) && (output->vrrPolicy() == VrrPolicy::Always || (output->vrrPolicy() == VrrPolicy::Automatic && wantsAdaptiveSync)); - const bool tearing = (output->capabilities() & Output::Capability::Tearing) && options->allowTearing() && activeFullscreenItem && activeFullscreenItem->presentationHint() == PresentationModeHint::Async; + const bool tearing = (output->capabilities() & Output::Capability::Tearing) && options->allowTearing() && activeFullscreenItem && activeWindow->wantsTearing(activeFullscreenItem->presentationHint() == PresentationModeHint::Async); if (vrr) { frame->setPresentationMode(tearing ? PresentationMode::AdaptiveAsync : PresentationMode::AdaptiveSync); } else { diff --git a/src/kcms/rules/rulesmodel.cpp b/src/kcms/rules/rulesmodel.cpp index c89c976f81..f71bf366ce 100644 --- a/src/kcms/rules/rulesmodel.cpp +++ b/src/kcms/rules/rulesmodel.cpp @@ -724,6 +724,11 @@ void RulesModel::populateRuleList() RulePolicy::ForceRule, RuleItem::Boolean, i18n("Adaptive Sync"), i18n("Appearance & Fixes"), QIcon::fromTheme("monitor-symbolic"))); + + addRule(new RuleItem(QLatin1String("tearing"), + RulePolicy::ForceRule, RuleItem::Boolean, + i18n("Allow Tearing"), i18n("Appearance & Fixes"), + QIcon::fromTheme("monitor-symbolic"))); } const QHash RulesModel::x11PropertyHash() diff --git a/src/rules.cpp b/src/rules.cpp index 7e7a1f1c77..d8c07de1f9 100644 --- a/src/rules.cpp +++ b/src/rules.cpp @@ -76,6 +76,7 @@ Rules::Rules() , disableglobalshortcutsrule(UnusedForceRule) , desktopfilerule(UnusedSetRule) , adaptivesyncrule(UnusedForceRule) + , tearingrule(UnusedForceRule) { } @@ -160,6 +161,7 @@ void Rules::readFromSettings(const RuleSettings *settings) READ_SET_RULE(desktopfile); READ_FORCE_RULE(layer, ); READ_FORCE_RULE(adaptivesync, ); + READ_FORCE_RULE(tearing, ); } #undef READ_MATCH_STRING @@ -255,43 +257,44 @@ void Rules::write(RuleSettings *settings) const // returns true if it doesn't affect anything bool Rules::isEmpty() const { - return (placementrule == UnusedForceRule - && positionrule == UnusedSetRule - && sizerule == UnusedSetRule - && minsizerule == UnusedForceRule - && maxsizerule == UnusedForceRule - && opacityactiverule == UnusedForceRule - && opacityinactiverule == UnusedForceRule - && ignoregeometryrule == UnusedSetRule - && desktopsrule == UnusedSetRule - && screenrule == UnusedSetRule - && activityrule == UnusedSetRule - && maximizevertrule == UnusedSetRule - && maximizehorizrule == UnusedSetRule - && minimizerule == UnusedSetRule - && shaderule == UnusedSetRule - && skiptaskbarrule == UnusedSetRule - && skippagerrule == UnusedSetRule - && skipswitcherrule == UnusedSetRule - && aboverule == UnusedSetRule - && belowrule == UnusedSetRule - && fullscreenrule == UnusedSetRule - && noborderrule == UnusedSetRule - && decocolorrule == UnusedForceRule - && blockcompositingrule == UnusedForceRule - && fsplevelrule == UnusedForceRule - && fpplevelrule == UnusedForceRule - && acceptfocusrule == UnusedForceRule - && closeablerule == UnusedForceRule - && autogrouprule == UnusedForceRule - && autogroupfgrule == UnusedForceRule - && autogroupidrule == UnusedForceRule - && strictgeometryrule == UnusedForceRule - && shortcutrule == UnusedSetRule - && disableglobalshortcutsrule == UnusedForceRule - && desktopfilerule == UnusedSetRule - && layerrule == UnusedForceRule - && adaptivesyncrule == UnusedForceRule); + return placementrule == UnusedForceRule + && positionrule == UnusedSetRule + && sizerule == UnusedSetRule + && minsizerule == UnusedForceRule + && maxsizerule == UnusedForceRule + && opacityactiverule == UnusedForceRule + && opacityinactiverule == UnusedForceRule + && ignoregeometryrule == UnusedSetRule + && desktopsrule == UnusedSetRule + && screenrule == UnusedSetRule + && activityrule == UnusedSetRule + && maximizevertrule == UnusedSetRule + && maximizehorizrule == UnusedSetRule + && minimizerule == UnusedSetRule + && shaderule == UnusedSetRule + && skiptaskbarrule == UnusedSetRule + && skippagerrule == UnusedSetRule + && skipswitcherrule == UnusedSetRule + && aboverule == UnusedSetRule + && belowrule == UnusedSetRule + && fullscreenrule == UnusedSetRule + && noborderrule == UnusedSetRule + && decocolorrule == UnusedForceRule + && blockcompositingrule == UnusedForceRule + && fsplevelrule == UnusedForceRule + && fpplevelrule == UnusedForceRule + && acceptfocusrule == UnusedForceRule + && closeablerule == UnusedForceRule + && autogrouprule == UnusedForceRule + && autogroupfgrule == UnusedForceRule + && autogroupidrule == UnusedForceRule + && strictgeometryrule == UnusedForceRule + && shortcutrule == UnusedSetRule + && disableglobalshortcutsrule == UnusedForceRule + && desktopfilerule == UnusedSetRule + && layerrule == UnusedForceRule + && adaptivesyncrule == UnusedForceRule + && tearingrule == UnusedForceRule; } Rules::ForceRule Rules::convertForceRule(int v) @@ -686,6 +689,7 @@ APPLY_RULE(shortcut, Shortcut, QString) APPLY_FORCE_RULE(disableglobalshortcuts, DisableGlobalShortcuts, bool) APPLY_RULE(desktopfile, DesktopFile, QString) APPLY_FORCE_RULE(adaptivesync, AdaptiveSync, bool) +APPLY_FORCE_RULE(tearing, Tearing, bool) #undef APPLY_RULE #undef APPLY_FORCE_RULE @@ -745,6 +749,7 @@ bool Rules::discardUsed(bool withdrawn) DISCARD_USED_SET_RULE(desktopfile); DISCARD_USED_FORCE_RULE(layer); DISCARD_USED_FORCE_RULE(adaptivesync); + DISCARD_USED_FORCE_RULE(tearing); return changed; } @@ -893,6 +898,7 @@ CHECK_FORCE_RULE(DisableGlobalShortcuts, bool) CHECK_RULE(DesktopFile, QString) CHECK_FORCE_RULE(Layer, Layer) CHECK_FORCE_RULE(AdaptiveSync, bool) +CHECK_FORCE_RULE(Tearing, bool) #undef CHECK_RULE #undef CHECK_FORCE_RULE diff --git a/src/rules.h b/src/rules.h index 69f761b65f..6328baf453 100644 --- a/src/rules.h +++ b/src/rules.h @@ -78,6 +78,7 @@ public: QString checkDesktopFile(QString desktopFile, bool init = false) const; Layer checkLayer(Layer layer) const; bool checkAdaptiveSync(bool adaptivesync) const; + bool checkTearing(bool requestsTearing) const; private: MaximizeMode checkMaximizeVert(MaximizeMode mode, bool init) const; @@ -189,6 +190,7 @@ public: bool applyDesktopFile(QString &desktopFile, bool init) const; bool applyLayer(enum Layer &layer) const; bool applyAdaptiveSync(bool &adaptivesync) const; + bool applyTearing(bool &tearing) const; private: #endif @@ -295,6 +297,8 @@ private: SetRule desktopfilerule; bool adaptivesync; ForceRule adaptivesyncrule; + bool tearing; + ForceRule tearingrule; friend QDebug &operator<<(QDebug &stream, const Rules *); }; diff --git a/src/rulesettings.kcfg b/src/rulesettings.kcfg index 67cf4f7f38..01ee3a1ce8 100644 --- a/src/rulesettings.kcfg +++ b/src/rulesettings.kcfg @@ -450,5 +450,14 @@ Rules::UnusedForceRule + + + + true + + + + Rules::UnusedForceRule + diff --git a/src/window.cpp b/src/window.cpp index acf7ad0f36..00f883192d 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -4032,6 +4032,11 @@ bool Window::wantsAdaptiveSync() const return rules()->checkAdaptiveSync(isFullScreen()); } +bool Window::wantsTearing(bool tearingRequested) const +{ + return rules()->checkTearing(tearingRequested); +} + /** * Returns @c true if the Window can be minimized; otherwise @c false. * diff --git a/src/window.h b/src/window.h index 7a6f5b9438..4a9ed53db0 100644 --- a/src/window.h +++ b/src/window.h @@ -1004,6 +1004,7 @@ public: virtual void setFullScreen(bool set); bool wantsAdaptiveSync() const; + bool wantsTearing(bool tearingRequested) const; QRectF geometryRestore() const; void setGeometryRestore(const QRectF &rect);