import QtQuick import Quickshell import Quickshell.Hyprland import Quickshell.Io import QtQuick.Effects import Quickshell.Widgets import Quickshell.Wayland FloatingWindow { id: overlay visible: toplevel color: "transparent" title: bgcol ? "monoverlay-t" : "monoverlay" property var toplevel: null property var bgcol: null onClosed: { this.destroy() } mask: Region {} Process { id: slurp running: true command: ['sh', '-c', "slurp -f %x,%y,%w,%h parseInt(n)) const toplevel = Hyprland.activeToplevel const {at, size} = toplevel.lastIpcObject x -= at[0] y -= at[1] if ( x < 0 || y < 0 || x + w > size[0] || y + h > size[1] ) { overlay.destroy() return } source.sourceRect = Qt.rect(x, y, w, h) overlay.implicitWidth = w overlay.implicitHeight = h overlay.toplevel = toplevel.wayland }} } Process { id: hyprpicker command: ['hyprpicker'] stdout: StdioCollector { onStreamFinished: { overlay.bgcol = Qt.color(this.text.trim()) }} } ScreencopyView { id: view visible: false layer.enabled: true width: sourceSize.width height: sourceSize.height live: true captureSource: overlay.toplevel } Item { anchors.fill: parent ShaderEffectSource { id: source visible: true anchors.fill: parent sourceItem: view sourceRect: overlay.sourceRect layer.enabled: true layer.effect: ShaderEffect { id: colorkey fragmentShader: "colorkey.frag.qsb" property color bgcol: overlay.bgcol property bool key_enabled: !!overlay.bgcol } } layer.enabled: true layer.effect: MultiEffect { anchors.fill: parent shadowEnabled: true blurMax: 12 } } HoverHandler { id: hover } Rectangle { visible: hover.hovered color: "#111" anchors { top: parent.top right: parent.right margins: 4 } radius: 8 width: 24 height: 24 TapHandler { acceptedButtons: Qt.LeftButton | Qt.RightButton onTapped: (_, button) => { if (button == 1) hyprpicker.running = true else if (button == 2) overlay.bgcol = null } } Image { anchors { fill: parent margins: 2 } source: Quickshell.shellPath("assets/picker.svg") sourceSize: { width: this.width height: this.height } } } }