From 38dc6d8009ea1da800fb45c65a0e0c7debe83cdf Mon Sep 17 00:00:00 2001 From: bvn13 Date: Thu, 25 Jun 2020 22:21:16 +0300 Subject: [PATCH] added screen locker with dual monitors support from https://github.com/meskarune/i3lock-fancy/pull/87 --- config | 2 +- i3lock-fancy-dualmonitor | 236 ++++++++++++++++++++++++++++++++++ icons/circlelock.png | Bin 0 -> 2381 bytes icons/circlelockclear.png | Bin 0 -> 2493 bytes icons/circlelockcleardark.png | Bin 0 -> 2518 bytes icons/circlelockdark.png | Bin 0 -> 2433 bytes icons/lock.png | Bin 0 -> 1387 bytes icons/lockdark.png | Bin 0 -> 1847 bytes icons/token.png | Bin 0 -> 2551 bytes icons/tokendark.png | Bin 0 -> 2159 bytes 10 files changed, 237 insertions(+), 1 deletion(-) create mode 100755 i3lock-fancy-dualmonitor create mode 100644 icons/circlelock.png create mode 100644 icons/circlelockclear.png create mode 100644 icons/circlelockcleardark.png create mode 100644 icons/circlelockdark.png create mode 100644 icons/lock.png create mode 100644 icons/lockdark.png create mode 100644 icons/token.png create mode 100644 icons/tokendark.png diff --git a/config b/config index ee1c59b..2aa745c 100644 --- a/config +++ b/config @@ -209,7 +209,7 @@ mode "mode_mic" { bindsym $mod+m mode "mode_mic" # lock screen -bindsym Mod4+l exec i3lock +bindsym Mod4+l exec --no-startup-id ~/.config/i3/i3lock-fancy-dualmonitor # Start i3bar to display a workspace bar (plus the system information i3status # finds out, if available) diff --git a/i3lock-fancy-dualmonitor b/i3lock-fancy-dualmonitor new file mode 100755 index 0000000..d35c2d5 --- /dev/null +++ b/i3lock-fancy-dualmonitor @@ -0,0 +1,236 @@ +#!/usr/bin/env bash +# Author: Dolores Portalatin +# Dependencies: imagemagick, i3lock-color-git, scrot, wmctrl (optional) +set -o errexit -o noclobber -o nounset + +# Determines the brightness of the screenshot +# $1 - Image file to check +# $2 - Arguments passed to 'convert'. For example this can be used to crop the image, to just sample a part of it +get_brightness() { + # Quite fast way of getting a brightness value + convert "$1" +repage $2 -colorspace gray -format "%[fx:round(100*mean)]" info: +} + +# Determines the width of the given text when processed using the text_options flag +# $1 - The text to checked +# Prints the text width in pixels to stdout +get_text_width() { + # empty text or text containing only whitespace would throw an error so we just return zero + if [ -z "${1// }" ]; then + echo 0 + return + fi + convert "${text_options[@]}" label:"$1" -format "%[fx:w]\n" info: +} + +# Calculates the absolute positions for the lock and text or the given monitor, generates the command line arguemnts +# for convert that apply the lock icon and the text to the proper locations and adds them to the decorations_params array +# $1 - Monitor Width +# $2 - Monitor Height +# $3 - X Offset +# $4 - Y Offset +# Prints the brigthness in the center of the monitor to file descriptor 3 +# This is used to determine the average brightness in the centers of all the monitors and to then set the proper colors +# for i3lock-color +process_monitor() { + width=$1 + height=$2 + x_offset=$3 + y_offset=$4 + + # center coordinates relative to the current monitor + x_mid=$((width / 2)) + y_mid=$((height / 2)) + + # absolute X, Y coordinates of the top left edge of the text + x_text=$((x_offset + x_mid - (text_width / 2))) + y_text=$((y_offset + y_mid + 160)) + + # absolute X, Y coordinates of the top left edge of the icon + # The lock icon has dimensions 60x60, we subtract half of that from each dimension + # If the lock dimensions ever change, these values here need to be changed too + x_icon=$((x_offset + x_mid - 30)) + y_icon=$((y_offset + y_mid - 30)) + + # Get brightness for the middle of the monitor + brightness="$(get_brightness "$image" "-crop 100x100+$x_icon+$y_icon")" + + if [ "$brightness" -gt "$threshold" ]; then # bright background image and black text + text_color="black" + icon="$scriptpath/icons/lockdark.png" + else # dark background image and white text + text_color="white" + icon="$scriptpath/icons/lock.png" + fi + + decoration_params+=(+repage) + + if [ "$text_width" -ne 0 ]; then + # Only add text flags, if there actually is text + decoration_params+=("${text_options[@]}" -fill "$text_color" -annotate "+$x_text+$y_text" "$text") + fi + + decoration_params+=("$icon" -geometry "+$x_icon+$y_icon" -composite) + + + # Write brightness to file descriptor + exec 3<<< "$brightness" +} + +# get path where the script is located to find the lock icon +scriptpath=$(readlink -f -- "$0") +scriptpath=${scriptpath%/*} + +hue=(-level "0%,100%,0.6") +effect=(-filter Gaussian -resize 20% -define "filter:sigma=1.5" -resize 500.5%) +# default system sans-serif font +font=$(convert -list font | awk "{ a[NR] = \$2 } /family: $(fc-match sans -f "%{family}\n")/ { print a[NR-1]; exit }") + +image="$(mktemp --suffix=.png)" + +# brightness value to compare to, everything above is considered white and everything below black +threshold="40" + +desktop="" +shot=(import -window root) +i3lock_cmd=(i3lock -i "$image") +shot_custom=false + +options="Options: + -h, --help This help menu. + + -d, --desktop Attempt to minimize all windows before locking. + + -g, --greyscale Set background to greyscale instead of color. + + -p, --pixelate Pixelate the background instead of blur, runs faster. + + -f , --font Set a custom font. + + -t , --text Set a custom text prompt. + + -l, --listfonts Display a list of possible fonts for use with -f/--font. + Note: this option will not lock the screen, it displays + the list and exits immediately. + + -n, --nofork Do not fork i3lock after starting. + + -- Must be last option. Set command to use for taking a + screenshot. Default is 'import -window root'. Using 'scrot' + or 'maim' will increase script speed and allow setting + custom flags like having a delay." + +# move pipefail down as for some reason "convert -list font" returns 1 +set -o pipefail +trap 'rm -f "$image"' EXIT +temp="$(getopt -o :hdnpglt:f: -l desktop,help,listfonts,nofork,pixelate,greyscale,text:,font: --name "$0" -- "$@")" +eval set -- "$temp" + +# l10n support +text="Type password to unlock" +case "${LANG:-}" in + de_* ) text="Bitte Passwort eingeben" ;; # Deutsch + da_* ) text="Indtast adgangskode" ;; # Danish + en_* ) text="Type password to unlock" ;; # English + es_* ) text="Ingrese su contraseña" ;; # Española + fr_* ) text="Entrez votre mot de passe" ;; # Français + id_* ) text="Masukkan kata sandi Anda" ;; # Bahasa Indonesia + it_* ) text="Inserisci la password" ;; # Italian + pl_* ) text="Podaj hasło" ;; # Polish + pt_* ) text="Digite a senha para desbloquear" ;; # Português + ru_* ) text="Введите пароль" ;; # Russian + * ) text="Type password to unlock" ;; # Default to English +esac + +while true ; do + case "$1" in + -h|--help) + printf "Usage: %s [options]\n\n%s\n\n" "${0##*/}" "$options"; exit 1 ;; + -d|--desktop) desktop=$(command -V wmctrl) ; shift ;; + -g|--greyscale) hue=(-level "0%,100%,0.6" -set colorspace Gray -separate -average) ; shift ;; + -p|--pixelate) effect=(-scale 10% -scale 1000%) ; shift ;; + -f|--font) + case "$2" in + "") shift 2 ;; + *) font=$2 ; shift 2 ;; + esac ;; + -t|--text) text=$2 ; shift 2 ;; + -l|--listfonts) + convert -list font | awk -F: '/Font: / { print $2 }' | sort -du | command -- ${PAGER:-less} + exit 0 ;; + -n|--nofork) i3lock_cmd+=(--nofork) ; shift ;; + --) shift; shot_custom=true; break ;; + *) echo "error" ; exit 1 ;; + esac +done + +if "$shot_custom" && [[ $# -gt 0 ]]; then + shot=("$@"); +fi + +text_options=(-font "$font" -pointsize 26) +text_width=$(get_text_width "$text") + +command -- "${shot[@]}" "$image" + +# All the arguments to be passed to convert, to add the lock and text to the monitors is collected here so that we can +# apply them in a single call to convert +decoration_params=() + +# We collect the brightness values from all the monitors and average them, from that we determine which flags to pass to +# i3lock-color since the colors for i3lock-color cannot be specified per monitor. +# We could also just call get_brightness on the whole image but process_monitor samples only the center +# of the screen where the lock actually is, so we get a better value for the brightness +sum_brightness=0 +num_monitors=0 + +# Loop through all connected monitors (as reported by xrandr) +# For each monitor the convert arguments to add the lock and text to that monitor are generated +while read -r monitor; do + if [[ "$monitor" =~ ([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+) ]]; then + width=${BASH_REMATCH[1]} + height=${BASH_REMATCH[2]} + x_offset=${BASH_REMATCH[3]} + y_offset=${BASH_REMATCH[4]} + + # We get the return value from the function by using a new file descriptor + # The traditional approach of using $(process_monitor ...) and echo doesn't work because it forks into a + # subshell and then process_monitor cannot access decoration_params + exec 3>&- + process_monitor "$width" "$height" "$x_offset" "$y_offset" && read -r brightness <&3 + exec 3>&- + + sum_brightness=$((brightness + sum_brightness)) + num_monitors=$((num_monitors + 1)) + fi +done <<<"$(xrandr --verbose | grep "\bconnected\b")" + +convert "$image" "${hue[@]}" "${effect[@]}" "${decoration_params[@]}" "$image" + +avg_brightness=$((sum_brightness / num_monitors)) + +if [ "$avg_brightness" -gt "$threshold" ]; then # Screenshot is rather bright, so we use dark colors + param=("--textcolor=00000000" "--insidecolor=0000001c" "--ringcolor=0000003e" \ + "--linecolor=00000000" "--keyhlcolor=ffffff80" "--ringvercolor=ffffff00" \ + "--separatorcolor=22222260" "--insidevercolor=ffffff1c" \ + "--ringwrongcolor=ffffff55" "--insidewrongcolor=ffffff1c") +else # Bright colors + param=("--textcolor=ffffff00" "--insidecolor=ffffff1c" "--ringcolor=ffffff3e" \ + "--linecolor=ffffff00" "--keyhlcolor=00000080" "--ringvercolor=00000000" \ + "--separatorcolor=22222260" "--insidevercolor=0000001c" \ + "--ringwrongcolor=00000055" "--insidewrongcolor=0000001c") +fi + +# If invoked with -d/--desktop, we'll attempt to minimize all windows (ie. show +# the desktop) before locking. +${desktop} ${desktop:+-k on} + +# try to use i3lock with prepared parameters +if ! "${i3lock_cmd[@]}" "${param[@]}" >/dev/null 2>&1; then + # We have failed, lets get back to stock one + "${i3lock_cmd[@]}" +fi + +# As above, if we were passed -d/--desktop, we'll attempt to restore all windows +# after unlocking. +${desktop} ${desktop:+-k off} diff --git a/icons/circlelock.png b/icons/circlelock.png new file mode 100644 index 0000000000000000000000000000000000000000..232c4e32a5452ef91df55e58b381c3f61ab88be0 GIT binary patch literal 2381 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 literal 0 HcmV?d00001 diff --git a/icons/circlelockclear.png b/icons/circlelockclear.png new file mode 100644 index 0000000000000000000000000000000000000000..3d5bebdb698a12f637ccc5c005b3d9396f7ee302 GIT binary patch literal 2493 zcmV;u2}1UXP)npZR(IJq)w>Xhpnr|o*(EmP_=1d8`U1DomLI8b<(P8tOZ(aU7H)*Ax}Grod?1A z6<@!7bMM)Q+EEC3*uK}M-S5*q=l);6>vPUM|MR~_P$OWB5yn`>ahwigOaTBw2xUo< zj1dIEB7}rm#DS_|6l09C*{m&@Og@}SrFLgB8GAmTH#;1TcUO~lxm*Vn3dIyfQMYKC z{z$D>-=HXpK?w0u$0jM^bUM8w8jYS@SXelg%jMd4?%eseN^N;Op1oSF_Nq>&yIfaS z_Z~tBOA(`J!Wd&B9*=)H7!1CUOeXh=A-Nj*`}>_VO%F9SHC@nZwSOcCA}_|CD8eku z9-5n*JJ;Ra?H6OGR16Ib*;`s#Ueao{f2wrOS45cOIK#}$%qy{2?6}mwXesb|y_)v+ z_ESow(p#=>*@WZq_z}O~|Ej~`_;276gHuo}PX+5{aC65JPw)_#>U3;R;zWN$K%;6*1y$iy&Z`}o?Y30 z&o7KICPqg`8L@j~hGC9&c6L5hUtfQv*e3`A6^TT?9*f0}XS3OE03Z|!#e_zqd9$IR z;UY^iK?@yUb zrmq&;nM|g4Vq)SiHk)l^t-#D?^H)?V)%9ZE{QUe64F-clY%F*0-hIERsp;in`<@{k z3tJAD;7iTT%|9--bGe*(e0=j$z)RW+@Wc@U#V0sk@Nfge{eV)?{B2n*Vp&<dX07#OI zX*8O@i;c%_xA(Iwd$ibIA{>oIPfGDhP^;B9ir1-B>Y-#Z`B164y}iBeSSKEu@bMOMVPWBz6vh<_#dz_WW!Zz}KEy;KajCMkK}Lsj1g^p4ZgMKL7xU z5R!b}t%W;x?!06)8rzLV<2!{e+VA)O3ILv|Q3yF=c^+DA#N%=2%08B54`YniJX@0z za=AQ45Cp-xT&@E(ayY-Tk0i;vV&B=Nf+Wd#0wE+Q6pE=@IBafiKI?M19xJv71_lnd zw6wff3*TU29XtmlmYT=urs9}VVKmY*H zH2qO6oB{wWuL>Z9)~pan4VtDu1SsUg%aiv1M=%WIRH;-q0SbgEiejWV8Z8COHxN>6 zCQ1Q9Xi=?JUjrx*MhNj*t@dgyoNF|itA4*fIXO8=G&D4nRm`pwYPI?XNsgwv=qiK4m5~DoNt1!kTe@#%K zkBZVmk|d+`_4P|{f~6o4Lb$1^=|Uw&7Z(?`>2!KeCAy^`pU=0Z)9KzyboF}uMVU;N zDz@)Q90WnwG(0>!Vzb%GPQ^w?N4HummIEY7hARndE$}=~Pfbl->Fn$*d(ZE7yC1RH zY!S-oC=QK?jpNU&Wba=Dx-91ef8r>AGMTxEt~ zoJOPZdj^Byr_1~ABaAU7yk74$i^UQb6YYb>(9lp%PfySGmAU$T3k^a@Xm4*nB}HB5 zL1AEE;7CVD$Enp0CRSZpl}e?zt*!0M%Fh!%4PY3?X)qYhsnzOtSG&LNX-6OsxYXX> zzNIRWRS7e{2qJGb zo1YvXAJ;1%joHjBt(rL9?ACb%D zw>Oe4X**aT{lxV2bo`UFkTDG7^!a@Bwr$(?l|mMvf+N~cD0F&ucJ}4IzP`814^cW4 zK8ZSKFc`kS-ke>Diq51nnT#V42>jM+wU+c$r3Aw;PK83@>*(k>wbrX=Jyd)Mk1>`- zB9Uir-@bj;Znu9>shx7*cDo-j7!2nc8ynA;TkR-9bk%|9c~v+Zel8dcK5w_%`^DN@ ziQ=b=dcFRlUa!BfJQ1h_l9gEmLDKUAqyH`QwOwc@di zl&DD|4P%UWp4V|4XIxxd)Ge!6=HzmDj3mkVLItAgf5-bDoP5+w;E1ne00000NkvXX Hu0mjfFM6!A literal 0 HcmV?d00001 diff --git a/icons/circlelockcleardark.png b/icons/circlelockcleardark.png new file mode 100644 index 0000000000000000000000000000000000000000..2b541f0992e1058ae7dba287c58f7de2741240e0 GIT binary patch literal 2518 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 literal 0 HcmV?d00001 diff --git a/icons/circlelockdark.png b/icons/circlelockdark.png new file mode 100644 index 0000000000000000000000000000000000000000..853fe54f182bf3c4af20f5d5af67ce972df7b875 GIT binary patch literal 2433 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 toxrWY{r0>(yWO!4ha>gYty>?DkB_HQ6t&6W zaHJZI#+j6qlnJxhJXus!)U$Q#*84`IaYn1v`c*0wl#3H4WikjMhU0h$0025WJ3qN` z<3`!ThYvq^_UzgFt6dur5iy^en|t48v-MO|R5T|hCQeJqZ4r_R1^|F3Po8Ag)z!68 z6t$6In8>wWuTrV_n3x#)*s)^`RaI3#O3hC)!4N{Mr>AF6b#?Vm5JFsvoMmNYEvHVM zs!^-e3sU3*001J~1dH4F?Af#RXU?4YS}L&s0C45XmCt5oW)i$!Z@Ix>@Jf+Wk`=bw z?I#->8^4kw7Yga=>5uyQ`f^@;Mu zwa3QBy3*3phQ*S35hO`+yLa!tiSh~Uu9tx*!Lzfo(Ew4>($dm~^?LoRSTajdUS5tY zK^(`C5JFKUbXMKF2FD>#4t=GMNu1<`UryH%x3eXTCHY7p%A80srdN# z`03Qt)bWD{51vm?PybUeuaIN=_U%udPG>UD^Qv&kD+#Su>%V#PX8z{Qn@3T8b%N2n2Nd_wVl)@-GuSHa3=V`}Xay#wf2EE|)9u+_`hevGFp&6h&=f zSvEp`TJoa1yL%7HzD%&!>y3IHxAIa5ou-xve%;wQf7Zw)!v$L~*x7+RCD8WVcdswYjGqts~XO@WlA0$a~ z2M!!)%E`%jAU78P6c8K}6GLy?wryag7@bb{Z((6!zY-NfcEJXNVKzBAd2*!~f*|;m zl$3EPN4!FiT`h1Hy`0RPOx1a85zlLZ*Ld%K6$NBq%5_zw$^53WIO@@oLlOfoSfWfwOapB zf(HN!ww4VI4X04{6DLl5rxXVO6clW;*?Lg+UAuPmD#ZZ+1qEBJ);lPBK|#UKN^t-{ zLBV->dB36TnVFeGN^t-{A;Bt@ijR(t{zu3k7Z>+j2_66_BseK4$*I%n=7ju8ZfivZ z69mC&G#cbrcmM#fl22+VBABA6jh&sH$TKfRQK^?NU#?Pu2LK8+9vFs&>g(%&uvjeL zTCLVQ3kwS*hG8L>%av46P>_jXSV)OJ8UTd^FN$FpCbGZ3|3e|a5_s!|c<;uvdcEGO zQmOb?K}Jd#3oCJm%Oy(fyrc=x_b5MP9eWwIS2#-+JS+A;*O4vgLm)VE%y0*ujbSHmjFQ! lTux5TgW}@i8>{`R?LQwR#T|{B?0*0N002ovPDHLkV1g9Za2o&s literal 0 HcmV?d00001 diff --git a/icons/token.png b/icons/token.png new file mode 100644 index 0000000000000000000000000000000000000000..d203a08c14e54a0a84666f350010f88c98b8ddc9 GIT binary patch literal 2551 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 N002ovPDHLkV1nkg&`$sW literal 0 HcmV?d00001 diff --git a/icons/tokendark.png b/icons/tokendark.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb63d5d5eb76139cbbde012b0ce189d9d3c917c GIT binary patch literal 2159 zcmV-#2$1)QP) zy|bGI@smp3^U+oBSMSyPs4n3D_}>Pd;#dyAMF8snR_o6SAOo-iU=zUPq=h(X!Xp5m zBBJX6UM8YX12|7aBLHG%3cv%{GqZaD?wHwc0Nh122}{RG5l#SHW#*dzt`X5X5n0_p zbTF)$#VeT^n^|sVcg^glX7(!p+shQ}BnW?unZL=*H;5=DA|)a)^TD8Wc-RJMm>EA8$eiwaLXqAc@g;zGk=nqHIigz%p=_-TNB;CS5-2ziK_lURey-e{Er1W zZU+&}d_zRO=bXDJBF4-R5jf}eTl_2{GaEDSw`lrAlmNI6-~xbKIHsnTLRdt;#LTZc z=bni~Be^6=nuG`dGqZ_^QKe>{MYeqp;3WXhnAsly*ic#Bamh0CRc8LSh^)3X)-+@1 z+#~1QyUw|Pg%GyQEGME=M9zm0u6XaC_uhYmnWH&FRRQdqKb2+qb?4kW-us^oC4HfjmgO}O;nvU^LinPHyyU&V-B<3x8cverhKPJ6NfK*&+9XN-o#**$ zlgZ@%WHNcbD2n^4`q<1S018y$CAPxMGF6>~5T1DNbE{(2duf_JXJ(h0rnA!5m6#K6jIF0tLp1}dwch?EPFqM@EAaj#ZJZmlxF6=_xWTp$yC*g z$j^!B6U=-rk`)n{nVQ+P5W)pj-RvWK+g!ThoOABQwl_92N|NNAot>RKS(e=kA#9;4 z4!U|&15l{y<2=vr?e6aW!#Vess!}sl)#2(g5k22m@Ii!=B)Ouh=bEvyh89KfR+eQC zYRwiy`Ug;k5VrF?-<(V)eya9cNV;=PD2P~9IvHmhf~ln0T{*F zHlo(Bsj9~@a@`h8RSQ)uVGdse}pG%VDtIoMEh{)ww z8ATyN2m!$F@;u)OAtWuW8!F34=g2XN9~$wUiD+d!9$#VRXPcq0u9LUD_jk&&d{b3_ zi4ObPT?sQ0-Ehu*OGGwAL}S6wN<84b=NLkoyA}=7M-O&5XSP^hw+Yvq0u(|}@BJHQ z_NtjJ%j2E7IEpchDGERGuw!J%u(nzW)Ya>%w|11>-Sb+a_IMVZe45tYXE+P1!-*;!j73g zTkk>5)NE78w&^v!_&j2>zMs`*{iiNVK}0Ca@;PSSP}PTn2@_Gu%wtu3YTzcxNGR?) z&PWnEp>094$hHwlSGT;Xs#}=jFS=+rAtIhP)4<_`KF)TVKwm6cI?eyICx)3vsMho# z!c>!`K7t=LDSi7migcXh7|O69`gC$yv%D*Sr?fdw;G=|I7P^cvbWiI{q0eM?PA%tk zdO`(5?=iYKH(;QK`xXj|Lenyz?ed?_8g3T(vofBp!Yq^YkUo1?OOfztm~t1ic3Y0b zV3R%zXxHOi&`HC6XYsT!M4rKK56=quww90b)PpsA8i~YFXv%e>Yq&jV`~IlwvY+jP z-eGCpZ|(cjB0cN*MHsY(&(ivh*RE#$U+=W~Vz5b{1*Zk{Pjfqa>E``e%CsVu?xoLS z;?cxX30rlpxp(I$jXBP0;fweq37eUB&hcckH_zt*_)_dyv-HxNDZ4= zUY6wtgwe*O)mo2K=ocKRn_wV#=Z7&2cn)>Pei*!w2O+^PFa?l zlgZ@4bUJ-6gs_PPC+E8gnK1MEXf*n0nx+?=bL09z388wk*r%`K!fL3QX$YYxiee|v z^9Lb>hdAPVSRWxB5v?%uDl?C%It44S_3UdXB3WL5BMZM06F^gqyAZd{`Yn$rLP002ovPDHLkV1gbXHzfc7 literal 0 HcmV?d00001