diff --git a/Overlay.qml b/Overlay.qml index 1bf1d2d..7a6948f 100644 --- a/Overlay.qml +++ b/Overlay.qml @@ -10,27 +10,44 @@ FloatingWindow { id: overlay visible: toplevel color: "transparent" + title: bgcol ? "monoverlay-t" : "monoverlay" property var toplevel: null - title: "monoverlay" + 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) - console.log(x, y, w, h, toplevel) + overlay.implicitWidth = w + overlay.implicitHeight = h overlay.toplevel = toplevel.wayland }} } - IpcHandler { - target: "overlay" - function open() {slurp.running = true} + Process { + id: hyprpicker + command: ['hyprpicker'] + stdout: StdioCollector { onStreamFinished: { overlay.bgcol = Qt.color(this.text.trim()) }} } ScreencopyView { @@ -39,18 +56,61 @@ FloatingWindow { layer.enabled: true width: sourceSize.width height: sourceSize.height - // layer.effect: ShaderEffect { - // fragmentShader: "discord.frag.qsb" - // property color bgcol: "#111111" - // } live: true captureSource: overlay.toplevel } - ShaderEffectSource { - id: source + Item { anchors.fill: parent - sourceItem: view + 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 + } + } } - - onClosed: toplevel = null } diff --git a/assets/picker.svg b/assets/picker.svg new file mode 100644 index 0000000..402c59b --- /dev/null +++ b/assets/picker.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/discord.frag b/colorkey.frag similarity index 90% rename from discord.frag rename to colorkey.frag index 7591bef..c8c7eb4 100644 --- a/discord.frag +++ b/colorkey.frag @@ -5,11 +5,13 @@ layout(std140, binding = 0) uniform buf { mat4 qt_Matrix; float qt_Opacity; vec4 bgcol; + bool key_enabled; }; layout(binding = 1) uniform sampler2D source; void main() { vec4 p = texture(source, qt_TexCoord0); if ( + key_enabled && p.r == bgcol.r && p.g == bgcol.g && p.b == bgcol.b diff --git a/colorkey.frag.qsb b/colorkey.frag.qsb new file mode 100644 index 0000000..9b9ac48 Binary files /dev/null and b/colorkey.frag.qsb differ diff --git a/discord.frag.qsb b/discord.frag.qsb deleted file mode 100644 index 7991470..0000000 Binary files a/discord.frag.qsb and /dev/null differ diff --git a/shell.qml b/shell.qml index 00734f3..0da918a 100644 --- a/shell.qml +++ b/shell.qml @@ -32,5 +32,13 @@ ShellRoot { } Shell.Corners { } // Shell.Keystrokes { } - Shell.Overlay { } + + Component { + id: overlay + Shell.Overlay {} + } + IpcHandler { + target: 'overlay' + function open() {overlay.createObject(this, {})} + } }