274 Commits

Author SHA1 Message Date
janishutz c38907ec39 [Hyprland] add launch command for qutebrowser 2026-02-02 09:07:09 +01:00
janishutz 1721651319 [Hyprland] Add binds for qalculate 2026-01-23 13:41:07 +01:00
janishutz e4692c456c [Hyprland] Make steam not start in floating mode 2026-01-22 19:48:26 +01:00
janishutz 6ee881c7dc [Hyprland] Update for new keyboard having native ability to swap caps and escape 2026-01-19 11:08:22 +01:00
janishutz 2649ee4b56 [Hyprland] Remove hyprpm reload 2026-01-09 17:41:47 +01:00
janishutz 4024b9e830 [Setup] Improve color extraction 2026-01-09 16:23:30 +01:00
janishutz 11767c3009 [Astal] Prepare for reloadable style 2026-01-09 16:04:51 +01:00
janishutz c2cd216dac [Scripts] Another incorrect filename fix 2026-01-09 15:04:45 +01:00
janishutz 5c245f9c35 [Scripts] Fix incorrect filename 2026-01-09 14:46:04 +01:00
janishutz 54fb71eeae [Scripts] Add script to add latexindent 2026-01-09 14:45:09 +01:00
janishutz 44642960ad [Hyprland] Remove vivado shenanigans 2026-01-09 07:45:59 +01:00
janishutz f8b7f00f44 [Hyprland] Flat accel profile 2026-01-06 14:03:59 +01:00
janishutz 069139641f [Yazi] Update to new conf 2026-01-06 13:03:33 +01:00
janishutz 17689ac0e8 [Hyprland] Update config to newest version 2026-01-01 15:10:39 +01:00
janishutz 5581267a73 [Fish] Add alias for flutter via fvm 2026-01-01 12:50:09 +01:00
janishutz e2fd60187a [Hyprland] Improve scrolling 2025-12-19 11:08:09 +01:00
janishutz 37ff1af0ed [Kitty] Improve scrolling 2025-12-19 11:04:12 +01:00
janishutz 37849dee8f [Hyprland] Finish change to us-intl layout 2025-12-14 11:05:19 +01:00
janishutz fe36f97774 [Eslint] More fixes 2025-12-13 14:29:12 +01:00
janishutz e9399cf7bb [Eslint] Fix typing 2025-12-13 14:28:22 +01:00
janishutz c453e7aa90 [Hyprland] improve notifications 2025-12-09 11:26:04 +01:00
janishutz 5c069beb2b [Hyprland] Add notifications to layout change 2025-12-09 11:24:07 +01:00
janishutz 0a555e9e5a [Hyprland] update bind 2025-12-09 11:22:52 +01:00
janishutz c7e82042af [Hyprland] update keyboard layout and add layout change binds 2025-12-09 11:17:07 +01:00
janishutz c421ea2cb3 [Hyprland] Fix binds 2025-12-08 10:29:08 +01:00
janishutz 84b008e29c [Hyprland] Extract gestures into separate file 2025-12-08 10:28:11 +01:00
janishutz 007c3d0bf0 [Eslint] Fix config error 2025-12-04 14:50:46 +01:00
janishutz 8872abecbd [Eslint] Update config 2025-12-04 11:22:01 +01:00
janishutz 841575d4e3 [Fish] Update alias 2025-11-27 16:46:14 +01:00
janishutz befe9696b0 [Fish] Fix alias 2025-11-27 16:45:38 +01:00
janishutz 4b12ae2c12 [Scripts] Fixes for vpn script 2025-11-24 14:25:13 +01:00
janishutz 5227e5f05e [Scripts] Fix vpn script 2025-11-23 13:36:06 +01:00
janishutz b8098eac8b [Scripts] Improve VPN script 2025-11-18 09:38:24 +01:00
janishutz 5b610643c7 [Install] Fix bt 2025-11-17 09:17:27 +01:00
janishutz 4fce8c955c [Hyprland] Fix cursor size 2025-11-12 10:32:15 +01:00
janishutz eabb972cb8 [Binds] Fix swapescape 2025-11-11 09:58:48 +01:00
janishutz 688b94c3ad [Binds] Add binds to dynamically enable and disable caps:swapescape 2025-11-11 09:50:31 +01:00
janishutz d4689d66cd [FMT] Improve latexindent config 2025-11-11 08:05:53 +01:00
janishutz e28e3e6207 [Install] Add usbutils 2025-11-06 17:47:18 +01:00
janishutz b45b3d60d1 [Scripts] Add pdf wordcount script 2025-11-04 15:51:49 +01:00
janishutz 8d2e3cea85 [Hyprland] Move conflicting bind 2025-11-03 17:13:44 +01:00
janishutz 8a42f9bfa2 [Install] Add timesyncd enable 2025-11-03 10:15:00 +01:00
janishutz 09916ae68e [Hyprland] Add more launch commands 2025-11-02 10:49:33 +01:00
janishutz 5b5fa9ad4e [Astal] Fix launch on new astal version 2025-11-01 10:37:30 +01:00
janishutz 814b975533 [Linecount] Add cloc and alias for it 2025-10-30 15:31:47 +01:00
janishutz d0a450d4e8 [Setup] Make cleaner 2025-10-30 10:42:50 +01:00
janishutz 786d5c5fe0 [Yazi] Fix themes 2025-10-30 10:42:42 +01:00
janishutz 5ba2894101 [Hyprland] Improve windowrules 2025-10-30 10:24:08 +01:00
janishutz 499bf793b2 [Hyprland] Add some nice windorules 2025-10-30 10:24:08 +01:00
janishutz f1c57b8ecc [Scripts] Add nvim update script 2025-10-29 15:19:18 +01:00
janishutz 20cc042b64 [Scripts] Add batch video conversion script 2025-10-25 16:26:39 +02:00
janishutz ae9dcaa074 [Hyprland] Windowrules: Add for BeatSaber 2025-10-22 17:01:28 +02:00
janishutz 21b68b1e68 [Hyprland] Fix alvr launch bind typo 2025-10-22 12:55:57 +02:00
janishutz fa4929a94b [Hyprland] Screenshot binds exit submap 2025-10-22 12:53:44 +02:00
janishutz 6b4d0e22b1 [Kitty] Remove default mapping interfering with new nvim bind 2025-10-21 08:44:42 +02:00
janishutz d5615892e7 [Hyprland] Add launch command for alvr and bsm 2025-10-17 17:30:04 +02:00
janishutz 81d0df6023 [Hyprland] Fix notifications submap 2025-10-17 10:58:39 +02:00
janishutz 9cf14d3b55 [Astal] Format 2025-10-17 10:47:05 +02:00
janishutz 06325b09b8 [Hyprland] Update readmes 2025-10-17 10:44:33 +02:00
janishutz 539ec34b4c [Astal] Finish modes, move tray into quickactions menu 2025-10-17 10:44:33 +02:00
janishutz 00d4f101fc [Hyprland] Remove some quick access binds (unnecessary) 2025-10-17 09:55:15 +02:00
janishutz c9a89cf545 [Setup] Fix platform wrong 2025-10-17 09:54:16 +02:00
janishutz 7ba9a65f19 [Build] Add linter 2025-10-17 09:47:40 +02:00
janishutz 52ced69697 [Hyprland] Fix submaps 2025-10-17 09:47:25 +02:00
janishutz 47bbdd9f85 [Astal] Add mode indicator 2025-10-17 09:47:18 +02:00
janishutz 94a57be9f7 [Astal] Add colours 2025-10-17 07:29:18 +02:00
janishutz 9d779269eb [Hyprland] Notifications binds 2025-10-17 06:52:15 +02:00
janishutz da61dc869d [Astal] Add new mode for hyprland 2025-10-17 06:51:05 +02:00
janishutz e44cc65f1f [Astal] Start adding hyprland module 2025-10-16 22:25:48 +02:00
janishutz 0392f8fc0f [Hyprland] Launch submap autoreset 2025-10-16 22:25:35 +02:00
janishutz 3c76f0412a [Setup] Fix hyprmode apply 2025-10-16 17:05:11 +02:00
janishutz 627c005fe3 [Hyprland] Fix submap 2025-10-16 17:05:03 +02:00
janishutz 6540bda07a [Hyprland] Add new bind layout 2025-10-16 16:18:08 +02:00
janishutz a9c73ba9d9 [Scripts] Improve VPN script 2025-10-16 10:44:27 +02:00
janishutz 30488edaed [Fish] Fix latexdocs alias 2025-10-10 15:05:28 +02:00
janishutz 8ed711d300 [Fish] Improve latex doc opening 2025-10-09 21:08:06 +02:00
janishutz a8043a9899 [Hyprland] Speed up animations even more 2025-10-09 11:02:51 +02:00
janishutz aa9ebaf22b [Astal] Battery widget: Show waiting 2025-10-09 09:33:21 +02:00
janishutz 2314a17066 [Install] Add ntp 2025-10-06 13:11:34 +02:00
janishutz 7051688fa5 [Clang] Formatter: Only merge empty functions 2025-10-05 12:13:56 +02:00
janishutz 0f4f601a2d [Clang] Improve formatter config 2025-10-05 12:09:53 +02:00
janishutz f38e2ff94f [Clang] Improve formatter config 2025-10-05 11:58:55 +02:00
janishutz 50c5cf945d [Clang] Improve formatter config 2025-10-05 08:38:26 +02:00
janishutz 903da245ac [Termfilechooser] Fix 2025-10-04 08:53:07 +02:00
janishutz 2d15296597 [Fish] Force pager into pager mode and not cat 2025-10-02 14:39:15 +02:00
janishutz 3a619cbf92 [Hyprland] Add new keybind on laptop 2025-10-02 14:21:32 +02:00
janishutz 530022ee59 [Hyprlock] Update clock 2025-10-02 08:39:03 +02:00
janishutz 5c01a5f806 [LatexIndent] Fix path 2025-10-01 15:34:14 +02:00
janishutz b6f5ad9bcf [Install] Add man 2025-10-01 13:44:15 +02:00
janishutz 92dc644ee2 [Fish] Add alias for gcc with error flags 2025-10-01 12:42:14 +02:00
janishutz ddc39f4928 [Setup] Fix indentconfig copying 2025-10-01 10:48:30 +02:00
janishutz a93d7494d3 [Install] Add sysstat package 2025-10-01 10:47:13 +02:00
janishutz 706cff40b3 [Setup] Fix errors with startup 2025-09-30 14:03:26 +02:00
janishutz e35845099a [Hyprland] Update for new folder structure 2025-09-30 07:41:44 +02:00
janishutz c44ef61cf2 [Fish] Update for new folder structure 2025-09-30 07:41:14 +02:00
janishutz ef65f827a2 [Yazi] Update keymap for new structure 2025-09-29 11:48:29 +02:00
jh04 6b8f415703 [Eslint] Update rules 2025-09-28 17:08:48 +02:00
janishutz f7004d9f25 [All] Remove old files 2025-09-27 08:07:58 +02:00
jh04 58d5b6cf69 [Setup] Add reload to make sure config reload happens properly 2025-09-26 14:04:47 +02:00
jh04 c55f70b852 [Fish] Add alias for latex docs 2025-09-26 14:03:21 +02:00
janishutz 97e02d81af [Clang] Fix config file 2025-09-25 16:42:26 +02:00
janishutz a545bb0066 [Clang] Fix incorrect config 2025-09-25 16:40:53 +02:00
janishutz 35d51f80df [Clang] Finish up config 2025-09-25 15:57:39 +02:00
janishutz d638aa0434 [Clang] Fix setup script 2025-09-25 15:52:55 +02:00
janishutz 258fc61669 [Clang] Add formatter config 2025-09-25 15:52:16 +02:00
janishutz 6dc15047d4 [Eslint] Add sort-imports rule 2025-09-25 15:20:13 +02:00
janishutz 0725763b95 [Hyprland] Configure gestures 2025-09-25 15:04:47 +02:00
jh04 29b8f188e9 [Yazi] Update keymap 2025-09-25 11:04:07 +02:00
jh04 959732ffd1 [Yazi] Update keymap 2025-09-23 15:19:36 +02:00
janishutz be3497de77 [Indent] Add more rules 2025-09-23 11:14:26 +02:00
janishutz 17d83a53b7 [Hyprland] configure gestures 2025-09-23 11:12:53 +02:00
janishutz 122f3ab070 [Hyprland] Add special workspace config 2025-09-22 16:17:22 +02:00
janishutz 46a732e8f7 [Install] Add dep for latexindent 2025-09-22 13:44:53 +02:00
janishutz 3373ae3b8c [Install] Add dep for latexindent 2025-09-22 13:37:50 +02:00
janishutz edd2db313c [Install] Add dep for latexindent 2025-09-22 13:36:37 +02:00
janishutz ecfd517a4a [Hyprland] Tweak animation duration 2025-09-22 13:01:13 +02:00
janishutz 25419067d4 [Install] Add note on using nwg-look 2025-09-22 12:53:46 +02:00
janishutz 36faff6b5f [Install] Add langgerman to install 2025-09-22 08:44:27 +02:00
janishutz ffe516175c [Eslint] Revert EOL decision 2025-09-20 08:12:20 +02:00
janishutz f58f22cadd [Install] Add german latex extras 2025-09-20 07:17:56 +02:00
janishutz 7e9faff6d6 [Astal] Make brightness adjust only in 5% intervals 2025-09-18 07:52:41 +02:00
janishutz ffa25045e5 [zathura] Add poppler to install 2025-09-17 16:17:43 +02:00
jh04 66dcd82952 [Hyprland] Fix bind 2025-09-16 17:31:28 +02:00
jh04 40013a61d1 [Hyprland] Fix some binds 2025-09-16 17:30:37 +02:00
janishutz ee26c0c5c2 [Hyprland] Fix errors 2025-09-16 13:03:25 +02:00
janishutz 02a351768f [Fish] Add pager alias 2025-09-16 12:59:20 +02:00
janishutz 9539f09e83 [Install] Add pager 2025-09-16 12:59:20 +02:00
jh04 25a78f126e [Astal] Add battery low notification 2025-09-15 14:42:05 +02:00
jh04 e0c339785d [Eslint] Update eol-last 2025-09-15 10:32:59 +02:00
jh04 e6f57831b1 [Eslint] Enforce newline 2025-09-15 10:27:26 +02:00
jh04 4e323d932f [Hyprland] Update binds 2025-09-15 09:20:29 +02:00
janishutz 64d8ca7ab4 [Install] Add eslint_d 2025-09-14 07:29:12 +02:00
jh04 7de17aaeb7 [Yazi] Update keymaps for ETH folders 2025-09-13 17:24:37 +02:00
janishutz 4f0c6a45cf [Install] Add http-server 2025-09-13 08:29:42 +02:00
janishutz a2dbdd78d3 [Setup] Don't do autologin (will make optional) 2025-09-13 08:22:11 +02:00
jh04 e4a76c494c [Greetd] Add auto-unlock of keyring 2025-09-12 17:26:53 +02:00
janishutz 1ee3f01883 [Setup] Add note 2025-09-12 13:12:13 +02:00
janishutz a89ed00a17 [Greetd] Add autologin 2025-09-12 12:26:47 +02:00
janishutz 64e671119d [Hyprland] Add dimming around rofi layer 2025-09-12 11:54:55 +02:00
janishutz 7b7955ac29 [Build] Run config build 2025-09-12 11:52:00 +02:00
jh04 823a8d8fbc [Setup] Make it quicker for small changes 2025-09-12 11:49:34 +02:00
jh04 088562cd53 [System] Remove mkinitcpio config 2025-09-12 11:49:26 +02:00
janishutz e9b8c35b52 [Scripts] Rename 2025-09-12 11:42:53 +02:00
janishutz 5a1811979e [Rofi] Fix positioning 2025-09-12 11:41:21 +02:00
janishutz 274890281c [Install] Add ripgrep 2025-09-12 10:40:46 +02:00
janishutz 0606ec06f5 [Hyprland] Add new rules 2025-09-12 10:40:11 +02:00
jh04 f22f8da68c [Install] Add git-credential-manager 2025-09-12 10:19:00 +02:00
jh04 409078edf9 [Install] Add ruby 2025-09-12 10:15:18 +02:00
jh04 2840c9aa70 [Fish] Add fish_variables 2025-09-12 10:13:22 +02:00
jh04 f4aedf7b5e [Install] Fix packages 2025-09-12 10:10:58 +02:00
jh04 f51cc0049a [Fish] Disable greeting 2025-09-12 10:10:48 +02:00
jh04 c01529a599 [Fish] Remove autojump from config 2025-09-12 09:57:40 +02:00
jh04 121f02c785 [Yazi] Fix keymap overlap 2025-09-12 09:57:33 +02:00
jh04 f6cd98e458 [Install] Add more utilities 2025-09-12 09:57:25 +02:00
jh04 cc9f38c71c [Install] Add more features 2025-09-12 09:29:18 +02:00
jh04 606a1fec1b [Install] Add auto-install of arch4edu and yay 2025-09-12 08:46:19 +02:00
janishutz d3bf33a142 [Install] Add seahorse to install 2025-09-12 06:59:29 +02:00
janishutz 91a6566d68 [Install] Finish up 2025-09-11 20:25:42 +02:00
jh04 ce0d951a54 [Install] Reorganize 2025-09-11 09:22:29 +02:00
jh04 106fe9cd9e Restructure bar restart and fix typos in ethz-vpn 2025-09-09 13:28:31 +02:00
jh04 a199569aac [Eslint] Increase max line length 2025-08-28 15:44:56 +02:00
jh04 80d16ab6ff [Install] Properly install yazi plugins 2025-08-22 14:21:19 +02:00
janishutz 1c8b72867e [Yazi] Add new plugin 2025-08-22 12:00:06 +02:00
jh04 9d59b24995 [Scripts] Add script to update open-webui 2025-08-21 12:14:30 +02:00
jh04 e78d07b25b [Base] Remove unnecessary files 2025-08-20 17:25:48 +02:00
jh04 a2c11e5cd1 [Yazi] Add keybind to open in evince 2025-08-05 11:21:27 +02:00
janishutz 70aceee3ca [Build] Build config 2025-07-31 09:08:07 +02:00
janishutz 8e6340e4c7 [Hyprlock] Update to V0.9 2025-07-31 09:07:19 +02:00
janishutz 46a4d7628d [Yazi] Add keybinds, start configuring openers 2025-07-28 11:10:03 +02:00
janishutz 2ec9356aca [Scripts] Prepare for cleanup 2025-07-22 15:52:52 +02:00
janishutz 3c19159c23 [Install] Use bvi instead of ghex 2025-07-16 15:38:45 +02:00
jh04 f6afd785fd [Setup] Fix yazi plugin updates 2025-06-22 15:21:45 +02:00
jh04 e20a33e132 [Setup] Fix 2025-06-22 14:49:58 +02:00
jh04 4683a171b9 [Astal] Finish up audio fix 2025-06-18 11:59:03 +02:00
jh04 4189258def [Astal] Fix audio issues 2025-06-18 11:40:58 +02:00
janishutz 2e8f1ec9ae [Hypr] Add easy docked switching 2025-06-12 10:08:57 +02:00
janishutz 78c97c5d84 [Hypr] Add docked config 2025-06-12 10:05:16 +02:00
jh04 4540dc00e7 [Eslint] Fix newline 2025-06-11 10:56:47 +02:00
jh04 294d7a9a98 [Eslint] Add max-len config 2025-06-11 09:48:34 +02:00
jh04 77dd4b4ca8 [Eslint] Add function-paren-newline option 2025-06-11 09:43:48 +02:00
jh04 7394ab63bf [Eslint] Change a few options 2025-06-10 17:23:43 +02:00
jh04 7f851fac73 [Eslint] Fix errors with single-line interface defintions 2025-06-07 11:18:58 +02:00
jh04 a5a6d9a916 [Eslint] Fix issues with end of file extra line 2025-06-06 15:36:12 +02:00
jh04 3967a4cd5c [latexfmt] Update align delims 2025-06-06 13:27:45 +02:00
jh04 f684f52d8f [latexfmt] Add indents for code 2025-06-06 13:20:52 +02:00
jh04 1079f62c06 [Eslint] Fix no-extra-parens config 2025-06-06 13:20:39 +02:00
jh04 1f460ccc38 [Eslint] Add support for mjs and cjs, format config 2025-06-06 11:46:57 +02:00
jh04 8b7f15eddf [Eslint] Add padding guides 2025-06-06 11:36:04 +02:00
jh04 0750c45111 [latexfmt] Finish up latexindent config 2025-06-06 10:59:16 +02:00
jh04 0db1815665 [Eslint] Fix spelling error in config 2025-06-06 10:35:04 +02:00
jh04 d028b027c5 [Eslint] Add more style options 2025-06-06 10:34:01 +02:00
jh04 e91f5aa5d6 [Eslint] Fix end of file newline 2025-06-06 10:27:49 +02:00
jh04 6105341234 [Eslint] Finish up config 2025-06-06 09:33:57 +02:00
jh04 6a362a963f [Eslint] Fix config 2025-06-05 19:59:45 +02:00
jh04 9005bd089a [Hyprland] Increase border size 2025-06-05 17:53:49 +02:00
jh04 1921545d08 [Hyprland] Fix keybind for cliphist 2025-06-05 15:40:00 +02:00
jh04 05b463699f [Install] Add cliphist 2025-06-05 15:38:19 +02:00
jh04 6f33358f4a [Hyprland] Add cliphist 2025-06-05 15:37:44 +02:00
jh04 909983d069 [Scripts] Fix indentconfig.yaml 2025-06-05 14:10:04 +02:00
jh04 a259206de8 [Scripts] add indentconfig.yaml 2025-06-05 13:33:52 +02:00
jh04 3f058cbfd3 [Scripts] Add a script to automatically rename files
This script automatically fixes any file name errors to ensure all files
are named correctly. Use with caution, as I have not yet tested it much
2025-06-04 14:26:32 +02:00
janishutz 318fc39b61 [Astal] Fix syntax 2025-05-26 15:05:07 +02:00
janishutz 6b1c8dec58 [Setup] Fix syntax error 2025-05-22 16:47:46 +02:00
janishutz 3541ec68e7 [Hyprland] Update binds (remove unnecessary ones) 2025-05-22 16:47:33 +02:00
janishutz 3a3674670b [Hyprland] Update binds 2025-05-22 16:43:27 +02:00
janishutz b2c6d72a2f [Hypridle] Improve idle manager 2025-05-22 11:46:20 +02:00
janishutz b9c68535d4 [Hypridle] Remove 100s timout 2025-05-22 11:45:28 +02:00
janishutz ae5226202a [Install] Remove TODO 2025-05-22 11:27:07 +02:00
janishutz 580aee4ad5 [Vimiv] Add notes and alias for fish 2025-05-22 10:12:12 +02:00
jh04 a8bf678d45 [Astal] Increase max-width of hyprland active window 2025-05-20 17:04:28 +02:00
janishutz 73feae1142 [Hyprland] Change to dwindle layout 2025-05-20 15:19:18 +02:00
janishutz b26b870bb2 [Hyprland] Resize window keybinds 2025-05-20 14:35:39 +02:00
janishutz 2d3a6ad33f [Astal] Remove debug code 2025-05-20 14:24:25 +02:00
janishutz ef9439b92c [Hyprland] Improve gestures 2025-05-19 14:29:40 +02:00
jh04 c635f3bfa9 [Build] Run build 2025-05-19 10:02:44 +02:00
jh04 7c3eb71150 [Astal] Update memory icon 2025-05-19 09:47:12 +02:00
janishutz 4fef18041f [Notes] Add another todo 2025-05-16 07:39:25 +02:00
janishutz df3384c667 [Notes] Mark completed items, add new todo 2025-05-16 07:37:49 +02:00
janishutz 7a97d7425e [Bar] Ellipsize too large text 2025-05-15 17:07:06 +02:00
jh04 73ca687358 [Fish] Add more aliases 2025-05-13 17:26:44 +02:00
jh04 88441958d9 [Yazi] Add more keybinds 2025-05-13 17:26:36 +02:00
janishutz e59af388b1 [Kitty] Finish improved cursor_trail settings 2025-05-12 14:17:24 +02:00
janishutz 39da9176ad [Build] Run build 2025-05-12 13:49:46 +02:00
janishutz e4ee9c9dc8 [Kitty] Improve cursor trail 2025-05-12 13:48:54 +02:00
jh04 feef8452f4 [Install] Add new programs, restructure 2025-05-09 11:12:02 +02:00
janishutz c3ff5a58d6 [AGS] Improve Battery display 2025-05-08 12:53:53 +02:00
janishutz a005189aef [Setup] Make bars restart, will be writing new notifications stuff soon 2025-05-08 10:55:31 +02:00
janishutz e98f5c2bd7 [Build] Run build 2025-05-08 10:43:00 +02:00
janishutz e7f6be4291 [AGS] QuickView: Use better battery icon 2025-05-08 10:42:55 +02:00
janishutz 4fa7dc3c1a [Eslint] Update arrow-parens to as-needed 2025-05-05 16:15:19 +02:00
janishutz 2ccb49f24b [Eslint] Finish config 2025-05-05 15:50:56 +02:00
jh04 ec04ebee66 [Player] Fix time display 2025-05-05 12:01:07 +02:00
jh04 2b2f1c2b66 [Build] Run build 2025-05-03 16:57:46 +02:00
jh04 21f7e53b2b [Build] Fix changeable colours 2025-05-03 16:57:39 +02:00
janishutz 5f09b7b915 [Install] Add new program 2025-04-29 15:35:19 +02:00
janishutz 688013a6b8 [Hyprland] Add logging for bar & notifier to temp folder 2025-04-29 14:47:56 +02:00
jh04 4e7c3ceee8 [Yazi] Remove plugins from here 2025-04-28 10:16:30 +02:00
jh04 390874374e [Hyprland] Hyprlock: Animations 2025-04-28 10:16:30 +02:00
janishutz 7f7a755e32 [Hyprland] Fix merge error 2025-04-28 08:56:38 +02:00
jh04 ac6b47449a [README] Update 2025-04-27 17:11:41 +02:00
jh04 ce5f530ed2 Merge V2 complete 2025-04-27 17:07:20 +02:00
jh04 62789224a7 Merge 2025-04-27 16:56:43 +02:00
jh04 0b849bad4f Fish change alias bt 2025-04-25 08:55:02 +02:00
jh04 0022880936 Actually create kitty config 2025-04-21 20:26:45 +02:00
janishutz 1d5240b7c6 Add terminal file chooser 2025-04-14 16:51:42 +02:00
janishutz 0b0e83f505 Improve notifications 2025-04-14 15:23:28 +02:00
janishutz f4cfa20dea Add fastfetch config 2025-04-10 11:35:39 +02:00
jh04 d866102fcc Improve copying in Zathura 2025-04-09 19:20:00 +02:00
jh04 921373f049 Update package list 2025-04-09 10:13:54 +02:00
jh04 1c39478650 Remove VSCode forced workspace 2025-04-05 15:19:55 +02:00
jh04 a845e086fd Change switch workspace keybind 2025-04-03 11:06:32 +02:00
jh04 b363438f6a Add zathura launch bind 2025-04-03 08:35:54 +02:00
jh04 7d9da82b6c Add restore plugin, improve ouch for yazi 2025-04-02 11:14:00 +02:00
jh04 c52c5b5a42 Improve Zathura, move to zoxide, add yazi plugins 2025-04-02 11:08:15 +02:00
jh04 97c49f17e6 Add nohlsearch to keybind zathura 2025-04-02 10:40:04 +02:00
jh04 134519558a Remove some zathura binds that come by default 2025-04-02 10:31:09 +02:00
jh04 9e5ae7db83 Update zathura binds 2025-04-01 17:52:33 +02:00
jh04 a31b3481c3 Make zathura open on 2nd workspace 2025-04-01 17:44:07 +02:00
jh04 1c757d1173 Add zathura config 2025-04-01 17:40:25 +02:00
jh04 89b97c4ba1 Add Zathura config 2025-04-01 17:40:10 +02:00
jh04 2ba627a370 Hyprland revert mouse focus change 2025-04-01 15:57:44 +02:00
jh04 995de3617c Hyprland change mouse focus 2025-04-01 13:50:28 +02:00
janishutz a477078f16 Hyprland fix vivado window rules 2025-03-31 15:33:15 +02:00
janishutz f93eeb5d87 Hyprland improve vivado 2025-03-31 15:17:32 +02:00
jh04 5b0e3767bd Add yazi keybinds 2025-03-31 10:50:44 +02:00
janishutz 51962c424b Hyprland fix for V0.48 2025-03-30 08:09:44 +02:00
jh04 a6ce7ccdce Fix path for scripts 2025-03-28 13:50:42 +01:00
janishutz 0f0e0e8671 improve notifications keybinds 2025-03-28 11:45:42 +01:00
janishutz c6061e0f12 Remove quit keybind from hyprland. Can be done through wlogout 2025-03-27 16:23:12 +01:00
jh04 cac0e41a2e Change shortcuts for fish 2025-03-24 09:12:07 +01:00
jh04 c4797dd592 Remove killactive from MainMod + C 2025-03-22 20:41:22 +01:00
jh04 8986ad894e Improve keybindings 2025-03-22 11:31:46 +01:00
jh04 f127ea8a41 Fix binds for new notification handler 2025-03-21 18:25:36 +01:00
jh04 bb75cfabaf Add binds for new notification handler 2025-03-21 18:10:15 +01:00
96 changed files with 4209 additions and 3640 deletions
+42 -1
View File
@@ -1,4 +1,45 @@
# janishutz Hyprland <div id="title" align="center">
<img src="https://static.janishutz.com/logo.jpg" width="300">
<h1>janishutz Hyprland</h1>
</div>
Collection of dotfiles for my personal Hyprland setup, running on Arch Linux.
Includes a setup and install script (that one is not complete yet though).
For my neovim config, see [here](https://git.janishutz.com/janishutz/nvim)
![screenshot of desktop with 2 screens](./assets/screenshot.png)
I am currently working on redoing my keybinds for Hyprland, in what I call `hyprvim`:
They are going to use submaps and will be significantly different, yet still familiar.
This will enable me to have many more keybinds with reasonable starter bindings.
I will also update Astal to have a mode indicator if `hyprvim` is enabled.
## Features
- Astal4 based Status Bar and Quick Actions menu
- System info
- Hyprland info
- Date & Time
- Bluetooth picker
- some networking settings (more coming later)
- Audio and brightness control
- battery monitoring
- Logout, Reboot, Shutdown, etc
- Rofi config for App launcher
- Wlogout config
- Theming script that generates a GTK theme and theming for bar, Hyprland, etc
- Fish config (with some handy aliases, based on one from ohh-my-fish)
- Fastfetch config
- kitty config with cursor trail
- Linter configs (currently only eslint, which is not complete yet)
- mpv config
- zathura configs
- yazi configs with links to various directories I use commonly plus a few plugins and themes that are applied by the script
- Astal3 based Notifications (due to be migrated to Astal4)
## Installing
Clone your repo to any folder and adapt what you need. Some folders are still hard-coded, which I will be changing later on, so you will likely run into issues.
You may then run the `setup` script. That won't install all dependencies though. The `install` script is what serves that purpose, but that is not complete yet
## Setting up to develop ## Setting up to develop
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

+279 -72
View File
@@ -9,7 +9,9 @@ const renderColourAsHex = util.renderColourAsHex;
// │ Theme generator (returns theme as object) │ // │ Theme generator (returns theme as object) │
// ╰───────────────────────────────────────────────╯ // ╰───────────────────────────────────────────────╯
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => { module.exports.generateTheme = (
theme, wallpaper, lockpaper, palette
) => {
return { return {
'wallpaper-path': wallpaper, 'wallpaper-path': wallpaper,
'lockpaper-path': lockpaper, 'lockpaper-path': lockpaper,
@@ -49,14 +51,30 @@ module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => {
'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ), 'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ),
'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ), 'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ),
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 2, gradientMultipliers[ theme ] ) ), palette[ 0 ], 1, gradientMultipliers[ theme ]
'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 3, gradientMultipliers[ theme ] ) ), ) ),
'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 4, gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 5, gradientMultipliers[ theme ] ) ), palette[ 0 ], 2, gradientMultipliers[ theme ]
'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), ) ),
'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), 'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour(
'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour( palette[ 0 ], 1, 1 / gradientMultipliers[ theme ] ) ), palette[ 0 ], 3, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 4, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 5, gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour(
palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
) ),
// ── Secondary accent ───────────────────────────────────────────── // ── Secondary accent ─────────────────────────────────────────────
'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ), 'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ),
@@ -154,9 +172,9 @@ module.exports.generateTheme = ( theme, wallpaper, lockpaper, palette ) => {
// ┌ ┐ // ┌ ┐
// │ Path to this repo on disk │ // │ Path to this repo on disk │
// └ ┘ // └ ┘
'path-to-dotfiles': __dirname.slice(0, __dirname.length - 5), 'path-to-dotfiles': __dirname.slice( 0, __dirname.length - 5 ),
} };
} };
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
@@ -171,74 +189,265 @@ const gradientMultipliers = {
'light': 1.1, 'light': 1.1,
'bright': 1.15, 'bright': 1.15,
'test': 0.75 'test': 0.75
} };
const colours = { const colours = {
foreground: { 'foreground': {
'nordic': [ 200, 220, 255 ], 'nordic': [
'deep-dark': [ 230, 230, 230 ], 200,
'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator 220,
'light': [ 40, 40, 40 ], 255
'bright': [ 0, 0, 0 ], ],
'test': [ 0, 0, 0 ], 'deep-dark': [
230,
230,
230
],
'material': [
255,
255,
255
], // TODO: Will be calculated by material theme generator
'light': [
40,
40,
40
],
'bright': [
0,
0,
0
],
'test': [
0,
0,
0
],
}, },
'foreground-accent': { 'foreground-accent': {
'nordic': [ 255, 255, 255 ], 'nordic': [
'deep-dark': [ 255, 255, 255 ], 255,
'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator 255,
'light': [ 0, 0, 0 ], 255
'bright': [ 50, 50, 50 ], ],
'test': [ 0, 0, 0 ], 'deep-dark': [
255,
255,
255
],
'material': [
200,
200,
200
], // TODO: Will be calculated by material theme generator
'light': [
0,
0,
0
],
'bright': [
50,
50,
50
],
'test': [
0,
0,
0
],
}, },
background: { 'background': {
'nordic': [ 10, 10, 15 ], 'nordic': [
'deep-dark': [ 20, 20, 20 ], 10,
'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator 10,
'light': [ 230, 230, 230 ], 15
'bright': [ 255, 255, 255 ], ],
'test': [ 255, 255, 255 ], 'deep-dark': [
20,
20,
20
],
'material': [
30,
30,
30
], // TODO: Will be calculated by material theme generator
'light': [
230,
230,
230
],
'bright': [
255,
255,
255
],
'test': [
255,
255,
255
],
}, },
'background-alternative': { 'background-alternative': {
'nordic': [ 20, 20, 25 ], 'nordic': [
'deep-dark': [ 30, 30, 30 ], 20,
'material': [ 40, 40, 40 ], // TODO: Will be calculated by material theme generator 20,
'light': [ 210, 210, 210 ], 25
'bright': [ 230, 230, 230 ], ],
'test': [ 255, 255, 0 ] // brown 'deep-dark': [
30,
30,
30
],
'material': [
40,
40,
40
], // TODO: Will be calculated by material theme generator
'light': [
210,
210,
210
],
'bright': [
230,
230,
230
],
'test': [
255,
255,
0
] // brown
}, },
'background-tertiary': { 'background-tertiary': {
'nordic': [ 0, 0, 0 ], 'nordic': [
'deep-dark': [ 45, 45, 45 ], 0,
'material': [ 0, 0, 0 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 180, 180, 180 ], 0
'bright': [ 200, 200, 200 ], ],
'test': [ 255, 0, 255 ] // purple 'deep-dark': [
45,
45,
45
],
'material': [
0,
0,
0
], // TODO: Will be calculated by material theme generator
'light': [
180,
180,
180
],
'bright': [
200,
200,
200
],
'test': [
255,
0,
255
] // purple
}, },
shadow: { 'shadow': {
'nordic': [ 0, 0, 2 ], 'nordic': [
'deep-dark': [ 40, 40, 40 ], 0,
'material': [ 30, 30, 30 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 190, 190, 190 ], 2
'bright': [ 150, 150, 150 ], ],
'test': [ 120, 0, 0 ] // dark red 'deep-dark': [
40,
40,
40
],
'material': [
30,
30,
30
], // TODO: Will be calculated by material theme generator
'light': [
190,
190,
190
],
'bright': [
150,
150,
150
],
'test': [
120,
0,
0
] // dark red
}, },
inactive: { 'inactive': {
'nordic': [ 200, 200, 200 ], 'nordic': [
'deep-dark': [ 200, 200, 200 ], 200,
'material': [ 200, 200, 200 ], // TODO: Will be calculated by material theme generator 200,
'light': [ 65, 65, 65 ], 200
'bright': [ 60, 60, 60 ], ],
'test': [ 150, 150, 150 ] 'deep-dark': [
200,
200,
200
],
'material': [
200,
200,
200
], // TODO: Will be calculated by material theme generator
'light': [
65,
65,
65
],
'bright': [
60,
60,
60
],
'test': [
150,
150,
150
]
}, },
'inactive-background': { 'inactive-background': {
'nordic': [ 0, 0, 0 ], 'nordic': [
'deep-dark': [ 0, 0, 0 ], 0,
'material': [ 255, 255, 255 ], // TODO: Will be calculated by material theme generator 0,
'light': [ 80, 80, 80 ], 0
'bright': [ 60, 60, 60 ], ],
'test': [ 60, 60, 60 ] 'deep-dark': [
0,
0,
0
],
'material': [
255,
255,
255
], // TODO: Will be calculated by material theme generator
'light': [
80,
80,
80
],
'bright': [
60,
60,
60
],
'test': [
60,
60,
60
]
} }
} };
const fonts = { const fonts = {
'primary': { 'primary': {
'nordic': 'Comfortaa', 'nordic': 'Comfortaa',
@@ -261,20 +470,18 @@ const fonts = {
'light': 'Jetbrains Mono', 'light': 'Jetbrains Mono',
'bright': 'Jetbrains Mono', 'bright': 'Jetbrains Mono',
} }
} };
const iconTheme = { const iconTheme = {
'nordic': 'Candy', 'nordic': 'Candy',
'deep-dark': 'Candy', 'deep-dark': 'Candy',
'material': 'Candy', 'material': 'Candy',
'light': 'Candy', 'light': 'Candy',
'bright': 'Candy' 'bright': 'Candy'
} };
const yaziThemes = { const yaziThemes = {
'nordic': 'tokyo-night', 'nordic': 'tokyo-night',
'deep-dark': 'vscode-dark-modern', 'deep-dark': 'vscode-dark-modern',
'material': 'dracula', 'material': 'dracula',
'light': 'vscode-light-modern', 'light': 'vscode-light-modern',
'bright': 'vscode-light-modern', 'bright': 'vscode-light-modern',
} };
+2 -2
View File
@@ -10,7 +10,7 @@ const inquirer = require( 'inquirer' ).default;
const build = ( wallpaper, lockpaper, theme ) => { const build = ( wallpaper, lockpaper, theme ) => {
console.log( '\n=> Extracting colours' ); console.log( '\n=> Extracting colours' );
// Extract colour palette from chosen wallpaper using Color-Thief // Extract colour palette from chosen wallpaper using Color-Thief
colorThief.getPalette( wallpaper ).then( palette => { colorThief.getPalette( wallpaper, 20 ).then( palette => {
palette = util.removeUselessColours( palette ); palette = util.removeUselessColours( palette );
// Define view options (for rendering with mustache) // Define view options (for rendering with mustache)
if ( theme === 'test' ) { if ( theme === 'test' ) {
@@ -30,7 +30,7 @@ const build = ( wallpaper, lockpaper, theme ) => {
name: 'confirm-proceed-build', name: 'confirm-proceed-build',
message: 'Okay to proceed with these colours?' message: 'Okay to proceed with these colours?'
} ] ).then( answer => { } ] ).then( answer => {
if ( answer ) proceedWithBuild( wallpaper, lockpaper, theme, palette ); if ( answer['confirm-proceed-build'] ) proceedWithBuild( wallpaper, lockpaper, theme, palette );
else { else {
// Have the user pick any other of the extracted colours instead // Have the user pick any other of the extracted colours instead
let counter = -1; let counter = -1;
+86 -38
View File
@@ -1,5 +1,7 @@
const convert = require( 'color-convert' ); const convert = require( 'color-convert' );
const fs = require( 'fs' ); const fs = require( 'fs' );
const path = require( 'path' ); const path = require( 'path' );
/** /**
@@ -8,15 +10,21 @@ const path = require( 'path' );
* @param {string} extension The file extension to look for * @param {string} extension The file extension to look for
* @returns {string[]} returns a list of html files with their full path * @returns {string[]} returns a list of html files with their full path
*/ */
const treeWalker = ( dir, extension, ignoreList ) => { const treeWalker = (
dir, extension, ignoreList
) => {
const ls = fs.readdirSync( dir ); const ls = fs.readdirSync( dir );
const fileList = []; const fileList = [];
for ( let file in ls ) { for ( let file in ls ) {
if ( fs.statSync( path.join( dir, ls[ file ] ) ).isDirectory() ) { if ( fs.statSync( path.join( dir, ls[ file ] ) ).isDirectory() ) {
// Filter ignored directories // Filter ignored directories
if ( ignoreList === undefined || !ignoreList.includes( ls[ file ] ) ) { if ( ignoreList === undefined || !ignoreList.includes( ls[ file ] ) ) {
const newFiles = treeWalker( path.join( dir, ls[ file ] ), extension, ignoreList ); const newFiles = treeWalker(
for (let file = 0; file < newFiles.length; file++) { path.join( dir, ls[ file ] ), extension, ignoreList
);
for ( let file = 0; file < newFiles.length; file++ ) {
fileList.push( newFiles[ file ] ); fileList.push( newFiles[ file ] );
} }
} }
@@ -28,50 +36,69 @@ const treeWalker = ( dir, extension, ignoreList ) => {
} }
return fileList; return fileList;
} };
const renderColourAsHex = ( colour ) => { const renderColourAsHex = colour => {
return '#' + convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] ); return '#' + convert.default.rgb.hex(
} colour[ 0 ], colour[ 1 ], colour[ 2 ]
);
};
const renderColourAsRGB = ( colour ) => { const renderColourAsRGB = colour => {
return `rgb(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] })` return `rgb(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] })`;
} };
const renderColourAsRGBA = ( colour, ambiance ) => { const renderColourAsRGBA = ( colour, ambiance ) => {
return `rgba(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] }, ${ ambiance })` return `rgba(${ colour[ 0 ] }, ${ colour[ 1 ] }, ${ colour[ 2 ] }, ${ ambiance })`;
} };
const renderColourAsRGBHex = ( colour ) => { const renderColourAsRGBHex = colour => {
const hexCol = convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] ); const hexCol = convert.default.rgb.hex(
return `rgb(${hexCol})`.toLowerCase(); colour[ 0 ], colour[ 1 ], colour[ 2 ]
} );
function decimalToHex(decimal) { return `rgb(${ hexCol })`.toLowerCase();
const hexValue = Math.round(decimal * 255); };
return hexValue.toString(16).padStart(2, '0');
function decimalToHex ( decimal ) {
const hexValue = Math.round( decimal * 255 );
return hexValue.toString( 16 ).padStart( 2, '0' );
} }
const renderColourAsRGBAHex = ( colour, ambiance ) => { const renderColourAsRGBAHex = ( colour, ambiance ) => {
const hexCol = convert.default.rgb.hex( colour[ 0 ], colour[ 1 ], colour[ 2 ] ); const hexCol = convert.default.rgb.hex(
return `rgba(${hexCol}${decimalToHex(ambiance)})`.toLowerCase(); colour[ 0 ], colour[ 1 ], colour[ 2 ]
} );
const removeUselessColours = ( palette ) => { return `rgba(${ hexCol }${ decimalToHex( ambiance ) })`.toLowerCase();
};
const removeUselessColours = palette => {
const p = []; const p = [];
for ( let i = 0; i < palette.length; i++ ) { for ( let i = 0; i < palette.length; i++ ) {
const el = palette[ i ];
const luminance = calculateLuminance( palette[ i ] ); const luminance = calculateLuminance( palette[ i ] );
if ( luminance < 215 && luminance > 40 ) {
if ( luminance < 210 && luminance > 40 ) {
p.push( palette[ i ] ); p.push( palette[ i ] );
} }
for ( let j = 0; j < el.length; j++ ) {
if ( el[j] > 70 ) {
p.push( palette[ i ] );
break;
}
}
} }
return p; return p;
} };
const calculateLuminance = ( colour ) => { const calculateLuminance = colour => {
return colour[ 0 ] + colour[ 1 ] + colour[ 2 ] / 3; return colour[ 0 ] + colour[ 1 ] + colour[ 2 ] / 3;
} };
/* /*
@@ -129,33 +156,54 @@ const replacements = {
'rgba(158, 158, 158, 0.2)': '@fg_rgba_02', 'rgba(158, 158, 158, 0.2)': '@fg_rgba_02',
'rgba(158, 158, 158, 0.1168)': '@fg_rgba_01' 'rgba(158, 158, 158, 0.1168)': '@fg_rgba_01'
}; };
const themePreProcessor = ( file, replacement, out ) => {
const themePreProcessor = (
file, replacement, out
) => {
const colours = Object.keys( replacements ); const colours = Object.keys( replacements );
let data = '' + fs.readFileSync( file ); let data = '' + fs.readFileSync( file );
for (let index = 0; index < colours.length; index++) {
for ( let index = 0; index < colours.length; index++ ) {
const colour = colours[index]; const colour = colours[index];
data = data.replaceAll(colour, replacements[ colour ]);
data = data.replaceAll( colour, replacements[ colour ] );
} }
const outPath = file.replace( replacement, out ); const outPath = file.replace( replacement, out );
try { try {
fs.mkdirSync( path.dirname( outPath ), { fs.mkdirSync( path.dirname( outPath ), {
recursive: true, 'recursive': true,
} ); } );
} catch ( e ) { } catch ( e ) {
console.error( e ); console.error( e );
} }
fs.writeFileSync( outPath, data ); fs.writeFileSync( outPath, data );
} };
const getGradientColour = ( colour, index, multiplier ) => { const getGradientColour = (
colour, index, multiplier
) => {
if ( index === 0 ) { if ( index === 0 ) {
return [ colour[ 0 ] * multiplier, colour[ 1 ] * multiplier, colour[ 2 ] * multiplier ]; return [
colour[ 0 ] * multiplier,
colour[ 1 ] * multiplier,
colour[ 2 ] * multiplier
];
} }
const gradient = getGradientColour( colour, index - 1, multiplier );
return [ Math.min( 255, gradient[ 0 ] * multiplier ), Math.min( 255, gradient[ 1 ] * multiplier ), Math.min( 255, gradient[ 2 ] * multiplier ) ]; const gradient = getGradientColour(
} colour, index - 1, multiplier
);
return [
Math.min( 255, gradient[ 0 ] * multiplier ),
Math.min( 255, gradient[ 1 ] * multiplier ),
Math.min( 255, gradient[ 2 ] * multiplier )
];
};
module.exports = { module.exports = {
treeWalker, treeWalker,
@@ -167,4 +215,4 @@ module.exports = {
themePreProcessor, themePreProcessor,
getGradientColour, getGradientColour,
removeUselessColours removeUselessColours
} };
+11 -2
View File
@@ -1,11 +1,14 @@
const fs = require( 'fs' ); const fs = require( 'fs' );
const path = require( 'path' ); const path = require( 'path' );
const data = '' + fs.readFileSync( '/usr/share/themes/Material-Black-Blueberry/gtk-4.0/gtk.css' ); const data = '' + fs.readFileSync( '/usr/share/themes/Material-Black-Blueberry/gtk-4.0/gtk.css' );
let lineNumber = 1; let lineNumber = 1;
const indexer = {}; const indexer = {};
for (let i = 0; i < data.length; i++) {
for ( let i = 0; i < data.length; i++ ) {
const char = data[i]; const char = data[i];
if ( char === '\n' ) { if ( char === '\n' ) {
@@ -13,17 +16,22 @@ for (let i = 0; i < data.length; i++) {
} else if ( char === '#' ) { } else if ( char === '#' ) {
const extract = data.substring( i ); const extract = data.substring( i );
const col = extract.slice( 0, extract.indexOf( '\n' ) ); const col = extract.slice( 0, extract.indexOf( '\n' ) );
if ( !indexer[ col ] ) { if ( !indexer[ col ] ) {
indexer[ col ] = []; indexer[ col ] = [];
} }
indexer[ col ].push( lineNumber ); indexer[ col ].push( lineNumber );
} else if ( char === 'r' ) { } else if ( char === 'r' ) {
const extract = data.substring( i ); const extract = data.substring( i );
if ( extract.slice( 0, 3 ) === 'rgb' ) { if ( extract.slice( 0, 3 ) === 'rgb' ) {
const col = extract.slice( 0, extract.indexOf( '\n' ) ); const col = extract.slice( 0, extract.indexOf( '\n' ) );
if ( !indexer[ col ] ) { if ( !indexer[ col ] ) {
indexer[ col ] = []; indexer[ col ] = [];
} }
indexer[ col ].push( lineNumber ); indexer[ col ].push( lineNumber );
} }
} }
@@ -32,7 +40,8 @@ for (let i = 0; i < data.length; i++) {
// Output // Output
const keys = Object.keys( indexer ); const keys = Object.keys( indexer );
for (let i = 0; i < keys.length; i++) {
for ( let i = 0; i < keys.length; i++ ) {
const element = keys[i]; const element = keys[i];
if ( element.length <= 25 ) { if ( element.length <= 25 ) {
-5
View File
@@ -1,5 +0,0 @@
{
"gen": {
"overrides": {}
}
}
+31 -15
View File
@@ -1,26 +1,31 @@
import { App } from "astal/gtk4" import {
import style from "./style.scss" App
import Bar from "./components/bar/Bar"; } from 'astal/gtk4';
import AstalHyprland from "gi://AstalHyprland?version=0.1"; import AstalHyprland from 'gi://AstalHyprland?version=0.1';
import { hyprToGdk } from "./util/hyprland"; import Bar from './components/bar/Bar';
import Brightness from "./util/brightness"; import Brightness from './util/brightness';
import {
hyprToGdk
} from './util/hyprland';
import style from './style.scss';
App.start({ App.start( {
instanceName: "runner", 'instanceName': 'runner',
css: style, 'css': style,
main() { main () {
const hypr = AstalHyprland.get_default(); const hypr = AstalHyprland.get_default();
const bars = new Map<number, string>(); const bars = new Map<number, string>();
const barCreator = ( monitor: AstalHyprland.Monitor ) => { const barCreator = ( monitor: AstalHyprland.Monitor ) => {
const gdkMonitor = hyprToGdk( monitor ); const gdkMonitor = hyprToGdk( monitor );
if ( gdkMonitor ) { if ( gdkMonitor ) {
print( 'Bar added for screen ' + monitor.get_id() ); print( 'Bar added for screen ' + monitor.get_id() );
bars.set( monitor.get_id(), Bar.BarLauncher( gdkMonitor ) ); bars.set( monitor.get_id(), Bar.BarLauncher( gdkMonitor ) );
} }
} };
for (const monitor of hypr.monitors) { for ( const monitor of hypr.monitors ) {
barCreator( monitor ); barCreator( monitor );
} }
@@ -30,14 +35,17 @@ App.start({
hypr.connect( 'monitor-removed', ( _, monitor ) => { hypr.connect( 'monitor-removed', ( _, monitor ) => {
const windowName = bars.get( monitor ); const windowName = bars.get( monitor );
if ( windowName ) { if ( windowName ) {
const win = App.get_window( windowName ); const win = App.get_window( windowName );
if ( win ) { if ( win ) {
App.toggle_window( windowName ); App.toggle_window( windowName );
win.set_child( null ); win.set_child( null );
App.remove_window( win ); App.remove_window( win );
print( 'Bar removed for screen', monitor ); print( 'Bar removed for screen', monitor );
} }
bars.delete( monitor ); bars.delete( monitor );
} }
} ); } );
@@ -49,7 +57,7 @@ App.start({
// } // }
// Launcher(); // Launcher();
}, },
requestHandler(request, res) { requestHandler ( request, res ) {
const args = request.trimStart().split( ' ' ); const args = request.trimStart().split( ' ' );
if ( args[ 0 ] === 'notifier' ) { if ( args[ 0 ] === 'notifier' ) {
@@ -60,6 +68,7 @@ App.start({
} else if ( args[ 0 ] === 'brightness' ) { } else if ( args[ 0 ] === 'brightness' ) {
try { try {
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
if ( brightness.screenAvailable ) { if ( brightness.screenAvailable ) {
if ( args[ 1 ] === 'increase' ) { if ( args[ 1 ] === 'increase' ) {
brightness.screen += args.length > 1 ? parseInt( args[ 2 ] ) / 100 : 1; brightness.screen += args.length > 1 ? parseInt( args[ 2 ] ) / 100 : 1;
@@ -70,19 +79,27 @@ App.start({
brightness.screen = parseInt( args[ 2 ] ) / 100; brightness.screen = parseInt( args[ 2 ] ) / 100;
} else { } else {
res( 'Argument <brightness> unspecified' ); res( 'Argument <brightness> unspecified' );
return; return;
} }
} else { } else {
res( 'Unknown command ' + args[ 1 ] ); res( 'Unknown command ' + args[ 1 ] );
return; return;
} }
res( 'Ok' ); res( 'Ok' );
} else { } else {
res( 'No controllable screen available' ); res( 'No controllable screen available' );
} }
} catch ( e ) { } catch ( e ) {
print( e );
res( 'Error running brightness change' ); res( 'Error running brightness change' );
} }
} else if ( args[ 0 ] === 'reload-style' ) {
res( 'Reloading style sheets' );
App.apply_css( '', true );
// TODO: Compile scss and then load it
} }
// } else if ( args[ 0 ] === 'launcher' ) { // } else if ( args[ 0 ] === 'launcher' ) {
// if ( args[ 1 ] === 'show' ) { // if ( args[ 1 ] === 'show' ) {
@@ -99,5 +116,4 @@ App.start({
// } // }
// } // }
}, },
}) } );
@@ -1,44 +1,58 @@
import { Gtk } from "astal/gtk4"; import Audio from './modules/Audio/Audio';
import Power from "./modules/Power"; import {
import Audio from "./modules/Audio/Audio"; BatteryBox
import Bluetooth from "./modules/Bluetooth/Bluetooth"; } from './modules/Battery';
import Brightness from "./modules/Brightness/Brightness"; import Bluetooth from './modules/Bluetooth/Bluetooth';
import Player from "./modules/Player/Player"; import Brightness from './modules/Brightness/Brightness';
import { BatteryBox } from "./modules/Battery"; import {
import { exec } from "astal"; Gtk
import Network from "./modules/Networking/Network"; } from 'astal/gtk4';
import Network from './modules/Networking/Network';
import Player from './modules/Player/Player';
import Power from './modules/Power';
import SysTray from './modules/SysTray';
import {
exec
} from 'astal';
const QuickActions = () => { const QuickActions = () => {
const popover = new Gtk.Popover({ cssClasses: ["quick-actions-wrapper"] }); const popover = new Gtk.Popover( {
popover.set_child(renderQuickActions()); 'cssClasses': [ 'quick-actions-wrapper' ]
} );
popover.set_child( renderQuickActions() );
return popover; return popover;
}; };
const renderQuickActions = () => { const renderQuickActions = () => {
const user = exec("/bin/sh -c whoami"); const user = exec( '/bin/sh -c whoami' );
const profile = exec("/bin/fish -c get-profile-picture"); const profile = exec( '/bin/fish -c get-profile-picture' );
const cwd = exec("pwd"); const cwd = exec( 'pwd' );
const um = Power.UserMenu(); const um = Power.UserMenu();
return ( return (
<box visible cssClasses={["quick-actions", "popover-box"]} vertical> <box visible cssClasses={[
'quick-actions',
'popover-box'
]} vertical>
<centerbox <centerbox
startWidget={ startWidget={
<button <button
onClicked={() => um.popup()} onClicked={() => um.popup()}
cssClasses={["stealthy-button"]} cssClasses={[ 'stealthy-button' ]}
child={ child={
<box> <box>
{um} {um}
<Gtk.Frame <Gtk.Frame
cssClasses={["avatar-icon"]} cssClasses={[ 'avatar-icon' ]}
child={ child={
<image <image
file={ file={
profile !== "" profile !== ''
? profile ? profile
: cwd + : cwd
"/no-avatar-icon.jpg" + '/no-avatar-icon.jpg'
} }
></image> ></image>
} }
@@ -53,6 +67,7 @@ const renderQuickActions = () => {
hexpand={false} hexpand={false}
> >
<BatteryBox></BatteryBox> <BatteryBox></BatteryBox>
<SysTray.SystemTray></SysTray.SystemTray>
<Power.Power></Power.Power> <Power.Power></Power.Power>
</box> </box>
} }
@@ -1,4 +1,4 @@
import { bind, Binding } from "astal"; import { bind } from "astal";
import { Gtk } from "astal/gtk4"; import { Gtk } from "astal/gtk4";
import AstalWp from "gi://AstalWp"; import AstalWp from "gi://AstalWp";
@@ -13,8 +13,8 @@ const AudioModule = () => {
wp.defaultMicrophone.set_volume(volume / 100); wp.defaultMicrophone.set_volume(volume / 100);
}; };
const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SPEAKER); const speakerSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SINK);
const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_MICROPHONE); const micSelector = SinkSelectPopover(AstalWp.MediaClass.AUDIO_SOURCE);
return ( return (
<box cssClasses={["audio-box"]} vertical> <box cssClasses={["audio-box"]} vertical>
@@ -107,12 +107,18 @@ const AudioModule = () => {
}; };
const SinkPicker = (type: AstalWp.MediaClass) => { const SinkPicker = (type: AstalWp.MediaClass) => {
const devices = bind(wp, "endpoints"); const devices = bind(wp, "nodes");
wp.connect("ready", () => {
const dev = wp.get_nodes()!
for (let i = 0; i < dev.length; i++) {
const d = dev[i];
}
})
return ( return (
<box vertical> <box vertical>
<label <label
label={`Available Audio ${type === AstalWp.MediaClass.AUDIO_SPEAKER ? "Output" : type === AstalWp.MediaClass.AUDIO_MICROPHONE ? "Input" : ""} Devices`} label={`Available Audio ${type === AstalWp.MediaClass.AUDIO_SINK ? "Output" : type === AstalWp.MediaClass.AUDIO_SOURCE ? "Input" : ""} Devices`}
cssClasses={[ 'title-2' ]} cssClasses={[ 'title-2' ]}
></label> ></label>
<Gtk.Separator marginBottom={5} marginTop={3}></Gtk.Separator> <Gtk.Separator marginBottom={5} marginTop={3}></Gtk.Separator>
@@ -128,11 +134,11 @@ const SinkPicker = (type: AstalWp.MediaClass) => {
if ( if (
id === id ===
(type === (type ===
AstalWp.MediaClass.AUDIO_SPEAKER AstalWp.MediaClass.AUDIO_SINK
? wp.defaultSpeaker.id ? wp.defaultSpeaker.id
: type === : type ===
AstalWp.MediaClass AstalWp.MediaClass
.AUDIO_MICROPHONE .AUDIO_SOURCE
? wp.defaultMicrophone.id ? wp.defaultMicrophone.id
: "") : "")
) { ) {
@@ -0,0 +1,51 @@
{devices.as(d => {
return d.map(device => {
if (device.get_media_class() !== type) {
return <box cssClasses={[ 'empty' ]}></box>;
}
return (
<button
cssClasses={bind(device, "id").as(id => {
if (
id ===
(type ===
AstalWp.MediaClass.AUDIO_SPEAKER
? wp.defaultSpeaker.id
: type ===
AstalWp.MediaClass
.AUDIO_MICROPHONE
? wp.defaultMicrophone.id
: "")
) {
return [
"sink-option",
"currently-selected-sink-option",
];
} else {
return ["sink-option"];
}
})}
child={
<box halign={Gtk.Align.START}>
<image
iconName={bind(device, "icon").as(
icon => icon,
)}
marginEnd={3}
></image>
<label
label={bind(
device,
"description",
).as(t => t ?? "")}
></label>
</box>
}
onClicked={() => {
device.set_is_default(true);
}}
></button>
);
});
})}
@@ -29,21 +29,23 @@ export const BatteryBox = () => {
cssClasses={["battery-time"]} cssClasses={["battery-time"]}
visible={bind(battery, "charging").as(c => !c)} visible={bind(battery, "charging").as(c => !c)}
label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)} label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to empty. Power usage: ${batteryEnergy(er)}`)}
/> />
<label <label
cssClasses={["battery-time"]} cssClasses={["battery-time"]}
visible={bind(battery, "charging")} visible={bind(battery, "charging")}
label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)} label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)}
tooltipText={bind(battery, 'energyRate').as(er => `Time to full. Charge rate: ${batteryEnergy(er)}`)}
/> />
</box> </box>
); );
}; };
const MINUTE = 60;
const HOUR = MINUTE * 60;
const toTime = (time: number) => { const toTime = (time: number) => {
const MINUTE = 60; if (!time) return "Waiting on BIOS"
const HOUR = MINUTE * 60; if (time > 24 * HOUR) return "24h+";
if (time > 24 * HOUR) return "";
const hours = Math.round(time / HOUR); const hours = Math.round(time / HOUR);
const minutes = Math.round((time - hours * HOUR) / MINUTE); const minutes = Math.round((time - hours * HOUR) / MINUTE);
@@ -4,10 +4,10 @@ import Brightness from "../../../../util/brightness";
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
const BrightnessModule = () => { const BrightnessModule = () => {
print( brightness.screen * 100 );
const setBrightness = (value: number) => { const setBrightness = (value: number) => {
brightness.screen = value; brightness.screen = value;
} }
return ( return (
<box visible={bind(brightness, 'screenAvailable')}> <box visible={bind(brightness, 'screenAvailable')}>
<image iconName={"brightness-high-symbolic"}></image> <image iconName={"brightness-high-symbolic"}></image>
@@ -17,7 +17,7 @@ const BrightnessModule = () => {
hexpand hexpand
max={1} max={1}
min={0.01} min={0.01}
step={0.01} step={0.05}
vexpand vexpand
onChangeValue={self => setBrightness(self.value)} onChangeValue={self => setBrightness(self.value)}
></slider> ></slider>
@@ -135,8 +135,9 @@ const PlayerItem = ({ player }: { player: AstalMpris.Player }) => {
}; };
const secondsToFriendlyTime = (time: number) => { const secondsToFriendlyTime = (time: number) => {
const minutes = Math.floor(time / 60); const m = Math.floor(time / 60);
const hours = Math.floor(minutes / 60); const minutes = Math.floor(m % 60);
const hours = Math.floor(m / 60 % 24);
const seconds = Math.floor(time % 60); const seconds = Math.floor(time % 60);
if (hours > 0) { if (hours > 0) {
return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`; return `${hours}:${expandTime(minutes)}:${expandTime(seconds)}`;
@@ -1,48 +1,56 @@
import { exec } from "astal"; import {
import { Gtk } from "astal/gtk4"; exec
} from 'astal';
import {
Gtk
} from 'astal/gtk4';
const PowerMenu = (): Gtk.Popover => { const PowerMenu = (): Gtk.Popover => {
const popover = new Gtk.Popover({ cssClasses: ["PowerMenu"] }); const popover = new Gtk.Popover( {
'cssClasses': [ 'PowerMenu' ]
} );
const powerMenuBox = () => { const powerMenuBox = () => {
return ( return (
<box> <box>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={ child={
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
} }
onClicked={() => exec("/bin/sh -c 'shutdown now'")} onClicked={() => exec( '/bin/sh -c \'shutdown now\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-reboot-symbolic"}></image>} child={<image iconName={'system-reboot-symbolic'}></image>}
onClicked={() => exec("/bin/sh -c 'reboot'")} onClicked={() => exec( '/bin/sh -c \'reboot\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-suspend-symbolic"}></image>} child={<image iconName={'system-suspend-symbolic'}></image>}
onClicked={() => exec("/bin/sh -c 'systemctl suspend'")} onClicked={() => exec( '/bin/sh -c \'systemctl suspend\'' )}
></button> ></button>
</box> </box>
); );
}; };
popover.set_child(powerMenuBox()); popover.set_child( powerMenuBox() );
return popover; return popover;
}; };
const Power = () => { const Power = () => {
const pm = PowerMenu(); const pm = PowerMenu();
return ( return (
<button <button
widthRequest={0} widthRequest={0}
hexpand={false} hexpand={false}
vexpand={false} vexpand={false}
cssClasses={["power-menu-button"]} cssClasses={[ 'power-menu-button' ]}
child={ child={
<box> <box>
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
{pm} {pm}
</box> </box>
} }
@@ -58,24 +66,24 @@ const UserMenu = (): Gtk.Popover => {
return ( return (
<box> <box>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={ child={
<image iconName={"system-lock-screen-symbolic"}></image> <image iconName={'system-lock-screen-symbolic'}></image>
} }
onClicked={() => exec("/bin/sh -c 'hyprlock'")} onClicked={() => exec( '/bin/sh -c \'hyprlock\'' )}
></button> ></button>
<button <button
cssClasses={["power-button"]} cssClasses={[ 'power-button' ]}
child={<image iconName={"system-log-out-symbolic"}></image>} child={<image iconName={'system-log-out-symbolic'}></image>}
onClicked={() => onClicked={() => exec( '/bin/sh -c \'hyprctl dispatch exit 0\'' )
exec("/bin/sh -c 'hyprctl dispatch exit 0'")
} }
></button> ></button>
</box> </box>
); );
}; };
popover.set_child(powerMenuBox()); popover.set_child( powerMenuBox() );
return popover; return popover;
}; };
@@ -0,0 +1,88 @@
import AstalTray from 'gi://AstalTray';
import {
GObject
} from 'astal';
import {
Gtk
} from 'astal/gtk4';
const SYNC = GObject.BindingFlags.SYNC_CREATE;
const SysTray = () => {
const trayBox = new Gtk.Box( {
'cssClasses': [ '' ]
} );
const tray = AstalTray.get_default();
const trayItems = new Map<string, Gtk.MenuButton>();
const trayAddedHandler = tray.connect( 'item-added', ( _, id ) => {
const item = tray.get_item( id );
const popover = Gtk.PopoverMenu.new_from_model( item.menu_model );
const icon = new Gtk.Image();
const button = new Gtk.MenuButton( {
popover,
'child': icon,
'cssClasses': [ 'tray-item' ],
} );
item.bind_property(
'gicon', icon, 'gicon', SYNC
);
popover.insert_action_group( 'dbusmenu', item.action_group );
item.connect( 'notify::action-group', () => {
popover.insert_action_group( 'dbusmenu', item.action_group );
} );
trayItems.set( id, button );
trayBox.append( button );
} );
const trayRemovedHandler = tray.connect( 'item-removed', ( _, id ) => {
const button = trayItems.get( id );
if ( button ) {
trayBox.remove( button );
button.run_dispose();
trayItems.delete( id );
}
} );
trayBox.connect( 'destroy', () => {
tray.disconnect( trayAddedHandler );
tray.disconnect( trayRemovedHandler );
} );
return trayBox;
};
const TrayPopover = () => {
const popover = new Gtk.Popover( {
'cssClasses': [ 'TrayPopover' ]
} );
popover.set_child( SysTray() );
return popover;
};
const SystemTray = () => {
const systray = TrayPopover();
return (
<button
widthRequest={0}
hexpand={false}
vexpand={false}
cssClasses={[ 'power-menu-button' ]}
child={
<box>
<image iconName={'systemtray'}></image>
{systray}
</box>
}
onClicked={() => systray.popup()}
/>
);
};
export default {
SystemTray
};
+34 -20
View File
@@ -1,19 +1,30 @@
import { App, Astal, Gdk, Gtk } from "astal/gtk4"; import {
import Hyprland from "./modules/Hyprland"; App, Astal, Gdk, Gtk
import Calendar from "./modules/Calendar"; } from 'astal/gtk4';
import QuickView from "./modules/QuickView"; import Calendar from './modules/Calendar';
import SystemInfo from "./modules/SystemInfo"; import {
import { CenterBox } from "astal/gtk4/widget"; CenterBox
} from 'astal/gtk4/widget';
import Hyprland from './modules/Hyprland';
import QuickView from './modules/QuickView';
import SystemInfo from './modules/SystemInfo';
const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } ) => { const Bar = ( {
const { TOP, LEFT, RIGHT } = Astal.WindowAnchor; gdkmonitor, name
}: {
'gdkmonitor': Gdk.Monitor,
'name': string
} ) => {
const {
TOP, LEFT, RIGHT
} = Astal.WindowAnchor;
return ( return (
<window <window
gdkmonitor={gdkmonitor} gdkmonitor={gdkmonitor}
cssClasses={["Bar"]} cssClasses={[ 'Bar' ]}
name={name} name={name}
namespace={"bar"} namespace={'bar'}
exclusivity={Astal.Exclusivity.EXCLUSIVE} exclusivity={Astal.Exclusivity.EXCLUSIVE}
anchor={TOP | LEFT | RIGHT} anchor={TOP | LEFT | RIGHT}
visible visible
@@ -21,13 +32,13 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
child={ child={
<CenterBox <CenterBox
orientation={Gtk.Orientation.HORIZONTAL} orientation={Gtk.Orientation.HORIZONTAL}
start_widget={ startWidget={
<box <box
hexpand hexpand
halign={Gtk.Align.START} halign={Gtk.Align.START}
> >
<Hyprland.ModeStatus />
<Calendar.Time /> <Calendar.Time />
<SystemInfo.SystemInfo />
<Hyprland.Workspace /> <Hyprland.Workspace />
</box> </box>
} }
@@ -36,9 +47,9 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
<box <box
hexpand hexpand
halign={Gtk.Align.END} halign={Gtk.Align.END}
cssClasses={["BarRight"]} cssClasses={[ 'BarRight' ]}
> >
<Hyprland.SysTray /> <SystemInfo.SystemInfo />
<QuickView.QuickView /> <QuickView.QuickView />
</box> </box>
} }
@@ -48,21 +59,24 @@ const Bar = ( { gdkmonitor, name }: { gdkmonitor: Gdk.Monitor, name: string } )
); );
}; };
const cliHandler = (args: string[]): string => { const cliHandler = ( args: string[] ): string => {
return "Not implemented"; console.debug( args );
return 'Not implemented';
}; };
const BarLauncher = ( monitor: Gdk.Monitor ) => { const BarLauncher = ( monitor: Gdk.Monitor ) => {
const windowName = `bar-${monitor.get_connector()}` const windowName = `bar-${ monitor.get_connector() }`;
const createBar = () => { const createBar = () => {
return <Bar gdkmonitor={monitor} name={windowName}></Bar> return <Bar gdkmonitor={monitor} name={windowName}></Bar>;
} };
// Actually start the bar // Actually start the bar
createBar(); createBar();
return windowName; return windowName;
} };
export default { export default {
BarLauncher, BarLauncher,
+45
View File
@@ -11,6 +11,50 @@ window.Bar {
/* border-radius: 10px; */ /* border-radius: 10px; */
/* margin: 8px; */ /* margin: 8px; */
/* } */ /* } */
.mode-status {
color: white;
background-color: #00002dff;
padding-left: 10px;
padding-right: 10px;
margin-left: 5px;
border-radius: 20px;
font-family: $monospace-font;
&.command-mode {
background-color: darkslategray;
color: white;
}
&.windowing-mode {
background-color: darkslategray;
color: white;
}
&.workspace-mode {
background-color: darkblue;
color: white;
}
&.launch-mode {
background-color: darkgreen;
color: white;
}
&.device-mode {
background-color: darkred;
color: white;
}
&.screenshotting-mode {
background-color: purple;
color: white;
}
&.notifications-mode {
background-color: darkorange;
color: white;
}
}
.bar-button { .bar-button {
border-radius: 20px; border-radius: 20px;
@@ -54,6 +98,7 @@ window.Bar {
.time { .time {
min-width: 11rem; min-width: 11rem;
padding: 3px; padding: 3px;
& button { & button {
box-shadow: none; box-shadow: none;
padding: 0; padding: 0;
@@ -1,75 +1,34 @@
import AstalTray from "gi://AstalTray"; import {
import { bind, GObject } from "astal"; bind,
import AstalHyprland from "gi://AstalHyprland"; exec,
import { Gtk } from "astal/gtk4"; readFile
} from 'astal';
import AstalHyprland from 'gi://AstalHyprland';
import {
Gtk
} from 'astal/gtk4';
import Pango from 'gi://Pango?version=1.0';
const hypr = AstalHyprland.get_default(); const hypr = AstalHyprland.get_default();
const SYNC = GObject.BindingFlags.SYNC_CREATE;
const SysTray = () => {
const trayBox = new Gtk.Box({ cssClasses: ["bar-button"] });
const tray = AstalTray.get_default();
const trayItems = new Map<string, Gtk.MenuButton>();
const trayAddedHandler = tray.connect("item-added", (_, id) => {
const item = tray.get_item(id);
const popover = Gtk.PopoverMenu.new_from_model(item.menu_model);
const icon = new Gtk.Image();
const button = new Gtk.MenuButton({
popover,
child: icon,
cssClasses: ["tray-item"],
});
item.bind_property("gicon", icon, "gicon", SYNC);
popover.insert_action_group("dbusmenu", item.action_group);
item.connect("notify::action-group", () => {
popover.insert_action_group("dbusmenu", item.action_group);
});
trayItems.set(id, button);
trayBox.append(button);
});
const trayRemovedHandler = tray.connect("item-removed", (_, id) => {
const button = trayItems.get(id);
if (button) {
trayBox.remove(button);
button.run_dispose();
trayItems.delete(id);
}
});
trayBox.connect("destroy", () => {
tray.disconnect(trayAddedHandler);
tray.disconnect(trayRemovedHandler);
});
return trayBox;
};
const Workspace = () => { const Workspace = () => {
return ( return (
<box> <box>
{bind(hypr, "workspaces").as(wss => {bind( hypr, 'workspaces' ).as( wss => wss
wss .filter( ws => !( ws.id >= -99 && ws.id <= -2 ) ) // filter out special workspaces
.filter(ws => !(ws.id >= -99 && ws.id <= -2)) // filter out special workspaces .sort( ( a, b ) => a.id - b.id )
.sort((a, b) => a.id - b.id) .map( ws => (
.map(ws => (
<button <button
cssClasses={bind(hypr, "focusedWorkspace").as(fw => cssClasses={bind( hypr, 'focusedWorkspace' ).as( fw => ws === fw
ws === fw
? [ ? [
"focused-workspace-button", 'focused-workspace-button',
"workspace-button", 'workspace-button',
] ]
: ["workspace-button"], : [ 'workspace-button' ], )}
)}
onButtonPressed={() => ws.focus()} onButtonPressed={() => ws.focus()}
child={<label label={String(ws.id)}></label>} child={<label label={String( ws.id )}></label>}
></button> ></button>
)), ) ), )}
)}
</box> </box>
); );
}; };
@@ -79,15 +38,15 @@ const Workspace = () => {
* displaying all available clients * displaying all available clients
*/ */
const ActiveWindow = () => { const ActiveWindow = () => {
const focused = bind(hypr, "focusedClient"); const focused = bind( hypr, 'focusedClient' );
const WindowPopover = (): Gtk.Popover => { const WindowPopover = (): Gtk.Popover => {
// Set up boxes + Popover // Set up boxes + Popover
const popover = new Gtk.Popover(); const popover = new Gtk.Popover();
const popoverBox = WindowPopoverBox(); const popoverBox = WindowPopoverBox();
popover.set_child(popoverBox); popover.set_child( popoverBox );
return popover; return popover;
}; };
@@ -97,47 +56,91 @@ const ActiveWindow = () => {
// Return fully assembled HyprlandFocusedClient box // Return fully assembled HyprlandFocusedClient box
// ─────────────────────────────────────────────────────────────────── // ───────────────────────────────────────────────────────────────────
return ( return (
<box visible={focused.as(Boolean)}> <box visible={focused.as( Boolean )}>
<button <button
onClicked={() => windowPopover.popup()} onClicked={() => windowPopover.popup()}
cssClasses={["bar-button"]} cssClasses={[ 'bar-button' ]}
child={ child={
focused.as( focused.as( client => client && (
client => <label
client && ( maxWidthChars={70}
<label label={bind(client, "title").as(String)} /> ellipsize={Pango.EllipsizeMode.END}
), label={bind( client, 'title' ).as( String )} />
) ), )
}></button> }></button>
{windowPopover} {windowPopover}
</box > </box >
); );
}; };
type submaps = 'device' | 'launch' | 'workspace' | 'windowing' | 'screenshotting' | 'notifications' | '';
const ModeStatus = () => {
let isUsingHyprvim = false;
try {
const path = exec( 'bash -c "cd ~ && pwd"' ) + '/.config/hyprvim';
isUsingHyprvim = readFile( path ).trim() === 'y';
} catch ( e ) {
printerr( 'Failed to read hyprvim config', e );
}
const label = new Gtk.Label();
if ( !isUsingHyprvim ) return label;
print( '==> Using hyprvim config' );
const map = {
'device': 'DEV',
'launch': 'LNC',
'workspace': 'WSP',
'windowing': 'WIN',
'screenshotting': 'SCS',
'notifications': 'NOT',
'': 'NRM'
};
label.label = map[''];
label.cssClasses = [ 'mode-status' ];
// TODO: Possibly add popover to it that lists binds
hypr.connect( 'submap', ( _, name: submaps ) => {
label.label = map[name];
label.cssClasses = [
'mode-status',
name + '-mode'
];
} );
return label;
};
const WindowPopoverBox = () => { const WindowPopoverBox = () => {
return <box vertical> return <box vertical>
<label label={"Available Windows"} cssClasses={['title-2']}></label> <label label={'Available Windows'} cssClasses={[ 'title-2' ]}></label>
<Gtk.Separator marginTop={5} marginBottom={5}></Gtk.Separator> <Gtk.Separator marginTop={5} marginBottom={5}></Gtk.Separator>
<box vertical> <box vertical>
{bind(hypr, 'clients').as(clients => { {bind( hypr, 'clients' ).as( clients => {
return clients.map(client => { return clients.map( client => {
return <button child={ return <button child={
<box> <box>
<label label={bind(client, 'workspace').as(w => `(WS ${w.name})`)}></label> <label label={bind( client, 'workspace' ).as( w => `(WS ${ w.name })` )}></label>
<label label={bind(client, 'initialClass').as(c => `[${c}]`)}></label> <label label={bind( client, 'initialClass' ).as( c => `[${ c }]` )}></label>
<label label={bind(client, 'title')}></label> <label label={bind( client, 'title' )}></label>
</box> </box>
} }
onClicked={() => client.focus()} onClicked={() => client.focus()}
></button> ></button>;
}) } );
})} } )}
</box> </box>
</box> </box>;
} };
export default { export default {
Workspace, Workspace,
ActiveWindow, ActiveWindow,
SysTray, ModeStatus
}; };
@@ -1,16 +1,24 @@
import { bind } from "astal"; import AstalBattery from 'gi://AstalBattery';
import AstalBattery from "gi://AstalBattery"; import AstalBluetooth from 'gi://AstalBluetooth';
import AstalBluetooth from "gi://AstalBluetooth"; import AstalNetwork from 'gi://AstalNetwork';
import AstalNetwork from "gi://AstalNetwork"; import AstalWp from 'gi://AstalWp';
import AstalWp from "gi://AstalWp"; import Brightness from '../../../util/brightness';
import { Gtk } from "astal/gtk4"; import {
import Brightness from "../../../util/brightness"; Gtk
import QuickActions from "../../QuickActions/QuickActions"; } from 'astal/gtk4';
import QuickActions from '../../QuickActions/QuickActions';
import {
bind
} from 'astal';
import {
execAsync
} from 'astal';
const STATE = AstalNetwork.DeviceState; const STATE = AstalNetwork.DeviceState;
const QuickView = () => { const QuickView = () => {
const qa = QuickActions.QuickActions(); const qa = QuickActions.QuickActions();
const showQuickActions = () => { const showQuickActions = () => {
qa.popup(); qa.popup();
}; };
@@ -18,14 +26,14 @@ const QuickView = () => {
return ( return (
<button <button
onClicked={() => showQuickActions()} onClicked={() => showQuickActions()}
cssClasses={["quick-action-button"]} cssClasses={[ 'quick-action-button' ]}
child={ child={
<box> <box>
<BatteryWidget></BatteryWidget> <BatteryWidget></BatteryWidget>
<Audio></Audio> <Audio></Audio>
<BluetoothWidget></BluetoothWidget> <BluetoothWidget></BluetoothWidget>
<NetworkWidget></NetworkWidget> <NetworkWidget></NetworkWidget>
<image iconName={"system-shutdown-symbolic"}></image> <image iconName={'system-shutdown-symbolic'}></image>
{qa} {qa}
</box> </box>
} }
@@ -39,37 +47,39 @@ const NetworkWidget = () => {
return ( return (
<box> <box>
<image <image
iconName={bind(network, "state").as(state => { iconName={bind( network, 'state' ).as( state => {
if (state === AstalNetwork.State.CONNECTING) { if ( state === AstalNetwork.State.CONNECTING ) {
return "chronometer-reset-symbolic"; return 'chronometer-reset-symbolic';
} else if ( } else if (
state === AstalNetwork.State.CONNECTED_LOCAL || state === AstalNetwork.State.CONNECTED_LOCAL
state === AstalNetwork.State.CONNECTED_SITE || || state === AstalNetwork.State.CONNECTED_SITE
state === AstalNetwork.State.CONNECTED_GLOBAL || state === AstalNetwork.State.CONNECTED_GLOBAL
) { ) {
return "network-wired-activated-symbolic"; return 'network-wired-activated-symbolic';
} else { } else {
return "paint-unknown-symbolic"; return 'paint-unknown-symbolic';
} }
})} } )}
cssClasses={["network-widget", "quick-view-symbol"]} cssClasses={[
visible={bind(network.wifi, "state").as( 'network-widget',
state => state !== STATE.ACTIVATED, 'quick-view-symbol'
)} ]}
visible={bind( network.wifi, 'state' ).as( state => state !== STATE.ACTIVATED, )}
></image> ></image>
<image <image
iconName={bind(network.wifi, "state").as(state => { iconName={bind( network.wifi, 'state' ).as( state => {
if (state === STATE.ACTIVATED) { if ( state === STATE.ACTIVATED ) {
return network.wifi.iconName; return network.wifi.iconName;
} else { } else {
return ""; return '';
} }
})} } )}
tooltipText={bind(network.wifi, 'ssid')} tooltipText={bind( network.wifi, 'ssid' )}
cssClasses={["network-widget", "quick-view-symbol"]} cssClasses={[
visible={bind(network.wifi, "state").as( 'network-widget',
state => state === STATE.ACTIVATED, 'quick-view-symbol'
)} ]}
visible={bind( network.wifi, 'state' ).as( state => state === STATE.ACTIVATED, )}
></image> ></image>
</box> </box>
); );
@@ -77,57 +87,66 @@ const NetworkWidget = () => {
const BluetoothWidget = () => { const BluetoothWidget = () => {
const bluetooth = AstalBluetooth.get_default(); const bluetooth = AstalBluetooth.get_default();
const enabled = bind(bluetooth, "isPowered"); const enabled = bind( bluetooth, 'isPowered' );
const connected = bind(bluetooth, "isConnected"); const connected = bind( bluetooth, 'isConnected' );
// For each connected BT device, render status // For each connected BT device, render status
return ( return (
<box> <box>
<box visible={enabled.as(e => e)}> <box visible={enabled.as( e => e )}>
<image <image
iconName={"bluetooth-active-symbolic"} iconName={'bluetooth-active-symbolic'}
visible={connected.as(c => c)} visible={connected.as( c => c )}
></image> ></image>
<image <image
iconName={"bluetooth-disconnected-symbolic"} iconName={'bluetooth-disconnected-symbolic'}
visible={connected.as(c => !c)} visible={connected.as( c => !c )}
></image> ></image>
</box> </box>
<image <image
iconName={"bluetooth-disabled-symbolic"} iconName={'bluetooth-disabled-symbolic'}
visible={enabled.as(e => !e)} visible={enabled.as( e => !e )}
></image> ></image>
<box> <box>
{bind(bluetooth, "devices").as(devices => { {bind( bluetooth, 'devices' ).as( devices => {
return devices.map(device => { return devices.map( device => {
return ( return (
<image <image
iconName={bind(device, "icon").as( iconName={bind( device, 'icon' ).as( icon => icon, )}
icon => icon, visible={bind( device, 'connected' )}
)} tooltipText={bind( device, 'batteryPercentage' ).as( n => {
visible={bind(device, "connected")} return device.get_name() + ': ' + n + '%';
tooltipText={bind(device, "batteryPercentage").as( }, )}
n => {
return device.get_name() + ': ' + n + "%";
},
)}
></image> ></image>
); );
}); } );
})} } )}
</box> </box>
</box> </box>
); );
}; };
let hasSentNotification = false;
const BatteryWidget = () => { const BatteryWidget = () => {
const battery = AstalBattery.get_default(); const battery = AstalBattery.get_default();
if (battery.get_is_present()) {
if ( battery.get_is_present() ) {
return ( return (
<image <image
iconName={bind(battery, "iconName").as(icon => icon)} iconName={bind( battery, 'batteryIconName' ).as( icon => icon )}
cssClasses={["quick-view-symbol"]} cssClasses={[ 'quick-view-symbol' ]}
tooltipText={bind(battery, 'percentage').as(p => `${Math.round(p * 100)}%`)} tooltipText={bind( battery, 'percentage' ).as( p => {
const level = Math.round( p * 100 );
if ( level < 20 && !hasSentNotification ) {
hasSentNotification = true;
execAsync( 'bash -c "notify-send \'Battery level below 20%\'"' );
}
return `Battery Level: ${ level }%`;
} )}
></image> ></image>
); );
} else { } else {
@@ -138,14 +157,14 @@ const BatteryWidget = () => {
const BrightnessWidget = () => { const BrightnessWidget = () => {
const brightness = Brightness.get_default(); const brightness = Brightness.get_default();
const screen_brightness = bind(brightness, "screen"); const screen_brightness = bind( brightness, 'screen' );
return ( return (
<box cssClasses={["quick-view-symbol"]}> <box cssClasses={[ 'quick-view-symbol' ]}>
<image iconName={"brightness-high-symbolic"}></image> <image iconName={'brightness-high-symbolic'}></image>
<label <label
label={screen_brightness.as(b => '' + Math.round(100 * b))} label={screen_brightness.as( b => '' + Math.round( 100 * b ) )}
visible={bind(brightness, "screenAvailable")} visible={bind( brightness, 'screenAvailable' )}
></label> ></label>
</box> </box>
); );
@@ -153,31 +172,27 @@ const BrightnessWidget = () => {
const Audio = () => { const Audio = () => {
const wireplumber = AstalWp.get_default(); const wireplumber = AstalWp.get_default();
if (wireplumber) {
if ( wireplumber ) {
return ( return (
<box orientation={Gtk.Orientation.HORIZONTAL}> <box orientation={Gtk.Orientation.HORIZONTAL}>
<image <image
iconName={bind(wireplumber.defaultSpeaker, "volumeIcon").as( iconName={bind( wireplumber.defaultSpeaker, 'volumeIcon' ).as( icon => icon, )}
icon => icon, cssClasses={[ 'quick-view-symbol' ]}
)} tooltipText={bind( wireplumber.defaultSpeaker, 'volume' ).as( v => Math.round( 100 * v ) + '%' )}
cssClasses={["quick-view-symbol"]}
tooltipText={bind(wireplumber.defaultSpeaker, 'volume').as(v => Math.round(100 * v) + '%')}
></image> ></image>
<image <image
iconName={bind( iconName={bind( wireplumber.defaultMicrophone,
wireplumber.defaultMicrophone, 'volumeIcon', ).as( icon => icon )}
"volumeIcon", cssClasses={[ 'quick-view-symbol' ]}
).as(icon => icon)} tooltipText={bind( wireplumber.defaultMicrophone, 'volume' ).as( v => Math.round( 100 * v ) + '%' )}
cssClasses={["quick-view-symbol"]}
tooltipText={bind(wireplumber.defaultMicrophone, 'volume').as(v => Math.round(100 * v) + '%')}
></image> ></image>
</box> </box>
); );
} else { } else {
print( print( '[ WirePlumber ] Could not connect, Audio support in bar will be missing', );
"[ WirePlumber ] Could not connect, Audio support in bar will be missing",
); return <image iconName={'action-unavailable-symbolic'}></image>;
return <image iconName={"action-unavailable-symbolic"}></image>;
} }
}; };
@@ -185,4 +200,5 @@ const Audio = () => {
export default { export default {
QuickView, QuickView,
BrightnessWidget
}; };
@@ -1,35 +1,39 @@
import { execAsync } from "astal"; import {
import { Gtk } from "astal/gtk4"; Gtk
import sysinfo from "../sysinfo"; } from 'astal/gtk4';
import {
execAsync
} from 'astal';
import sysinfo from '../sysinfo';
const info = () => { const info = () => {
return ( return (
<box vertical> <box vertical>
<label <label
label={"System Information"} label={'System Information'}
cssClasses={["title-2"]} cssClasses={[ 'title-2' ]}
></label> ></label>
<Gtk.Separator marginTop={5} marginBottom={10}></Gtk.Separator> <Gtk.Separator marginTop={5} marginBottom={10}></Gtk.Separator>
<label <label
vexpand vexpand
halign={Gtk.Align.START} halign={Gtk.Align.START}
hexpand hexpand
label={sysinfo.ramUsed(used => { label={sysinfo.ramUsed( used => {
return "RAM: " + used + ` (${sysinfo.ramUtil.get()}%)`; return 'RAM: ' + used + ` (${ sysinfo.ramUtil.get() }%)`;
})} } )}
></label> ></label>
<label <label
label={sysinfo.systemStats(stats => { label={sysinfo.systemStats( stats => {
return `CPU: ${stats.cpuTemp}, ${stats.cpuClk} return `CPU: ${ stats.cpuTemp }, ${ stats.cpuClk }
GPU: ${stats.gpuTemp}, ${stats.gpuClk} (${stats.vram} / ${stats.availableVRAM}) GPU: ${ stats.gpuTemp }, ${ stats.gpuClk } (${ stats.vram } / ${ stats.availableVRAM })
Kernel: ${stats.kernel}`; Kernel: ${ stats.kernel }`;
})} } )}
></label> ></label>
<Gtk.Separator marginTop={10}></Gtk.Separator> <Gtk.Separator marginTop={10}></Gtk.Separator>
<button <button
onClicked={() => execAsync(`/bin/sh -c "kitty --hold fish -c 'fastfetch'"`)} onClicked={() => execAsync( '/bin/sh -c "kitty --hold fish -c \'fastfetch\'"' )}
child={ child={
<label label={"View FastFetch"}></label> <label label={'View FastFetch'}></label>
}></button> }></button>
</box> </box>
); );
@@ -38,7 +42,7 @@ Kernel: ${stats.kernel}`;
const SystemInformationPanel = () => { const SystemInformationPanel = () => {
const popover = new Gtk.Popover(); const popover = new Gtk.Popover();
popover.set_child(info()); popover.set_child( info() );
return popover; return popover;
}; };
@@ -54,44 +58,44 @@ const SystemInfo = () => {
sysinfo.refreshStats(); sysinfo.refreshStats();
}; };
if (sysinfo.enabled) { if ( sysinfo.enabled ) {
return ( return (
<button <button
onClicked={() => openSysInfo()} onClicked={() => openSysInfo()}
child={ child={
<box tooltipText={sysinfo.ramUsed(v => v)}> <box tooltipText={sysinfo.ramUsed( v => v )}>
<box <box
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image <image
iconName={"power-profile-performance-symbolic"} iconName={'power-profile-performance-symbolic'}
marginEnd={1} marginEnd={1}
></image> ></image>
<label <label
label={sysinfo.cpuUtil(util => util)} label={sysinfo.cpuUtil( util => util )}
marginEnd={5} marginEnd={5}
></label> ></label>
</box> </box>
<box <box
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image iconName={"histogram-symbolic"}></image> <image iconName={'memory'}></image>
<label label={sysinfo.ramUtil(util => util)}></label> <label label={sysinfo.ramUtil( util => util )}></label>
</box> </box>
<box <box
cssClasses={[ 'quick-view-symbol' ]} cssClasses={[ 'quick-view-symbol' ]}
> >
<image iconName={"show-gpu-effects-symbolic"}></image> <image iconName={'show-gpu-effects-symbolic'}></image>
<label label={sysinfo.gpuUtil(util => util)}></label> <label label={sysinfo.gpuUtil( util => util )}></label>
</box> </box>
{panel} {panel}
</box> </box>
} }
cssClasses={["bar-button"]} cssClasses={[ 'bar-button' ]}
></button> ></button>
); );
} else { } else {
return <image iconName={"action-unavailable-symbolic"}></image>; return <image iconName={'action-unavailable-symbolic'}></image>;
} }
}; };
+3 -2
View File
@@ -1,5 +1,6 @@
$fg-color: #E6E6E6; $fg-color: #E6E6E6;
$bg-color: #141414; $bg-color: #141414;
$accent-color: #591641; $accent-color: #EBC405;
$accent-color-2: #97103A; $accent-color-2: #B81C15;
$shadow-color: rgba(40, 40, 40, 0.3); $shadow-color: rgba(40, 40, 40, 0.3);
$monospace-font: Source Code Pro
+19 -12
View File
@@ -1,30 +1,36 @@
alias ls='ls -l --color' alias ls='ls -l --color'
alias ll='ls -la --color' alias ll='ls -la --color'
alias v='nvim' alias v='nvim'
alias i='vimiv'
alias c='clear' alias c='clear'
alias zs='zathura-sandbox' alias zs='zathura-sandbox'
alias bt='bluetui' alias z='zathura'
alias vicfg='cd ~/.config/nvim/ && nvim' alias bt='bashtop'
alias vicfg='nvim ~/projects/nvim/'
alias fm='thunar .' alias fm='thunar .'
alias gl='git ls-files --others --exclude-standard' alias gl='git ls-files --others --exclude-standard'
alias gm='gti ls-files -m' alias gm='git ls-files -m'
alias gpu='git push' alias gpu='git push'
alias gp='git pull' alias gp='git pull'
alias gc='git commit -a -m' alias gc='git commit -a -m'
alias ga='git add ./*' alias ga='git add ./*'
alias cfh='nvim ~/projects/active/dotfiles/config/hypr/' alias cfh='nvim ~/projects/dotfiles/config/hypr/'
alias cfn='nvim ~/projects/active/nvim/' alias cfn='nvim ~/projects/nvim/'
alias cff='nvim ~/projects/active/dotfiles/config/fish/' alias cff='nvim ~/projects/dotfiles/config/fish/'
alias cfw='nvim ~/projects/archive/dotfiles-old/pc/configs/waybar/' alias cfa='nvim ~/projects/dotfiles/config/astal/'
alias cfa='nvim ~/projects/active/dotfiles/config/ags/' alias cf='nvim ~/projects/dotfiles/'
alias cf='nvim ~/projects/active/dotfiles/'
alias g='lazygit' alias g='lazygit'
alias open-webui='sudo systemctl start docker && sudo docker start -i open-webui' alias open-webui='sudo systemctl start docker && sudo docker start -i open-webui'
alias ai='ollama serve' alias ai='ollama serve'
alias ff='fastfetch' alias ff='fastfetch'
alias p='nvimpager -p'
alias latexdocs='zathura ~/projects/latex/docs/docs.pdf &>> /dev/null & disown'
alias gccerr='gcc -Wall -Wextra -Wpedantic -Werror -Wmissing-prototypes -std=c99'
alias linecount='cloc --vcs git .'
alias flutter='fvm flutter'
# Add scripts in ~/projects/active/dotfiles/general/scripts/ to path # Add scripts in ~/projects/dotfiles/scripts/ to path
fish_add_path -P ~/projects/active/dotfiles/scripts/ fish_add_path -P ~/projects/dotfiles/scripts/
function y function y
set tmp (mktemp -t "yazi-cwd.XXXXXX") set tmp (mktemp -t "yazi-cwd.XXXXXX")
@@ -36,7 +42,6 @@ function y
end end
zoxide init --cmd j fish | source zoxide init --cmd j fish | source
# [ -f /usr/share/autojump/autojump.fish ]; and source /usr/share/autojump/autojump.fish
if status is-interactive if status is-interactive
function fish_prompt function fish_prompt
@@ -124,3 +129,5 @@ end
end end
set -g fish_greeting ""
+33
View File
@@ -0,0 +1,33 @@
# This file contains fish universal variable definitions.
# VERSION: 3.0
SETUVAR __fish_initialized:3800
SETUVAR fish_color_autosuggestion:555\x1ebrblack
SETUVAR fish_color_cancel:\x2dr
SETUVAR fish_color_command:blue
SETUVAR fish_color_comment:red
SETUVAR fish_color_cwd:green
SETUVAR fish_color_cwd_root:red
SETUVAR fish_color_end:green
SETUVAR fish_color_error:brred
SETUVAR fish_color_escape:brcyan
SETUVAR fish_color_history_current:\x2d\x2dbold
SETUVAR fish_color_host:normal
SETUVAR fish_color_host_remote:yellow
SETUVAR fish_color_normal:normal
SETUVAR fish_color_operator:brcyan
SETUVAR fish_color_param:cyan
SETUVAR fish_color_quote:yellow
SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold
SETUVAR fish_color_search_match:white\x1e\x2d\x2dbackground\x3dbrblack
SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack
SETUVAR fish_color_status:red
SETUVAR fish_color_user:brgreen
SETUVAR fish_color_valid_path:\x2d\x2dunderline
SETUVAR fish_greeting:\x1d
SETUVAR fish_key_bindings:fish_default_key_bindings
SETUVAR fish_pager_color_completion:normal
SETUVAR fish_pager_color_description:B3A06D\x1eyellow\x1e\x2di
SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline
SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan
SETUVAR fish_pager_color_selected_background:\x2dr
SETUVAR fish_user_paths:/usr/lib/python3\x2e11/site\x2dpackages\x1e/usr/lib/python3\x2e11\x1e/usr/lib/python3\x2e11/site\x2dpackages/\x1e/home/janis/\x2elocal/lib/python3\x2e11/site\x2dpackages/\x1e/home/janis/\x2elocal/lib/python3\x2e11/
View File
+8 -19
View File
@@ -9,30 +9,19 @@
#██████████████ █████ ████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ████████████████████████████████████████████████████████████████████████████████████████████████ ██
general { general {
lock_cmd = hyprlock --immediate lock_cmd = hyprlock
unlock_cmd = loginctl unlock-session unlock_cmd = loginctl unlock-session
before_sleep_cmd = hyprlock --immediate before_sleep_cmd = hyprlock
after_sleep_cmd = hyprlock --immediate after_sleep_cmd = hyprlock
}
listener {
timeout = 100
on-timeout = notify-send "Entering idle state... (200s to screen off)"
on-resume = notify-send "Welcome back!"
}
listener {
timeout = 200
on-timeout = notify-send "100s to screen off"
}
listener {
timeout = 210
on-timeout = hyprlock
} }
listener { listener {
timeout = 300 timeout = 300
on-timeout = hyprlock --grace 15
}
listener {
timeout = 360
on-timeout = hyprctl dispatch dpms off on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on on-resume = hyprctl dispatch dpms on
} }
+59 -30
View File
@@ -8,9 +8,7 @@ $mainMod = SUPER
# These key-binds are non-specific, laptop config has a separate file that includes # These key-binds are non-specific, laptop config has a separate file that includes
# extra config for it specifically # extra config for it specifically
bind = $mainMod, Q, killactive bind = $mainMod, Q, killactive
# bind = $mainMod SHIFT, Q, exit
bind = $mainMod, Return, exec, kitty bind = $mainMod, Return, exec, kitty
# bind = $mainMod, E, exec, thunar
bind = $mainMod SHIFT, E, exec, thunar bind = $mainMod SHIFT, E, exec, thunar
bind = $mainMod, E, exec, kitty --hold fish -c "y" bind = $mainMod, E, exec, kitty --hold fish -c "y"
bind = $mainMod, V, togglefloating, bind = $mainMod, V, togglefloating,
@@ -46,13 +44,11 @@ bind = $mainMod SHIFT, L, exec, librewolf
bind = $mainMod SHIFT, D, exec, vesktop bind = $mainMod SHIFT, D, exec, vesktop
bind = $mainMod SHIFT, V, exec, vscodium bind = $mainMod SHIFT, V, exec, vscodium
bind = $mainMod SHIFT, T, exec, thunderbird bind = $mainMod SHIFT, T, exec, thunderbird
bind = $mainMod SHIFT, H, exec, heroic bind = $mainMod CTRL, H, exec, heroic
bind = $mainMod SHIFT, Z, exec, zathura bind = $mainMod SHIFT, Z, exec, zathura
bind = $mainMod SHIFT, I, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh" bind = $mainMod SHIFT, I, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh"
bind = $mainMod SHIFT, A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay" bind = $mainMod SHIFT, A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay"
bind = $mainMod SHIFT, G, exec, notify-send 'Preparing system for gaming...' --app-name="Util" && corectrl
bind = $mainMod SHIFT, P, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam bind = $mainMod SHIFT, P, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam
bind = $mainMod SHIFT, R, exec, notify-send 'Launching in Remoteplay optimised session' --app-name="Steam" && steam -pipewire
bind = $mainMod CTRL, K, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill bind = $mainMod CTRL, K, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill
bind = $mainMod SHIFT, O, exec, terminator -e "~/projects/dotfiles/ai.sh" bind = $mainMod SHIFT, O, exec, terminator -e "~/projects/dotfiles/ai.sh"
@@ -70,12 +66,12 @@ bind = SHIFT, PRINT, exec, grimblast --notify save screen
# │ Rofi commands │ # │ Rofi commands │
# └ ┘ # └ ┘
bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run" bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run"
bind = $mainMod SHIFT, H, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
# ┌ ┐ # ┌ ┐
# │ Logout commands │ # │ Logout commands │
# └ ┘ # └ ┘
bind = $mainMod, escape, exec, wlogout bind = $mainMod, escape, exec, wlogout
bind = $mainMod ALT CTRL, L, exec, hyprlock --immediate
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
@@ -85,14 +81,6 @@ bind = $mainMod ALT CTRL, L, exec, hyprlock --immediate
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# ┌ ┐
# │ Move focus with mainMod + arrow keys │
# └ ┘
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# ┌ ┐ # ┌ ┐
# │ Same with vim-motions │ # │ Same with vim-motions │
# └ ┘ # └ ┘
@@ -140,6 +128,12 @@ bind = $mainMod SHIFT, j, movetoworkspace, e-1
bind = $mainMod SHIFT, k, movetoworkspace, e+1 bind = $mainMod SHIFT, k, movetoworkspace, e+1
# ┌ ┐
# │ Special workspace │
# └ ┘
bind = $mainMod SHIFT, M, movetoworkspace, special
bind = $mainMod, M, togglespecialworkspace
# ┌ ┐ # ┌ ┐
# │ Scroll through existing workspaces with │ # │ Scroll through existing workspaces with │
# │ mainMod + scroll │ # │ mainMod + scroll │
@@ -148,30 +142,18 @@ bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1 bind = $mainMod, mouse_up, workspace, e-1
# ┌ ┐
# │ Tile window to a part of the screen │
# └ ┘
# bind = $mainMod CTRL, left, movewindow, left
# bind = $mainMod CTRL, right, movewindow, right
# ┌ ┐ # ┌ ┐
# │ move to next window / previous window with │ # │ move to next window / previous window with │
# │ ALT + Tab / SHIFT + ALT + Tab │ # │ ALT + Tab / SHIFT + ALT + Tab │
# └ ┘ # └ ┘
bind = ALT SHIFT, tab, cyclenext, prev bind = ALT SHIFT, tab, cyclenext, prev
# bind = ALT, tab, cyclenext, next
# bind = ALT CTRL, tab, focusurgentorlast
bind = ALT, tab, focusurgentorlast bind = ALT, tab, focusurgentorlast
# ┌ ┐ # ┌ ┐
# │ Master layout commands │ # │ Dwindle layout commands │
# └ ┘ # └ ┘
bind = $mainMod CTRL, M, layoutmsg, swapwithmaster bind = $mainMod CTRL, M, layoutmsg, swapsplit
bind = $mainMod SHIFT, A, layoutmsg, addmaster
bind = $mainMod SHIFT CTRL, right, layoutmsg, orientationnext
bind = $mainMod SHIFT CTRL, left, layoutmsg, orientationprev
# ┌ ┐ # ┌ ┐
@@ -182,6 +164,39 @@ bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow bindm = $mainMod, mouse:273, resizewindow
# ┌ ┐
# │ Resize window with keybinds (change split) │
# └ ┘
bind = $mainMod ALT, T, submap, split
# Submap for split
submap = split
binde = , H, splitratio, -0.01
binde = , L, splitratio, +0.01
# Reset bind
bind = , escape, submap, reset
submap = reset
# ┌ ┐
# │ Truly resize window with keybind (submap) │
# └ ┘
bind = $mainMod ALT, R, submap, resize
# Submap for resize
submap = resize
binde = , L, resizeactive, 10 0
binde = , H, resizeactive, -10 0
binde = , K, resizeactive, 0 -10
binde = , J, resizeactive, 0 10
# Reset bind
bind = , escape, submap, reset
submap = reset
# ┌ ┐ # ┌ ┐
# │ Freeze │ # │ Freeze │
# └ ┘ # └ ┘
@@ -199,8 +214,8 @@ bind = ,code:121, exec, pamixer -t
# ┌ ┐ # ┌ ┐
# │ Brightness-Control │ # │ Brightness-Control │
# └ ┘ # └ ┘
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%' --app-name="Brightness" bind = ,code:232, exec, light -U 5
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%' --app-name="Brightness" bind = ,code:233, exec, light -A 5
# ┌ ┐ # ┌ ┐
@@ -208,3 +223,17 @@ bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased
# └ ┘ # └ ┘
bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl" bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl"
bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl" bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl"
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Funny windows user trolling binds │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
bind = CTRL ALT, Delete, exec, notify-send 'I am not Windows' 'Did ya really think that was gonna do anything? Only an eternally broken OS could need such a stupid keybind'
bind = ALT, F4, exec, notify-send 'I am not Windows' 'That just feels like a way too unergonomic keybind to be used for such a common action'
bind = $mainMod, left, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, right, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, up, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, down, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
+2 -2
View File
@@ -4,10 +4,10 @@
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
exec = swaybg -m fill -i /home/janis/NextCloud/Wallpapers/dark/colour-explosion.jpg exec = swaybg -m fill -i /home/janis/NextCloud/Wallpapers/hypercar/ferrari_499p.jpg
general { general {
col.active_border = rgba(591641cc) rgba(97103acc) rgba(2d2057cc) 45deg col.active_border = rgba(ebc405cc) rgba(b81c15cc) rgba(673722cc) 45deg
col.inactive_border = rgb(000000) col.inactive_border = rgb(000000)
} }
+43 -45
View File
@@ -9,18 +9,18 @@ exec-once = ~/.config/hypr/xdg-portal-hyprland
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XAUTHORITY DISPLAY exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XAUTHORITY DISPLAY
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# exec-once = waybar
exec-once = hypridle exec-once = hypridle
exec-once = nm-applet exec-once = nm-applet
exec-once = nextcloud --background exec-once = nextcloud --background
# exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4 >> ~/log 2>&1" exec-once = sleep 2 && bash -c "ags run -d ~/projects/dotfiles/config/astal/ --gtk 4 >> /tmp/runner-log 2>&1"
exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4" exec-once = bash -c "ags run -d ~/projects/dotfiles/config/ags/notifications/ --gtk 3 >> /tmp/notifier-log 2>&1"
# exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/ >> ~/logn 2>&1"
exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/"
# ── wlhist ──────────────────────────────────────────────────────────
exec-once = wl-paste --type text --watch cliphist store # Stores only text data
exec-once = wl-paste --type image --watch cliphist store # Stores only image data
exec = hyprctl setcursor oreo_spark_blue_cursors 24
env = QT_QPA_PLATFORM,wayland env = QT_QPA_PLATFORM,wayland
env = QT_QPA_PLATFORM_THEME,qt6ct env = QT_QPA_PLATFORM_THEME,qt6ct
env = OLLAMA_HOST,0.0.0.0 env = OLLAMA_HOST,0.0.0.0
@@ -31,29 +31,40 @@ env = OLLAMA_HOST,0.0.0.0
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
input { input {
kb_layout = ch kb_layout = us
kb_options = caps:swapescape kb_variant = altgr-intl
natural_scroll = true natural_scroll = true
numlock_by_default = true numlock_by_default = true
repeat_delay = 400
follow_mouse = 2 follow_mouse = 2
mouse_refocus = true mouse_refocus = true
scroll_factor = 2
accel_profile = flat
touchpad { touchpad {
disable_while_typing = true disable_while_typing = true
natural_scroll = true natural_scroll = true
scroll_factor = 4
} }
focus_on_close = 1 focus_on_close = 1
sensitivity = 0 # -1.0 - 1.0, 0 means no modification. sensitivity = 0
} }
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more # ── Cursors ─────────────────────────────────────────────────────────
workspace_swipe = true cursor {
workspace_swipe_distance = 300 no_warps = false
inactive_timeout = 5
}
# ── Bind config ─────────────────────────────────────────────────────
binds {
workspace_back_and_forth = true
} }
@@ -63,27 +74,26 @@ gestures {
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
general { general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 3 gaps_in = 3
gaps_out = 4 gaps_out = 4
border_size = 1 border_size = 2
# col.active_border = rgba(cc5c00ff) rgba(cc5c00ff) rgba(ff0000ff) 45deg
# col.inactive_border = rgba(595959aa)
layout = master layout = dwindle
no_border_on_floating = false
} }
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Style │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
decoration { decoration {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
inactive_opacity = 1 inactive_opacity = 1
rounding = 10 rounding = 10
shadow { shadow {
enabled = true enabled = true
range = 4 range = 4
# color = rgba(1a1a1aee)
} }
blur { blur {
@@ -100,38 +110,26 @@ decoration {
animations { animations {
enabled = yes enabled = yes
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05 bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier animation = windows, 1, 4, myBezier
animation = windowsOut, 1, 7, default, popin 80% animation = windowsOut, 1, 6, default, popin 80%
animation = border, 1, 10, default animation = border, 1, 8, default
animation = fade, 1, 7, default animation = fade, 1, 3, default
animation = workspaces, 1, 6, default animation = workspaces, 1, 2, default
animation = specialWorkspaceIn, 1, 2, default, fade
animation = specialWorkspaceOut, 1, 2, default, fade
} }
misc { misc {
disable_hyprland_logo = true disable_hyprland_logo = true
disable_splash_rendering = false disable_splash_rendering = false
vrr = 2 vrr = 3
allow_session_lock_restore = true allow_session_lock_restore = true
} }
dwindle { dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more pseudotile = true
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below force_split = 2
preserve_split = yes # you probably want this preserve_split = true
} }
master {
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
# no_gaps_when_only = true
}
cursor {
no_warps = false
inactive_timeout = 60
}
+15
View File
@@ -0,0 +1,15 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Gestures │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
gestures {
workspace_swipe_distance = 200
workspace_swipe_cancel_ratio = 0.3
workspace_swipe_forever = true
workspace_swipe_direction_lock = false
}
gesture = 3, horizontal, workspace,
gesture = 3, down, close
gesture = 3, up, fullscreen
@@ -0,0 +1,14 @@
# hyprvim
Using Vim Motions and in general vim-style commands is really neat - so why not apply to the Window Manager as well?
## Mapping
- `Super + W`: Manage windows (close windows, resize them, change split)
- `Super + Y`: Workspace management (change workspace, move windows to workspaces)
- `Super + C`: Notification management (dismiss notifications)
- `Super + X`: Launch commands (for software)
- `Super + D`: Device management (brightness, volume, media, etc)
- `Super + S`: Screenshot
There are several quick binds available, such as `Super + [0-9]` to switch workspaces, `Super + Shift + [0-9]` to move windows as well as `Super + [hjkl]` to move focus.
Additionally, there are shortcuts to commonly used apps, such as `Super + Enter` for `kitty`, `Super + Shift + L` for `librewolf` and `Super + Space` for `rofi`
@@ -0,0 +1,56 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ device config │
# ╰────────────────────────────────────────────────╯
# ── Brightness-Control ──────────────────────────────────────────────
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%'
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%'
# ── Volume control ──────────────────────────────────────────────────
bind = ,code:123, exec, pamixer -i 5
bind = ,code:122, exec, pamixer -d 5
bind = ,code:121, exec, pamixer -t
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, D, submap, device
submap = device
# ── Swapescape ──────────────────────────────────────────────────────
bind = , S, exec, fish -c "toggle-swapescape"
bind = , S, submap, reset
# ── FPV goggles binds ───────────────────────────────────────────────
bind = CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 1920x0, 1, mirror, DP-1 && notify-send 'Set FPV goggles to mirror main screen' --app-name="Hyprctl"
bind = CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1280x720@60, 3840x0, 1 && notify-send 'Set to expand FPV goggles' --app-name="Hyprctl"
# ── Monitor config binds ────────────────────────────────────────────
bind = SHIFT, D, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1, mirror, eDP-1 && notify-send 'Set to mirror internal display' --app-name="Hyprctl"
bind = SHIFT, E, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1 && notify-send 'Set to expand external display' --app-name="Hyprctl"
# ── Internal display controls ───────────────────────────────────────
bind = , E, exec, hyprctl keyword monitor eDP-1, 2880x1800@60, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to battery optimized settings' --app-name="PowerProfiles"
bind = , B, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to balanced performance settings' --app-name="PowerProfiles"
bind = , P, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -p && notify-send 'Set to performance optimized settings' --app-name="PowerProfiles"
# ── Using docked ────────────────────────────────────────────────────
bind = , D, exec, hyprctl keyword monitor eDP-1, disable
# Keyboard layout
bind = , U, exec, hyprctl keyword input:kb_layout us && hyprctl keyword input:kb_variant altgr-intl && notify-send 'Set to US keyboard layout' --app-name="Keyboard layout"
bind = , U, submap, reset
bind = , C, exec, hyprctl keyword input:kb_layout ch && hyprctl keyword input:kb_variant '' && notify-send 'Set to CH keyboard layout' --app-name="Keyboard layout"
bind = , C, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,86 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ App launching │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, Return, exec, kitty
# ── Rofi ────────────────────────────────────────────────────────────
bind = $mainMod, Space, exec, killall rofi || rofi -show combi -modes combi -combi-modes "window,drun,run"
bind = $mainMod SHIFT, H, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
# ── Power / logout ──────────────────────────────────────────────────
bind = $mainMod, escape, exec, wlogout
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Launch submap │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, X, submap, launch
submap = launch
# ── Kitty ───────────────────────────────────────────────────────────
bind = , K, exec, kitty
bind = , K, submap, reset
bind = , Return, exec, kitty
bind = , Return, submap, reset
# ── Others ──────────────────────────────────────────────────────────
bind = , Q, exec, qutebrowser
bind = , Q, submap, reset
bind = , L, exec, librewolf
bind = , L, submap, reset
bind = , E, exec, thunar
bind = , E, submap, reset
bind = , D, exec, vesktop
bind = , D, submap, reset
bind = SHIFT, B, exec, brave
bind = SHIFT, B, submap, reset
bind = , F, exec, filezilla
bind = , F, submap, reset
bind = , V, exec, vscodium
bind = , V, submap, reset
bind = , T, exec, thunderbird
bind = , T, submap, reset
bind = , H, exec, heroic
bind = , H, submap, reset
bind = , Z, exec, zathura
bind = , Z, submap, reset
bind = , B, exec, /opt/bs-manager/bs-manager
bind = , B, submap, reset
bind = , P, exec, alvr_dashboard
bind = , P, submap, reset
bind = , C, exec, qalculate-qt
bind = , C, submap, reset
bind = , A, exec, notify-send 'AirPlay server starting...' --app-name="AirPlay Audio" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && shairport-sync -a LinuxPlay"
bind = , A, submap, reset
bind = SHIFT, A, exec, notify-send 'AirPlay video server starting...' --app-name="AirPlay Video" && terminator -T "hidden-terminator" -e "systemctl start avahi-daemon && sleep 5 && uxplay -n LinuxVideoPlay -nh"
bind = SHIFT, A, submap, reset
bind = , S, exec, notify-send 'Steam is launching...' --app-name="Steam" && steam
bind = , S, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,30 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Notifications │
# ╰────────────────────────────────────────────────╯
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, C, submap, notifications
submap = notifications
bind = , T, exec, astal -i notifier toggle
bind = , T, submap, reset
bind = , D, exec, astal -i notifier clear-newest
bind = , D, submap, reset
bind = , C, exec, astal -i notifier clear
bind = , C, submap, reset
bind = , S, exec, astal -i notifier show
bind = , S, submap, reset
bind = , H, exec, astal -i notifier hide
bind = , H, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,25 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Screenshotting binds │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, S, submap, screenshotting
submap = screenshotting
bind = , Y, exec, grimblast --notify copy area
bind = , Y, submap, reset
bind = , C, exec, grimblast --notify copysave area
bind = , C, submap, reset
bind = , S, exec, grimblast --notify save area
bind = , S, submap, reset
bind = SHIFT, Y, exec, grimblast --notify copy screen
bind = SHIFT, Y, submap, reset
bind = SHIFT, C, exec, grimblast --notify copysave screen
bind = SHIFT, C, submap, reset
bind = SHIFT, S, exec, grimblast --notify save screen
bind = SHIFT, S, submap, reset
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,40 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Window management submap │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, Q, killactive
# ── Resize, move using mouse plus mainMod ───────────────────────────
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# ── Submap ──────────────────────────────────────────────────────────
bind = $mainMod, W, submap, windowing
submap = windowing
# ── Resize windows ──────────────────────────────────────────────────
binde = , L, resizeactive, 10 0
binde = , H, resizeactive, -10 0
binde = , K, resizeactive, 0 -10
binde = , J, resizeactive, 0 10
# ── Change splitratio ───────────────────────────────────────────────
binde = SHIFT, H, splitratio, -0.01
binde = SHIFT, L, splitratio, +0.01
# ── Kill, freeze, etc ───────────────────────────────────────────────
bind = SHIFT, f, exec, hyprfreeze -a
bind = , x, killactive
bind = , q, killactive
bind = , f, fullscreen
bind = , v, togglefloating
bind = SHIFT, k, exec, notify-send 'Insta-Kill activated' --app-name="Hyprctl" && hyprctl kill
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
@@ -0,0 +1,118 @@
# ┌ ┐
# │ Switch workspaces with mainMod + [0-9] │
# └ ┘
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# ┌ ┐
# │ Move active window to a workspace with │
# │ mainMod + SHIFT + [0-9] │
# └ ┘
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# ┌ ┐
# │ Move focus with vim motions │
# └ ┘
bind = $mainMod, h, movefocus, l
bind = $mainMod, l, movefocus, r
bind = $mainMod, j, movefocus, d
bind = $mainMod, k, movefocus, u
# ┌ ┐
# │ Special workspace │
# └ ┘
bind = $mainMod SHIFT, M, movetoworkspace, special
bind = $mainMod, M, togglespecialworkspace
# ┌ ┐
# │ Scroll through existing workspaces with │
# │ mainMod + scroll │
# └ ┘
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
# ┌ ┐
# │ move to next window / previous window with │
# │ ALT + Tab / SHIFT + ALT + Tab │
# └ ┘
bind = ALT SHIFT, tab, cyclenext, prev
bind = ALT, tab, focusurgentorlast
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ Submap for workspace management │
# ╰────────────────────────────────────────────────╯
bind = $mainMod, A, submap, workspace
submap = workspace
# ── Move to workspace ───────────────────────────────────────────────
bind = , 1, workspace, 1
bind = , 2, workspace, 2
bind = , 3, workspace, 3
bind = , 4, workspace, 4
bind = , 5, workspace, 5
bind = , 6, workspace, 6
bind = , 7, workspace, 7
bind = , 8, workspace, 8
bind = , 9, workspace, 9
bind = , 0, workspace, 10
# ── Move active window to workspace ─────────────────────────────────
bind = SHIFT, 1, movetoworkspace, 1
bind = SHIFT, 2, movetoworkspace, 2
bind = SHIFT, 3, movetoworkspace, 3
bind = SHIFT, 4, movetoworkspace, 4
bind = SHIFT, 5, movetoworkspace, 5
bind = SHIFT, 6, movetoworkspace, 6
bind = SHIFT, 7, movetoworkspace, 7
bind = SHIFT, 8, movetoworkspace, 8
bind = SHIFT, 9, movetoworkspace, 9
bind = SHIFT, 0, movetoworkspace, 10
# ── Move workspace with vim motions or mouse scroll ─────────────────
bind = , h, workspace, e-1
bind = , l, workspace, e+1
bind = , mouse_down, workspace, e+1
bind = , mouse_up, workspace, e-1
# ── Move window to workspace with vim motions ───────────────────────
bind = SHIFT, h, movetoworkspace, e-1
bind = SHIFT, l, movetoworkspace, e+1
# ── Special workspace ───────────────────────────────────────────────
bind = , s, togglespecialworkspace
bind = SHIFT, s, movetoworkspace, special
# ── dwindle ─────────────────────────────────────────────────────────
bind = , M, layoutmsg, swapsplit
# ── Exit submap ─────────────────────────────────────────────────────
bind = , escape, submap, reset
submap = reset
# ────────────────────────────────────────────────────────────────────
+15
View File
@@ -0,0 +1,15 @@
$mainMod = SUPER
source=./modal-binds/workspace.conf
source=./modal-binds/launch.conf
source=./modal-binds/notifications.conf
source=./modal-binds/window-management.conf
source=./modal-binds/screenshot.conf
source=./modal-binds/device.conf
bind = CTRL ALT, Delete, exec, notify-send 'I am not Windows' 'Did ya really think that was gonna do anything? Only an eternally broken OS could need such a stupid keybind'
bind = ALT, F4, exec, notify-send 'I am not Windows' 'That just feels like a way too unergonomic keybind to be used for such a common action'
bind = $mainMod, left, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, right, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, up, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
bind = $mainMod, down, exec, notify-send 'I am not Windows' 'This is no inefficient stacking manager. Tiling happens automatically'
+92 -86
View File
@@ -1,17 +1,3 @@
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ WORKSPACE RULES │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
# Display full sized (without gaps), if only window on screen
# workspace = w[tv1], gapsout:0, gapsin:0
# workspace = f[1], gapsout:0, gapsin:0
# windowrule = bordersize 0, floating:0, onworkspace:w[tv1]
# windowrule = rounding 0, floating:0, onworkspace:w[tv1]
# windowrule = bordersize 0, floating:0, onworkspace:f[1]
# windowrule = rounding 0, floating:0, onworkspace:f[1]
$mainMod = SUPER $mainMod = SUPER
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
@@ -19,103 +5,123 @@ $mainMod = SUPER
# │ WINDOW RULES │ # │ WINDOW RULES │
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
windowrule = float, title:.*(rofi).* windowrule = move 1450 50, match:title (.*)Power menu$
windowrule = animation popin, title:.*(rofi).* windowrule = workspace 2, match:class evince
windowrule = center, title:(rofi)(.*) windowrule = workspace 2, match:title .*Okular.*
windowrule = workspace 2, match:class org.pwmt.zathura
windowrule = fullscreen on, match:title wlogout
windowrule = workspace 2, match:class librewolf
windowrule = workspace 2, match:title LibreWolf
windowrule = workspace 2, match:title BSManager
windowrule = workspace 1, match:title ALVR(.*)
windowrule = workspace 2, match:title (.*)Beat Saber(.*)
windowrule = fullscreen on, match:title (.*)Beat Saber(.*)
windowrule = workspace 2, match:title (.*)Discord(.*)
windowrule = workspace 3, match:title ^(Steam)(.*)$
windowrule = float off, match:title ^(Steam)(.*)$
windowrule = workspace 1, match:title (.*)(VSCodium)$
windowrule = center on, match:title ^(.*)(VSCodium)$
windowrule = workspace 3, match:class minecraft-launcher
windowrule = tile on, match:class minecraft-launcher
windowrule = fullscreen on, match:title ^(.*)(Minecraft)(.*)$
windowrule = workspace 3, match:title ^(.*)(Minecraft)(.*)$
windowrule = move 1450 50, title:^(.*)(Power menu)$ windowrule = workspace 1, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, class:evince windowrule = size 0 0, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, title:.*(Okular).* windowrule = move 0 0, match:title ^(.*)hidden-terminator*(.*)$
windowrule = workspace 2, class:org.pwmt.zathura windowrule = float on, match:title ^(.*)hidden-terminator*(.*)$
windowrule = fullscreen, title:wlogout
windowrule = workspace 2, class:librewolf
windowrule = workspace 2, title:LibreWolf
windowrule = workspace 2, title:(.*)(Discord)(.*)
windowrule = workspace 3, title:^(Steam)(.*)$
windowrule = workspace 1, title:^(.*)(VSCodium)$
windowrule = center, title:^(.*)(VSCodium)$
windowrule = workspace 3, class:minecraft-launcher
windowrule = tile, class:minecraft-launcher
windowrule = fullscreen, title:^(.*)(Minecraft)(.*)$
windowrule = workspace 3, title:^(.*)(Minecraft)(.*)$
windowrule = workspace 1, title:^(.*)hidden-terminator*(.*)$
windowrule = size 0 0, title:^(.*)hidden-terminator*(.*)$
windowrule = move 0 0, title:^(.*)hidden-terminator*(.*)$
windowrule = float, title:^(.*)hidden-terminator*(.*)$
# ┌ ┐ # ┌ ┐
# │ Set rule for yazi filepicker │ # │ Set rule for yazi filepicker │
# └ ┘ # └ ┘
windowrule = float, title:^(.*)termfilechooser*(.*)$ windowrule = float on, match:title ^(.*)termfilechooser*(.*)$
windowrule = size 1400 800, title:^(.*)termfilechooser*(.*)$ windowrule = size 1400 800, match:title ^(.*)termfilechooser*(.*)$
windowrule = center, title:^(.*)termfilechooser*(.*)$ windowrule = center on, match:title ^(.*)termfilechooser*(.*)$
windowrule = dim_around on, match:title ^(.*)termfilechooser*(.*)$
# ┌ ┐ # ┌ ┐
# │ Set floating windows & position them centered │ # │ Set floating windows & position them centered │
# └ ┘ # └ ┘
windowrule = float, class:file_progress windowrule = float on, match:class file_progress
windowrule = center, class:file_progress windowrule = center on, match:class file_progress
windowrule = float, class:confirm windowrule = float on, match:class confirm
windowrule = center, class:confirm windowrule = center on, match:class confirm
windowrule = float, class:dialog windowrule = float on, match:class dialog
windowrule = center, class:dialog windowrule = center on, match:class dialog
windowrule = float, class:download windowrule = float on, match:class download
windowrule = center, class:download windowrule = center on, match:class download
windowrule = float, class:notification windowrule = float on, match:class notification
windowrule = center, class:notification windowrule = center on, match:class notification
windowrule = float, class:error windowrule = float on, match:class error
windowrule = center, class:error windowrule = center on, match:class error
windowrule = float, class:splash windowrule = float on, match:class splash
windowrule = center, class:splash windowrule = center on, match:class splash
windowrule = float, class:confirmreset windowrule = float on, match:class confirmreset
windowrule = center, class:confirmreset windowrule = center on, match:class confirmreset
windowrule = float, title:Open File windowrule = float on, match:title Open File
windowrule = center, title:Open File windowrule = center on, match:title Open File
windowrule = float, title:branchdialog windowrule = float on, match:title branchdialog
windowrule = center, title:branchdialog windowrule = center on, match:title branchdialog
windowrule = float, class:Lxappearance windowrule = float on, match:class Lxappearance
windowrule = center, class:Lxappearance windowrule = center on, match:class Lxappearance
windowrule = float, title:^(Media viewer)$ windowrule = float on, match:title ^(Media viewer)$
windowrule = center, title:^(Media viewer)$ windowrule = center on, match:title ^(Media viewer)$
windowrule = float, title:^(Volume Control)$ windowrule = float on, match:title ^(Volume Control)$
windowrule = center, title:^(Volume Control)$ windowrule = center on, match:title ^(Volume Control)$
windowrule = float, title:^(Picture-in-Picture)$ windowrule = float on, match:title ^(Picture-in-Picture)$
windowrule = center, title:^(Picture-in-Picture)$ windowrule = center on, match:title ^(Picture-in-Picture)$
windowrule = float, title:^(File Operation Progress)$ windowrule = float on, match:title ^(File Operation Progress)$
windowrule = center, title:^(File Operation Progress)$ windowrule = center on, match:title ^(File Operation Progress)$
windowrule = float, title:^(Loading)(.*)$ windowrule = float on, match:title ^(Loading)(.*)$
windowrule = center, title:^(Loading)(.*)$ windowrule = center on, match:title ^(Loading)(.*)$
windowrule = float, class:pavucontrol-qt windowrule = float on, match:title ^(Qalculate)(.*)$
windowrule = center, class:pavucontrol-qt windowrule = center on, match:title ^(Qalculate)(.*)$
windowrule = workspace special, match:title ^(Qalculate)(.*)$
windowrule = size 1200 800, match:title ^(Qalculate)(.*)$
windowrule = float, class:pavucontrol windowrule = float on, match:class pavucontrol-qt
windowrule = center, class:pavucontrol windowrule = center on, match:class pavucontrol-qt
windowrule = float, class:file-roller windowrule = float on, match:class pavucontrol
windowrule = center, class:file-roller windowrule = center on, match:class pavucontrol
windowrule = idleinhibit focus, title:^(Rocket League)(.*)$ windowrule = float on, match:class file-roller
windowrule = fullscreen, title:^(Steam Big Picture)$ windowrule = center on, match:class file-roller
windowrule = idleinhibit always, class:steam
windowrule = idleinhibit always, class:lutris # idleinhibit
windowrule = idleinhibit focus, class:vlc windowrule = idle_inhibit focus, match:title ^(Rocket League)(.*)$
windowrule = idleinhibit focus, class:supertuxkart windowrule = fullscreen on, match:title ^(Steam Big Picture)$
windowrule = idleinhibit fullscreen, title:^(.*)(Discord)(.*)$ windowrule = idle_inhibit always, match:class steam
windowrule = idleinhibit fullscreen, title:^(.*)(~)(.*)$ windowrule = idle_inhibit always, match:class lutris
windowrule = idle_inhibit focus, match:class vlc
windowrule = idle_inhibit focus, match:class supertuxkart
windowrule = idle_inhibit fullscreen, match:title ^(.*)(Discord)(.*)$
windowrule = idle_inhibit fullscreen, match:title ^(.*)(~)(.*)$
# Do not screenshare bitwarden windows
windowrule = no_screen_share on, match:title (.*)(Bitwarden)(.*)
windowrule = no_screen_share on, match:class nm-connection-editor
windowrule = no_screen_share on, match:title (.*)(secret)(.*)
windowrule = no_screen_share on, match:class (.*)[aA]uthentication(.*)
# ┌ ┐
# │ Layer rules │
# └ ┘
layerrule = dim_around on, match:namespace rofi
+1 -6
View File
@@ -17,15 +17,10 @@
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# monitor=DP-1, preferred, 0x0, 1, vrr, 2
monitor=DP-1, 1920x1080@144, 0x0, 1, vrr, 2 monitor=DP-1, 1920x1080@144, 0x0, 1, vrr, 2
monitor=DP-2, 1920x1080@75, 1920x0, 1 monitor=DP-2, 1920x1080@75, 1920x0, 1
# monitor=,highres highrr, auto, 1
# exec = swaybg -m fill -i /mnt/storage/SORTED/Pictures/Wallpapers/wallpaper/arch-bg-matterhorn.jpg
# exec = swaybg -m fill -i /mnt/storage/SORTED/Pictures/Wallpapers/McLaren/main_livery_upscaled.jpg
exec = hyprctl setcursor oreo_spark_blue_cursors 24
source=./hyprland/binds.conf source=./hyprland/binds.conf
source=./hyprland/general.conf source=./hyprland/general.conf
+48
View File
@@ -0,0 +1,48 @@
#░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
#░ ░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░
#▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒
#▒ ▒▒▒▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒ ▒▒
#▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓ ▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓
#▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓
#▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓
#█ ████ ████ ████ ██████ ████ ███ █ █ ██ ██ █ ███████████ ██████ █████ ██ ███ ████ █████ █
#██████████████ █████ ██████████████████████████████████████████████████████████████████████████████████████████████████████ ██
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ MONITORS │
# ╰────────────────────────────────────────────────╯
# ────────────────────────────────────────────────────────────────────
monitor=eDP-1, disable
monitor=,highres highrr, auto, 1
source=./hyprland/binds.conf
source=./hyprland/general.conf
source=./hyprland/windowrules.conf
# ┌ ┐
# │ LAPTOP │
# └ ┘
exec = hyprctl setcursor oreo_spark_blue_cursors 36
env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor
env = X_CURSOR_THEME, Oreo_spark_blue_cursor
env = XCURSOR_SIZE,24
env = XDG_SESSION_TYPE, wayland
env = QT_QPA_PLATFORM,wayland
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
exec-once = hyprpm reload -nn
xwayland {
force_zero_scaling = true
}
# ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado
windowrule = tile, title:(.*)Vivado(.*)
+9 -34
View File
@@ -19,13 +19,11 @@
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
monitor=eDP-1, 2880x1800@60, 0x0, 1.5 monitor=eDP-1, 2880x1800@60, 0x0, 1.5
# monitor=,highres highrr, auto, 1 monitor=,highres highrr, auto, 1
# exec = swaybg -m fill -i /home/janis/Pictures/arch-bg.png
source=./hyprland/binds.conf source=./hyprland/binds.conf
source=./hyprland/gestures.conf
source=./hyprland/general.conf source=./hyprland/general.conf
source=./hyprland/windowrules.conf source=./hyprland/windowrules.conf
@@ -35,40 +33,17 @@ source=./hyprland/windowrules.conf
exec = hyprctl setcursor oreo_spark_blue_cursors 36 exec = hyprctl setcursor oreo_spark_blue_cursors 36
env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor env = HYPRCURSOR_THEME, Oreo_spark_blue_cursor
env = X_CURSOR_THEME, Oreo_spark_blue_cursor env = X_CURSOR_THEME, Oreo_spark_blue_cursor
env = XCURSOR_SIZE,24 env = XCURSOR_SIZE, 36
env = ELECTRON_ENABLE_HIGHDPI_SUPPORT, 1 env = ELECTRON_ENABLE_HIGHDPI_SUPPORT, 1
env = XDG_SESSION_TYPE, wayland env = XDG_SESSION_TYPE, wayland
env = QT_QPA_PLATFORM,wayland env = QT_QPA_PLATFORM, wayland
# env = QT_QPA_PLATFORM_THEME,qt6ct env = ELECTRON_OZONE_PLATFORM_HINT, wayland
env = ELECTRON_OZONE_PLATFORM_HINT,wayland
env = GDK_SCALE,2 env = GDK_SCALE,2
exec-once = hyprpm reload -nn
input {
kb_options = caps:swapescape
}
xwayland { xwayland {
force_zero_scaling = true force_zero_scaling = true
} }
# ── Volume control ──────────────────────────────────────────────────
bind = ,code:123, exec, pamixer -i 5
bind = ,code:122, exec, pamixer -d 5
bind = ,code:121, exec, pamixer -t
# ── Brightness-Control ──────────────────────────────────────────────
bind = ,code:232, exec, light -U 5 && notify-send 'Display brightness decreased by 5%'
bind = ,code:233, exec, light -A 5 && notify-send 'Display brightness increased by 5%'
# ── Monitor config binds ────────────────────────────────────────────
bind = $mainMod CTRL, D, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1, mirror, eDP-1 && notify-send 'Set to mirror internal display'
bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1920x0, 1 && notify-send 'Set to expand external display'
# ── Internal display controls ───────────────────────────────────────
bind = $mainMod ALT, E, exec, hyprctl keyword monitor eDP-1, 2880x1800@60, 0x0, 1.5 && cpupower-gui -b && notify-send 'Set to battery optimized settings'
bind = $mainMod ALT, P, exec, hyprctl keyword monitor eDP-1, 2880x1800@120, 0x0, 1.5 && cpupower-gui -p && notify-send 'Set to performance optimized settings'
# ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado
windowrule = tile, title:(.*)Vivado(.*)
+3 -7
View File
@@ -9,16 +9,12 @@
#██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██
general {
grace = 15
}
# ┌ ┐ # ┌ ┐
# │ BACKGROUND │ # │ BACKGROUND │
# └ ┘ # └ ┘
background { background {
monitor = monitor =
path = /home/janis/NextCloud/Wallpapers/dark/colour-splash.jpg # Or screenshot path = /home/janis/NextCloud/Wallpapers/hypercar/ferrari_499p-closeup.jpg # Or screenshot
blur_passes = 1 blur_passes = 1
} }
@@ -33,7 +29,7 @@ input-field {
dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8 dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8
dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0
dots_center = false dots_center = false
outer_color = rgb(89, 22, 65) outer_color = rgb(235, 196, 5)
inner_color = rgb(200, 200, 200) inner_color = rgb(200, 200, 200)
font_color = rgb(10, 10, 10) font_color = rgb(10, 10, 10)
fade_on_empty = true fade_on_empty = true
@@ -49,7 +45,7 @@ label {
monitor = monitor =
text = <b>$TIME</b> text = <b>$TIME</b>
color = color =
font_size = 100 font_size = 150
font_family = Comfortaa font_family = Comfortaa
position = 0, 80 position = 0, 80
+8
View File
@@ -17,6 +17,7 @@ font_size 12.0
# │ Cursor config │ # │ Cursor config │
# └ ┘ # └ ┘
cursor_trail 1 cursor_trail 1
cursor_trail_start_threshold 0
# ┌ ┐ # ┌ ┐
@@ -28,3 +29,10 @@ url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto ne
detect_urls yes detect_urls yes
show_hyperlink_targets yes show_hyperlink_targets yes
include current-theme.conf include current-theme.conf
wheel_scroll_multiplier 10.0
touch_scroll_multiplier 5.0
# ┌ ┐
# │ Mappings │
# └ ┘
map kitty_mod+e
File diff suppressed because it is too large Load Diff
+276
View File
@@ -0,0 +1,276 @@
# ─────────────────────────────────────────────────────────────────────
# ╭─────────────────────────────────────────────────╮
# │ clang-format config │
# ╰─────────────────────────────────────────────────╯
# ─────────────────────────────────────────────────────────────────────
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: BlockIndent
AlignArrayOfStructures: Left
AlignConsecutiveAssignments:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: true
AlignConsecutiveBitFields:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveShortCaseStatements:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCaseArrows: false
AlignCaseColons: false
AlignConsecutiveTableGenBreakingDAGArgColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenCondOperatorColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenDefinitionColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments:
Kind: Always
OverEmptyLines: 0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseExpressionOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: false
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: true
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Always
BreakAfterJavaFieldAnnotations: false
BreakAfterReturnType: None
BreakArrays: true
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Attach
BreakBeforeConceptDeclarations: Always
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakFunctionDefinitionParameters: false
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
BreakTemplateDeclarations: MultiLine
ColumnLimit: 100
CommentPragmas: "^ IWYU pragma:"
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: Always
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: ^"(llvm|llvm-c|clang|clang-c)/
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: ^(<|"(gtest|gmock|isl|json)/)
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: .*
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: (Test)?$
IncludeIsMainSourceRegex: ""
IndentAccessModifiers: true
IndentCaseBlocks: true
IndentCaseLabels: true
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: BeforeHash
IndentRequiresClause: true
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertBraces: false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
Binary: 0
BinaryMinDigits: 0
Decimal: 0
DecimalMinDigits: 0
Hex: 0
HexMinDigits: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLines:
AtEndOfFile: false
AtStartOfBlock: true
AtStartOfFile: true
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ""
MacroBlockEnd: ""
MainIncludeChar: Quote
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PPIndentWidth: -1
PackConstructorInitializers: BinPack
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakScopeResolution: 500
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
QualifierAlignment: Left
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: true
RemoveParentheses: MultipleParentheses
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Always
ShortNamespaceLines: 1
SkipMacroDefinitionBody: false
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeJsonColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDeclarationName: true
AfterFunctionDefinitionName: true
AfterIfMacros: true
AfterOverloadedOperator: false
AfterPlacementOperator: true
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInContainerLiterals: true
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParens: Custom
SpacesInParensOptions:
ExceptDoubleParentheses: false
InConditionalStatements: true
InCStyleCasts: false
InEmptyParentheses: false
Other: true
SpacesInSquareBrackets: true
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
TableGenBreakInsideDAGArg: DontBreak
UseTab: Never
VerilogBreakBetweenInstancePorts: true
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE
+733 -54
View File
@@ -1,65 +1,744 @@
// @ts-check
import eslint from '@eslint/js'; import eslint from '@eslint/js';
import tseslint from 'typescript-eslint'; import globals from 'globals';
import stylistic from '@stylistic/eslint-plugin'; import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
import typescript from '@typescript-eslint/eslint-plugin';
import vue from 'eslint-plugin-vue';
export default tseslint.config( const style = {
eslint.configs.recommended,
...tseslint.configs.recommended,
{
'plugins': { 'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': false,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always'
],
'@stylistic/array-element-newline': [
'error',
{
'consistent': false,
'multiline': false,
'minItems': 2
}
],
'@stylistic/arrow-parens': [
'error',
'as-needed'
],
'@stylistic/arrow-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/block-spacing': [
'error',
'always'
],
'@stylistic/brace-style': [
'error',
'1tbs',
{
'allowSingleLine': false
}
],
'@stylistic/comma-dangle': [
'error',
'never'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/function-call-argument-newline': [
'error',
'consistent'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/function-paren-newline': [
'error',
'multiline-arguments'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'error',
4
],
'@stylistic/indent-binary-ops': [
'error',
4
],
'@stylistic/key-spacing': [
'error',
{
'beforeColon': false,
'afterColon': true
}
],
'@stylistic/keyword-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/lines-between-class-members': [
'error',
'always'
],
'@stylistic/max-len': [
'warn',
{
'code': 140,
'comments': 160,
'ignoreComments': false,
'ignoreUrls': true,
'ignoreStrings': true,
'ignoreTemplateLiterals': true,
'ignoreRegExpLiterals': true
}
],
'@stylistic/max-statements-per-line': [
'error',
{
'max': 1
}
],
'@stylistic/multiline-ternary': [
'error',
'always-multiline'
],
'@stylistic/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': 'error',
'@stylistic/no-confusing-arrow': 'error',
'@stylistic/no-extra-parens': [
'error',
'all',
{
'nestedBinaryExpressions': false,
'ternaryOperandBinaryExpressions': false,
'ignoreJSX': 'multi-line',
'nestedConditionalExpressions': false
}
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'error',
'@stylistic/no-multiple-empty-lines': [
'error',
{
'max': 3,
'maxEOF': 2
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 1
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never'
}
],
// Padding lines. The most in-depth part of this config
'@stylistic/padding-line-between-statements': [
'error',
// Variables, Constants
{
'blankLine': 'never',
'prev': 'var',
'next': 'var'
},
{
'blankLine': 'never',
'prev': 'let',
'next': 'let'
},
{
'blankLine': 'never',
'prev': 'const',
'next': 'const'
},
{
'blankLine': 'always',
'prev': 'var',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'with'
]
},
{
'blankLine': 'always',
'prev': 'let',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': 'const',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// Import
{
'blankLine': 'never',
'prev': 'import',
'next': 'import'
},
{
'blankLine': 'never',
'prev': 'cjs-import',
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': 'cjs-import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'import'
},
{
'blankLine': 'always',
'prev': 'import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// If
{
'blankLine': 'always',
'prev': '*',
'next': 'if'
},
{
'blankLine': 'always',
'prev': 'if',
'next': '*'
},
// For
{
'blankLine': 'always',
'prev': '*',
'next': 'for'
},
{
'blankLine': 'always',
'prev': 'for',
'next': '*'
},
// While
{
'blankLine': 'always',
'prev': '*',
'next': 'while'
},
{
'blankLine': 'always',
'prev': 'while',
'next': '*'
},
// Functions
{
'blankLine': 'always',
'prev': '*',
'next': 'function'
},
{
'blankLine': 'always',
'prev': 'function',
'next': '*'
},
// Block Statements
{
'blankLine': 'always',
'prev': '*',
'next': 'block-like'
},
{
'blankLine': 'always',
'prev': 'block-like',
'next': '*'
},
// Switch
{
'blankLine': 'always',
'prev': '*',
'next': 'switch'
},
{
'blankLine': 'always',
'prev': 'switch',
'next': '*'
},
// Try-Catch
{
'blankLine': 'always',
'prev': '*',
'next': 'try'
},
{
'blankLine': 'always',
'prev': 'try',
'next': '*'
},
// Throw
{
'blankLine': 'always',
'prev': '*',
'next': 'throw'
},
{
'blankLine': 'always',
'prev': 'throw',
'next': '*'
},
// Return
{
'blankLine': 'never',
'prev': 'return',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'return'
},
// Export
{
'blankLine': 'always',
'prev': '*',
'next': 'export'
},
{
'blankLine': 'always',
'prev': 'export',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'cjs-export'
},
{
'blankLine': 'always',
'prev': 'cjs-export',
'next': '*'
},
// Classes
{
'blankLine': 'always',
'prev': '*',
'next': 'class'
},
{
'blankLine': 'always',
'prev': 'class',
'next': '*'
}
],
'@stylistic/quote-props': [
'error',
'always'
],
'@stylistic/quotes': [
'error',
'single'
],
'@stylistic/rest-spread-spacing': [
'error',
'never'
],
'@stylistic/semi': [
'error',
'always'
],
'@stylistic/semi-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/semi-style': [
'error',
'last'
],
'@stylistic/space-before-blocks': [
'error',
'always'
],
'@stylistic/space-before-function-paren': [
'error',
'always'
],
'@stylistic/space-in-parens': [
'error',
'always'
],
'@stylistic/space-infix-ops': [
'error',
{
'int32Hint': false
}
],
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': [
'error',
'always'
],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/template-curly-spacing': [
'error',
'always'
],
'@stylistic/template-tag-spacing': [
'error',
'always'
],
'@stylistic/type-generic-spacing': 'error',
'@stylistic/type-named-tuple-spacing': 'error',
'@stylistic/wrap-iife': [
'error',
'inside'
],
'@stylistic/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error'
}
};
/** @type {import('eslint').Linter.Config} */
export default tseslint.config(
// Base JavaScript rules
eslint.configs.recommended,
tseslint.configs.recommended,
style,
// Vue support (including TS and JSX inside SFCs)
{
'files': [ '**/*.vue' ],
'languageOptions': {
'sourceType': 'module',
'ecmaVersion': 'latest',
'globals': globals.browser,
'parserOptions': {
'parser': tseslint.parser
}
},
'plugins': {
'vue': vue,
'@stylistic': stylistic,
'@stylistic/js': stylistic, '@stylistic/js': stylistic,
'@stylistic/ts': stylistic, '@stylistic/ts': stylistic,
'@typescript-eslint': typescript
}, },
'extends': [
eslint.configs.recommended,
...vue.configs['flat/recommended']
],
'rules': { 'rules': {
// Formatting ...typescript.configs.recommended.rules,
'@stylistic/js/array-bracket-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], ...style.rules,
'@stylistic/js/array-bracket-spacing': [ 'error', 'always' ],
'@stylistic/js/array-element-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], // Vue specific rules
'@stylistic/js/arrow-parens': [ 'error', 'always' ], '@stylistic/indent': 'off',
'@stylistic/js/arrow-spacing': [ 'error', { 'before': true, 'after': true } ], 'vue/html-indent': [
'@stylistic/js/block-spacing': [ 'error', 'always' ], 'error',
'@stylistic/js/brace-style': [ 'error', '1tbs' ], 4
'@stylistic/js/comma-spacing': [ 'error', { 'before': false, 'after': true } ], ],
'@stylistic/js/comma-style': [ 'error', 'last' ], 'vue/html-comment-indent': [
'@stylistic/js/dot-location': [ 'error', 'property' ], 'error',
'@stylistic/js/eol-last': [ 'error', 'always' ], 4
'@stylistic/js/function-call-spacing': [ 'error', 'never' ], ],
'@stylistic/js/implicit-arrow-linebreak': [ 'error', 'beside' ], 'vue/script-indent': [
'@stylistic/js/indent': [ 'error', 4 ], 'error',
'@stylistic/js/key-spacing': [ 'error', { 'beforeColon': false, 'afterColon': true } ], 4,
'@stylistic/js/keyword-spacing': [ 'error', { 'before': true, 'after': true } ], {
'@stylistic/js/lines-between-class-members': [ 'error', 'always' ], 'baseIndent': 1,
'@stylistic/js/new-parens': [ 'error', 'always' ], 'switchCase': 1
'@stylistic/js/no-extra-parens': [ 'error', 'all' ], }
'@stylistic/js/no-extra-semi': 'error', ],
'@stylistic/js/no-floating-decimal': 'error', 'vue/html-self-closing': [
'@stylistic/js/no-mixed-operators': 'error', 'error',
'@stylistic/js/no-mixed-spaces-and-tabs': 'error', {
'@stylistic/js/no-multi-spaces': 'error', 'html': {
'@stylistic/js/no-trailing-spaces': 'error', 'void': 'never',
'@stylistic/js/no-whitespace-before-property': 'error', 'normal': 'never',
'@stylistic/js/object-curly-newline': [ 'error', { 'multiline': true, 'minProperties': 3 } ], 'component': 'always'
'@stylistic/js/object-curly-spacing': [ 'error', 'always' ], },
'@stylistic/js/one-var-declaration-per-line': 'error', 'svg': 'always',
'@stylistic/js/quote-props': [ 'error', 'always' ], 'math': 'never'
'@stylistic/js/quotes': [ 'error', 'single' ], }
'@stylistic/js/rest-spread-spacing': [ 'error', 'never' ], ],
'@stylistic/js/semi': [ 'error', 'always' ], 'vue/max-attributes-per-line': [
'@stylistic/js/semi-spacing': [ 'error', { 'before': false, 'after': true } ], 'error',
'@stylistic/js/semi-style': [ 'error', 'last' ], {
'@stylistic/js/space-before-blocks': [ 'error', 'always' ], 'singleline': 3,
'@stylistic/js/space-before-function-paren': [ 'error', 'always' ], 'multiline': 1
'@stylistic/js/space-in-parens': [ 'error', 'always' ], }
'@stylistic/js/space-infix-ops': [ 'error', { 'int32Hint': false } ], ]
'@stylistic/js/space-unary-ops': 'error',
'@stylistic/js/spaced-comment': [ 'error', 'always' ],
'@stylistic/js/switch-colon-spacing': 'error',
'@stylistic/js/template-curly-spacing': [ 'error', 'always' ],
'@stylistic/js/wrap-iife': [ 'error', 'inside' ],
'@stylistic/js/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error',
} }
} }
); );
+2
View File
@@ -0,0 +1,2 @@
paths:
- /home/janis/projects/dotfiles/config/lint/latexfmt.yaml
+82
View File
@@ -0,0 +1,82 @@
# Use spaces for indent (because f*k tabs)
defaultIndent: " "
# Limit Number of backups
maxNumberOfBackups: 3
verbatimEnvironments:
verbatim: 1
lstlisting: 1
minted: 1
code: 1
indentRules:
recall: " "
remarks: " "
remark: " "
guides: " "
properties: " "
restrictions: " "
limitations: " "
terms: " "
notation: " "
usage: " "
task: " "
proof: " "
general: " "
simplebox: " "
definition: " "
theorem: " "
lemma: " "
corollary: " "
axiom: " "
fact: " "
proposition: " "
example: " "
formula: " "
conjugation: " "
forms: " "
lookForAlignDelims:
tables:
delims: 1
alignDoubleBackSlash: 1
spacesBeforeDoubleBackSlash: 1
multiColumnGrouping: 0
alignRowsWithoutMaxDelims: 1
spacesBeforeAmpersand: 1
spacesAfterAmpersand: 1
justification: left
alignFinalDoubleBackSlash: 0
dontMeasure: 0
delimiterRegEx: (?<!\\)(&)
delimiterJustification: left
lookForChildCodeBlocks: 1
alignContentAfterDoubleBackSlash: 0
spacesAfterDoubleBackSlash: 1
specialBeginEnd:
If:
begin: '\\If'
middle:
- '\\ElsIf'
- '\\Else'
end: '\\EndIf'
lookForThis: 1
For:
begin: '\\For'
end: '\\EndFor'
lookForThis: 1
Procedure:
begin: '\\Procedure'
end: '\\EndProcedure'
lookForThis: 1
Function:
begin: '\\Function'
end: '\\EndFunction'
lookForThis: 1
While:
begin: '\\While'
end: '\\EndWhile'
lookForThis: 1
specialBeforeCommand: 1
+8
View File
@@ -0,0 +1,8 @@
{
"devDependencies": {
"@eslint/js": "^9.28.0",
"@stylistic/eslint-plugin": "^4.4.1",
"eslint-plugin-vue": "^10.2.0",
"typescript-eslint": "^8.33.1"
}
}
-13
View File
@@ -1,13 +0,0 @@
/** Basic config file **/
configuration {
show-icons: true;
icon-theme: "Candy";
display-drun: "";
display-run: "🏃🏽‍♂️ ";
display-window: "🗔 ";
display-combi: "🔎 ";
dpi: 160;
}
@theme "style.rasi"
+5 -5
View File
@@ -2,9 +2,9 @@
background: #141414; background: #141414;
background-selected: #1E1E1E; background-selected: #1E1E1E;
foreground: #E6E6E6; foreground: #E6E6E6;
accent: #591641; accent: #EBC405;
accent-two: #97103A; accent-two: #B81C15;
// border-color: #2D2057; // border-color: #673722;
inactive: #C8C8C8; inactive: #C8C8C8;
spacing: 2; spacing: 2;
width: 30em; width: 30em;
@@ -18,8 +18,8 @@
border: 1px; border: 1px;
border-radius: 10px; border-radius: 10px;
padding: 0; padding: 0;
location: west; location: center;
anchor: west; anchor: center;
margin: 0; margin: 0;
} }
+2 -2
View File
@@ -22,11 +22,11 @@ button {
} }
button:hover { button:hover {
background-color: rgba(151, 16, 58, 0.5); background-color: rgba(184, 28, 21, 0.5);
} }
button:focus { button:focus {
background-color: rgb(151, 16, 58); background-color: rgb(184, 28, 21);
color: rgb(230, 230, 230); color: rgb(230, 230, 230);
} }
@@ -0,0 +1,11 @@
[filechooser]
cmd=yazi-wrapper.sh
default_dir=$HOME
; Uncomment to skip creating destination save files with instructions in them
; create_help_file=0
; Uncomment and edit the line below to change the terminal emulator command
; env=TERMCMD=foot
; Mode must be one of 'suggested', 'default', or 'last'.
open_mode=suggested
save_mode=suggested
+2
View File
@@ -0,0 +1,2 @@
[preferred]
org.freedesktop.impl.portal.FileChooser=termfilechooser
+1 -1
View File
@@ -2,7 +2,7 @@
# : Manager {{{ # : Manager {{{
[manager] [mgr]
cwd = { fg = "#8be9fd" } cwd = { fg = "#8be9fd" }
# Hovered # Hovered
@@ -1,6 +1,6 @@
# : Manager {{{ # : Manager {{{
[manager] [mgr]
cwd = { fg = "#7aa2f7" } # Blue cwd = { fg = "#7aa2f7" } # Blue
# Hovered # Hovered
@@ -7,7 +7,7 @@
# #
# A theme inspired by Visual Studio Code's Dark Modern theme. # A theme inspired by Visual Studio Code's Dark Modern theme.
[colors] [mgr]
background = "#1F1F1F" background = "#1F1F1F"
foreground = "#D4D4D4" foreground = "#D4D4D4"
selection = "#264F78" selection = "#264F78"
@@ -29,7 +29,7 @@ bright_magenta = "#AF00DB"
bright_cyan = "#0598BC" bright_cyan = "#0598BC"
bright_white = "#FFFFFF" bright_white = "#FFFFFF"
[manager] [mgr]
cwd = { fg = "cyan" } cwd = { fg = "cyan" }
# Hovered # Hovered
hovered = { fg = "#000000", bg = "#ADD6FF" } hovered = { fg = "#000000", bg = "#ADD6FF" }
+20 -15
View File
@@ -1,4 +1,4 @@
[manager] [mgr]
prepend_keymap = [ prepend_keymap = [
# # undo trash # # undo trash
@@ -7,31 +7,36 @@ prepend_keymap = [
{ on = "C", run = "plugin ouch tar.gz", desc = "Compress with ouch" }, { on = "C", run = "plugin ouch tar.gz", desc = "Compress with ouch" },
# Goto # Goto
{ on = [ "g", "h" ], run = "cd ~", desc = "Go to ~" }, { on = [ "g", "h" ], run = "cd ~", desc = "Go to ~" },
{ on = [ "g", "c", "c" ], run = "cd ~/.config", desc = "Go to ~/.config" },
{ on = [ "g", "c", "h" ], run = "cd ~/.config/hypr", desc = "Go to Hyprland config" },
{ on = [ "g", "c", "f" ], run = "cd ~/.config/fish", desc = "Go to Fish config" },
{ on = [ "g", "c", "y" ], run = "cd ~/.config/yazi", desc = "Go to Yazi config" },
{ on = [ "g", "c", "w" ], run = "cd ~/.config/waybar", desc = "Go to waybar config" },
{ on = [ "g", "c", "n" ], run = "cd ~/.config/nvim", desc = "Go to NeoVim config" },
{ on = [ "g", "a" ], run = "cd ~/.cache", desc = "Go to ~/.cache" }, { on = [ "g", "a" ], run = "cd ~/.cache", desc = "Go to ~/.cache" },
{ on = [ "g", "n" ], run = "cd ~/NextCloud/Documents/", desc = "Go to NextCloud Documents" },
{ on = [ "g", "e", "c" ], run = "cd ~/projects/active/eth-gitlab/eth-code-expert/Semester2/", desc = "Go to ETH-Code-Expert" },
{ on = [ "g", "e", "n" ], run = "cd ~/NextCloud/Documents/ETH/Semester2", desc = "Go to ETH Nextcloud" },
{ on = [ "g", "e", "p" ], run = "cd ~/projects/active/eth/semester2/", desc = "Go to ETH notes folder" },
{ on = [ "g", "e", "g" ], run = "cd ~/projects/active/eth-gitlab/pprog25-jahutz/", desc = "Go to ETH Gitlab folder" },
{ on = [ "g", "l", "b" ], run = "cd ~/.local/bin", desc = "Go to ~/.local/bin" }, { on = [ "g", "l", "b" ], run = "cd ~/.local/bin", desc = "Go to ~/.local/bin" },
{ on = [ "g", "l", "s" ], run = "cd ~/.local/share", desc = "Go to ~/.local/share" }, { on = [ "g", "l", "s" ], run = "cd ~/.local/share", desc = "Go to ~/.local/share" },
{ on = [ "g", "c", "c" ], run = "cd ~/.config", desc = "Go to ~/.config" },
{ on = [ "g", "c", "h" ], run = "cd ~/projects/dotfiles/config/hypr", desc = "Go to Hyprland config" },
{ on = [ "g", "c", "f" ], run = "cd ~/projects/dotfiles/config/fish", desc = "Go to Fish config" },
{ on = [ "g", "c", "y" ], run = "cd ~/projects/dotfiles/config/yazi", desc = "Go to Yazi config" },
{ on = [ "g", "c", "a" ], run = "cd ~/projects/dotfiles/config/astal", desc = "Go to astal config" },
{ on = [ "g", "c", "l" ], run = "cd ~/projects/dotfiles/config/lint", desc = "Go to linter configs" },
{ on = [ "g", "c", "k" ], run = "cd ~/projects/dotfiles/config/kitty", desc = "Go to kitty config" },
{ on = [ "g", "c", "r" ], run = "cd ~/projects/dotfiles/config/rofi", desc = "Go to rofi config" },
{ on = [ "g", "c", "s" ], run = "cd ~/projects/dotfiles/scripts", desc = "Go to script" },
{ on = [ "g", "c", "d" ], run = "cd ~/projects/dotfiles", desc = "Go to Dotfiles folder" },
{ on = [ "g", "c", "n" ], run = "cd ~/projects/nvim", desc = "Go to NeoVim config" },
{ on = [ "g", "n" ], run = "cd ~/NextCloud/Documents/", desc = "Go to NextCloud Documents" },
{ on = [ "g", "w" ], run = "cd ~/NextCloud/Wallpapers", desc = "Go to Wallpapers" },
{ on = [ "g", "e", "n" ], run = "cd ~/NextCloud/Documents/ETH/Semester3/", desc = "Go to ETH Nextcloud" },
{ on = [ "g", "e", "p" ], run = "cd ~/projects/eth/semester3/", desc = "Go to ETH git folder" },
{ on = [ "g", "e", "g" ], run = "cd ~/projects/eth/gitlab/spca2025-jahutz-hand-in/", desc = "Go to ETH Gitlab folder" },
{ on = [ "g", "e", "s" ], run = "cd ~/projects/eth/eth-summaries/semester3/", desc = "Go to ETH Summaries folder" },
{ on = [ "g", "s", "h" ], run = "cd ~/.steam/steam/steamapps/common", desc = "Go to ~/.steam/steam/steamapps/common" }, { on = [ "g", "s", "h" ], run = "cd ~/.steam/steam/steamapps/common", desc = "Go to ~/.steam/steam/steamapps/common" },
{ on = [ "g", "s", "g" ], run = "cd /mnt/games/SteamLibrary", desc = "Go to SteamLibrary on NTFS partition" }, { on = [ "g", "s", "g" ], run = "cd /mnt/games/SteamLibrary", desc = "Go to SteamLibrary on NTFS partition" },
{ on = [ "g", "s", "s" ], run = "cd /mnt/secondary/SteamLibrary", desc = "Go to SteamLibrary on main games drive" }, { on = [ "g", "s", "s" ], run = "cd /mnt/secondary/SteamLibrary", desc = "Go to SteamLibrary on main games drive" },
{ on = [ "g", "o" ], run = "cd /mnt/janis/Documents", desc = "Go to Documents" }, { on = [ "g", "o" ], run = "cd /mnt/janis/Documents", desc = "Go to Documents" },
{ on = [ "g", "d" ], run = "cd ~/Downloads", desc = "Go to ~/Downloads" }, { on = [ "g", "d" ], run = "cd ~/Downloads", desc = "Go to ~/Downloads" },
{ on = [ "g", "p", "a" ], run = "cd ~/projects/active", desc = "Go to Active projects" }, { on = [ "g", "p" ], run = "cd ~/projects", desc = "Go to projects" },
{ on = [ "g", "p", "r" ], run = "cd ~/projects/archive", desc = "Go to Archive projects" },
{ on = [ "g", "p", "p" ], run = "cd ~/projects", desc = "Go to projects" },
{ on = [ "g", "t", "m" ], run = "cd /tmp", desc = "Go to /tmp" }, { on = [ "g", "t", "m" ], run = "cd /tmp", desc = "Go to /tmp" },
{ on = [ "g", "t", "t" ], run = "cd ~/.local/share/Trash/", desc = "Go to TRASH" }, { on = [ "g", "t", "t" ], run = "cd ~/.local/share/Trash/", desc = "Go to TRASH" },
{ on = [ "g", "/" ], run = "cd /", desc = "Go to /" }, { on = [ "g", "/" ], run = "cd /", desc = "Go to /" },
{ on = [ "g", "m" ], run = "cd /run/media/$USER", desc = "Go to /run/media" }, { on = [ "g", "m" ], run = "cd /run/media/$USER", desc = "Go to /run/media" },
{ on = [ "g", "<Space>" ], run = "cd --interactive", desc = "Go to interactively" }, { on = [ "g", "<Space>" ], run = "cd --interactive", desc = "Go to interactively" },
{ on = [ "g", "-" ], run = "plugin vcs-files", desc = "Show Git file changes" },
] ]
+5
View File
@@ -8,5 +8,10 @@ use = "boydaihungst/restore"
rev = "5d22884" rev = "5d22884"
hash = "8e6fc2d660f661c91e30b10dd1a251b8" hash = "8e6fc2d660f661c91e30b10dd1a251b8"
[[plugin.deps]]
use = "yazi-rs/plugins:vcs-files"
rev = "e95c7b3"
hash = "cc8da55f1deda45ee3787cc97b58ffc9"
[flavor] [flavor]
deps = [] deps = []
+2 -1
View File
@@ -1,2 +1,3 @@
[flavor] [flavor]
use = "vscode-dark-modern" dark = "vscode-dark-modern"
light = "vscode-dark-modern"
+7
View File
@@ -8,3 +8,10 @@ prepend_previewers = [
{ mime = "application/x-rar", run = "ouch" }, { mime = "application/x-rar", run = "ouch" },
{ mime = "application/x-xz", run = "ouch" }, { mime = "application/x-xz", run = "ouch" },
] ]
[opener]
open = [
{ run = 'xdg-open "$@"', desc = "Open" },
{ run = 'okular "$@"', desc = "Open in Okular" },
{ run = 'evince "$@"', desc = "Open in Evince" },
]
+724
View File
@@ -0,0 +1,724 @@
import eslint from '@eslint/js';
import globals from 'globals';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
import typescript from '@typescript-eslint/eslint-plugin';
import vue from 'eslint-plugin-vue';
const style = {
'plugins': {
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
},
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting
'@stylistic/array-bracket-newline': [
'error',
{
'multiline': true,
'minItems': 2
}
],
'@stylistic/array-bracket-spacing': [
'error',
'always',
{
'singleValue': true,
'arraysInArrays': true,
'objectsInArrays': true
}
],
'@stylistic/array-element-newline': [
'error',
{
'multiline': true,
'minItems': 2
}
],
'@stylistic/arrow-parens': [
'error',
'as-needed'
],
'@stylistic/arrow-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/block-spacing': [
'error',
'always'
],
'@stylistic/brace-style': [
'error',
'1tbs'
],
'@stylistic/comma-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/comma-style': [
'error',
'last'
],
'@stylistic/dot-location': [
'error',
'property'
],
'@stylistic/eol-last': [
'error',
'always'
],
'@stylistic/function-call-spacing': [
'error',
'never'
],
'@stylistic/function-paren-newline': [
'error',
{
'minItems': 3
}
],
'@stylistic/function-call-argument-newline': [
'error',
'consistent'
],
'@stylistic/implicit-arrow-linebreak': [
'error',
'beside'
],
'@stylistic/indent': [
'error',
4
],
'@stylistic/key-spacing': [
'error',
{
'beforeColon': false,
'afterColon': true
}
],
'@stylistic/keyword-spacing': [
'error',
{
'before': true,
'after': true
}
],
'@stylistic/lines-between-class-members': [
'error',
'always'
],
'@stylistic/max-len': [
'warn',
{
'code': 120,
'comments': 140,
'ignoreComments': false,
'ignoreUrls': true,
'ignoreStrings': false
}
],
'@stylistic/new-parens': [
'error',
'always'
],
'@stylistic/newline-per-chained-call': [ 'error' ],
'@stylistic/no-extra-parens': [
'error',
'all',
{
'nestedBinaryExpressions': false,
'ternaryOperandBinaryExpressions': false,
'ignoreJSX': 'multi-line',
'nestedConditionalExpressions': false
}
],
'@stylistic/no-extra-semi': 'error',
'@stylistic/no-floating-decimal': 'error',
'@stylistic/no-mixed-operators': 'error',
'@stylistic/no-mixed-spaces-and-tabs': 'error',
'@stylistic/no-multi-spaces': 'error',
'@stylistic/no-multiple-empty-lines': [
'error',
{
'max': 3,
'maxEOF': 2
}
],
'@stylistic/no-tabs': 'error',
'@stylistic/no-trailing-spaces': 'error',
'@stylistic/no-whitespace-before-property': 'error',
'@stylistic/object-curly-newline': [
'error',
{
'multiline': true,
'minProperties': 1
}
],
'@stylistic/object-curly-spacing': [
'error',
'always'
],
'@stylistic/object-property-newline': 'error',
'@stylistic/operator-linebreak': [
'error',
'before'
],
'@stylistic/one-var-declaration-per-line': 'error',
'@stylistic/padded-blocks': [
'error',
{
'blocks': 'never',
'classes': 'always',
'switches': 'never',
}
],
// Padding lines. The most in-depth part of this config
'@stylistic/padding-line-between-statements': [
'error',
// Variables, Constants
{
'blankLine': 'never',
'prev': 'var',
'next': 'var'
},
{
'blankLine': 'never',
'prev': 'let',
'next': 'let'
},
{
'blankLine': 'never',
'prev': 'const',
'next': 'const'
},
{
'blankLine': 'always',
'prev': 'var',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'with'
]
},
{
'blankLine': 'always',
'prev': 'let',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': 'const',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'cjs-import',
'class',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'import',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// Import
{
'blankLine': 'never',
'prev': 'import',
'next': 'import'
},
{
'blankLine': 'never',
'prev': 'cjs-import',
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'cjs-import'
},
{
'blankLine': 'always',
'prev': 'cjs-import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
{
'blankLine': 'always',
'prev': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
],
'next': 'import'
},
{
'blankLine': 'always',
'prev': 'import',
'next': [
'block',
'block-like',
'break',
'cjs-export',
'class',
'const',
'continue',
'debugger',
'directive',
'do',
'empty',
'export',
'expression',
'for',
'function',
'if',
'iife',
'let',
'return',
'switch',
'throw',
'try',
'var',
'while',
'with'
]
},
// If
{
'blankLine': 'always',
'prev': '*',
'next': 'if'
},
{
'blankLine': 'always',
'prev': 'if',
'next': '*'
},
// For
{
'blankLine': 'always',
'prev': '*',
'next': 'for'
},
{
'blankLine': 'always',
'prev': 'for',
'next': '*'
},
// While
{
'blankLine': 'always',
'prev': '*',
'next': 'while'
},
{
'blankLine': 'always',
'prev': 'while',
'next': '*'
},
// Functions
{
'blankLine': 'always',
'prev': '*',
'next': 'function'
},
{
'blankLine': 'always',
'prev': 'function',
'next': '*'
},
// Block Statements
{
'blankLine': 'always',
'prev': '*',
'next': 'block-like'
},
{
'blankLine': 'always',
'prev': 'block-like',
'next': '*'
},
// Switch
{
'blankLine': 'always',
'prev': '*',
'next': 'switch'
},
{
'blankLine': 'always',
'prev': 'switch',
'next': '*'
},
// Try-Catch
{
'blankLine': 'always',
'prev': '*',
'next': 'try'
},
{
'blankLine': 'always',
'prev': 'try',
'next': '*'
},
// Throw
{
'blankLine': 'always',
'prev': '*',
'next': 'throw'
},
{
'blankLine': 'always',
'prev': 'throw',
'next': '*'
},
// Return
{
'blankLine': 'never',
'prev': 'return',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'return'
},
// Export
{
'blankLine': 'always',
'prev': '*',
'next': 'export'
},
{
'blankLine': 'always',
'prev': 'export',
'next': '*'
},
{
'blankLine': 'always',
'prev': '*',
'next': 'cjs-export'
},
{
'blankLine': 'always',
'prev': 'cjs-export',
'next': '*'
},
// Classes
{
'blankLine': 'always',
'prev': '*',
'next': 'class'
},
{
'blankLine': 'always',
'prev': 'class',
'next': '*'
},
],
'@stylistic/quote-props': [
'error',
'always'
],
'@stylistic/quotes': [
'error',
'single'
],
'@stylistic/rest-spread-spacing': [
'error',
'never'
],
'@stylistic/semi': [
'error',
'always'
],
'@stylistic/semi-spacing': [
'error',
{
'before': false,
'after': true
}
],
'@stylistic/semi-style': [
'error',
'last'
],
'@stylistic/space-before-blocks': [
'error',
'always'
],
'@stylistic/space-before-function-paren': [
'error',
'always'
],
'@stylistic/space-in-parens': [
'error',
'always'
],
'@stylistic/space-infix-ops': [
'error',
{
'int32Hint': false
}
],
'@stylistic/space-unary-ops': 'error',
'@stylistic/spaced-comment': [
'error',
'always'
],
'@stylistic/template-curly-spacing': [
'error',
'always'
],
'@stylistic/switch-colon-spacing': 'error',
'@stylistic/wrap-iife': [
'error',
'inside'
],
'@stylistic/wrap-regex': 'error',
'@stylistic/ts/type-annotation-spacing': 'error',
}
};
/** @type {import('eslint').Linter.Config} */
export default tseslint.config(
// Base JavaScript rules
eslint.configs.recommended,
tseslint.configs.recommended,
style,
// Vue support (including TS and JSX inside SFCs)
{
'files': [ '**/*.vue' ],
'languageOptions': {
'sourceType': 'module',
'ecmaVersion': 'latest',
'globals': globals.browser,
'parserOptions': {
'parser': tseslint.parser,
},
},
'plugins': {
'vue': vue,
'@stylistic': stylistic,
'@stylistic/js': stylistic,
'@stylistic/ts': stylistic,
'@typescript-eslint': typescript,
},
'extends': [
eslint.configs.recommended,
...vue.configs['flat/recommended']
],
'rules': {
...typescript.configs.recommended.rules,
...style.rules,
// Vue specific rules
'@stylistic/indent': 'off',
'vue/html-indent': [
'error',
4
],
'vue/html-comment-indent': [
'error',
4
],
'vue/script-indent': [
'error',
4,
{
'baseIndent': 1,
'switchCase': 1
}
],
'vue/html-self-closing': [
'error',
{
'html': {
'void': 'never',
'normal': 'never',
'component': 'always'
},
'svg': 'always',
'math': 'never'
}
],
'vue/max-attributes-per-line': [
'error',
{
'singleline': 3,
'multiline': 1,
}
],
},
},
);
+22 -22
View File
@@ -40,40 +40,40 @@
/* /*
* ── Accent colour ──────────────────────────────────────────────────── * ── Accent colour ────────────────────────────────────────────────────
*/ */
@define-color accent #591641; @define-color accent #EBC405;
@define-color accent_rgba_05 rgba(89, 22, 65, 0.5); @define-color accent_rgba_05 rgba(235, 196, 5, 0.5);
@define-color accent_rgba_03 rgba(89, 22, 65, 0.3); @define-color accent_rgba_03 rgba(235, 196, 5, 0.3);
@define-color accent_rgba_02 rgba(89, 22, 65, 0.2); @define-color accent_rgba_02 rgba(235, 196, 5, 0.2);
@define-color accent_rgba_015 rgba(89, 22, 65, 0.15); @define-color accent_rgba_015 rgba(235, 196, 5, 0.15);
@define-color accent_rgba_011 rgba(89, 22, 65, 0.11); @define-color accent_rgba_011 rgba(235, 196, 5, 0.11);
@define-color accent_rgba_007 rgba(89, 22, 65, 0.07); @define-color accent_rgba_007 rgba(235, 196, 5, 0.07);
/* /*
* ── Accent Gradient ────────────────────────────────────────────────── * ── Accent Gradient ──────────────────────────────────────────────────
*/ */
@define-color accent_gradient_1 #390E2A; @define-color accent_gradient_1 #967D03;
@define-color accent_gradient_2 #2E0B21; @define-color accent_gradient_2 #786403;
@define-color accent_gradient_3 #24091B; @define-color accent_gradient_3 #605002;
@define-color accent_gradient_4 #1D0715; @define-color accent_gradient_4 #4D4002;
@define-color accent_gradient_5 #170611; @define-color accent_gradient_5 #3E3301;
@define-color accent_gradient_inverse_1 #8B2266; @define-color accent_gradient_inverse_1 #FFFF08;
@define-color accent_gradient_inverse_2 #8B2266; @define-color accent_gradient_inverse_2 #FFFF08;
@define-color accent_gradient_inverse_3 #8B2266; @define-color accent_gradient_inverse_3 #FFFF08;
/* /*
* ── Secondary accent colour ────────────────────────────────────────── * ── Secondary accent colour ──────────────────────────────────────────
*/ */
@define-color accent2 #97103A; @define-color accent2 #B81C15;
@define-color accent2_rgba_05 rgba(151, 16, 58, 0.5); @define-color accent2_rgba_05 rgba(184, 28, 21, 0.5);
@define-color accent2_rgba_03 rgba(151, 16, 58, 0.3); @define-color accent2_rgba_03 rgba(184, 28, 21, 0.3);
@define-color accent2_rgba_02 rgba(151, 16, 58, 0.2); @define-color accent2_rgba_02 rgba(184, 28, 21, 0.2);
@define-color accent2_rgba_015 rgba(151, 16, 58, 0.15); @define-color accent2_rgba_015 rgba(184, 28, 21, 0.15);
@define-color accent2_rgba_01 rgba(151, 16, 58, 0.1); @define-color accent2_rgba_01 rgba(184, 28, 21, 0.1);
/* /*
* ── Tertiary accent colour ─────────────────────────────────────────── * ── Tertiary accent colour ───────────────────────────────────────────
*/ */
@define-color accent3 #2D2057; @define-color accent3 #673722;
/* /*
* ── Inactive Colour ────────────────────────────────────────────────── * ── Inactive Colour ──────────────────────────────────────────────────
+124 -18
View File
@@ -1,37 +1,143 @@
#!/bin/sh #!/bin/sh
# Read platform to install on (only if no platform file present in ~/.config/) echo "
read -p "Choose the configs to install, Laptop or Desktop (l/D): " platform ==> Setting up arch4edu & yay
"
git clone https://aur.archlinux.org/yay
cd yay
makepkg -si
cd ..
rm -rf yay
reflector -c 'Switzerland, Germany' --sort 'rate' --protocol https --latest 10 --save /etc/pacman.d/mirrorlist
echo "Server = https://at.arch4edu.mirror.kescher.at/\$arch" >/etc/pacman.d/mirrorlist
sudo cp ./system/pacman.conf /etc/pacman.conf
sudo pacman-key --recv-keys 7931B6D628C8D3BA
sudo pacman-key --finger 7931B6D628C8D3BA
sudo pacman-key --lsign-key 7931B6D628C8D3BA
# Packages to be added to install: aylurs-gtk-shell-git, brightnessctl, zoxide, trash-cli, fzf, ouch
# Install yazi plugins using ya pack -a ndtoan96/ouch and ya pack -a boydaihungst/restore
#
# TODO: get configs from current setup
# Hyprland # Hyprland
yay -S hyprland hypridle hyprfreeze hyprlock plymouth aylurs-gtk-shell-git brightnessctl pulsemixer xdg-desktop-portal-hyprland echo "
==> Installing Hyprland
"
sleep 2
yay -S --noconfirm --noremovemake hyprland hypridle hyprfreeze hyprlock aylurs-gtk-shell brightnessctl pulsemixer xdg-desktop-portal-hyprland cliphist grimblast wl-clipboard polkit-gnome swaybg polkit-kde-agent grim rofi cpio sysstat
# Audio, drivers, tools # Audio, drivers
yay -S pipewire pipewire-alsa pipewire-pulse pipewire-jack mesa fish thunar yazi wireplumber grimblast wl-clipboard wget vimiv zoxide trash-cli fzf ouch zathura sensors radeontop lm-sensors echo "
==> Installing drivers...
"
sleep 2
yay -S --noconfirm --noremovemake pipewire pipewire-alsa pipewire-pulse pipewire-jack mesa wireplumber trash-cli sensors radeontop lm-sensors smartmontools
# Tools
echo "
==> Installing tools...
"
sleep 2
yay -S --noconfirm --noremovemake fish fzf ouch zathura zathura-pdf-poppler wget vimiv zoxide thunar yazi gnome-tweaks lxappearance gnome-keyring ffmpeg network-manager-applet cpupower-gui python-tkinter acpi python-pillow seahorse man man-pages ntp
# Set up yazi # Set up yazi
ya pack -a ndtoan96/ouch echo "
ya pack -a boydaihungst/restore ==> Setting up yazi...
"
sleep 2
ya pkg add ndtoan96/ouch
ya pkg add boydaihungst/restore
ya pkg add yazi-rs/plugins:vcs-files
# Fonts # Fonts
yay -S adobe-source-code-pro-fonts gnome-font-viewer gnome-characters gnome-tweaks lxappearance kvantum gnome-keyring smartmontools ffmpeg polkit-gnome swaybg network-manager-applet polkit-kde-agent cpupower-gui ttf-fantasque-nerd ttf-jetbrains-mono-nerd ttf-fluentui-system-icons ttf-comfortaa echo "
==> Installing fonts...
"
sleep 2
yay -S --noconfirm --noremovemake adobe-source-code-pro-fonts gnome-font-viewer gnome-characters ttf-fantasque-nerd ttf-jetbrains-mono-nerd ttf-fluentui-system-icons ttf-comfortaa candy-icons
# Programming # Programming
yay -S meld docker vscodium kitty fish docker terminator ghex nodejs npm python-pip git-credential-manager-core-bin wine kate rustup cargo filezilla typescript-language-server php jdk vscode-css-languageserver vscode-html-languageserver bash-language-server lazygit echo "
sudo npm i -g @vue/typescript-plugin ==> Installing coding tools...
"
sleep 2
yay -S --noconfirm --noremovemake docker vscodium kitty fish docker terminator bvi nodejs npm python-pip git-credential-manager-bin wine kate rustup cargo filezilla php jdk ripgrep
# nvim # nvim
yay -S neovim lua lua-language-server tree-sitter texlab stylua luarocks jdtls perl julia autojump pyright echo "
==> Installing nvim...
"
sleep 2
yay -S --noconfirm --noremovemake neovim lua lua-language-server tree-sitter tree-sitter-cli texlab stylua luarocks jdtls perl julia pyright vscode-css-languageserver vscode-html-languageserver bash-language-server python-black proselint asmfmt typescript-language-server shfmt sass ruby eslint_d nvimpager
sudo npm i -g @vue/typescript-plugin
# Internet # Internet
yay -S librewolf-bin webcord-bin thunderbird rustdesk brave-bin echo "
==> Installing internet programs...
"
sleep 2
yay -S --noconfirm --noremovemake librewolf-bin vesktop-bin thunderbird rustdesk brave-bin
# Utilities # Utilities
yay -S okular vlc nextcloud-client p7zip zip unzip gnome-keyring noto-fonts thunderbird pamixer pavucontrol light neofetch bashtop hugo sddm uxplay upower echo "
==> Installing other utilities...
"
sleep 2
yay -S --noconfirm --noremovemake okular vlc nextcloud-client p7zip zip unzip noto-fonts pavucontrol light fastfetch bashtop hugo uxplay upower gdu dig nwg-look serpl fcitx5 qalculate-gtk openconnect light blueman xdg-desktop-portal-termfilechooser-hunkyburrito-git lazygit tldr cloc usbutils bluez-utils bluez
# LaTeX # LaTeX
yay -S texlive biber echo "
==> Installing LaTeX...
"
sleep 2
yay -S --noconfirm --noremovemake texlive biber texlive-latexextra perl-yaml-tiny perl-file-homedir libxcrypt-compat
# WebDev utilities
echo "
==> Installing webdev utilities...
"
sleep 2
sudo npm i -g create-vue sitemap-generator-cli http-server
echo "
==> Doing system config...
"
sleep 2
sudo cp ./system/greetd/config.toml /etc/greetd/config.toml
chsh -s /bin/fish
sudo systemctl enable greetd
cd ./build/
npm i
cd ..
cd ./config/astal/
mkdir node_modules && cd node_modules && ln -sf /usr/share/astal/gjs/ ./astal
cd ../../config/ags/notifications/
mkdir node_modules && cd node_modules && ln -sf /usr/share/astal/gjs/ ./astal
cd ~/projects/dotfiles/
./setup
cd ~/projects/
git clone https://git.janishutz.com/janishutz/nvim
cd nvim
./nvim-install.sh
xdg-settings set default-web-browser librewolf.desktop
xdg-mime default org.pwmt.zathura.desktop application/pdf
sudo systemctl disable rustdesk
sudo systemctl enable --now systemd-timesyncd
hyprpm update
git-credential-manager configure
echo "
==> DONE!
Run the postinstall script after a reboot and logging into NextCloud
to install the grub theme and cursor icons.
Use GNOME Tweaks and nwg-look to change the necessary appearance settings.
"
+13 -8
View File
@@ -17,12 +17,14 @@
- [ ] AppLauncher (possibly, if anyrun is no good, probably not) - [ ] AppLauncher (possibly, if anyrun is no good, probably not)
- [ ] OSD (see [here](https://github.com/Aylur/astal/tree/main/examples/gtk3/js)) - [ ] OSD (see [here](https://github.com/Aylur/astal/tree/main/examples/gtk3/js))
- [x] Open Window List for bar when hovering over window title and per-workspace when hovering over workspace - [x] Open Window List for bar when hovering over window title and per-workspace when hovering over workspace
- [ ] Keybind to open QuickActions
- [ ] Improve handling of tray items (crashes on update of submenus)
- [ ] Text recognition - [ ] Text recognition
- [ ] Theming - [ ] Theming
- [x] Vivado dark mode - [x] Vivado dark mode
- [x] GTK - [x] GTK
- [x] QT (via environment variable) - [x] QT (via environment variable)
- [x] ~Librewolf~ - [x] Librewolf
- [x] Astal - [x] Astal
- [x] Hyprland - [x] Hyprland
- [x] Rofi - [x] Rofi
@@ -41,23 +43,26 @@
- [ ] Read docs - [ ] Read docs
- [ ] battery management - [ ] battery management
- [ ] Programs - [ ] Programs
- [ ] New image viewer (eog, vimiv) - [ ] Switch to vimiv (make default and configure)
- [x] Other pdf reader (maybe -> zathura) - [x] Other pdf reader (maybe -> zathura)
- [x] Maybe TUI archive manager (~felix-rs~, ouch in yazi) - [x] Maybe TUI archive manager (~felix-rs~, ouch in yazi)
- [ ] vimiv
- [ ] Configure
- [ ] Theme
- [ ] Lazygit: Configure - [ ] Lazygit: Configure
- [ ] Nvim (other repo) - [ ] Nvim (other repo)
- [x] Replace notification handler (noice) - [x] Replace notification handler (noice)
- [ ] Configure formatters (of Java, Cpp, TS/JS/Vue, Python) - [ ] Configure formatters (of Java, Cpp, TS/JS/Vue, Python)
- [ ] Maybe: Add extra configs to commentbox - [ ] Maybe: Add extra configs to commentbox
- [ ] Remove trouble (useless for my purposes) - [ ] Remove trouble (useless for my purposes)
- [ ] Yazi - [x] Yazi
- [x] More keybinds - [x] More keybinds
- [ ] Configure - [x] Configure
- [ ] Drag and drop support? - [ ] ~Drag and drop support?~
- [ ] Check out plugins - [x] Check out plugins
- [x] Use as file picker - [x] Use as file picker
- [ ] SDDM - [x] SDDM
- [ ] Replace with LightDM or ensure theming works, but prefer replacing, consider greetd + tuigreet - [x] Replace with LightDM or ensure theming works, but prefer replacing, consider greetd + tuigreet
- [ ] Scripts - [ ] Scripts
- [ ] Installer (after the basic OS setup is done (= from chroot onwards)) - [ ] Installer (after the basic OS setup is done (= from chroot onwards))
- [x] Theming script - [x] Theming script
+8
View File
@@ -0,0 +1,8 @@
{
"devDependencies": {
"@eslint/js": "^9.37.0",
"@stylistic/eslint-plugin": "^5.4.0",
"eslint-plugin-vue": "^10.5.1",
"typescript-eslint": "^8.46.1"
}
}
Executable
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
cd ~/NextCloud/Documents/Private/PC/
unzip ./oreo_spark_blue_cursors.zip
sudo mv ./oreo_spark_blue_cursors /usr/share/icons
cd ~/NextCloud/Documents/Private/PC/monterey-grub-theme/
sudo chmod +x ./install.sh
sudo ./install.sh
-60
View File
@@ -1,60 +0,0 @@
# Bar
## Attempt 1
Use Astal (https://aylur.github.io/astal) to write me a new status bar for hyprland. You may use JSX (be aware, it's not react, but gjs based and has therefore some limitations), but I prefer using the other syntax that is similar to what it was for AGS (the old version of astal), which more closely resembles GTK syntax. The bar should include the following, from left to right:
Left aligned
- Date & Time (with seconds, preferably)
- System stats (i.e. CPU, Memory util, Screen Brightness & Battery status, if available)
- Workspace number
Centered
- The window name
Right aligned (still left to right)
- System tray
- QuickAction menu in GNOME QuickAction menu style, but only the closed version showing icons for volume, mic, WiFi / Ethernet and a Power icon. For the icons (all throughout the bar) use the fluentui-icons (so the Windows 11 icons). If you can't provide them here, tell me what icon should go there and I will put it there manually
The actual QuickAction Menu (which you could also write in a separate file) will provide options where I can pick WiFi, Bluetooth (also turn it on and off), change volume of mic and output, pick the mic and output, have media controls and have a power menu).
For the QuickAction menu, provide a function that is exposed from the file to open and close it, as for all the features (like enabling BT, WiFi, etc).
### Followups
To the WiFi and Bluetooth menus, add the option to pick a WiFi Network / Bluetooth device. Please also fully extract the QuickActions menu to a separate file.
Now, can you also provide scss for the bar, such that:
- I have an easy way to customize colours (which I will be doing using one of my scripts, so having a separate colour config file will be a great option)
- it is very rounded (the corners)
- it has a very sleek, but modern design, with only a single accent colour
- Hovering over something clickable uses a hover colour
## Attempt 2
Using AstalNetwork, can you write a UI (that can be integrated into a popover) and a corresponding backend that allows me to:
- Turn on/off networking and WiFi
- Select a WiFi Network
- Some way of adding a new connection (can be a special UI or simply opens up another tool like nm-applet's network config)
- WiFi-Auto-Connect
- Exposes a function (or multiple) through which I can get (as a bindable porperty):
- Current up/down speed
- Connection type
- WiFi SSID (if applicable)
- WiFi Signal Strength (if applicable)
- Local IP
I would prefer if you could split up the logic from the UI, i.e. have the logic in a separate TS file and have the UI as its own TSX file and simply import the logic
# GTK THEME
Provide GTK CSS for Gtk 4, as short as possible, but including everything that is necessary to make it look good, where you have the following options for colours to pick. They will be replaced by a script (no need to provide that) according to some variables
- #000 (normal background)
- #111 (accent background, to differentiate, will be slightly brighter / darker
- #222 (secondary accent background, slightly brighter / darker than #111)
- #333 (inactive background, but could also be used to be slightly brighter / dark than #222)
- #555 (shadow colour)
- #555A (shadow colour, but as RGBA value)
- #F00 (accent colour, primary accent colour)
- #0F0 (secondary accent colour, use if it makes sense to differentiate from the primary accent)
- #00F (tertiary accent colour, use sparingly)
- #AAA (inactive colour, darker / brighter than primary foreground colour)
- #FFF (primary foreground colour)
Propose additional colours in a similar format (three-digit hex) and explain what they are for if necessary. Make the theme rounded and include as many of the widgets as needed or possible
+1
View File
@@ -3,3 +3,4 @@ $bg-color: {{ colour-background-hex }};
$accent-color: {{ colour-accent-hex }}; $accent-color: {{ colour-accent-hex }};
$accent-color-2: {{ colour-accent-2-hex }}; $accent-color-2: {{ colour-accent-2-hex }};
$shadow-color: {{ colour-shadow-rgba-03 }}; $shadow-color: {{ colour-shadow-rgba-03 }};
$monospace-font: {{ font-mono }}
+1 -5
View File
@@ -9,10 +9,6 @@
#██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██
general {
grace = 15
}
# ┌ ┐ # ┌ ┐
# │ BACKGROUND │ # │ BACKGROUND │
# └ ┘ # └ ┘
@@ -49,7 +45,7 @@ label {
monitor = monitor =
text = <b>$TIME</b> text = <b>$TIME</b>
color = {{ colour-primary-rgb }} color = {{ colour-primary-rgb }}
font_size = 100 font_size = 150
font_family = {{ font-primary }} font_family = {{ font-primary }}
position = 0, 80 position = 0, 80
-13
View File
@@ -1,13 +0,0 @@
/** Basic config file **/
configuration {
show-icons: true;
icon-theme: "{{ icon-theme }}";
display-drun: "";
display-run: "🏃🏽‍♂️ ";
display-window: "🗔 ";
display-combi: "🔎 ";
dpi: 160;
}
@theme "style.rasi"
+2 -2
View File
@@ -18,8 +18,8 @@
border: 1px; border: 1px;
border-radius: 10px; border-radius: 10px;
padding: 0; padding: 0;
location: west; location: center;
anchor: west; anchor: center;
margin: 0; margin: 0;
} }
+2 -1
View File
@@ -1,2 +1,3 @@
[flavor] [flavor]
use = "{{ yazi-theme }}" dark = "{{ yazi-theme }}"
light = "{{ yazi-theme }}"
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
node "$SCRIPT_DIR/util/auto-renamer/index.js" $@
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
extension="out"
read -p "Pick extension to convert from: " extension
outfolder="out"
outext="mp4"
read -p "Output folder: " outfolder
read -p "Output extension: " outext
mkdir $outfolder
for file in *.$extension; do
ffmpeg -i "$file" "$outfolder/${file%.$extension}.$outext"
echo "\n\n==> Conversion complete\n\n"
done
+28 -12
View File
@@ -1,29 +1,41 @@
#!/usr/bin/env bash #!/usr/bin/env bash
connect() { connect() {
read -sp $'Please type in your Encryption Password:\n' encpass read -sp $'Please enter your Encryption Password: ' encpass
echo "
==> Connecting"
TOKEN=$(cat ~/.local/share/ethz-vpn-connect/ethzvpntoken.secret | openssl enc -aes-256-cbc -pbkdf2 -d -a -k $encpass) TOKEN=$(cat ~/.local/share/ethz-vpn-connect/ethzvpntoken.secret | openssl enc -aes-256-cbc -pbkdf2 -d -a -k $encpass)
PASSWORD=$(cat ~/.local/share/ethz-vpn-connect/ethzvpnpass.secret | openssl enc -aes-256-cbc -pbkdf2 -d -a -k $encpass) PASSWORD=$(cat ~/.local/share/ethz-vpn-connect/ethzvpnpass.secret | openssl enc -aes-256-cbc -pbkdf2 -d -a -k $encpass)
USERNAME=$(cat ~/.local/share/ethz-vpn-connect/ethzvpnusername.txt) USERNAME=$(cat ~/.local/share/ethz-vpn-connect/ethzvpnusername.txt)
echo $PASSWORD | sudo openconnect -b -u $USERNAME@student-net.ethz.ch -g student-net --useragent=AnyConnect --passwd-on-stdin --token-mode=totp --token-secret=sha1:base32:$TOKEN sslvpn.ethz.ch echo $PASSWORD | sudo openconnect -b -u $USERNAME@student-net.ethz.ch -g student-net --useragent=AnyConnect --no-external-auth --passwd-on-stdin --token-mode=totp --token-secret=sha1:base32:$TOKEN sslvpn.ethz.ch
if [ $? -ne 0 ]; then
echo ' ==> Failed to connect <=='
else
echo ' ==> Connected <==
'
fi
encpass="" encpass=""
PASSWORD="" PASSWORD=""
TOKEN="" TOKEN=""
} }
disconnect() { disconnect() {
sudo killall -v -SIGINT openconnect #add -i option to ask for confirmation, usefull if running multible openconnect. sudo killall -v -SIGINT openconnect
echo " ==> Disconnected"
} }
setup() { setup() {
echo 'You are about to overwrite your secrets. Press ctrl + C to cancel.' echo 'You are about to overwrite your secrets. Press ctrl + C to cancel.'
read -p $'Please type in your Username: ' USERNAME read -p 'Please enter your ETHZ-Username: ' USERNAME
echo 'Ok!' read -sp 'Please choose and enter your Encryption Password (will be required when launching): ' encpass
read -sp $'Please type in your Encryption Password: ' encpass echo ""
echo 'Ok!' read -sp 'Please enter your ETHZ WLAN (= Radius) Password: ' PASSWORD
read -sp $'Please type in your ETHZ WLAN Password: ' PASSWORD echo ""
echo 'Ok!' read -sp 'Please enter your ETHZ OTP Secret: ' TOKEN
read -sp $'Please type in your ETHZ OTP Secret: ' TOKEN echo ""
if [[ -d ~/.local/share/ethz-vpn-connect ]]; then
rm -rf ~/.local/share/ethz-vpn-connect
fi
mkdir ~/.local/share/ethz-vpn-connect mkdir ~/.local/share/ethz-vpn-connect
echo $PASSWORD | openssl enc -aes-256-cbc -pbkdf2 -a -k $encpass >~/.local/share/ethz-vpn-connect/ethzvpnpass.secret echo $PASSWORD | openssl enc -aes-256-cbc -pbkdf2 -a -k $encpass >~/.local/share/ethz-vpn-connect/ethzvpnpass.secret
echo $TOKEN | openssl enc -aes-256-cbc -pbkdf2 -a -k $encpass >~/.local/share/ethz-vpn-connect/ethzvpntoken.secret echo $TOKEN | openssl enc -aes-256-cbc -pbkdf2 -a -k $encpass >~/.local/share/ethz-vpn-connect/ethzvpntoken.secret
@@ -31,7 +43,11 @@ setup() {
encpass="" encpass=""
PASSWORD="" PASSWORD=""
TOKEN="" TOKEN=""
echo $'Secrets set\n' if [ $? -ne 0 ]; then
echo ' ==> Failed to set secrets <=='
else
echo ' ==> Secrets set <==\n'
fi
} }
case "$1" in case "$1" in
@@ -54,6 +70,6 @@ setup)
setup setup
;; ;;
*) *)
echo -e 'Usage: ethz-vpn [Option] \n [Option]: \n connect, c: Connect VPN \n disconnect, d, dc: Disconnect VPN \n setup: set secrets and eth-Kürzel.\n' echo -e 'Usage: ethz-vpn [Option] \n [Option]: \n connect, c: Connect VPN \n disconnect, d, dc: Disconnect VPN \n setup: set secrets and eth-Username.\n'
;; ;;
esac esac
+7
View File
@@ -0,0 +1,7 @@
#!/bin/sh
cp -f ~/.config/hypr/hyprland_docked.conf ~/.config/hypr/hyprland.conf
./restart-bar
echo " ==> Done! To revert to normal config, run apply-config"
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
echo "Word count is $(pdftotext $1 - | tr -d '.' | wc -w)"
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
echo "
=> Restarting ags
"
killall gjs
killall ags
sleep 4
ags run -d ~/projects/dotfiles/config/astal --gtk 4 & disown
sleep 2
ags run -d ~/projects/dotfiles/config/ags/notifications --gtk 3 & disown
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
cp "$SCRIPT_DIR/../config/lint/clang-format" ./.clang-format
+1 -2
View File
@@ -4,6 +4,5 @@ SCRIPT_DIR=$(dirname "$0")
cp "$SCRIPT_DIR/../config/lint/eslint.config.mjs" . cp "$SCRIPT_DIR/../config/lint/eslint.config.mjs" .
# TODO: Improve eslint config to include JSX and Vue configs too, read on website npm i --save-dev @eslint/js typescript-eslint @stylistic/eslint-plugin eslint-plugin-vue
npm i --save-dev @eslint/js typescript-eslint @stylistic/eslint-plugin
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
cp "$SCRIPT_DIR/../config/lint/latexfmt.yaml" ./.latexindent.yaml
+10
View File
@@ -0,0 +1,10 @@
#!/bin/sh
enabled=$(hyprctl getoption input:kb_options | grep "caps:swapescape")
if [[ $enabled == "" ]]; then
hyprctl keyword input:kb_options "caps:swapescape"
notify-send "Swapescape enabled"
else
hyprctl keyword input:kb_options ""
notify-send "Swapescape disabled"
fi
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
cd ~/projects/nvim/
git pull
./nvim-install.sh
+5
View File
@@ -0,0 +1,5 @@
#!/bin/sh
docker container rm open-webui
docker image pull ghcr.io/open-webui/open-webui
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v /home/janis/projects/otherProjects/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:latest
+238
View File
@@ -0,0 +1,238 @@
const fs = require('fs');
const path = require('path');
const { argv } = require('process');
const config = {
// replace character of key with value, any character, apart from ['.', '_', '-', ' ']
'replace': {
'ä': 'ae',
'ö': 'oe',
'ü': 'ue',
',': '-',
'&': 'And',
},
'rules': {
'underscore-before-and-after-number': true, // Will not do trailing or leading for filename
'enforce-leading-zero': true, // adds a leading zero to any number below 10
'camel-case-rules': {
'enforce-snake-case-for-filetypes': ['py'], // using underscores
'enforce-kebab-case-for-filetypes': ['css', 'html', 'scss', 'tex'], // using hyphens
},
'file-start-letter': 'lower', // lower, upper, unchanged
'directory-start-letter': 'upper', // lower, upper, unchanged
'replace-dots-with': '', // will not replace as leading character to not break dotfiles
}
}
/**
* Recursively find all files with extension in a directory
* @param {string} dir The directory to search. Either absolute or relative path
* @param {string} extension The file extension to look for
* @param {boolean} cleanup If helper files (like .DS_STORE and Windows helpers should be auto-deleted)
* @param {string[]} ignoreList A list of filenames or directories to ignore
* @returns {{ files: string, directories: string }} returns a list of html files with their full path
*/
const treeWalker = (dir, extension, cleanup, ignoreList) => {
const ls = fs.readdirSync(dir);
const fileList = [];
const dirList = [];
for (let file in ls) {
if (fs.statSync(path.join(dir, ls[file])).isDirectory()) {
// Filter ignored directories
if (ignoreList === undefined || !ignoreList.includes(ls[file])) {
const newData = treeWalker(path.join(dir, ls[file]), extension, ignoreList);
const newFiles = newData.files;
dirList.push( path.join( dir, ls[ file ] ) );
for (let dir = 0; dir < newData.directories.length; dir++) {
dirList.push( newData.directories[dir] );
}
for (let file = 0; file < newFiles.length; file++) {
fileList.push(newFiles[file]);
}
}
} else if (extension == '*' || ls[file].includes(extension)) {
if (ignoreList === undefined || !ignoreList.includes(ls[file])) {
fileList.push(path.join(dir, ls[file]));
}
}
}
return { 'files': fileList, 'directories': dirList };
}
/**
* @param {string} filename The filename to fix according to the rules
* @returns {string} the fixed filename
*/
const fixName = ( fn, ft ) => {
let out = '';
const enforceSnake = config.rules['camel-case-rules']['enforce-snake-case-for-filetypes'].includes( ft );
const enforceKebab = config.rules['camel-case-rules']['enforce-kebab-case-for-filetypes'].includes( ft );
const isDir = ft === 'directory';
const startLetter = isDir ? config.rules['directory-start-letter'] : config.rules['file-start-letter'];
let nextUpperCase = false;
for ( let i = 0; i < fn.length; i++ ) {
const c = fn[i];
if ( c == '.' ) {
// Rule: Removed after number, allowed elsewhere
if ( i > 0 && /[0-9]/.test( fn[ i - 1 ] ) ) {
out += config.rules[ 'replace-dots-with' ];
} else {
out += '.';
}
} else if ( /[A-Z]/.test( c ) ) {
// If we reach a capital letter and enforce either kebab-case or snake_case, we can assume that this is the start of a CamelCase word
if ( enforceKebab ) {
out += '-' + c.toLowerCase();
} else if ( enforceSnake ) {
out += '_' + c.toLowerCase();
} else {
nextUpperCase = false;
if ( i == 0 && startLetter === 'lower' ) {
out += c.toLowerCase();
} else {
out += c;
}
}
} else if ( c == ' ' ) {
// We always replace spaces, the question is just to what
if ( enforceKebab ) {
out += '-';
} else if ( enforceSnake ) {
out += '_';
} else {
nextUpperCase = true;
}
} else if ( c == '_' ) {
// If we are not enforcing snake_case, then replace it
if ( !enforceSnake ) {
if ( needsUnderscore( i, fn ) ) {
out += '_';
} else if ( enforceKebab ) {
out += '-';
} else {
nextUpperCase = true;
}
} else {
out += '_'
}
} else if ( c == '-' ) {
// If we are not enforcing kebab-case
if ( !enforceKebab ) {
if ( enforceSnake ) {
out += '_';
} else {
nextUpperCase = true;
}
} else {
out += '-'
}
} else {
let curr = config.replace[ c ] === undefined ? c : config.replace[ c ];
if ( config.rules[ 'underscore-before-and-after-number' ] || config.rules['enforce-leading-zero'] ) {
if ( /[0-9]/.test( c ) ) {
if ( i < fn.length - 1 ) {
if ( config.rules['enforce-leading-zero'] ) {
const prevIsNumber = i > 0 && /[0-9]/.test( fn[i - 1] );
const nextIsNumber = /[0-9]/.test( fn[i + 1] );
if ( !nextIsNumber && ( i == 0|| !prevIsNumber ) ) {
curr = '0' + curr;
}
}
if ( config.rules['underscore-before-and-after-number'] ) {
if ( !( /[0-9]/.test( fn[ i + 1 ] ) ) && fn[ i + 1 ] != '_' ) {
curr += '_';
}
}
} else {
if ( config.rules['enforce-leading-zero'] && ( i > 0 && !( /[0-9]/.test( fn[i - 1] ) ) ) ) {
curr = '0' + curr;
}
}
} else {
if ( config.rules['underscore-before-and-after-number'] && /[0-9]/.test( fn[ i + 1 ] ) ) {
curr += '_';
}
}
}
if ( nextUpperCase || ( i == 0 && startLetter === 'upper' ) ) {
nextUpperCase = false;
out += curr.toUpperCase();
} else {
if ( i == 0 && startLetter === 'upper' ) {
out += curr.toUpperCase();
} else {
out += curr.toLowerCase();
}
}
}
}
return out;
}
const needsUnderscore = ( i, fn ) => {
return ( i > 0 && /[0-9]/.test( fn[ i - 1 ] ) ) || ( i < fn - 1 && /[0-9]/.test( fn[ i + 1 ] ) )
}
const separateDirAndFileAndFiletype = ( filename ) => {
const loc = filename.lastIndexOf( '/' ) + 1;
let ftl = filename.lastIndexOf( '.' ) + 1;
let fn = filename.substring( loc, ftl - 1 );
let ft = filename.substring( ftl );
if ( fs.statSync( filename ).isDirectory() ) {
ftl = filename.length;
fn = filename.substring( loc );
ft = 'directory';
}
const dir = filename.slice( 0, loc - 1 );
return { 'filename': fn, 'dir': dir, 'filetype': ft };
}
const fixDirName = ( directory, top ) => {
if ( directory === top ) {
return top;
}
const f = separateDirAndFileAndFiletype( directory );
return fixDirName( f.dir, top ) + '/' + fixName( f.filename, f.filetype );
}
if (argv[2] == '-h') {
console.log('auto-renamer [directory]\n\n=> Recursively rename files in directory');
} else if (argv[2] == '-v') {
console.log('auto-renamer version 1.0.0, developed by Janis Hutz (development@janishutz.com)');
} else {
// Recursively add all files in the directory
const fp = path.resolve( argv[2] );
const list = treeWalker(fp, '*', ['.git', '@girs']);
const files = list.files;
const directories = list.directories;
for (let i = 0; i < files.length; i++) {
const file = files[i];
const f = separateDirAndFileAndFiletype( file );
let fixedFile = fixName( f.filename, f.filetype );
// Rename
const fixedPath = f.dir + '/' + fixedFile + '.' + f.filetype;
console.log( file + ' -> ' + fixedPath );
fs.renameSync( file, fixedPath );
}
// Fix directory names after file names. Sort array by decending length
directories.sort( ( a, b ) => {
return b.length - a.length;
} );
// separate directories up until we reach the path of dir started in
for (let i = 0; i < directories.length; i++) {
const dir = directories[i];
const fixed = fixDirName( dir, fp );
console.log( dir + ' -> ' + fixed );
fs.renameSync( dir, fixDirName( dir, fp ) );
}
}
+66 -31
View File
@@ -23,23 +23,25 @@ echo "
" "
trap 'echo -e "\nCaught Ctrl+C, exiting..."; exit 1' SIGINT trap 'echo -e "\nCaught Ctrl+C, exiting..."; exit 130' SIGINT
# Read platform to install on (only if no platform file present in ~/.config/) # Read platform to install on (only if no platform file present in ~/.config/)
platform="" platform=""
if [[ -f ~/.config/platform ]]; then if [[ -f ~/.config/platform ]]; then
echo "Config type already selected, skipping"
platform=$(cat ~/.config/platform) platform=$(cat ~/.config/platform)
else else
read -p "Choose the configs to install, Laptop or Desktop (l/D): " platform read -p "Choose the configs to install, Laptop or Desktop (l/D): " platform
echo "$platform" > ~/.config/platform echo "$platform" >~/.config/platform
fi fi
platform=$(echo "$platform" | tr '[:upper:]' '[:lower:]') platform=$(echo "$platform" | tr '[:upper:]' '[:lower:]')
# ────────────────────────────────────────────────────────────────────
# Get user preference for regenerating the styling # Get user preference for regenerating the styling
regen="" regen=""
read -p "Would you like to regenerate styling? (y/N) " regen read -p "Would you like to regenerate styling? (y/N) " regen
if [ $regen == "y" ]; then restart=""
if [[ "$regen" == "y" ]]; then
restart="y"
cd build cd build
node build.js node build.js
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -47,30 +49,54 @@ if [ $regen == "y" ]; then
exit 130 exit 130
fi fi
cd .. cd ..
else
read -p "Apply full config? (y/N) " restart
fi fi
# ────────────────────────────────────────────────────────────────────
# hyprvim config
hyprvim=""
if [[ -f ~/.config/hyprvim ]]; then
hyprvim=$(cat ~/.config/hyprvim)
else
read -p "Would you like to use hyprvim? (Y/n) " hyprvim
fi
hyprvim=$(echo "$hyprvim" | tr '[:upper:]' '[:lower:]')
if [[ "$hyprvim" == "" ]]; then
hyprvim="y"
fi
echo "$hyprvim" >~/.config/hyprvim
# ────────────────────────────────────────────────────────────────────
echo "=> Moving configs to correct destinations" echo "=> Moving configs to correct destinations"
killall swaybg killall swaybg
cp -r ./config/fish ~/.config/ cp -r ./config/fish ~/.config/
cp -r ./config/hypr ~/.config/ cp -r ./config/hypr ~/.config/
rm -rf ~/.config/rofi/ rm -rf ~/.config/rofi/
cp -r ./config/rofi ~/.config/ cp -r ./config/rofi ~/.config/
cp -r ./config/xdg-desktop-portal-termfilechooser/ ~/.config/
cp -r ./config/xdg-desktop-portal/ ~/.config/
# Depending on platform, remove one or the other config and rename remaining one # Depending on platform, remove one or the other config and rename remaining one
if [[ "$platform" == "d" ]]; then if [[ "$platform" == "d" ]]; then
echo "Running on desktop" echo "==> Running on desktop"
mv ~/.config/hypr/hyprland_desktop.conf ~/.config/hypr/hyprland.conf cp -f ~/.config/hypr/hyprland_desktop.conf ~/.config/hypr/hyprland.conf
rm ~/.config/hypr/hyprland_*
mv ~/.config/rofi/config_desktop.rasi ~/.config/rofi/config.rasi
rm ~/.config/rofi/config_*
else else
echo "Running on laptop" echo "==> Running on laptop"
mv ~/.config/hypr/hyprland_laptop.conf ~/.config/hypr/hyprland.conf cp -f ~/.config/hypr/hyprland_laptop.conf ~/.config/hypr/hyprland.conf
rm ~/.config/hypr/hyprland_*
mv ~/.config/rofi/config_laptop.rasi ~/.config/rofi/config.rasi
rm ~/.config/rofi/config_*
fi fi
# Enable or disable "hyprvim" (using hyprland with vim-inspired modes)
if [[ "$hyprvim" == "y" ]]; then
echo "==> Enabling hyprvim"
mv -f ~/.config/hypr/hyprland/mode-binds.conf ~/.config/hypr/hyprland/binds.conf
else
echo "==> Disabling hyprvim"
rm -rf ~/.config/hypr/hyprland/modal-binds
rm ~/.config/hypr/hyprland/mode-binds.conf
fi
# Done this way intentionally to control what is copied
cp -r ./config/kitty ~/.config/ cp -r ./config/kitty ~/.config/
cp -r ./config/fastfetch ~/.config/ cp -r ./config/fastfetch ~/.config/
cp -r ./config/lazygit ~/.config/ cp -r ./config/lazygit ~/.config/
@@ -79,34 +105,43 @@ cp -r ./config/Thunar ~/.config/
cp -r ./config/wlogout/ ~/.config/ cp -r ./config/wlogout/ ~/.config/
cp -r ./config/yazi ~/.config/ cp -r ./config/yazi ~/.config/
cp -r ./config/zathura ~/.config/ cp -r ./config/zathura ~/.config/
cp ./config/lint/indentconfig.yaml ~/.indentconfig.yaml
# ────────────────────────────────────────────────────────────────────
echo " echo "
=> Installing yazi plugins => Installing yazi plugins
" "
ya pack -i rm -rf ~/.config/yazi/plugins/*
ya pkg upgrade
echo " if [[ "$restart" == "y" ]]; then
echo "
=> Installing GTK Theme => Installing GTK Theme
" "
sudo rm -rf /usr/share/themes/Adaptive-Theme/ sudo rm -rf /usr/share/themes/Adaptive-Theme/
sudo mkdir /usr/share/themes/Adaptive-Theme/ sudo mkdir /usr/share/themes/Adaptive-Theme/
sudo cp -r ./gtk-theme/dist/* /usr/share/themes/Adaptive-Theme/ sudo cp -r ./gtk-theme/dist/* /usr/share/themes/Adaptive-Theme/
echo "
echo "
=> Installing System Configs => Installing System Configs
" "
sudo cp ./system/environment /etc/environment sudo cp ./system/environment /etc/environment
sudo cp -r ./system/greetd/* /etc/greetd/ sudo cp ./system/greetd/pam /etc/pam.d/greetd
hyprctl reload sudo cp -r ./system/greetd/config.toml /etc/greetd/
# echo " # if [[ "$platform" == "d" ]]; then
# => Restarting bars, etc # else
# " # echo "Setting up autologin config for greetd"
# killall gjs # sudo cp -r ./system/greetd/config-autologin.toml /etc/greetd/config.toml
# sleep 1 # fi
# ags run -d ./config/astal --gtk4 & disown 2>&1 > /dev/null hyprctl reload
# ags run -d ./config/ags/notifications/ & disown 2>&1 > /dev/null
./scripts/restart-bar
fi
# ────────────────────────────────────────────────────────────────────
hyprctl reload
echo " echo "
+2
View File
@@ -14,3 +14,5 @@ VKD3D_CONFIG=dxr11,dxr
RADV_PERFTEST_RT=1 RADV_PERFTEST_RT=1
ANDROID_HOME=/home/janis/Android/Sdk ANDROID_HOME=/home/janis/Android/Sdk
EDITOR=nvim EDITOR=nvim
PAGER=nvimpager
MANPAGER=nvimpager
+18
View File
@@ -0,0 +1,18 @@
[terminal]
# The VT to run the greeter on. Can be "next", "current" or a number
# designating the VT.
vt = 1
# The default session, also known as the greeter.
[default_session]
command = "tuigreet --cmd Hyprland --time --remember --remember-user-session --asterisks --user-menu --sessions /usr/share/wayland-sessions"
# The user to run the command as. The privileges this user must have depends
# on the greeter. A graphical greeter may for example require the user to be
# in the `video` group.
user = "greeter"
[initial_session]
command = "Hyprland"
user = "janis"
+9
View File
@@ -0,0 +1,9 @@
#%PAM-1.0
auth required pam_securetty.so
auth requisite pam_nologin.so
auth include system-local-login
auth optional pam_gnome_keyring.so
account include system-local-login
session include system-local-login
session optional pam_gnome_keyring.so auto_start
-73
View File
@@ -1,73 +0,0 @@
# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run. Advanced users may wish to specify all system modules
# in this array. For instance:
# MODULES=(usbhid xhci_hcd)
MODULES=()
# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image. This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=()
# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
FILES=()
# HOOKS
# This is the most important setting in this file. The HOOKS control the
# modules and scripts added to the image, and what happens at boot time.
# Order is important, and it is recommended that you do not change the
# order in which HOOKS are added. Run 'mkinitcpio -H <hook name>' for
# help on a given hook.
# 'base' is _required_ unless you know precisely what you are doing.
# 'udev' is _required_ in order to automatically load modules
# 'filesystems' is _required_ unless you specify your fs modules in MODULES
# Examples:
## This setup specifies all modules in the MODULES setting above.
## No RAID, lvm2, or encrypted root is needed.
# HOOKS=(base)
#
## This setup will autodetect all modules for your system and should
## work as a sane default
# HOOKS=(base udev autodetect modconf block filesystems fsck)
#
## This setup will generate a 'full' image which supports most systems.
## No autodetection is done.
# HOOKS=(base udev modconf block filesystems fsck)
#
## This setup assembles a mdadm array with an encrypted root file system.
## Note: See 'mkinitcpio -H mdadm_udev' for more information on RAID devices.
# HOOKS=(base udev modconf keyboard keymap consolefont block mdadm_udev encrypt filesystems fsck)
#
## This setup loads an lvm2 volume group.
# HOOKS=(base udev modconf block lvm2 filesystems fsck)
#
## NOTE: If you have /usr on a separate partition, you MUST include the
# usr and fsck hooks.
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems fsck plymouth)
# COMPRESSION
# Use this to compress the initramfs image. By default, zstd compression
# is used. Use 'cat' to create an uncompressed image.
#COMPRESSION="zstd"
#COMPRESSION="gzip"
#COMPRESSION="bzip2"
#COMPRESSION="lzma"
#COMPRESSION="xz"
#COMPRESSION="lzop"
#COMPRESSION="lz4"
# COMPRESSION_OPTIONS
# Additional options for the compressor
#COMPRESSION_OPTIONS=()
# MODULES_DECOMPRESS
# Decompress kernel modules during initramfs creation.
# Enable to speedup boot process, disable to save RAM
# during early userspace. Switch (yes/no).
#MODULES_DECOMPRESS="yes"