From e9aeb9ac6063494d028c2254f4b98369d8f06879 Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 30 Mar 2026 15:18:44 -0400 Subject: [PATCH] blur: add probe to check compositor for ext-bg-effect --- core/cmd/dms/commands_blur.go | 40 +++++++++++++++++++++++++++++ core/cmd/dms/commands_common.go | 1 + core/internal/blur/probe.go | 35 +++++++++++++++++++++++++ quickshell/Services/BlurService.qml | 31 +++++++++++++++++++--- 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 core/cmd/dms/commands_blur.go create mode 100644 core/internal/blur/probe.go diff --git a/core/cmd/dms/commands_blur.go b/core/cmd/dms/commands_blur.go new file mode 100644 index 00000000..d01eb932 --- /dev/null +++ b/core/cmd/dms/commands_blur.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" + "os" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/blur" + "github.com/spf13/cobra" +) + +var blurCmd = &cobra.Command{ + Use: "blur", + Short: "Background blur utilities", +} + +var blurCheckCmd = &cobra.Command{ + Use: "check", + Short: "Check if the compositor supports background blur (ext-background-effect-v1)", + Args: cobra.NoArgs, + Run: runBlurCheck, +} + +func init() { + blurCmd.AddCommand(blurCheckCmd) +} + +func runBlurCheck(cmd *cobra.Command, args []string) { + supported, err := blur.ProbeSupport() + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } + + switch supported { + case true: + fmt.Println("supported") + default: + fmt.Println("unsupported") + } +} diff --git a/core/cmd/dms/commands_common.go b/core/cmd/dms/commands_common.go index cfb087fa..6557860d 100644 --- a/core/cmd/dms/commands_common.go +++ b/core/cmd/dms/commands_common.go @@ -525,5 +525,6 @@ func getCommonCommands() []*cobra.Command { configCmd, dlCmd, randrCmd, + blurCmd, } } diff --git a/core/internal/blur/probe.go b/core/internal/blur/probe.go new file mode 100644 index 00000000..e9c24b8c --- /dev/null +++ b/core/internal/blur/probe.go @@ -0,0 +1,35 @@ +package blur + +import ( + wlhelpers "github.com/AvengeMedia/DankMaterialShell/core/internal/wayland/client" + client "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client" +) + +const extBackgroundEffectInterface = "ext_background_effect_manager_v1" + +func ProbeSupport() (bool, error) { + display, err := client.Connect("") + if err != nil { + return false, err + } + defer display.Context().Close() + + registry, err := display.GetRegistry() + if err != nil { + return false, err + } + + found := false + registry.SetGlobalHandler(func(e client.RegistryGlobalEvent) { + switch e.Interface { + case extBackgroundEffectInterface: + found = true + } + }) + + if err := wlhelpers.Roundtrip(display, display.Context()); err != nil { + return false, err + } + + return found, nil +} diff --git a/quickshell/Services/BlurService.qml b/quickshell/Services/BlurService.qml index 535d8d6b..40a3aeb8 100644 --- a/quickshell/Services/BlurService.qml +++ b/quickshell/Services/BlurService.qml @@ -3,13 +3,16 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell +import Quickshell.Io import Quickshell.Wayland // ! Import is needed despite what qmlls says import qs.Common Singleton { id: root - property bool available: false + property bool quickshellSupported: false + property bool compositorSupported: false + property bool available: quickshellSupported && compositorSupported readonly property bool enabled: available && (SettingsData.blurEnabled ?? false) readonly property color borderColor: { @@ -72,6 +75,27 @@ Singleton { region.destroy(); } + Process { + id: blurProbe + running: false + command: ["dms", "blur", "check"] + + stdout: StdioCollector { + onStreamFinished: { + root.compositorSupported = text.trim() === "supported"; + if (root.compositorSupported) + console.info("BlurService: Compositor supports ext-background-effect-v1"); + else + console.info("BlurService: Compositor does not support ext-background-effect-v1"); + } + } + + onExited: exitCode => { + if (exitCode !== 0) + console.warn("BlurService: blur probe failed with code:", exitCode); + } + } + Component.onCompleted: { try { const test = Qt.createQmlObject(` @@ -79,8 +103,9 @@ Singleton { Region { radius: 0 } `, root, "BlurAvailabilityTest"); test.destroy(); - available = true; - console.info("BlurService: Initialized with blur support"); + quickshellSupported = true; + console.info("BlurService: Quickshell blur support available"); + blurProbe.running = true; } catch (e) { console.info("BlurService: BackgroundEffect not available - blur disabled. Requires a newer version of Quickshell."); }