From 0e2dc7ea5b7d3fe3e02142adaf138bb2fa410734 Mon Sep 17 00:00:00 2001 From: chlorospingus Date: Sun, 5 Jul 2026 14:42:10 -0700 Subject: [PATCH] Overlay works perfectly with multiple running at once --- Overlay.qml | 90 ++++++++++++++++++++++++++++------ assets/picker.svg | 8 +++ discord.frag => colorkey.frag | 2 + colorkey.frag.qsb | Bin 0 -> 1794 bytes discord.frag.qsb | Bin 1607 -> 0 bytes shell.qml | 10 +++- 6 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 assets/picker.svg rename discord.frag => colorkey.frag (90%) create mode 100644 colorkey.frag.qsb delete mode 100644 discord.frag.qsb 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 0000000000000000000000000000000000000000..9b9ac48f512a77ff6b3f99200ed0ac810d54ef16 GIT binary patch literal 1794 zcmV+d2mSZ}02_XIob6ftZWBikU+g3<<{Ls1N(+~yrFJpKaqK_|4oQ0L%K6UR2iTyzMqi@;_J#ToRcWQFo!OnU*B6I`iXvLE(fMv>=i@iCGviCb7(2`u z8-nW)ToddW3z*I}7-wy^%v|{KSdA56F98?(ixwNO(7bPDYsVV|(u#61Nkj2@4G3f}MBTfdk0gIc~+#^YzlS+a}x1WSpq@M;>C zBlQ_uVwk0*;HS_AJRO7kBRr$@SXvS2_c^pcJO%&o-pYeT;m|0qC*%GydlWA z#E;iG=)N@V$4@(=&x1Xz@HFWkB|h@zi9SX=^ml^nB}o1xi_T2SBYlc^qaZcPuxuewDT$1L4TKtK2Lc^{m;62llyqT zNPcmDn*5C@`j?dWzM|(5ML)0jL;9K`zev7Qgcs>0;-Ng+`Ih|WKnmrSiKkw3P(KOQ zYj4zl4V+=Ji|2fp{8WI(^EysvRiSe_O=s~vXrbI0l0p6gSUgO;CD_M2eNMSOPd3Jw ztVQJi1Tv$P>kE{_-@ryxyMKT@?qO|D5!OkvjXC~;@LnX_n1?TkzXTNKIYa(0#pJTI z_cLMmnskx>JNSwG;r&;LbX4S8VjU*=Ny2+Y!FySp0TVpb&nbAX65hOmqd@!!?~H<1 zl`GO-gm;#7i-b4wcSXTlBFs}HpCi0;3SN{ci`tO-Wd-kb!h21@@eT1Kyf+lQs@y#7 zMR;$L?mXd*{LLwND}?z9$(IT5Ed?*iEWouw`U_0f9rnXA*}g@4D})E@bd_R>WLIOd zc>fbR@VcC0L-ZYiM2&SvTk_2GbME<;>u58DLb~N~(-PFS)!1%nb=x(9`CV+w0cP3{ zywD7^YFJOdN^7v1Mo`k81^Rs>@T~T{;0X)JTx%Jo6?7!`IX6pMwPCupq;2ZCBq#--npl*KHkt9tx)&3jT-k# z+6~R)&qB-N@3d9Iw``LSt3kq#9r8cykRN*;lK7?9A?3n{R{54QsOa4=kk0B5@Um;W z-hmq7V;lT;+Ms)~Z_xp&&K|{|pchtJL$6IJ!#ejwHRAklSbo60Otladk>|e9o5l}d zR1|%wUBZaC}d*u#dtp8jQd)CEj>Ts(bx?Ndsm5!QF?C z^kvWWef_S}3IodT0BhiRWA*X!+S2^oG~<|Gr##sP+g{w{}x{=SEX{=SEX{_hSAm>2bY8`eJ@8oO&ve!1+bV+~5b z!F3CtqpIqw=87tj?{Aw30TrcW3~((ixPp*EDkrZ7q4b`ZUmQk(6Em=*&P4oU%u!_~ zPE1>lX@@ng-E8u}uysGE*;aKS-Q)XKvvw6f^4kmW{q5t+sbe&`57UTiLTk|Po81X| zpw|g%&3#`e$PGqQzzFx637eZH-ZO>l*46+`%Xz~@+T09%n1i-!Iz4qX-QSANWjW<-`Q(&bayBB=4SK~BjutYEw|T!zyOIW zWU}4&w+I|w746kdUwW0vC$%$*$s9zG|M<4lQ~N;QmfZLZ5NCUkcc!>zOO>bD;mVPL kGh-e;s})V0|}IfM9|8L zu9x%Kxz@fjck9#v<+YD}>|fEx{%ch~q^h0Sowe5&Cj_d}hi0Sm-OT=G=C`vm>vI@m zrx;@caP`4;iM?c;S!|QJti@JX0DmDXvnbqYRHbhUi}Is0M%PPfRA!|1kT2EtB>` z*eZ-T3?_L0{K>`>GvZ}4U%-82XGAI`tFtUAmWNl}_Izp2MDj-ghx#P?fTz=Nzd?3N zzDY4rM!Rcmxt~oiSu|h3+=OB*1$Y z^W!3?(&t6;fm|<>{t-x+iyM@`>oMF-n)?}i;eJk%E$V-TSkttQKLC$&Q*cewnx-@k z9}|Ze&3BsgibF=@pyNKFImO`?*`oe;h@;}+{TIl{nAii!b&&8=#MjjLB4!RQlkDd- zzFFdXTjOzu^onmzZ6Ml~P-qZLNMEx+fMD}-SzZaOS zHS~Rt=9Y+$tRuM=g)PRgc>fbB|GqpK2I!1Mq0HLHMdJI(T{n!pz&Gw>v#CbtI-Zbr zyy{NFsMG?RFCI{PJ}6TW51S4*wwsmI>y!bbZu7kHl3P!09(t`sp%WfZxz?~9kMBwC zuIuED?Wz;h7E}A+s_A=`AgrS=!^$ma8W}LM>y4Tl=2nd;XoijpfL%M>^ZY8h%Ax;F zx3v-kVL6L)fmb$g!RZW969F4W(co^2H$ykKnwFksyKFO(-gXew3~Rms_=edsibW)4 z3chAbhvf58@+w9e@EIYj>mwpe>4 zHaiuX%f6?oJE^z-SH1nH)!U0sy%qk$dh`5Vr4}@~bX$R?tpv3oJXZOg6yLiQUpvch zQFpq{AtjffcL^E;UpY_`6*m->@xTb(suyuLOmAn^hK9j+R^9#voQhJ*xAM4Rt6hd* z1(o-0P^m;NPdkdFtV=>tZN{K^9V)$wJjP&!jI7~Jb)GFrgJr5%oi@kt8?vM~xXoR| zk|2xfTn9%8hAy+Y=SULqn%C#L3!i#(WBu{7=hjLXM3ME_Z!|e2t%o;=y!q*uD{E`d zRIst>T+@+`VRqCR}+#YwxL|UDRYvJW#jl=Y5nuAwBC1D zTK{fWLPJ)}7L0f7%7gnZPtpT5Wk4BLUCYB~wZmPNRn!q?cL^&7R3K8(Bee7o2tk5$ zjj1m}>jQB>xX_k<%)!2X=-`jjk;Pj~lj^8my*LBy|Ld&PLatObCz*6n=*4C`y1U`tqSpE#wJIu?&T+o_r zzW|oyf!RJUOC|N)EOF{+l+zm^-~vf2Fq!rXh$4qq(RjVzl}PQpk=AL=@eab5-DmJJ_