From 6ac552d3d5ce1a34765ca52f247a5f87775514f2 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Fri, 26 Nov 2021 07:59:35 +0100 Subject: [PATCH] Switch to wayland MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a simple wayland configuration. Currently set up simple wayland configuration based on river window manager and waybar. Rivercarro is the layout manager, being the same in principle as rivertile, the default layout manager for river, only it comes with smart gaps (gaps turn off if there is only one window open) and monocle mode (give one window all space). Runs `keyd` in the background to replace the old `xcape` capslock switching (capslock is escape and if held control). Uses `swaybg` to set a wallpaper. Added powermenu and lockscreen scripts. Improved lockscreen script to detect and work for wayland. Moved old rofi mode 'powermenu' to more general powermenu script, which works with any rofi-like selector (dmenu, bemenu, wofi, etc.) Loses some of its design quality but since it was wonky anyway, and I rarely see the menu, we could repurpose its functionality for a more general powermenu concept. Currently hardcoded for `bemenu` but can be easily swapped and possibly even extended back to rofi. Fixed file upload link sharing to clipboard. Updated rofi-pass to pass-pick. Made rofi-pass universal and less integrated to rofi - that's also the reason for the name change. `pass-pick` works with rofi (default), bemenu or dmenu. In theory it should also work with any other picker that contains a stdin listing function similar to dmenu. It has been definitely tested both on rofi and bemenu. The best user experience still reigns on rofi, where available keys are displayed on the picker and the keys themselves make the most sense. But all functions can be reached from bemenu as well, though the key mappings are more arbitrary and can not be changed as in rofi. The autofilling tool works with both xdotool and ydotool, so should work both on X11 and on Wayland. Ydotool ideally requires its daemon to be running, otherwise some of the typing may get gut off. Otherwise no change should be necessary. Updated qutebrowser open_download for bemenu. Updated download opening script to work with both rofi and bemenu. Prefers original rofi implementation but works with both, and can be set to use a custom dmenu-like file picker as well. Add brightnessctl and removed custom audio / brightness scripts since they became unnecessary. Updated bootstrap script to include system files: With `keyd` taking its configuration from the `/etc` directory and not home, a second stow stage was necessary. These stow files are in a module called `system-packages` inside the top-level `bootstrap` stow package. They will not be installed by the default dotfile stow invocation but have been integrated as an extra step into the install script. Installing this module requires sudo privileges! Switched vifm überzug to sixel graphics rendering. überzug relies on X11 functionality to work, while sixel does not. Unfortunately, alacritty does not work with sixel graphics yet, only foot does (somewhat). Waybar currently runs the gruvbox dark soft color scheme. Added the old polybar archupdates script to waybar and extended it to output json format with additional metadata that waybar can read. Can still output the old plaintext format that polybar expects. Added a wireguard connection to waybar,shows if currently connected to either a wireguard or tun VPN service. If so, shows an icon in the waybar - that can be hovered over to show the full assigned IP address. Added an upcoming event display to waybar, a simple event indicator to show upcoming events on the calendar, on hovering over it the tooltip lists all upcoming events. Added `screenshot` script to take simple screenshots and rectangle region shots of the current output. Can be invoked through the river shortcut PrintScr: `PrintScr` - Fullscreen screenshot `Mod+PrintScr` - Region screenshot `Shift+PrintScr` - Fullscreen screenshot and file upload `Mod+Shift+PrintScr` - Region screenshot and file upload Extended `sharefile` to take paths through stdin and make use of `fd` if it is found on the system. --- .assets/polybar/clock.png | Bin 1855 -> 0 bytes .assets/polybar/clock_alt.png | Bin 3720 -> 0 bytes .assets/polybar/full.png | Bin 9616 -> 0 bytes .assets/polybar/i3-highlight.png | Bin 1832 -> 0 bytes .assets/polybar/i3-mode.png | Bin 2833 -> 0 bytes .assets/polybar/i3-normal.png | Bin 1846 -> 0 bytes .assets/polybar/minimal.png | Bin 10519 -> 0 bytes .assets/polybar/mpris.png | Bin 3682 -> 0 bytes .assets/polybar/network.png | Bin 10586 -> 0 bytes .assets/polybar/sxhkd_mode.png | Bin 2801 -> 0 bytes .assets/polybar/system.png | Bin 3797 -> 0 bytes .assets/waybar/simple.png | Bin 0 -> 6358 bytes X/.config/fontconfig/fonts.conf | 61 --- X/.config/xresources/Xresources | 12 - X/.config/xresources/Xresources.d/fonts | 7 - X/.config/xresources/xinitrc | 77 ---- X/.local/bin/clip | 36 -- alacritty/.config/alacritty/alacritty.yml | 3 +- bootstrap/.stow-local-ignore | 1 + bootstrap/packages.txt | 23 +- .../etc/keyd/AT Translated Set 2 keyboard.cfg | 33 ++ .../system-packages/etc/keyd/default.cfg | 9 + i3/.config/i3/config | 205 ---------- install.sh | 92 +++-- mpv/.local/bin/umpv | 41 +- pass/.local/bin/pass-pick | 361 +++++++++++++++++ pass/.local/bin/rofi-pass | 307 --------------- polybar/.config/polybar/config | 364 ------------------ polybar/.config/polybar/scripts/poly-date | 31 -- .../.config/polybar/scripts/poly-mprisdisplay | 47 --- .../.config/polybar/scripts/poly-networkspeed | 83 ---- .../.config/polybar/scripts/poly-papersdue | 15 - polybar/.config/polybar/scripts/poly-pomo | 41 -- polybar/.config/polybar/scripts/poly-weather | 23 -- polybar/.local/bin/polybar-launch | 20 - polybar/.local/bin/pomo | 1 - polybar/.local/share/pomo-app | 1 - polybar/README.md | 92 ----- .../qutebrowser/userscripts/open_download | 112 ++++++ rofi/.config/rofi/modes/gopass | 73 ---- rofi/.config/rofi/modes/powermenu | 92 ----- scripts/.local/bin/control-brightness | 53 --- scripts/.local/bin/control-volume | 97 ----- scripts/.local/bin/lockscreen | 34 +- scripts/.local/bin/powermenu | 84 ++++ scripts/.local/bin/sharefile | 100 +++-- sh/.config/sh/profile.d/autostartx.sh | 8 +- vifm/.config/vifm/scripts/vifm-sixel | 62 +++ vifm/.config/vifm/vifmrc | 31 ++ vifm/.local/bin/ueberzug | 12 - vifm/.local/bin/vifmimg | 154 -------- vifm/.local/bin/vifmrun | 15 - wayland/.config/river/init | 242 ++++++++++++ wayland/.config/sh/env.d/compose-key.sh | 3 + wayland/.config/waybar/config | 170 ++++++++ .../.config/waybar/modules/archupdates | 27 +- wayland/.config/waybar/modules/khal.py | 35 ++ wayland/.config/waybar/modules/wireguard | 143 +++++++ wayland/.config/waybar/style.css | 152 ++++++++ wayland/.local/bin/screenshot | 48 +++ wayland/README.md | 110 ++++++ 61 files changed, 1811 insertions(+), 2032 deletions(-) delete mode 100644 .assets/polybar/clock.png delete mode 100644 .assets/polybar/clock_alt.png delete mode 100644 .assets/polybar/full.png delete mode 100644 .assets/polybar/i3-highlight.png delete mode 100644 .assets/polybar/i3-mode.png delete mode 100644 .assets/polybar/i3-normal.png delete mode 100644 .assets/polybar/minimal.png delete mode 100644 .assets/polybar/mpris.png delete mode 100644 .assets/polybar/network.png delete mode 100644 .assets/polybar/sxhkd_mode.png delete mode 100644 .assets/polybar/system.png create mode 100644 .assets/waybar/simple.png delete mode 100644 X/.config/fontconfig/fonts.conf delete mode 100644 X/.config/xresources/Xresources delete mode 100644 X/.config/xresources/Xresources.d/fonts delete mode 100644 X/.config/xresources/xinitrc delete mode 100755 X/.local/bin/clip create mode 100644 bootstrap/system-packages/etc/keyd/AT Translated Set 2 keyboard.cfg create mode 100644 bootstrap/system-packages/etc/keyd/default.cfg delete mode 100644 i3/.config/i3/config create mode 100755 pass/.local/bin/pass-pick delete mode 100755 pass/.local/bin/rofi-pass delete mode 100644 polybar/.config/polybar/config delete mode 100755 polybar/.config/polybar/scripts/poly-date delete mode 100755 polybar/.config/polybar/scripts/poly-mprisdisplay delete mode 100755 polybar/.config/polybar/scripts/poly-networkspeed delete mode 100755 polybar/.config/polybar/scripts/poly-papersdue delete mode 100755 polybar/.config/polybar/scripts/poly-pomo delete mode 100755 polybar/.config/polybar/scripts/poly-weather delete mode 100755 polybar/.local/bin/polybar-launch delete mode 120000 polybar/.local/bin/pomo delete mode 160000 polybar/.local/share/pomo-app delete mode 100644 polybar/README.md create mode 100755 qutebrowser/.local/share/qutebrowser/userscripts/open_download delete mode 100755 rofi/.config/rofi/modes/gopass delete mode 100755 rofi/.config/rofi/modes/powermenu delete mode 100755 scripts/.local/bin/control-brightness delete mode 100755 scripts/.local/bin/control-volume create mode 100755 scripts/.local/bin/powermenu create mode 100755 vifm/.config/vifm/scripts/vifm-sixel delete mode 100755 vifm/.local/bin/ueberzug delete mode 100755 vifm/.local/bin/vifmimg delete mode 100755 vifm/.local/bin/vifmrun create mode 100755 wayland/.config/river/init create mode 100644 wayland/.config/sh/env.d/compose-key.sh create mode 100644 wayland/.config/waybar/config rename polybar/.config/polybar/scripts/poly-archupdates => wayland/.config/waybar/modules/archupdates (57%) create mode 100755 wayland/.config/waybar/modules/khal.py create mode 100755 wayland/.config/waybar/modules/wireguard create mode 100644 wayland/.config/waybar/style.css create mode 100755 wayland/.local/bin/screenshot create mode 100644 wayland/README.md diff --git a/.assets/polybar/clock.png b/.assets/polybar/clock.png deleted file mode 100644 index 974ed2f1ab8b5cc93d577c6a2719ac9591b8b431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1855 zcmV-F2f+A=P)AxX00003b3#c}2nYz< z;ZNWI00#F-L_t(oN9|Z?P*YbJeOZ7ImJoMZt~>?kHm2pv7?^RH{M6iUJj@ zvZz>a325zLSj0h`0#$@*K?Jm80YO`(s1XN65)ouEYQmO40>->F3)$X#37w8qJH!3= z&i$5i&%NJwZ-N>e90bP3C@6p)g_vU@WeSWbJ6h)e`#u7LAc#hf#vY0KS{^-k(#914 zc#@slXVWJW4BiLd|0D*2vhUi}^8>cM#2sbQkv%L}&G!|uCD7)7> zWZ~i+96_B&Qi(or=hUv#wF4?|%asY~A+8vtm5Ms6vy$n*)^kOwSp$;C+VK6`7uz6^ zMhXF=Eo`p1TzvChL;G7x=Y<m?gs!0W#NccG+}L4?%Ne~dnGv3l(#>L=@Wf2!pV?xEA!BIbi?$>nRvzY%f}BU zgyhmz;&c;|&xl_X#fGQU@r)+U4)FK(up^-Q+8*94DgWzo{Lbf*sk8t)#NE)03Zva! zle9Ox-*-nyV%P*p+wH6q`!n(9cDoxvsOaS{wSC8~NRH0xSr&WHPmiopLr4v`=EY?h z?AY#w#VD!65lt!}>tZI;H*EDdCHSU1t=jX@;Q$w+0oufR@wZ2O8neq^DQCIdK`X0~ zWCg(H+<1B&kLVSZc_BHHvdY^5+eKIyk$fRDY7UWCM?aj`3_|pPeZpxQk(caCNeG%d znP_Zm>FgV|WlD8LBg{`fe?a^!??}FBct%q2Gy)3dtOY=nwewF(Juu%=g25`4g(DjN z-13YYj^9w6R8g44CB^~k98{Hnw)I~F8wg{HDItkH<8vcY?;SxN!~ z3Wx0Z!ZA2kjXOeRc&Eqv#6zAZ9tYyFl8nq4a0IT?iV}%30 z2a|(7k)JE$>692}TX{77{GZ={AhB9BhZ-5_Y;6kg8ggP2&y&-4eu{VvLi?;dKAaF7 z0l1~Wa5x;< zmq^$z9pmN(`#20I;&QnFU}h#Y8F|2Hi(Zr++7?@5zbBpcmAm)LX+~h;hB@HGo^<=>+vc`i3aW|06l3 zh!mdo{k-uy`lMd|5;R&O((LaT0s$isASISzNGYTbe=Jr@atH!8U&?Is4O^pn5h$Z$ zynLtCmevlbvhk`f)_Sa4r0B$=wuYuYjXSHevWn;FDX)6XVYpyJfDMXsg+{AjztfzM zK6q%fD;$)~+70uy8wfPS@V7Q?RzX&WUwnj4S*1>T`J?RZ4O!3Bk8yz8_>}1As3SL` zvalk8^aoB^#to-XiX+0C(s*9*7wnA0VkS>45x%ND8jH@w`t2 zfWr2hDMv~s?%d=CXNGm9#&2`Sy{bd$9qs@C002ovPDHLkV1is0dmR7( diff --git a/.assets/polybar/clock_alt.png b/.assets/polybar/clock_alt.png deleted file mode 100644 index 2027089174ca2b7db23ecd2cc66247599b4f9c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3720 zcmV;34tMd1P)X0ssI2Y%B(_00003b3#c}2nYz< z;ZNWI01iM&L_t(|UhP|XTvNvuzDWoI0s#U7vKT=@!X~n52xwWfZnXNNs90M;MXgU; ztx{1Gm#Tn1TftpWtEebi&?jyP6p#ppMJfacihv;d5|*%pBrkhzazlh*p|+X7a?i{; z^PO+z%sDe6thcupkT*F4at1yg1MrV$N^VKcfSds~1M;By*X;vl%k#@O^Lxg?@5a;8jUf^UjK`y>n(}db*|nJqdW#2Xid?`KDwWh);Rdre!_dNJYrMY+7P24wOXy6mPuq&=*DspzHCWBX6zem@ey>%m9#umI4)wLJIkuVNA-Ow<1DrP+UCBRR%%N6%T^5>_ryoNh*m6 z(xv4jJt!j(%cYu=p_AH0q0wc~lcvIKN}v^~>m2F6QuD7Bft*O4zkA^k!kF zw$qaJLHiCJ+8?xjiIa9`;my#E!3otv*(Q*MmI4(#yA<*{!v^Y7j%+!SJ9$gcVl;#f zF@fZudS6UZ$EXrAONFERvY+Og+G-US*MG?5F#Bl(14!h@O@5WJyQ7io*UeNw@KXR( zA_3*7cs)+{vmGZ6_|2NEsjRGJ?zL^TNqR~N2TbFGQ|Z(9>|HWV6A2$barO`UJW4J; z;IS>6mbi~~sgJw8{hatU!8Dw6B_T)f_{(^e@xsK}>?M&4hpkK_CKD|^anMq61bDRP z`#JsjI9tM-Gvm$G&?sVu=FDy9E=7F5V!<3!g%*_SmWWH|wmEBd5To|SzWHF`2wmvG zp@Qj=Mm}pC{dMfVIMvN(!dF?NK*gIl!MtyYLDf$xX`i`fsSY9Y4PT9#m0aw!a==%Ua z->-cA0(V{{wks&`>Wywv;_=-ZSNbmdI$+bDlc_Zfpd@D7$$XI+-`(DED7kA8cer9> z@9>j9xo9yF3jCmgN}vXY;q?e`jyHG0g4Tsfp&(T_#RNI=p7IhOQ^D~9H(IbKZkjJ~RFpDy>P3LWP)6dJT7*!TXM}i= z)9p-OWWR(Mr4iz8RWdXe?A+^(QR4KLB}G0UGXN!wcj!;^H5rvR@Bh8WhAn|2#plI zJ*w6{_{8Zm=YRc=Noq*wqZV#wTVr|CyX@nk_fV^jUA`5w-7q;ak)PsfZU-MJvf6a~ zw_EXX(Fayqsxpy^?5#v2$8JBIW9+*xI_~Dx(;Ku2$t84PilYf3=AJM+((>ct>C^28 ztH`;t!%>{!Ba3noh$*-Kf9EBGwkSgfs zu8p ztVt)oA}^nbHg)ztc>a3a)r-G;JO1~BF~!nSri7rPkw~o;Se6UAcsx8a^F08xq$StS z@v>x%)wQ&2D=y~VGP_^qQgO2}LJRs<);$#!ydds+*xPzblz@4FZk9a@A5r%Br_}S#J74cbNbNP$sr2LEL6f7 z$ZbRR`Xk_^RVD3NyDI~;^>o-uD|K#-uA;2e(<6G(VAj7FrT@08GQgOqaWrq?6y+ zsN}sh&=Wh6ea<7)t-kRy$lFrt0-({n3Y@O*=58kNR7FLlzn>Fsot+&>B)Cea55U;(6itndx_Wv7 z1$IpEK9IJ4%M|a#=Jxdx;+_~R_ZD6Xgrg<=f-ox~%s^^G^?KwuJF_B!6SOyo*zCP_8bV0swC1 zU`ZmrYEDb8WgVo0-pWUSr>~|4ZeRd88O>~Mm4Jq{M+K}i+h~q|AiJ$`pTt4XSMVsU z0Z_7?F5FTgu8Dq#Exlx@U=^w4GvRP14V;(|C=`Oqf0va60~%DVB_tKBCHJOih{yM2 z#>XX7J-tl1+KQHzXxa$t9kQ!C)vTh}14niBNsW zUXK`O`K{=h#i3hp6GW*;%=EI(xet13?nu9$W9#F_%jvRdiPD3xu++{Myh8B$P&gcl za4j}d%?+>36(Q{%C+8=febVOcX*Os~jQ~%7e(q}v>}1H&DdK&X7{HqDhJ~fnaj$v2 zA*|Qzu&}#LFoUJOE)pJ1Acg?Zg&qVdSWPPVFbqbq{588E=C$UMQq8GTq0206&B`Y-oJP-aNW;o4N6vPL;WqJ zUho9QM3#OqsEoF^Z<_hlkW}*Z<}Do;e>ADGo3&?|9pqc#4<;;iLk-FeD>B6U+FEG# zj{I~308>Bn!oJq=Fc1zicXXmvv+7%Y0AU_*B;dCbyEk26G6B_Ti+>KAH<7nlG<3}M zz^@4i^h8rCH{Mjef_|(G-@X1C5~ZbQ`T5#4bD}!fMWnLx)`;FqXCtS1_2e4Jp+KwVvZb;|e46NK|?eI6RM+5!QG?`-`ohsVGiT4pR`kL^^aTQ$@$?tP#&s;- zXDj(^R5V+8?4(BIk+Tm|t{h9@&jwSUvS7!qEelN`6(bZNbm<3!TJyi7XVC|aF6447 zjeG#@wKJ&qeB_o}Ei{ILuH*7O+g(JSX~ki{K8^qSQFS$7Pw(#E)|rB0f&Sv?mRDb% zS|cqHi@W<*e@nvoSI;>-`yE*aHr&L9|Kh{?L#0t~-GwJNMJnw&yVguch~L50x_@XFvi2@}QDHid-aTU?dF4gK8w~$#vxnNMJx7R1!#$i{uQ9 mgaLU_jf6e9uABi04E!Ikp*qe&uF1dv0000;w-@eat z?wubqJx|MYS6A0tRquo;DM+Fq5gntLz zhJb*ux~;ec1w{rWEhenyVQ`)a?}4e=G-N&(POS}A2e%m8d{{z;PB*aeQq-3s_qUN+ zo&eLdkF1{A)k$vzCnQf{#Knl95X(7R6ye)MM0zKBCsONnP7+EtRh;}Vli|6(JeP5w z?7Ums98P6_`{MjwK7u5iuVgi&p%t~vdiXd(6}7^C3l9wnMhFT43YrWG?mN`~{o-MP zXhCYt{322yg0^zkliyW<`I(o|F)1=LH+Q5J4q=k`qXaC>|Eo9DziQT~q2<0bw?0#L zK1SI8vtAiAwYuZA!<%`q6(26f~1o%x0>0xh=FF!7uf=ivDEoNq=)qB z-}4*H67mGX8D{J;EH#_ba2Yg0@!DA%c5)bbSdC3Tu>iEKceJ>O%Fj7CY+F5dESp#(L_A@WKh_T_b$xWNHX((;@@&%p5j(Bt1m+p0?qm~$O9hrxHa(RHET6=+mo4bkR;Ivb3G7|R?MQwZnf!#DUc+F!~NhQ??sC$vm>94cXtoFYwmF|uubr`SEYBm zx?aw@vFYexl1f=bnr@|Cvp{8ma!(7XCqbxSu7r^TK8vbPrkn*n8CBAm zCKIdITU1GWJB~pj9)CCSw_bwZ`S)bdMFMliw-VkVi&%HPG3(lZ@u{tr!+W^9_|)y) zX4CM}UT0cP&YxuGUaE2>eHX^Kz`NN7Axjohw~Ch^`D!^nrgU=c+`1pa1DfwnvokZr znp?h%;V6FCzZvnh682n(71i9|&DQDRdAgjo;_XE1_XoMzN_NF+4I(c6x;6XSZ>KgS z)Uko&xaikZLUHzqaBO}`y8DTJqMOBHPTekfe{qY;VhJE25=uWja~G!; zTC?K&v$rhE5HD3St0oR(EBquOr2=;LcVa4hquZ_mJQZRU;^&Ihpo|8=Dx|V5r@g7= z-bwTs#6H?_BK9}WI9*nMDW_Z`e<|0INvff z#fDQ!9qk8~!yxyp7gI^QH{4W&8N%FB-mz-a%~HE$6FE>#%U*%9Xy}y9dXw#EU4-fR z_zef(Vb~)xcJGa%&g~7u{(-&or|ipp1wA(NghQ0_U(=Jyg_V~s%A;y=8~S=h$jH;2 z7IKSxfl|!7QuQ@4Qf|s&f>@<+c)fY7+%4_&D}c$=DjTI8)2g9evE?^JA>SrZ{ItJp z!X-7gaP7|=RftdgZol%#E{p{FOH7>3Q21xn zY!nGGLX;IS{YEV9!XR@MbVip5Rn$7(D9Mk-0`mnX;sG&Mab0m~vvM)XJEUlmeRiwI z749O75mS}i7mMClkZ9^^Sd*#QllS>gpQ^=oB8TY{^0S{8Pz`{R(!Ja(1MfC^;7h%* zm$bPS?7Y!@-;GilmT@ld)|8#klyymPT%iOrl1A$P*!QKgE{-eelKKWL>y1aS_&kSS zj_~Yzm4T6&rhs4|6>hFIys!YP>nEwdn_TVvBg3)1=6Md){M$rk>$iZ5o^#&nrY|#y z>uYNof-m=bb0ZyOBm!E*-CUQH&u?Q64x9e3gnq|Hm(}XWO_7d8EvD|^cOSMq#)5@SB}&kw0Q%~GOMJl zC}~^V=V9XLE|CrSt@2drB@J+F>p`c-$CG(E2$Uw%@v~*!_l?Wbien=MMm+z(LY^?F z#jz)_iR{I(wYhb4HiQ1jG$GV-Q_52)ysGny{kh=O{OS=vz*i2E#Ztw2sy;W_8_?dt zRfTt<;W>ckQNO%r2lPX4Fvj~DIEa=^ym9O7hHN((nQ^A-bKh>g7?5T{nMd6~<#Wm~TA}eMto}~Y2EGt92HLrI^Mop_CayJ_77&7`gL=5*Ze*xHCz^`AlGM$=m zoA`*~&WiGlG2F)0t^&g3�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 Nq{S7)szi)_{2%h*ZCwBW diff --git a/.assets/polybar/i3-highlight.png b/.assets/polybar/i3-highlight.png deleted file mode 100644 index 46402bded32172fe186dddc849d579a880fd82dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1832 zcmV+@2iN$CP)w zh*mW2&fp-<{k1zY=iKjnXTE#xy>sE0)4v5nwf&S+JyfBA3%m9WS!@ch7#P4}uu)7D z28JI4iV}ujPL+saVStFmXh0hsj!YN=2)45@Jm3?`MTG$o3=sN}8CgkIqZ)=htxe4h z?f@&o+kK{@l>h-Ssdys<9u{*m5QAuhiYE|kV+Gmj&9xZcWt{= zEa7ugOJa|bRI|^KfZ?DY=hFaojRy!oKMy&ATd3zr4!bT2XPw0rGd8G6oRV(`H?Mmo z9Xamcxq0z&tk}rJ1@FB1-ijGBGr4moy2h?7TmRbZ`4jb5Yg^(MuKxI~c_oF`&bs<0 zFN(DTsq9QM%a+fv-8%MH<1MLN#^47VF>B51tEY~j?wQGBlsP4TN|NtPeX~yzqQun% z4Fq-_QvgAj$MGB0rHyr{A4 zK@>dtb(peX*@|q6@pW8l?e+y34p(UmChMs9I5h-1`--xnhR+YVBmgN&2`E>~jf^Oj zL?}O=N%N8wp-7NCR!hTiT0VmSPUg|WmhMUV%IQ-h3-Xe6$pwYLQ8m=W06_PJbC-h* zIIw-gfxf6~c5SQyV07^pAFiHpa$DK==cS_~dQbZCFPCt;zdASmgVE6&OJ_l3&7Wfl z*8K8*`DLg#7_}-C@^^b^2Gb^HW*5yZnw4EJe|+T+b>c@2F-jn~oQOHY! zfBc=_-DAp_EDGo*m424Vae?km9|Kexli5i6oVAWqjvYr+J}MrUWdn7wPow*K6QcwO zg!dc(=tGF5Rd>lixQGnGJ`w;1Id^GMz*SRgOenJJv`JGZb=^AB=$ALGPfG7pcJWek z&8Bh>07)`qHfRk30?fT<+LGm# z!{6-|k}H4n2Ymn-v9T*ZS<}(!>Ff&fl)-G)vd;R0j+6B{wy7rI_XnlGDMkqhYh-|( z1j3>|5eFB-u#F~8hlGy_Xq<*O_MpR>ZZ8|8KpL$N$~w6qKTVGzy6t$?@g~0ni>hcL zJdw{6_MBXuN%i*H*#dm1(#7HFE1N&va*>uL8t2u9(BynIeRluvHC{u4NsH0mc6ZxN zRm$AO&rdN4n3ziqtx`Y}qXYoY2Jixs6Y3Yl`5X<1haiqbR+3MS6a(T}qC)Dvh`IWD+=l8B(x3{nV?6M812Y;4H1_B7? zLdBt5lZq22lrEpp&j|{(JKd3qH)=onXPqSbG4Gg2Rb5rkGwzSHr1i~~bL*7^ZQ4@lAxrVbIgnZMU zUw7JHU7Q|SllC^Kwxp&Bze6oMH~-rte&49aEtKFas)1zZ8#sHU4hRhi2QI?+J`dh1 zmO)9+qCyPEv3qI)&$6*knM9mLCG{3#&(7MzTFBS#k#&vL3od!_8_AWMt8Y9E>)_ub zM-?qET~=V#_U8}zU8lGI_{R~qR4hrMgxgGLabzKopTRnLslEwGssxGiB|-@jBY9ff zQRdOPIY~C78qwairpEd!U9{Mt_HOFL&5rK&6yV@h?w&FCX-Sb1=VM`j?r_!~b`Dxs za_;vJT2P8(g@LFUP?QigWs1SDWI$2EuuQ8GRMZS8N{E^=#b8)6peSKjrd0_lY6cV~ zL`|7uFf196ZWnbB=rK>o83eD=xEv>q8^w#v4BYuHq|^kNGof@pL>Pd&{Ac8a5|_Oy z-P(8fAXI;;syZ+*AWKr=B8$5B9^Y0`cfMud2bHT&CIf~<>;1sJZs|`+((dc`ck~|u W%Uy)Ih+c*O0000yIIjEX<2bXZ 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 diff --git a/.assets/polybar/i3-normal.png b/.assets/polybar/i3-normal.png deleted file mode 100644 index d6ead86dd5d534cd1a705c77bd33e538d6cd5b37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1846 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 AmH+?% diff --git a/.assets/polybar/network.png b/.assets/polybar/network.png deleted file mode 100644 index e5928e1536f82b155d6f46bfaa8ed17feb1269ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10586 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 diff --git a/.assets/polybar/sxhkd_mode.png b/.assets/polybar/sxhkd_mode.png deleted file mode 100644 index 258166839a5e74cf15bf7dbd04d0d96dfb14191a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2801 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 Dr^;aH diff --git a/.assets/polybar/system.png b/.assets/polybar/system.png deleted file mode 100644 index 7be37349a2e3e6541a9ac4b8ce40a8e326262a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3797 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 LNkvXXu0mjfsBT$u diff --git a/.assets/waybar/simple.png b/.assets/waybar/simple.png new file mode 100644 index 0000000000000000000000000000000000000000..85135dd959ef2410f82d028babf2baa98541d6e2 GIT binary patch literal 6358 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 - - - - - serif - Heuristica - - - sans-serif - Noto Sans - - - monospace - Iosevka - - - fantasy - Signika - - - cursive - Comic Neue - - - - - true - - - - - rgb - - - - - lcddefault - - - - - true - - - - - hintfull - - - - - false - - - - - 92 - - - diff --git a/X/.config/xresources/Xresources b/X/.config/xresources/Xresources deleted file mode 100644 index 122fa17..0000000 --- a/X/.config/xresources/Xresources +++ /dev/null @@ -1,12 +0,0 @@ -! ~/.Xresources - -! Setting up commonly changed vars -#define myfontsize 11 -#define myfont Iosevka Mono -#define myOpacity 90 - -! Font settings -#include "Xresources.d/fonts" - -! Colorscheme -#include "Xresources.d/colorscheme" diff --git a/X/.config/xresources/Xresources.d/fonts b/X/.config/xresources/Xresources.d/fonts deleted file mode 100644 index 58faa41..0000000 --- a/X/.config/xresources/Xresources.d/fonts +++ /dev/null @@ -1,7 +0,0 @@ -Xft.antialias: 1 -Xft.autohint: 0 -Xft.dpi: 92 -Xft.hinting: true -Xft.hintstyle: hintslight -Xft.lcdfilter: lcddefault -Xft.rgba: rgb diff --git a/X/.config/xresources/xinitrc b/X/.config/xresources/xinitrc deleted file mode 100644 index 6539d02..0000000 --- a/X/.config/xresources/xinitrc +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh - -userresources=$XDG_CONFIG_HOME/xresources/Xresources -usermodmap=$XDG_CONFIG_HOME/xresources/Xmodmap -sysresources=/etc/X11/xinit/.Xresources -sysmodmap=/etc/X11/xinit/.Xmodmap - -# merge in defaults and keymaps - -if [ -f $sysresources ]; then - xrdb -merge $sysresources -fi - -if [ -f $sysmodmap ]; then - xmodmap $sysmodmap -fi - -if [ -f "$userresources" ]; then - xrdb -merge "$userresources" -fi - -if [ -f "$usermodmap" ]; then - xmodmap "$usermodmap" -fi - -if [ -d /etc/X11/xinit/xinitrc.d ]; then - for f in /etc/X11/xinit/xinitrc.d/?*.sh; do - # shellcheck disable=1090 - [ -x "$f" ] && . "$f" - done - unset f -fi - -# unclutter is a program to hide your mouse cursor when it is not moved -type unclutter >/dev/null 2>&1 && unclutter & -# picom is the maintained version of desktop compositor compton -type picom >/dev/null 2>&1 && picom & - -# if sxhkd - the key-binding daemon is installed, start it up -# set it to start up a custom fifo-creating version -# and set the chain-mode exiting key to a non existing one (default would be escape) -type sxhkd >/dev/null 2>&1 && sxhkd-piped -a "copyright" & - -# if nextcloud-client exists, start it up -type nextcloud >/dev/null 2>&1 && nextcloud --background & - -# load nm-applet, to allow easy vpn setting/switching from x interface -# TODO this should over time be replaced with a custom polybar interface -type nm-applet >/dev/null 2>&1 && nm-applet & - -# additional config options for Touchpad devices ONLY -if [ "$(journalctl --dmesg -o short-monotonic --no-hostname --no-pager | grep -c "Touchpad")" -gt 0 ]; then - # enable touch tapping for XPS13 touchpad - for different devices get the touchpad name with xinput list-prop - xinput set-prop "DLL075B:01 06CB:76AF Touchpad" "libinput Tapping Enabled" 1 - - # sets default to EURkey layout, with possibility to switch to german - # sets german layout to be default for the only pc I have with a german keyboard - # allows switching layouts with alt+space - setxkbmap -layout eu,de -else - setxkbmap -layout de,eu -fi -# Remaps Capslock key to control. -# (only works for x environment - I haven't needed it for non-x yet) -setxkbmap -option ctrl:nocaps -setxkbmap -option grp:alt_shift_toggle - -# Makes Capslock behave as escape - when ONLY capslock is pressed and released -# this only works when we already substitute a ctrl for caps with the lines above, -# otherwise control itself will act as escape. -# Needs xcape package installed. https://github.com/alols/xcape -# set a timeout of 500ms, if pressed longer it will ignore esc -type xcape >/dev/null 2>&1 && xcape -e 'Control_L=Escape' -t 500 - -type feh >/dev/null 2>&1 && exec feh --bg-scale ~/pictures/wall.jpg & -type xss-lock >/dev/null 2>&1 && exec xss-lock & -type i3 >/dev/null 2>&1 && exec i3 diff --git a/X/.local/bin/clip b/X/.local/bin/clip deleted file mode 100755 index b27880a..0000000 --- a/X/.local/bin/clip +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env sh - -# clip -- easy copying to x clipboard manager with xclip -# -# clips the first argument to the clipboard -# or stdin if stdin is passed -# will copy png/jpg as image files -# -# idea ~~stolen~~ creatively borrowed from -# https://github.com/kyazdani42/dotfiles/blob/master/bin/copy - -if ! exist xclip normal; then exit 1; fi - -# if we are in a pipe, read from stdin -if [ ! -t 0 ]; then - xclip -i -selection clipboard /dev/stdin - exit 0 -fi - -if [ $# != 1 ] || [ ! -f "$1" ]; then - printf "No file argument passed to xclip to clip: %s" "$1" - exit 1 -fi - -options="" -if grep -qE '.png$' "$1"; then - options="-target image/png" -elif grep -qE '.jpe\?g$' "$1"; then - options="-target image/jpeg" -fi - -if [ -n "$options" ]; then - xclip -selection clipboard "$options" "$1" -else - xclip -selection clipboard "$1" -fi diff --git a/alacritty/.config/alacritty/alacritty.yml b/alacritty/.config/alacritty/alacritty.yml index 29451bb..c8c4fe5 100644 --- a/alacritty/.config/alacritty/alacritty.yml +++ b/alacritty/.config/alacritty/alacritty.yml @@ -8,10 +8,11 @@ scrolling: multiplier: 3 font: - size: 12.5 + size: 12 # Allow terminal applications to change Alacritty's window title. window.dynamic_title: true +background_opacity: 1.0 import: - .config/alacritty/colorscheme.yml diff --git a/bootstrap/.stow-local-ignore b/bootstrap/.stow-local-ignore index a512395..c2591e7 100644 --- a/bootstrap/.stow-local-ignore +++ b/bootstrap/.stow-local-ignore @@ -3,3 +3,4 @@ ^/install_packages.sh ^/packages.*.txt ^/README.md +^/system-packages diff --git a/bootstrap/packages.txt b/bootstrap/packages.txt index bd1474d..a0f0eb5 100644 --- a/bootstrap/packages.txt +++ b/bootstrap/packages.txt @@ -160,9 +160,6 @@ reflector restic ripgrep-all rng-tools -rofi-calc -rofi-dmenu -rofi-greenclip rofimoji rtv sc-im @@ -210,13 +207,6 @@ vifm vim-language-server vimiv visidata -xcape -xclip -xsel -xorg-xev -xorg-xinit -xorg-xinput -xss-lock youtube-dl zathura-pdf-mupdf zsh-autosuggestions @@ -257,3 +247,16 @@ zathura-djvu yt-dlp-git yaml-language-server-bin +river +rivercarro +keyd +waybar-git +swaybg +waylock +wl-clipboard +clipman +libqalculate +ydotool +brightnessctl +grim +slurp diff --git a/bootstrap/system-packages/etc/keyd/AT Translated Set 2 keyboard.cfg b/bootstrap/system-packages/etc/keyd/AT Translated Set 2 keyboard.cfg new file mode 100644 index 0000000..d6287a8 --- /dev/null +++ b/bootstrap/system-packages/etc/keyd/AT Translated Set 2 keyboard.cfg @@ -0,0 +1,33 @@ +# Makes capslock to control/escape +# insert to paste +# right alt to enable German Umlaute (äÄöÖüÜ), +# sharp s (ß), and the Euro sign (€). +# Needs compose key to be set in xkb to work correctly: +# $ setxkbmap -option "compose:menu" + +capslock = overload(C, esc) +insert = S-insert +rightalt = layer(dia) +shift = layer(shift) +rightshift = layer(shift) + +[shift:S] + +rightalt = layer(shiftedDia) + +[dia] + +shift = layer(shiftedDia) +rightshift = layer(shiftedDia) + +a = macro(compose a ") +o = macro(compose o ") +u = macro(compose u ") +s = macro(compose s s) +e = macro(compose = e) + +[shiftedDia] + +a = macro(compose A ") +o = macro(compose O ") +u = macro(compose U ") diff --git a/bootstrap/system-packages/etc/keyd/default.cfg b/bootstrap/system-packages/etc/keyd/default.cfg new file mode 100644 index 0000000..373ebab --- /dev/null +++ b/bootstrap/system-packages/etc/keyd/default.cfg @@ -0,0 +1,9 @@ +# leftshift = oneshot(S) +# leftalt = oneshot(A) +# rightalt = oneshot(G) +# rightshift = oneshot(A) +# leftmeta = oneshot(M) +# rightmeta = oneshot(M) + +capslock = overload(C, esc) +insert = S-insert diff --git a/i3/.config/i3/config b/i3/.config/i3/config deleted file mode 100644 index b33d749..0000000 --- a/i3/.config/i3/config +++ /dev/null @@ -1,205 +0,0 @@ -# This file has been auto-generated by i3-config-wizard(1). -# It will not be overwritten, so edit it as you like. -# -# Should you change your keyboard layout some time, delete -# this file and re-run i3-config-wizard(1). -# - -# i3 config file (v4) -# -# Please see https://i3wm.org/docs/userguide.html for a complete reference! - -set $mod Mod4 -set $modemod Mod1 -set $font "pango:Iosevka 8" - -# Font for window titles. Will also be used by the bar unless a different font -# is used in the bar {} block below. -#font pango:monospace 8 -font $font - -workspace_auto_back_and_forth yes - -# This font is widely installed, provides lots of unicode glyphs, right-to-left -# text rendering and scalability on retina/hidpi displays (thanks to pango). -#font pango:DejaVu Sans Mono 8 - -# Before i3 v4.8, we used to recommend this one as the default: -# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 -# The font above is very space-efficient, that is, it looks good, sharp and -# clear in small sizes. However, its unicode glyph coverage is limited, the old -# X core fonts rendering does not support right-to-left and this being a bitmap -# font, it doesn’t scale on retina/hidpi displays. - -# Use Mouse+$mod to drag floating windows to their wanted position -floating_modifier $mod - -# kill focused window -bindsym $mod+Shift+c kill - -# change focus -bindsym $mod+h focus left -bindsym $mod+j focus down -bindsym $mod+k focus up -bindsym $mod+l focus right - -# alternatively, you can use the cursor keys: -bindsym $mod+Left focus left -bindsym $mod+Down focus down -bindsym $mod+Up focus up -bindsym $mod+Right focus right - -# move focused window -bindsym $mod+Shift+h move left -bindsym $mod+Shift+j move down -bindsym $mod+Shift+k move up -bindsym $mod+Shift+l move right - -# alternatively, you can use the cursor keys: -bindsym $mod+Shift+Left move left -bindsym $mod+Shift+Down move down -bindsym $mod+Shift+Up move up -bindsym $mod+Shift+Right move right - -# split in horizontal orientation -bindsym $mod+Shift+s split v - -# split in vertical orientation -bindsym $mod+s split h - -# enter fullscreen mode for the focused container -bindsym $mod+f fullscreen toggle - -# change container layout (stacked, tabbed, toggle split) -bindsym $mod+Shift+w layout stacking -bindsym $mod+w layout tabbed -bindsym $mod+e layout toggle split - -# toggle tiling / floating -bindsym $mod+Shift+v floating toggle - -# change focus between tiling / floating windows -bindsym $mod+v focus mode_toggle - -# focus the parent/child container -bindsym $mod+Shift+a focus parent -bindsym $mod+a focus child - -# make a (floating) window stick to all workspaces -bindsym $mod+ctrl+v sticky toggle - -# set up scratch pad for todo and 'drop-down' terminal -# call scratchpads to current workspace -- scratchpads started on i3 starting (see end of file) -bindsym $mod+t [class="scratchpad" title="dropdown-todo"] scratchpad show -bindsym $mod+Shift+Return [class="scratchpad" title="dropdown-terminal"] scratchpad show - -# GAP MANAGEMENT -# disable titles and borders, necessary for i3gaps to work apparently -for_window [class="^.*"] border pixel 0 -# by default set no gaps when multiple windows are on the workspace -gaps inner 0 -gaps outer 0 -# increase/decrease inner gapping -bindsym $mod+shift+g gaps inner current plus 10 -bindsym $mod+g gaps inner current minus 10 -# increase/decrease border sizes -bindsym $mod+b border toggle 2 - -# Define names for default workspaces for which we configure key bindings later on. -# We use variables to avoid repeating the names in multiple places. -set $ws1 "1" -set $ws2 "2" -set $ws3 "3" -set $ws4 "4" -set $ws5 "5" -set $ws6 "6" -set $ws7 "7" -set $ws8 "8" -set $ws9 "9" -set $ws10 "10" - -# switch to workspace -bindsym $mod+1 workspace $ws1 -bindsym $mod+2 workspace $ws2 -bindsym $mod+3 workspace $ws3 -bindsym $mod+4 workspace $ws4 -bindsym $mod+5 workspace $ws5 -bindsym $mod+6 workspace $ws6 -bindsym $mod+7 workspace $ws7 -bindsym $mod+8 workspace $ws8 -bindsym $mod+9 workspace $ws9 -bindsym $mod+0 workspace $ws10 - -# move focused container to workspace -bindsym $mod+Shift+1 move container to workspace $ws1 -bindsym $mod+Shift+2 move container to workspace $ws2 -bindsym $mod+Shift+3 move container to workspace $ws3 -bindsym $mod+Shift+4 move container to workspace $ws4 -bindsym $mod+Shift+5 move container to workspace $ws5 -bindsym $mod+Shift+6 move container to workspace $ws6 -bindsym $mod+Shift+7 move container to workspace $ws7 -bindsym $mod+Shift+8 move container to workspace $ws8 -bindsym $mod+Shift+9 move container to workspace $ws9 -bindsym $mod+Shift+0 move container to workspace $ws10 - - -# resize window (you can also use the mouse for that) -mode "resize" { - # These bindings trigger as soon as you enter the resize mode - - # Pressing left will shrink the window’s width. - # Pressing right will grow the window’s width. - # Pressing up will shrink the window’s height. - # Pressing down will grow the window’s height. - bindsym h resize shrink width 10 px or 10 ppt - bindsym Shift+h resize shrink width 30 px or 30 ppt - bindsym j resize grow height 10 px or 10 ppt - bindsym Shift+j resize grow height 30 px or 30 ppt - bindsym k resize shrink height 10 px or 10 ppt - bindsym Shift+k resize shrink height 30 px or 30 ppt - bindsym l resize grow width 10 px or 10 ppt - bindsym Shift+l resize grow width 30 px or 30 ppt - - # same bindings, but for the arrow keys - bindsym Left resize shrink width 10 px or 10 ppt - bindsym Down resize grow height 10 px or 10 ppt - bindsym Up resize shrink height 10 px or 10 ppt - bindsym Right resize grow width 10 px or 10 ppt - - # back to normal: Enter or Escape or $mod+r - bindsym Return mode "default" - bindsym Escape mode "default" - bindsym $modemod+r mode "default" - -} - -bindsym $modemod+r mode "resize" - -# reload the configuration file -bindsym $mod+F12 reload -# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) -bindsym $mod+Shift+F12 restart - -# default workspaces for most used apps -# assign [class="^qutebrowser$"] → number 1 -# spotify needs for_window, see https://i3wm.org/docs/userguide.html#assign_workspace -assign [class="^spotify$"] → 10 -assign [class="^Spotify$"] → 10 -#fix for spotify not moving to workspace 10 -for_window [class="^spotify$"] move to workspace 10 - -# windows with class floating will automatically float -# windows with class scratchpad will automatically float and be sent to the scratchpad -for_window [class="floating"] floating enable -for_window [class="scratchpad"] floating enable -for_window [class="scratchpad"] move scratchpad - -# Vim-like mark system - set with mod+m, go there with mod+' -# read 1 character and mark the current window with this character -bindsym $mod+m exec i3-input -F 'mark %s' -l 1 -P 'Mark: ' -# read 1 character and go to the window with the character -bindsym $mod+apostrophe exec i3-input -F '[con_mark="%s"] focus' -l 1 -P 'Goto: ' - -# launch polybar (script ensures only 1 instance existing at a time) -exec_always --no-startup-id polybar-launch top - diff --git a/install.sh b/install.sh index 9b18904..39c8692 100755 --- a/install.sh +++ b/install.sh @@ -17,7 +17,7 @@ main() { case "$1" in -v | --version) - printf "Personal system bootstrap script.\n\n©Marty Oehme\n\nVersion: 0.1.1\n" + printf "Personal system bootstrap script.\n\nby Marty Oehme\n\nv0.2\n" ;; -h | --help) printf "Usage: install [-f|--force][-v|--version][-h|--help]\n\n-f Do not ask for any confirmations but force update and installation.\n" @@ -36,44 +36,41 @@ main() { exit $ret } +# takes default value (y/n), question, abort message as arguments +# automatically answers yes if unattended install check_consent() { - echo "This will take a while, install many packages and link dotfiles all over the place. Proceed [y/N]?" - read -r yes - if [[ "$yes" != y* ]]; then - echo "Exiting." - exit + if [ "$UNATTENDED" == "true" ]; then + true + else + [[ "$1" == "y" ]] && default_consent="[Y/n]" || default_consent="[y/N]" + printf "%s %s " "$2" "$default_consent" + read -r answer + if [[ "$1" == "n" ]] && [[ "$answer" != y* ]]; then + echo first + printf "%s\n" "$3" + false + elif [[ "$1" == "y" ]] && [[ "$answer" == n* ]]; then + echo second + printf "%s\n" "$3" + false + else + true + fi fi } +entry_question() { + check_consent n "This will take a while, install many packages and link dotfiles all over the place. Proceed?" "Aborting." || exit +} + enable_git_hooks() { - if [ "$1" == "false" ]; then - echo "Should we enable git hooks for this repository, so that installed packages are automatically compared when committing? [Y/n]" - read -r no - if [[ "$no" == n* ]]; then - echo "Not changing repository settings." - return - fi - fi + check_consent y "Should we enable git hooks for this repository, so that installed packages are automatically compared when committing?" "Not changing repository settings." || return git config --local core.hooksPath .githooks/ echo "Changed repository settings." } -install() { - unattended=$1 - if ! "$unattended"; then - check_consent - fi - echo "====================== BEGINNING INSTALLATION =============================" - if ! "$unattended"; then - export BOOTSTRAP_PACKAGES="bootstrap/packages.txt" - "$bootstrap_dir"/install_packages.sh - else - export BOOTSTRAP_PACKAGES="bootstrap/packages.txt" - "$bootstrap_dir"/install_packages.sh -f - fi - unset BOOTSTRAP_PACKAGES - - echo "=================== BEGINNING DOTFILE MANAGEMENT ==========================" +stow_dotfiles() { + check_consent y "Link home directory dot files?" "Not linking dotfiles." || return # get all top level directories, remove their slashes and dots # finally get rid of .dot-directories, since they are for the repo not for my homedir targets="$(find . -maxdepth 1 -type d | sed -e 's/^\.\/\(.*\)$/\1/' | sed -e '/^\./d')" @@ -81,9 +78,42 @@ install() { # shellcheck disable=2086 # -- for some reason stow only works with unqoted var expansion stow -R ${targets} 2> >(grep -v 'Absolute/relative mismatch between Stow dir' 1>&2) + echo "Linked dotfiles." +} + +stow_system_packages() { + check_consent n "Link system settings as well? This will require sudo access." "Not touching system files." || return + sudo stow --dir="$bootstrap_dir" --target="/" -R system-packages/ + echo "Linked system files." +} + +install_packages() { + check_consent n "Install pre-designated packages? This will take a while." "Not installing packages." || return + export BOOTSTRAP_PACKAGES="bootstrap/packages.txt" + if ! "$UNATTENDED"; then + "$bootstrap_dir"/install_packages.sh + else + "$bootstrap_dir"/install_packages.sh -f + fi + unset BOOTSTRAP_PACKAGES + echo "Installed packages." +} + +install() { + UNATTENDED=$1 + if ! "$UNATTENDED"; then + entry_question + fi + + echo "====================== BEGINNING INSTALLATION =============================" + install_packages + + echo "=================== BEGINNING DOTFILE MANAGEMENT ==========================" + stow_dotfiles + stow_system_packages echo "================== ENABLING GIT REPOSITORY HOOKS ==========================" - enable_git_hooks "$unattended" + enable_git_hooks echo "====================== INSTALLATION FINISHED ==============================" exit 0 diff --git a/mpv/.local/bin/umpv b/mpv/.local/bin/umpv index 5d08e22..9e766c1 100755 --- a/mpv/.local/bin/umpv +++ b/mpv/.local/bin/umpv @@ -31,8 +31,6 @@ import os import socket import errno import subprocess -import fcntl -import stat import string files = sys.argv[1:] @@ -43,18 +41,21 @@ def is_url(filename): if len(parts) < 2: return False # protocol prefix has no special characters => it's an URL - allowed_symbols = string.ascii_letters + string.digits + '_' + allowed_symbols = string.ascii_letters + string.digits + "_" prefix = parts[0] return all(map(lambda c: c in allowed_symbols, prefix)) + # make them absolute; also makes them safe against interpretation as options def make_abs(filename): if not is_url(filename): return os.path.abspath(filename) return filename + + files = [make_abs(f) for f in files] -SOCK = os.path.join(os.getenv("HOME"), ".umpv_socket") +SOCK = os.path.join(str(os.getenv("HOME")), ".umpv_socket") sock = None try: @@ -66,7 +67,7 @@ except socket.error as e: pass # abandoned socket elif e.errno == errno.ENOENT: sock = None - pass # doesn't exist + pass # doesn't exist else: raise e @@ -74,23 +75,29 @@ if sock: # Unhandled race condition: what if mpv is terminating right now? for f in files: # escape: \ \n " - f = f.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n") - f = "\"" + f + "\"" + f = f.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n") + f = '"' + f + '"' sock.send(("raw loadfile " + f + " append\n").encode("utf-8")) else: # Let mpv recreate socket if it doesn't already exist. opts = (os.getenv("MPV") or "mpv").split() - opts.extend(["--no-terminal", - "--force-window", - "--input-ipc-server=" + SOCK, - # position on lower left screen corner - # contains funky fix for slight resizings depending on video - # move it 10px more left than it wants; 5px more up - "--geometry=15%+-10-+5", - "--on-all-workspaces", - "--force-window=immediate", - "--"]) + opts.extend( + [ + "--no-terminal", + "--force-window", + "--input-ipc-server=" + SOCK, + # position on lower left screen corner + # contains funky fix for slight resizings depending on video + # move it 10px more left than it wants; 5px more up + "--geometry=15%+-10-+5", + "--on-all-workspaces", + "--force-window=immediate", + "--x11-name=float", + "--wayland-app-id=float", + "--", + ] + ) opts.extend(files) subprocess.check_call(opts) diff --git a/pass/.local/bin/pass-pick b/pass/.local/bin/pass-pick new file mode 100755 index 0000000..02ccfe2 --- /dev/null +++ b/pass/.local/bin/pass-pick @@ -0,0 +1,361 @@ +#!/usr/bin/env bash +# +# Pass picker +# +# Use a dmenu-like list selector to display and autofill your pass passwords. +# Can work with rofi, bemenu and dmenu, or a custom picker given as an option. +# Invoke it with `pass-pick`. You can set options through environment variables +# or through a configuration file. +# +# Keys: +# By default shows the available keys on rofi, but not on bemenu/dmenu. +# ROFI mapped keys (main password list): +# return autofill username/password combination +# alt+return enter entry submenu +# alt+u autofill username +# alt+p autofill password +# alt+ctrl+u send username to clipboard +# alt+ctrl+p send password to clipboard +# ROFI mapped keys (individual entry): +# return autofill selected field +# alt+return send selected field to clipboard +# alt+s reveal hidden password field +# alt+backspace back to main password menu +# Those options also work on bemenu, but have different (and fixed) mappings. +# BEMENU mapped keys (main password list): +# return autofill username/password combination +# alt+2 send username to clipboard +# alt+3 send password to clipboard +# alt+4 autofill username +# alt+5 autofill password +# alt+6 enter entry submenu +# BEMENU mapped keys (individual entry): +# return autofill selected field +# alt+2 send selected field to clipboard +# alt+3 back to main password menu +# alt+4 reveal hidden password field + +# Selector wrapper +# Prefers rofi if found, otherwise bemenu or dmenu if found, complains if no selector available. +# Passes along any options given to main script. +rofi_opts=("$@") +_picker() { + if [ -n "$PICKER" ]; then + "${PICKER[@]}" + elif command -v rofi 1>/dev/null 2>/dev/null; then + rofi -dmenu -no-auto-select -i "${rofi_opts[@]}" "$@" -p "entry" + elif command -v bemenu 1>/dev/null 2>/dev/null; then + bemenu -l 20 -i -p "entry >" + elif command -v dmenu 1>/dev/null 2>/dev/null; then + dmenu -i -p "entry >" + else + printf "%s: 📦 %s must be installed for %s function.\n" "critical" "rofi/dmenu" "this" >&2 + notify-send "📦 rofi/dmenu" --urgency="critical" "must be installed for this function." + exit 1 + fi +} + +# parse, see https://unix.stackexchange.com/a/331965/8541 +_parse_config() { + (grep -e "^$2=" -m 1 "$1" 2>/dev/null || printf "var=__UNDEFINED__\n") | head -n1 | cut -d '=' -f 2- +} + +# read config file +get_config() { + local locations=( + "$PP_CONFIGURATION_FILE" + "${xdg_config_home:-$HOME/.config}/pass-picker/pass-picker.conf" + "$HOME/.pass-picker.conf" + "/etc/pass-picker.conf" + ) + + # return the first config file with a valid path + for config in "${locations[@]}"; do + if [[ -n "$config" && -f "$config" ]]; then + # see if the config has been given a value + local val + val="$(_parse_config "$config" "$1")" + break + fi + done + + # if there was a config file but no value + # or there was no config file at all + if [ "$val" = "__UNDEFINED__" ] || [ -z "$val" ]; then + val="$2" + fi + printf -- "%s" "$val" +} + +set_defaults() { + # The location of the pass-picker config file + # PP_CONFIGURATION_FILE="~/.config/pass-picker/pass-picker.conf" + # set options, leaving already set environment variables intact + # try to read any settings from config files + PICKER="${PP_PICKER:-$(get_config PICKER)}" + + KEY_AUTOFILL="${PP_KEY_AUTOFILL:-$(get_config KEY_AUTOFILL Return)}" + KEY_ENTRY_OPEN="${PP_KEY_ENTRY_OPEN:-$(get_config KEY_ENTRY_OPEN Alt+Return)}" + KEY_FILL_USER="${PP_KEY_FILL_USER:-$(get_config KEY_FILL_USER Alt+u)}" + KEY_CLIP_USER="${PP_KEY_CLIP_USER:-$(get_config KEY_CLIP_USER Ctrl+Alt+u)}" + KEY_FILL_PASS="${PP_KEY_FILL_PASS:-$(get_config KEY_FILL_PASS Alt+p)}" + KEY_CLIP_PASS="${PP_KEY_CLIP_PASS:-$(get_config KEY_CLIP_PASS Ctrl+Alt+p)}" + KEY_ENTRYMENU_FILL="${PP_KEY_ENTRYMENU_FILL:-$(get_config KEY_ENTRYMENU_FILL Return)}" + KEY_ENTRYMENU_CLIP="${PP_KEY_ENTRYMENU_CLIP:-$(get_config KEY_ENTRYMENU_CLIP Alt+Return)}" + KEY_ENTRYMENU_SHOWFIELD="${KEY_ENTRYMENU_SHOWFIELD:-$(get_config KEY_ENTRYMENU_SHOWFIELD Alt+s)}" + KEY_ENTRYMENU_QUIT="${PP_KEY_ENTRYMENU_QUIT:-$(get_config KEY_ENTRYMENU_QUIT Alt+BackSpace)}" + + AUTOFILL_BACKEND="${PP_AUTOFILL_BACKEND:-$(get_config AUTOFILL_BACKEND ydotool)}" + AUTOFILL_CHAIN="${PP_AUTOENTRY_CHAIN:-$(get_config AUTOFILL_CHAIN 'username :tab password')}" + AUTOFILL_DELAY="${PP_AUTOENTRY_DELAY:-$(get_config AUTOFILL_DELAY 30)}" + PASS_USERNAME_FIELD="${PP_PASS_USERNAME_FIELD:-$(get_config PASS_USERNAME_FIELD 'username user login')}" +} + +# exit on escape pressed +exit_check() { + [ "$1" -eq 1 ] && exit +} + +# simply return a list of all passwords in pass store +# TODO only show website names (+ folder names), and account names for multiple accounts on one site +list_passwords() { + shopt -s nullglob globstar + prefix=${PASSWORD_STORE_DIR:-~/.password-store} + password_files=("$prefix"/**/*.gpg) + password_files=("${password_files[@]#"$prefix"/}") + password_files=("${password_files[@]%.gpg}") + + printf '%s\n' "${password_files[@]}" +} + +# return password for argument passed +show_password() { + pass show "$1" | head -n1 +} + +# send password to clipboard +clip_password() { + pass show -c "$1" +} + +# attempt to return the field specified +# attempts all (space separated) fields until the +# first one successfully returned +_p_get_field() { + local gp_entry="$1" + local gp_field="$2" + local clip="$3" + + # return on first successfully returned key + for key in $gp_field; do + local value + value=$(_p_get_key_value "$gp_entry" "$key") + + # found entry + if [ -n "$value" ]; then + + if [ -n "$clip" ]; then + # copies to clipboard, removes any trailing newlines, + # and only keeps it in for 1 paste (1 loop to read in script, 1 to output) + if command -v wl-copy; then + echo "$value" | wl-copy -o && break + elif command -v xclip; then + echo "$value" | xclip -i -selection 'clipboard' -loops 2 -rmlastnl && break + elif command -v xsel; then + echo "$value" | xsel -b && break + else + notify-send "No clipboard utility" "Install wl-copy, xclip or xsel." + fi + else + echo "$value" && break + fi + + fi + done +} + +# returns the corresponding value for the key passed in +# arguments: +# $1: pass (file) entry to search through +# $2: string name of the containting key +_p_get_key_value() { + local value + value=$(list_fields "$1" | grep "$2") + + # get everything after first colon, remove whitespace + echo "$value" | cut -d':' -f2- | tr -d '[:blank:]' +} + +# return username for argument passed +show_username() { + _p_get_field "$1" "${PASS_USERNAME_FIELD}" +} + +clip_username() { + _p_get_field "$1" "${PASS_USERNAME_FIELD}" "-c" +} + +show_field() { + _p_get_field "$1" "$2" +} + +clip_field() { + _p_get_field "$1" "$2" "-c" +} + +list_fields() { + pass show "$1" | tail -n+2 +} + +# invoke the dotool to type inputs +_type() { + local tool="${AUTOFILL_BACKEND}" + local toolmode="$1" + local key="$2" + + if [ "$tool" = "xdotool" ]; then + "$tool" "$toolmode" --delay "${AUTOFILL_DELAY}" "$key" + elif [ "$tool" = "ydotool" ]; then + "$tool" "$toolmode" --key-delay "${AUTOFILL_DELAY}" "$key" + else + "$tool" "$toolmode" "$key" + fi +} + +# automatically fill out fields +# transform special chain entries into valid dotool commands +autofill() { + local selected="${1}" + local autoentry_chain="${2}" + + for part in $autoentry_chain; do + case "$part" in + ":tab") _type key Tab ;; + ":return") _type key Return ;; + ":space") _type key space ;; + "username") _type type "$(show_username "$selected")" ;; + "password") _type type "$(show_password "$selected")" ;; + ":direct") _type type "$selected" ;; + *) printf '%s' "$selected" ;; + esac + done +} + +# opens a menu for the specified pass entry, containing its individual fields +entrymenu() { + local entry="$1" + local deobfuscate="$2" + local k_entrymenu_fill="${KEY_ENTRYMENU_FILL}" + local k_entrymenu_clip="${KEY_ENTRYMENU_CLIP}" + local k_entrymenu_showfield="${KEY_ENTRYMENU_SHOWFIELD}" + local k_entrymenu_quit="${KEY_ENTRYMENU_QUIT}" + + local pass + if [ "$deobfuscate" = "true" ]; then + pass="$(show_password "$entry")" + else + pass="(hidden)" + fi + + local field + field=$( + printf "password: %s\n%s" "$pass" "$(list_fields "$entry")" | + _picker \ + -kb-accept-entry "" \ + -kb-custom-1 "$k_entrymenu_fill" \ + -kb-custom-2 "$k_entrymenu_clip" \ + -kb-custom-3 "$k_entrymenu_quit" \ + -kb-custom-4 "$k_entrymenu_showfield" \ + -mesg " ᐊ $k_entrymenu_quit ᐊ | $k_entrymenu_fill: fill selection | $k_entrymenu_clip: clip selection | $k_entrymenu_showfield: reveal password" + ) + exit_value=$? + exit_check "$exit_value" + + # get field name + field=${field%%:*} + case "$exit_value" in + "0" | "10") + if [ "$field" = "password" ]; then + autofill "$entry" "password" + else + autofill "$(show_field "$entry" "$field")" ":direct" + fi + exit 0 + ;; + "11") + if [ "$field" = "password" ]; then + clip_password "$entry" + else + clip_field "$entry" "$field" + fi + exit 0 + ;; + "12") + main + ;; + "13") + local toggle + if [ "$deobfuscate" = "true" ]; then + toggle=false + else + toggle=true + fi + entrymenu "$entry" "$toggle" + ;; + esac +} + +main() { + local autoentry_chain="${AUTOFILL_CHAIN}" + local k_autofill="${KEY_AUTOFILL}" + local k_fill_user="${KEY_FILL_USER}" + local k_clip_user="${KEY_CLIP_USER}" + local k_fill_pass="${KEY_FILL_PASS}" + local k_clip_pass="${KEY_CLIP_PASS}" + local k_submenu="${KEY_ENTRY_OPEN}" + + entry="$( + list_passwords | + _picker -kb-accept-entry "" \ + -kb-custom-1 "$k_autofill" \ + -kb-custom-2 "$k_clip_user" \ + -kb-custom-3 "$k_clip_pass" \ + -kb-custom-4 "$k_fill_user" \ + -kb-custom-5 "$k_fill_pass" \ + -kb-custom-6 "$k_submenu" \ + -mesg "| $k_autofill: fill credentials | $k_submenu: open entry | $k_fill_user: fill username | $k_fill_pass: fill password | $k_clip_user: clip username | $k_clip_pass: clip password |" + )" + exit_value=$? + + echo "$entry" + exit_check "$exit_value" + case "$exit_value" in + "0" | "10") + autofill "$entry" "$autoentry_chain" + exit 0 + ;; + "11") + clip_username "$entry" + exit 0 + ;; + "12") + clip_password "$entry" + exit + ;; + "13") + autofill "$entry" "username" + exit + ;; + "14") + autofill "$entry" "password" + exit + ;; + "15") + entrymenu "$entry" + exit + ;; + esac +} + +set_defaults +main diff --git a/pass/.local/bin/rofi-pass b/pass/.local/bin/rofi-pass deleted file mode 100755 index c16a187..0000000 --- a/pass/.local/bin/rofi-pass +++ /dev/null @@ -1,307 +0,0 @@ -#!/usr/bin/env bash -# - -# selector wrapper -# uses rofi if found, or dmenu if found, complains if no selector available -# passes along any options given to main script -rofi_opts=("$@") -_rofi() { - if type rofi 1>/dev/null 2>/dev/null; then - rofi -dmenu -no-auto-select -i "${rofi_opts[@]}" "$@" -p "Entry" - elif type dmenu 1>/dev/null 2>/dev/null; then - dmenu -i "${rofi_opts[@]}" "$@" -p "Entry" - else - printf "%s: 📦 %s must be installed for %s function.\n" "critical" "rofi/dmenu" "this" >&2 - notify-send "📦 rofi/dmenu" --urgency="critical" "must be installed for this function." - exit 1 - fi -} - -# parse, see https://unix.stackexchange.com/a/331965/8541 -_parse_config() { - (grep -E "^$2=" -m 1 "$1" 2>/dev/null || printf "VAR=__UNDEFINED__\n") | head -n1 | cut -d '=' -f 2- -} - -# read config file -get_config() { - local locations=( - "$RP_CONFIGURATION_FILE" - "${XDG_CONFIG_HOME:-$HOME/.config}/rofi-pass/rofi-pass.conf" - "$HOME/.rofi-pass.conf" - "/etc/rofi-pass.conf" - ) - - # return the first config file with a valid path - for config in "${locations[@]}"; do - if [[ -n "$config" && -f "$config" ]]; then - # see if the config has been given a value - local val - val="$(_parse_config "$config" "$1")" - break - fi - done - - # if there was a config file but no value - # or there was no config file at all - if [ "$val" = "__UNDEFINED__" ] || [ -z "$val" ]; then - val="$2" - fi - printf -- "%s" "$val" -} - -set_defaults() { - # The location of the rofi-pass config file - # RP_CONFIGURATION_FILE="~/.config/rofi-pass/rofi-pass.conf" - # set options, leaving already set environment variables intact - # try to read any settings from config files - KEY_AUTOFILL="${RP_KEY_AUTOFILL:-$(get_config KEY_AUTOFILL Return)}" - KEY_ENTRY_OPEN="${RP_KEY_ENTRY_OPEN:-$(get_config KEY_ENTRY_OPEN Alt+Return)}" - KEY_FILL_USER="${RP_KEY_FILL_USER:-$(get_config KEY_FILL_USER Alt+u)}" - KEY_CLIP_USER="${RP_KEY_CLIP_USER:-$(get_config KEY_CLIP_USER Ctrl+Alt+u)}" - KEY_FILL_PASS="${RP_KEY_FILL_PASS:-$(get_config KEY_FILL_PASS Alt+p)}" - KEY_CLIP_PASS="${RP_KEY_CLIP_PASS:-$(get_config KEY_CLIP_PASS Ctrl+Alt+p)}" - KEY_ENTRYMENU_FILL="${RP_KEY_ENTRYMENU_FILL:-$(get_config KEY_ENTRYMENU_FILL Return)}" - KEY_ENTRYMENU_CLIP="${RP_KEY_ENTRYMENU_CLIP:-$(get_config KEY_ENTRYMENU_CLIP Alt+Return)}" - KEY_ENTRYMENU_SHOWFIELD="${KEY_ENTRYMENU_SHOWFIELD:-$(get_config KEY_ENTRYMENU_SHOWFIELD Alt+s)}" - KEY_ENTRYMENU_QUIT="${RP_KEY_ENTRYMENU_QUIT:-$(get_config KEY_ENTRYMENU_QUIT Alt+BackSpace)}" - - AUTOFILL_BACKEND="${RP_AUTOFILL_BACKEND:-$(get_config AUTOFILL_BACKEND xdotool)}" - AUTOFILL_CHAIN="${RP_AUTOENTRY_CHAIN:-$(get_config AUTOFILL_CHAIN 'username :tab password')}" - AUTOFILL_DELAY="${RP_AUTOENTRY_DELAY:-$(get_config AUTOFILL_DELAY 30)}" - PASS_USERNAME_FIELD="${RP_PASS_USERNAME_FIELD:-$(get_config PASS_USERNAME_FIELD 'username user login')}" -} - -# exit on escape pressed -# rofi returns exit code 1 on esc -exit_check() { - [ "$1" -eq 1 ] && exit -} - -# simply return a list of all passwords in pass store -# TODO only show website names (+ folder names), and account names for multiple accounts on one site -list_passwords() { - shopt -s nullglob globstar - prefix=${PASSWORD_STORE_DIR:-~/.password-store} - password_files=("$prefix"/**/*.gpg) - password_files=("${password_files[@]#"$prefix"/}") - password_files=("${password_files[@]%.gpg}") - - printf '%s\n' "${password_files[@]}" -} - -# return password for argument passed -show_password() { - pass show "$1" | head -n1 -} - -# send password to clipboard -clip_password() { - pass show -c "$1" -} - -# attempt to return the field specified -# attempts all (space separated) fields until the -# first one successfully returned -_p_get_field() { - local gp_entry="$1" - local gp_field="$2" - local clip="$3" - - # return on first successfully returned key - for key in $gp_field; do - local value - value=$(_p_get_key_value "$gp_entry" "$key") - - # found entry - if [ -n "$value" ]; then - - if [ -n "$clip" ]; then - # copies to clipboard, removes any trailing newlines, - # and only keeps it in for 1 paste (1 loop to read in script, 1 to output) - echo "$value" | xclip -i -selection 'clipboard' -loops 2 -rmlastnl && break - else - echo "$value" && break - fi - - fi - done -} - -# returns the corresponding value for the key passed in -# arguments: -# $1: pass (file) entry to search through -# $2: string name of the containting key -_p_get_key_value() { - local value - value=$(list_fields "$1" | grep "$2") - - # get everything after first colon, remove whitespace - echo "$value" | cut -d':' -f2- | tr -d '[:blank:]' -} - -# return username for argument passed -show_username() { - _p_get_field "$1" "${PASS_USERNAME_FIELD}" -} - -clip_username() { - _p_get_field "$1" "${PASS_USERNAME_FIELD}" "-c" -} - -show_field() { - _p_get_field "$1" "$2" -} - -clip_field() { - _p_get_field "$1" "$2" "-c" -} - -list_fields() { - pass show "$1" | tail -n+2 -} - -# invoke the dotool to type inputs -_type() { - local tool="${AUTOFILL_BACKEND}" - local toolmode="$1" - local key="$2" - - "$tool" "$toolmode" --delay "${AUTOFILL_DELAY}" "$key" -} - -# automatically fill out fields -# transform special chain entries into valid dotool commands -autofill() { - local selected="${1}" - local autoentry_chain="${2}" - - for part in $autoentry_chain; do - case "$part" in - ":tab") _type key Tab ;; - ":return") _type key Return ;; - ":space") _type key space ;; - "username") _type type "$(show_username "$selected")" ;; - "password") _type type "$(show_password "$selected")" ;; - ":direct") _type type "$selected" ;; - *) printf '%s' "$selected" ;; - esac - done -} - -# opens a menu for the specified pass entry, containing its individual fields -entrymenu() { - local entry="$1" - local deobfuscate="$2" - local k_entrymenu_fill="${KEY_ENTRYMENU_FILL}" - local k_entrymenu_clip="${KEY_ENTRYMENU_CLIP}" - local k_entrymenu_showfield="${KEY_ENTRYMENU_SHOWFIELD}" - local k_entrymenu_quit="${KEY_ENTRYMENU_QUIT}" - - local pass - if [ "$deobfuscate" = "true" ]; then - pass="$(show_password "$entry")" - else - pass="(hidden)" - fi - - local field - field=$( - printf "password: %s\n%s" "$pass" "$(list_fields "$entry")" | - _rofi \ - -kb-accept-entry "" \ - -kb-custom-1 "$k_entrymenu_fill" \ - -kb-custom-2 "$k_entrymenu_clip" \ - -kb-custom-3 "$k_entrymenu_quit" \ - -kb-custom-4 "$k_entrymenu_showfield" \ - -mesg " ᐊ $k_entrymenu_quit ᐊ | $k_entrymenu_fill: fill selection | $k_entrymenu_clip: clip selection | $k_entrymenu_showfield: reveal password" - ) - exit_value=$? - exit_check "$exit_value" - - # get field name - field=${field%%:*} - case "$exit_value" in - "10") - if [ "$field" = "password" ]; then - autofill "$entry" "password" - else - autofill "$(show_field "$entry" "$field")" ":direct" - fi - exit 0 - ;; - "11") - if [ "$field" = "password" ]; then - clip_password "$entry" - else - clip_field "$entry" "$field" - fi - exit 0 - ;; - "12") - main - ;; - "13") - local toggle - if [ "$deobfuscate" = "true" ]; then - toggle=false - else - toggle=true - fi - entrymenu "$entry" "$toggle" - ;; - esac -} - -main() { - local autoentry_chain="${AUTOFILL_CHAIN}" - local k_autofill="${KEY_AUTOFILL}" - local k_fill_user="${KEY_FILL_USER}" - local k_clip_user="${KEY_CLIP_USER}" - local k_fill_pass="${KEY_FILL_PASS}" - local k_clip_pass="${KEY_CLIP_PASS}" - local k_submenu="${KEY_ENTRY_OPEN}" - - entry="$( - list_passwords | - _rofi -kb-accept-entry "" \ - -kb-custom-1 "$k_autofill" \ - -kb-custom-2 "$k_clip_user" \ - -kb-custom-3 "$k_clip_pass" \ - -kb-custom-4 "$k_fill_user" \ - -kb-custom-5 "$k_fill_pass" \ - -kb-custom-6 "$k_submenu" \ - -mesg "| $k_autofill: fill credentials | $k_submenu: open entry | $k_fill_user: fill username | $k_fill_pass: fill password | $k_clip_user: clip username | $k_clip_pass: clip password |" - )" - exit_value=$? - - exit_check "$exit_value" - case "$exit_value" in - "10") - autofill "$entry" "$autoentry_chain" - exit 0 - ;; - "11") - clip_username "$entry" - exit 0 - ;; - "12") - clip_password "$entry" - exit - ;; - "13") - autofill "$entry" "username" - exit - ;; - "14") - autofill "$entry" "password" - exit - ;; - "15") - entrymenu "$entry" - exit - ;; - esac -} - -set_defaults -main diff --git a/polybar/.config/polybar/config b/polybar/.config/polybar/config deleted file mode 100644 index 76232eb..0000000 --- a/polybar/.config/polybar/config +++ /dev/null @@ -1,364 +0,0 @@ -;========================================================== -; -; -; ██████╗ ██████╗ ██╗ ██╗ ██╗██████╗ █████╗ ██████╗ -; ██╔══██╗██╔═══██╗██║ ╚██╗ ██╔╝██╔══██╗██╔══██╗██╔══██╗ -; ██████╔╝██║ ██║██║ ╚████╔╝ ██████╔╝███████║██████╔╝ -; ██╔═══╝ ██║ ██║██║ ╚██╔╝ ██╔══██╗██╔══██║██╔══██╗ -; ██║ ╚██████╔╝███████╗██║ ██████╔╝██║ ██║██║ ██║ -; ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ -; -; -; To learn more about how to configure Polybar -; go to https://github.com/polybar/polybar -; -; The README contains a lot of information -; -;========================================================== - -[colors] -background = ${xrdb:background} -background-alt = ${xrdb:color8} -foreground = ${xrdb:foreground} -foreground-alt = ${xrdb:color3} -primary = ${xrdb:color1} -secondary = ${xrdb:color4} -alert = ${xrdb:color2} - -[settings] -; The throttle settings lets the eventloop swallow up til X events -; if they happen within Y millisecond after first event was received. -; This is done to prevent flood of update event. -; -; For example if 5 modules emit an update event at the same time, we really -; just care about the last one. But if we wait too long for events to swallow -; the bar would appear sluggish so we continue if timeout -; expires or limit is reached. -throttle-output = 5 -throttle-output-for = 10 -; Time in milliseconds that the input handler will wait between processing events -throttle-input-for = 30 - -[global/wm] -margin-top = 0 -margin-bottom = 0 - -[bar/top] -; enable inter process communication, so that we can send messages -; to polybar via polybar-msg command -enable-ipc = true - -; Put the bar at the bottom of the screen -bottom=false - -width = 100% -height = 20 -padding-left = 0 -padding-right = 0 -module-margin-left = 2 -module-margin-right = 2 - -modules-left = sxhkdmode workspaces pomo papersdue -modules-center = music datecal -modules-right = dunstpaused networkspeed mail weather archupdates cpu temp volume battery -; do not use offsets for the bar, would only work with override-redirect -; and will mess up tray https://github.com/polybar/polybar/issues/1355 -tray-position = right - -; Basic Colors, defined further up -background = ${colors.background} -foreground = ${colors.foreground} -line-size = 1 -line-color = ${colors.primary} - -; Prefer fixed center position for the `modules-center` block. -; The center block will stay in the middle of the bar whenever -; possible. It can still be pushed around if other blocks need -; more space. -; When false, the center block is centered in the space between -; the left and right block. -fixed-center = true - -; Fonts are defined using ; -; Font names are specified using a fontconfig pattern. -; font-0 = NotoSans-Regular:size=8;2 -; font-1 = MaterialIcons:size=10 -; font-2 = Termsynu:size=8;-1 -; font-3 = FontAwesome:size=10 -; See the Fonts wiki page for more details -font-0 = Comic Neue:size=10 -font-1 = NotoSans:size=23 -font-2 = Iosevka:size=14;1 - -cursor-click = pointer - -[module/sxhkdmode] -type = custom/script -exec = sxhkd-chain-labels -exec-if = type sxhkd-chain-labels -tail = true -format =