Compare commits

...

181 Commits

Author SHA1 Message Date
e35845099a [Hyprland] Update for new folder structure 2025-09-30 07:41:44 +02:00
c44ef61cf2 [Fish] Update for new folder structure 2025-09-30 07:41:14 +02:00
ef65f827a2 [Yazi] Update keymap for new structure 2025-09-29 11:48:29 +02:00
6b8f415703 [Eslint] Update rules 2025-09-28 17:08:48 +02:00
f7004d9f25 [All] Remove old files 2025-09-27 08:07:58 +02:00
58d5b6cf69 [Setup] Add reload to make sure config reload happens properly 2025-09-26 14:04:47 +02:00
c55f70b852 [Fish] Add alias for latex docs 2025-09-26 14:03:21 +02:00
97e02d81af [Clang] Fix config file 2025-09-25 16:42:26 +02:00
a545bb0066 [Clang] Fix incorrect config 2025-09-25 16:40:53 +02:00
35d51f80df [Clang] Finish up config 2025-09-25 15:57:39 +02:00
d638aa0434 [Clang] Fix setup script 2025-09-25 15:52:55 +02:00
258fc61669 [Clang] Add formatter config 2025-09-25 15:52:16 +02:00
6dc15047d4 [Eslint] Add sort-imports rule 2025-09-25 15:20:13 +02:00
0725763b95 [Hyprland] Configure gestures 2025-09-25 15:04:47 +02:00
29b8f188e9 [Yazi] Update keymap 2025-09-25 11:04:07 +02:00
959732ffd1 [Yazi] Update keymap 2025-09-23 15:19:36 +02:00
be3497de77 [Indent] Add more rules 2025-09-23 11:14:26 +02:00
17d83a53b7 [Hyprland] configure gestures 2025-09-23 11:12:53 +02:00
122f3ab070 [Hyprland] Add special workspace config 2025-09-22 16:17:22 +02:00
46a732e8f7 [Install] Add dep for latexindent 2025-09-22 13:44:53 +02:00
3373ae3b8c [Install] Add dep for latexindent 2025-09-22 13:37:50 +02:00
edd2db313c [Install] Add dep for latexindent 2025-09-22 13:36:37 +02:00
ecfd517a4a [Hyprland] Tweak animation duration 2025-09-22 13:01:13 +02:00
25419067d4 [Install] Add note on using nwg-look 2025-09-22 12:53:46 +02:00
36faff6b5f [Install] Add langgerman to install 2025-09-22 08:44:27 +02:00
ffe516175c [Eslint] Revert EOL decision 2025-09-20 08:12:20 +02:00
f58f22cadd [Install] Add german latex extras 2025-09-20 07:17:56 +02:00
7e9faff6d6 [Astal] Make brightness adjust only in 5% intervals 2025-09-18 07:52:41 +02:00
ffa25045e5 [zathura] Add poppler to install 2025-09-17 16:17:43 +02:00
66dcd82952 [Hyprland] Fix bind 2025-09-16 17:31:28 +02:00
40013a61d1 [Hyprland] Fix some binds 2025-09-16 17:30:37 +02:00
ee26c0c5c2 [Hyprland] Fix errors 2025-09-16 13:03:25 +02:00
02a351768f [Fish] Add pager alias 2025-09-16 12:59:20 +02:00
9539f09e83 [Install] Add pager 2025-09-16 12:59:20 +02:00
25a78f126e [Astal] Add battery low notification 2025-09-15 14:42:05 +02:00
e0c339785d [Eslint] Update eol-last 2025-09-15 10:32:59 +02:00
e6f57831b1 [Eslint] Enforce newline 2025-09-15 10:27:26 +02:00
4e323d932f [Hyprland] Update binds 2025-09-15 09:20:29 +02:00
64d8ca7ab4 [Install] Add eslint_d 2025-09-14 07:29:12 +02:00
7de17aaeb7 [Yazi] Update keymaps for ETH folders 2025-09-13 17:24:37 +02:00
4f0c6a45cf [Install] Add http-server 2025-09-13 08:29:42 +02:00
a2dbdd78d3 [Setup] Don't do autologin (will make optional) 2025-09-13 08:22:11 +02:00
e4a76c494c [Greetd] Add auto-unlock of keyring 2025-09-12 17:26:53 +02:00
1ee3f01883 [Setup] Add note 2025-09-12 13:12:13 +02:00
a89ed00a17 [Greetd] Add autologin 2025-09-12 12:26:47 +02:00
64e671119d [Hyprland] Add dimming around rofi layer 2025-09-12 11:54:55 +02:00
7b7955ac29 [Build] Run config build 2025-09-12 11:52:00 +02:00
823a8d8fbc [Setup] Make it quicker for small changes 2025-09-12 11:49:34 +02:00
088562cd53 [System] Remove mkinitcpio config 2025-09-12 11:49:26 +02:00
e9b8c35b52 [Scripts] Rename 2025-09-12 11:42:53 +02:00
5a1811979e [Rofi] Fix positioning 2025-09-12 11:41:21 +02:00
274890281c [Install] Add ripgrep 2025-09-12 10:40:46 +02:00
0606ec06f5 [Hyprland] Add new rules 2025-09-12 10:40:11 +02:00
f22f8da68c [Install] Add git-credential-manager 2025-09-12 10:19:00 +02:00
409078edf9 [Install] Add ruby 2025-09-12 10:15:18 +02:00
2840c9aa70 [Fish] Add fish_variables 2025-09-12 10:13:22 +02:00
f4aedf7b5e [Install] Fix packages 2025-09-12 10:10:58 +02:00
f51cc0049a [Fish] Disable greeting 2025-09-12 10:10:48 +02:00
c01529a599 [Fish] Remove autojump from config 2025-09-12 09:57:40 +02:00
121f02c785 [Yazi] Fix keymap overlap 2025-09-12 09:57:33 +02:00
f6cd98e458 [Install] Add more utilities 2025-09-12 09:57:25 +02:00
cc9f38c71c [Install] Add more features 2025-09-12 09:29:18 +02:00
606a1fec1b [Install] Add auto-install of arch4edu and yay 2025-09-12 08:46:19 +02:00
d3bf33a142 [Install] Add seahorse to install 2025-09-12 06:59:29 +02:00
91a6566d68 [Install] Finish up 2025-09-11 20:25:42 +02:00
ce0d951a54 [Install] Reorganize 2025-09-11 09:22:29 +02:00
106fe9cd9e Restructure bar restart and fix typos in ethz-vpn 2025-09-09 13:28:31 +02:00
a199569aac [Eslint] Increase max line length 2025-08-28 15:44:56 +02:00
80d16ab6ff [Install] Properly install yazi plugins 2025-08-22 14:21:19 +02:00
1c8b72867e [Yazi] Add new plugin 2025-08-22 12:00:06 +02:00
9d59b24995 [Scripts] Add script to update open-webui 2025-08-21 12:14:30 +02:00
e78d07b25b [Base] Remove unnecessary files 2025-08-20 17:25:48 +02:00
a2c11e5cd1 [Yazi] Add keybind to open in evince 2025-08-05 11:21:27 +02:00
70aceee3ca [Build] Build config 2025-07-31 09:08:07 +02:00
8e6340e4c7 [Hyprlock] Update to V0.9 2025-07-31 09:07:19 +02:00
46a4d7628d [Yazi] Add keybinds, start configuring openers 2025-07-28 11:10:03 +02:00
2ec9356aca [Scripts] Prepare for cleanup 2025-07-22 15:52:52 +02:00
3c19159c23 [Install] Use bvi instead of ghex 2025-07-16 15:38:45 +02:00
f6afd785fd [Setup] Fix yazi plugin updates 2025-06-22 15:21:45 +02:00
e20a33e132 [Setup] Fix 2025-06-22 14:49:58 +02:00
4683a171b9 [Astal] Finish up audio fix 2025-06-18 11:59:03 +02:00
4189258def [Astal] Fix audio issues 2025-06-18 11:40:58 +02:00
2e8f1ec9ae [Hypr] Add easy docked switching 2025-06-12 10:08:57 +02:00
78c97c5d84 [Hypr] Add docked config 2025-06-12 10:05:16 +02:00
4540dc00e7 [Eslint] Fix newline 2025-06-11 10:56:47 +02:00
294d7a9a98 [Eslint] Add max-len config 2025-06-11 09:48:34 +02:00
77dd4b4ca8 [Eslint] Add function-paren-newline option 2025-06-11 09:43:48 +02:00
7394ab63bf [Eslint] Change a few options 2025-06-10 17:23:43 +02:00
7f851fac73 [Eslint] Fix errors with single-line interface defintions 2025-06-07 11:18:58 +02:00
a5a6d9a916 [Eslint] Fix issues with end of file extra line 2025-06-06 15:36:12 +02:00
3967a4cd5c [latexfmt] Update align delims 2025-06-06 13:27:45 +02:00
f684f52d8f [latexfmt] Add indents for code 2025-06-06 13:20:52 +02:00
1079f62c06 [Eslint] Fix no-extra-parens config 2025-06-06 13:20:39 +02:00
1f460ccc38 [Eslint] Add support for mjs and cjs, format config 2025-06-06 11:46:57 +02:00
8b7f15eddf [Eslint] Add padding guides 2025-06-06 11:36:04 +02:00
0750c45111 [latexfmt] Finish up latexindent config 2025-06-06 10:59:16 +02:00
0db1815665 [Eslint] Fix spelling error in config 2025-06-06 10:35:04 +02:00
d028b027c5 [Eslint] Add more style options 2025-06-06 10:34:01 +02:00
e91f5aa5d6 [Eslint] Fix end of file newline 2025-06-06 10:27:49 +02:00
6105341234 [Eslint] Finish up config 2025-06-06 09:33:57 +02:00
6a362a963f [Eslint] Fix config 2025-06-05 19:59:45 +02:00
9005bd089a [Hyprland] Increase border size 2025-06-05 17:53:49 +02:00
1921545d08 [Hyprland] Fix keybind for cliphist 2025-06-05 15:40:00 +02:00
05b463699f [Install] Add cliphist 2025-06-05 15:38:19 +02:00
6f33358f4a [Hyprland] Add cliphist 2025-06-05 15:37:44 +02:00
909983d069 [Scripts] Fix indentconfig.yaml 2025-06-05 14:10:04 +02:00
a259206de8 [Scripts] add indentconfig.yaml 2025-06-05 13:33:52 +02:00
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
318fc39b61 [Astal] Fix syntax 2025-05-26 15:05:07 +02:00
6b1c8dec58 [Setup] Fix syntax error 2025-05-22 16:47:46 +02:00
3541ec68e7 [Hyprland] Update binds (remove unnecessary ones) 2025-05-22 16:47:33 +02:00
3a3674670b [Hyprland] Update binds 2025-05-22 16:43:27 +02:00
b2c6d72a2f [Hypridle] Improve idle manager 2025-05-22 11:46:20 +02:00
b9c68535d4 [Hypridle] Remove 100s timout 2025-05-22 11:45:28 +02:00
ae5226202a [Install] Remove TODO 2025-05-22 11:27:07 +02:00
580aee4ad5 [Vimiv] Add notes and alias for fish 2025-05-22 10:12:12 +02:00
a8bf678d45 [Astal] Increase max-width of hyprland active window 2025-05-20 17:04:28 +02:00
73feae1142 [Hyprland] Change to dwindle layout 2025-05-20 15:19:18 +02:00
b26b870bb2 [Hyprland] Resize window keybinds 2025-05-20 14:35:39 +02:00
2d3a6ad33f [Astal] Remove debug code 2025-05-20 14:24:25 +02:00
ef9439b92c [Hyprland] Improve gestures 2025-05-19 14:29:40 +02:00
c635f3bfa9 [Build] Run build 2025-05-19 10:02:44 +02:00
7c3eb71150 [Astal] Update memory icon 2025-05-19 09:47:12 +02:00
4fef18041f [Notes] Add another todo 2025-05-16 07:39:25 +02:00
df3384c667 [Notes] Mark completed items, add new todo 2025-05-16 07:37:49 +02:00
7a97d7425e [Bar] Ellipsize too large text 2025-05-15 17:07:06 +02:00
73ca687358 [Fish] Add more aliases 2025-05-13 17:26:44 +02:00
88441958d9 [Yazi] Add more keybinds 2025-05-13 17:26:36 +02:00
e59af388b1 [Kitty] Finish improved cursor_trail settings 2025-05-12 14:17:24 +02:00
39da9176ad [Build] Run build 2025-05-12 13:49:46 +02:00
e4ee9c9dc8 [Kitty] Improve cursor trail 2025-05-12 13:48:54 +02:00
feef8452f4 [Install] Add new programs, restructure 2025-05-09 11:12:02 +02:00
c3ff5a58d6 [AGS] Improve Battery display 2025-05-08 12:53:53 +02:00
a005189aef [Setup] Make bars restart, will be writing new notifications stuff soon 2025-05-08 10:55:31 +02:00
e98f5c2bd7 [Build] Run build 2025-05-08 10:43:00 +02:00
e7f6be4291 [AGS] QuickView: Use better battery icon 2025-05-08 10:42:55 +02:00
4fa7dc3c1a [Eslint] Update arrow-parens to as-needed 2025-05-05 16:15:19 +02:00
2ccb49f24b [Eslint] Finish config 2025-05-05 15:50:56 +02:00
ec04ebee66 [Player] Fix time display 2025-05-05 12:01:07 +02:00
2b2f1c2b66 [Build] Run build 2025-05-03 16:57:46 +02:00
21f7e53b2b [Build] Fix changeable colours 2025-05-03 16:57:39 +02:00
5f09b7b915 [Install] Add new program 2025-04-29 15:35:19 +02:00
688013a6b8 [Hyprland] Add logging for bar & notifier to temp folder 2025-04-29 14:47:56 +02:00
4e7c3ceee8 [Yazi] Remove plugins from here 2025-04-28 10:16:30 +02:00
390874374e [Hyprland] Hyprlock: Animations 2025-04-28 10:16:30 +02:00
7f7a755e32 [Hyprland] Fix merge error 2025-04-28 08:56:38 +02:00
ac6b47449a [README] Update 2025-04-27 17:11:41 +02:00
ce5f530ed2 Merge V2 complete 2025-04-27 17:07:20 +02:00
62789224a7 Merge 2025-04-27 16:56:43 +02:00
0b849bad4f Fish change alias bt 2025-04-25 08:55:02 +02:00
0022880936 Actually create kitty config 2025-04-21 20:26:45 +02:00
1d5240b7c6 Add terminal file chooser 2025-04-14 16:51:42 +02:00
0b0e83f505 Improve notifications 2025-04-14 15:23:28 +02:00
f4cfa20dea Add fastfetch config 2025-04-10 11:35:39 +02:00
d866102fcc Improve copying in Zathura 2025-04-09 19:20:00 +02:00
921373f049 Update package list 2025-04-09 10:13:54 +02:00
1c39478650 Remove VSCode forced workspace 2025-04-05 15:19:55 +02:00
a845e086fd Change switch workspace keybind 2025-04-03 11:06:32 +02:00
b363438f6a Add zathura launch bind 2025-04-03 08:35:54 +02:00
7d9da82b6c Add restore plugin, improve ouch for yazi 2025-04-02 11:14:00 +02:00
c52c5b5a42 Improve Zathura, move to zoxide, add yazi plugins 2025-04-02 11:08:15 +02:00
97c49f17e6 Add nohlsearch to keybind zathura 2025-04-02 10:40:04 +02:00
134519558a Remove some zathura binds that come by default 2025-04-02 10:31:09 +02:00
9e5ae7db83 Update zathura binds 2025-04-01 17:52:33 +02:00
a31b3481c3 Make zathura open on 2nd workspace 2025-04-01 17:44:07 +02:00
1c757d1173 Add zathura config 2025-04-01 17:40:25 +02:00
89b97c4ba1 Add Zathura config 2025-04-01 17:40:10 +02:00
2ba627a370 Hyprland revert mouse focus change 2025-04-01 15:57:44 +02:00
995de3617c Hyprland change mouse focus 2025-04-01 13:50:28 +02:00
a477078f16 Hyprland fix vivado window rules 2025-03-31 15:33:15 +02:00
f93eeb5d87 Hyprland improve vivado 2025-03-31 15:17:32 +02:00
5b0e3767bd Add yazi keybinds 2025-03-31 10:50:44 +02:00
51962c424b Hyprland fix for V0.48 2025-03-30 08:09:44 +02:00
a6ce7ccdce Fix path for scripts 2025-03-28 13:50:42 +01:00
0f0e0e8671 improve notifications keybinds 2025-03-28 11:45:42 +01:00
c6061e0f12 Remove quit keybind from hyprland. Can be done through wlogout 2025-03-27 16:23:12 +01:00
cac0e41a2e Change shortcuts for fish 2025-03-24 09:12:07 +01:00
c4797dd592 Remove killactive from MainMod + C 2025-03-22 20:41:22 +01:00
8986ad894e Improve keybindings 2025-03-22 11:31:46 +01:00
f127ea8a41 Fix binds for new notification handler 2025-03-21 18:25:36 +01:00
bb75cfabaf Add binds for new notification handler 2025-03-21 18:10:15 +01:00
63 changed files with 2012 additions and 3127 deletions

View File

@@ -1,4 +1,36 @@
# 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)
## 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

View File

@@ -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;

View File

@@ -1,5 +0,0 @@
{
"gen": {
"overrides": {}
}
}

View File

@@ -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
: "") : "")
) { ) {

View File

@@ -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>
);
});
})}

View File

@@ -29,11 +29,13 @@ 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>
); );
@@ -43,7 +45,7 @@ const toTime = (time: number) => {
const MINUTE = 60; const MINUTE = 60;
const HOUR = MINUTE * 60; const HOUR = MINUTE * 60;
if (time > 24 * HOUR) return ""; if (time > 24 * HOUR) return "24h+";
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);

View File

@@ -4,7 +4,6 @@ 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;
} }
@@ -17,7 +16,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>

View File

@@ -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)}`;

View File

@@ -21,7 +21,7 @@ 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}

View File

@@ -2,6 +2,7 @@ import AstalTray from "gi://AstalTray";
import { bind, GObject } from "astal"; import { bind, GObject } from "astal";
import AstalHyprland from "gi://AstalHyprland"; import AstalHyprland from "gi://AstalHyprland";
import { Gtk } from "astal/gtk4"; 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 SYNC = GObject.BindingFlags.SYNC_CREATE;
@@ -105,7 +106,10 @@ const ActiveWindow = () => {
focused.as( focused.as(
client => client =>
client && ( client && (
<label label={bind(client, "title").as(String)} /> <label
maxWidthChars={70}
ellipsize={Pango.EllipsizeMode.END}
label={bind(client, "title").as(String)} />
), ),
) )
}></button> }></button>

View File

@@ -1,4 +1,5 @@
import { bind } from "astal"; import { bind } from "astal";
import { execAsync } 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";
@@ -120,14 +121,23 @@ const BluetoothWidget = () => {
); );
}; };
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 {

View File

@@ -75,7 +75,7 @@ const SystemInfo = () => {
<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

View File

@@ -1,5 +1,5 @@
$fg-color: #E6E6E6; $fg-color: #C8DCFF;
$bg-color: #141414; $bg-color: #0A0A0F;
$accent-color: #591641; $accent-color: #591641;
$accent-color-2: #97103A; $accent-color-2: #97103A;
$shadow-color: rgba(40, 40, 40, 0.3); $shadow-color: rgba(0, 0, 2, 0.3);

View File

@@ -1,10 +1,12 @@
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 z='zathura'
alias bt='bluetui' alias bt='bluetui'
alias vicfg='cd ~/.config/nvim/ && nvim' alias vicfg='nvim ~/projects/active/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='gti ls-files -m'
@@ -12,19 +14,20 @@ 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'
alias latexdocs='zathura ~/projects/latex/docs/docs.pdf'
# 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 +39,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 +126,5 @@ end
end end
set -g fish_greeting ""

33
config/fish/fish_variables Executable file
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

@@ -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
} }

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'

View File

@@ -13,6 +13,6 @@ general {
decoration { decoration {
shadow { shadow {
color = rgb(282828) color = rgb(000002)
} }
} }

View File

@@ -13,11 +13,14 @@ exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
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/ --gtk4 >> /tmp/runner-log 2>&1"
exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4" # exec-once = sleep 2 && bash -c "ags run -d ~/projects/active/dotfiles/config/astal/ --gtk4"
# exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/ >> ~/logn 2>&1" exec-once = bash -c "ags run -d ~/projects/config/ags/notifications/ >> /tmp/notifier-log 2>&1"
exec-once = bash -c "ags run -d ~/projects/active/dotfiles/config/ags/notifications/" # 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 exec = hyprctl setcursor oreo_spark_blue_cursors 24
@@ -36,6 +39,7 @@ input {
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
@@ -47,43 +51,63 @@ input {
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
}
# ── 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
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮ # ╭────────────────────────────────────────────────╮
# │ GENERAL CONFIG │ # │ GENERAL CONFIG │
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
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 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 +124,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, 5, myBezier
animation = windowsOut, 1, 7, default, popin 80% animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default animation = border, 1, 10, default
animation = fade, 1, 7, default animation = fade, 1, 4, default
animation = workspaces, 1, 6, default animation = workspaces, 1, 3, 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
}

View File

@@ -19,10 +19,6 @@ $mainMod = SUPER
# │ WINDOW RULES │ # │ WINDOW RULES │
# ╰────────────────────────────────────────────────╯ # ╰────────────────────────────────────────────────╯
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
windowrule = float, title:.*(rofi).*
windowrule = animation popin, title:.*(rofi).*
windowrule = center, title:(rofi)(.*)
windowrule = move 1450 50, title:^(.*)(Power menu)$ windowrule = move 1450 50, title:^(.*)(Power menu)$
windowrule = workspace 2, class:evince windowrule = workspace 2, class:evince
windowrule = workspace 2, title:.*(Okular).* windowrule = workspace 2, title:.*(Okular).*
@@ -119,3 +115,9 @@ windowrule = idleinhibit focus, class:vlc
windowrule = idleinhibit focus, class:supertuxkart windowrule = idleinhibit focus, class:supertuxkart
windowrule = idleinhibit fullscreen, title:^(.*)(Discord)(.*)$ windowrule = idleinhibit fullscreen, title:^(.*)(Discord)(.*)$
windowrule = idleinhibit fullscreen, title:^(.*)(~)(.*)$ windowrule = idleinhibit fullscreen, title:^(.*)(~)(.*)$
# ┌ ┐
# │ Layer rules │
# └ ┘
layerrule = dimaround, ^(rofi)

View File

@@ -0,0 +1,58 @@
#░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
#░ ░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░░░
#▒ ▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒
#▒ ▒▒▒▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒ ▒▒▒ ▒ ▒▒▒▒▒▒▒ ▒▒
#▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓ ▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓
#▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓
#▓ ▓▓▓▓ ▓▓▓▓▓ ▓▓▓ ▓ ▓▓▓ ▓▓▓▓ ▓ ▓▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓▓▓▓▓▓▓▓ ▓▓▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓ ▓
#█ ████ ████ ████ ██████ ████ ███ █ █ ██ ██ █ ███████████ ██████ █████ ██ ███ ████ █████ █
#██████████████ █████ ██████████████████████████████████████████████████████████████████████████████████████████████████████ ██
# ────────────────────────────────────────────────────────────────────
# ╭────────────────────────────────────────────────╮
# │ 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
}
# ── 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%'
# ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado
windowrule = tile, title:(.*)Vivado(.*)

View File

@@ -19,7 +19,7 @@
# ──────────────────────────────────────────────────────────────────── # ────────────────────────────────────────────────────────────────────
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 # exec = swaybg -m fill -i /home/janis/Pictures/arch-bg.png
@@ -68,6 +68,8 @@ bind = $mainMod CTRL, E, exec, hyprctl keyword monitor HDMI-A-1, 1920x1080@60, 1
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, 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' 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'
# ── Using docked ────────────────────────────────────────────────────
bind = $mainMod ALT, D, exec, hyprctl keyword monitor eDP-1, disable
# ── Vivado inversion ──────────────────────────────────────────────── # ── Vivado inversion ────────────────────────────────────────────────
windowrule = plugin:invertwindow, class:Vivado windowrule = plugin:invertwindow, class:Vivado

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/dark/mountains.jpg # Or screenshot
blur_passes = 1 blur_passes = 1
} }

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
# ┌ ┐ # ┌ ┐

File diff suppressed because it is too large Load Diff

276
config/lint/clang-format Normal file
View File

@@ -0,0 +1,276 @@
# ─────────────────────────────────────────────────────────────────────
# ╭─────────────────────────────────────────────────╮
# │ clang-format config │
# ╰─────────────────────────────────────────────────╯
# ─────────────────────────────────────────────────────────────────────
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: Left
AlignConsecutiveAssignments:
Enabled: true
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: true
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: All
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: false
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: None
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

View File

@@ -1,65 +1,724 @@
// @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/js': stylistic,
'@stylistic/ts': stylistic, '@stylistic/ts': stylistic,
}, },
'files': [
'**/*.ts',
'**/*.js',
'**/*.mjs',
'**/*.cjs',
'**/*.tsx',
'**/*.jsx'
],
'rules': { 'rules': {
'sort-imports': [
'warn',
{
'ignoreCase': false,
'ignoreDeclarationSort': false,
'ignoreMemberSort': false,
'memberSyntaxSortOrder': [
'none',
'all',
'multiple',
'single'
],
'allowSeparatedGroups': false
}
],
// Formatting // Formatting
'@stylistic/js/array-bracket-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], '@stylistic/array-bracket-newline': [
'@stylistic/js/array-bracket-spacing': [ 'error', 'always' ], 'error',
'@stylistic/js/array-element-newline': [ 'error', { 'multiline': true, 'minItems': 4 } ], {
'@stylistic/js/arrow-parens': [ 'error', 'always' ], 'multiline': true,
'@stylistic/js/arrow-spacing': [ 'error', { 'before': true, 'after': true } ], 'minItems': 2
'@stylistic/js/block-spacing': [ 'error', 'always' ], }
'@stylistic/js/brace-style': [ 'error', '1tbs' ], ],
'@stylistic/js/comma-spacing': [ 'error', { 'before': false, 'after': true } ], '@stylistic/array-bracket-spacing': [
'@stylistic/js/comma-style': [ 'error', 'last' ], 'error',
'@stylistic/js/dot-location': [ 'error', 'property' ], 'always',
'@stylistic/js/eol-last': [ 'error', 'always' ], {
'@stylistic/js/function-call-spacing': [ 'error', 'never' ], 'singleValue': true,
'@stylistic/js/implicit-arrow-linebreak': [ 'error', 'beside' ], 'arraysInArrays': true,
'@stylistic/js/indent': [ 'error', 4 ], 'objectsInArrays': true
'@stylistic/js/key-spacing': [ 'error', { 'beforeColon': false, 'afterColon': true } ], }
'@stylistic/js/keyword-spacing': [ 'error', { 'before': true, 'after': true } ], ],
'@stylistic/js/lines-between-class-members': [ 'error', 'always' ], '@stylistic/array-element-newline': [
'@stylistic/js/new-parens': [ 'error', 'always' ], 'error',
'@stylistic/js/no-extra-parens': [ 'error', 'all' ], {
'@stylistic/js/no-extra-semi': 'error', 'multiline': true,
'@stylistic/js/no-floating-decimal': 'error', 'minItems': 2
'@stylistic/js/no-mixed-operators': 'error', }
'@stylistic/js/no-mixed-spaces-and-tabs': 'error', ],
'@stylistic/js/no-multi-spaces': 'error', '@stylistic/arrow-parens': [
'@stylistic/js/no-trailing-spaces': 'error', 'error',
'@stylistic/js/no-whitespace-before-property': 'error', 'as-needed'
'@stylistic/js/object-curly-newline': [ 'error', { 'multiline': true, 'minProperties': 3 } ], ],
'@stylistic/js/object-curly-spacing': [ 'error', 'always' ], '@stylistic/arrow-spacing': [
'@stylistic/js/one-var-declaration-per-line': 'error', 'error',
'@stylistic/js/quote-props': [ 'error', 'always' ], {
'@stylistic/js/quotes': [ 'error', 'single' ], 'before': true,
'@stylistic/js/rest-spread-spacing': [ 'error', 'never' ], 'after': true
'@stylistic/js/semi': [ 'error', 'always' ], }
'@stylistic/js/semi-spacing': [ 'error', { 'before': false, 'after': true } ], ],
'@stylistic/js/semi-style': [ 'error', 'last' ], '@stylistic/block-spacing': [
'@stylistic/js/space-before-blocks': [ 'error', 'always' ], 'error',
'@stylistic/js/space-before-function-paren': [ 'error', 'always' ], 'always'
'@stylistic/js/space-in-parens': [ 'error', 'always' ], ],
'@stylistic/js/space-infix-ops': [ 'error', { 'int32Hint': false } ], '@stylistic/brace-style': [
'@stylistic/js/space-unary-ops': 'error', 'error',
'@stylistic/js/spaced-comment': [ 'error', 'always' ], '1tbs'
'@stylistic/js/switch-colon-spacing': 'error', ],
'@stylistic/js/template-curly-spacing': [ 'error', 'always' ], '@stylistic/comma-spacing': [
'@stylistic/js/wrap-iife': [ 'error', 'inside' ], 'error',
'@stylistic/js/wrap-regex': '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', '@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,
}
],
},
},
); );

View File

@@ -0,0 +1,2 @@
paths:
- /home/janis/projects/active/dotfiles/config/lint/latexfmt.yaml

76
config/lint/latexfmt.yaml Normal file
View File

@@ -0,0 +1,76 @@
# Use spaces for indent (because f*k tabs)
defaultIndent: " "
# Limit Number of backups
maxNumberOfBackups: 3
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
config/lint/package.json Normal file
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"
}
}

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"

View File

@@ -1,7 +1,7 @@
* { * {
background: #141414; background: #0A0A0F;
background-selected: #1E1E1E; background-selected: #141419;
foreground: #E6E6E6; foreground: #C8DCFF;
accent: #591641; accent: #591641;
accent-two: #97103A; accent-two: #97103A;
// border-color: #2D2057; // border-color: #2D2057;
@@ -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;
} }

View File

@@ -7,7 +7,7 @@ window {
font-family: monospace; font-family: monospace;
font-size: 14pt; font-size: 14pt;
color: #ffffff; /* text */ color: #ffffff; /* text */
background-color: rgba(20, 20, 20, 0.5); background-color: rgba(10, 10, 15, 0.5);
} }
button { button {
@@ -27,7 +27,7 @@ button:hover {
button:focus { button:focus {
background-color: rgb(151, 16, 58); background-color: rgb(151, 16, 58);
color: rgb(230, 230, 230); color: rgb(200, 220, 255);
} }
#lock { #lock {

View File

@@ -0,0 +1,3 @@
[filechooser]
cmd=yazi-wrapper.sh
default_dir=$HOME

View File

@@ -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" },
] ]

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 = []

View File

@@ -1,2 +1,2 @@
[flavor] [flavor]
use = "vscode-dark-modern" use = "tokyo-night"

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" },
]

View File

@@ -19,13 +19,13 @@
/* /*
* ── Foreground color, main interface text colour ───────────────────── * ── Foreground color, main interface text colour ─────────────────────
*/ */
@define-color fg #E6E6E6; @define-color fg #C8DCFF;
@define-color fg_rgba_07 rgba(230, 230, 230, 0.7); @define-color fg_rgba_07 rgba(200, 220, 255, 0.7);
@define-color fg_rgba_06 rgba(230, 230, 230, 0.6); @define-color fg_rgba_06 rgba(200, 220, 255, 0.6);
@define-color fg_rgba_05 rgba(230, 230, 230, 0.5); @define-color fg_rgba_05 rgba(200, 220, 255, 0.5);
@define-color fg_rgba_03 rgba(230, 230, 230, 0.3); @define-color fg_rgba_03 rgba(200, 220, 255, 0.3);
@define-color fg_rgba_02 rgba(230, 230, 230, 0.2); @define-color fg_rgba_02 rgba(200, 220, 255, 0.2);
@define-color fg_rgba_01 rgba(230, 230, 230, 0.1); @define-color fg_rgba_01 rgba(200, 220, 255, 0.1);
/* /*
* ── Foreground accent, usually brighter or darker than default ─────── * ── Foreground accent, usually brighter or darker than default ───────
@@ -51,14 +51,14 @@
/* /*
* ── Accent Gradient ────────────────────────────────────────────────── * ── Accent Gradient ──────────────────────────────────────────────────
*/ */
@define-color accent_gradient_1 #390E2A; @define-color accent_gradient_1 #481235;
@define-color accent_gradient_2 #2E0B21; @define-color accent_gradient_2 #41102F;
@define-color accent_gradient_3 #24091B; @define-color accent_gradient_3 #3A0E2B;
@define-color accent_gradient_4 #1D0715; @define-color accent_gradient_4 #350D26;
@define-color accent_gradient_5 #170611; @define-color accent_gradient_5 #2F0C23;
@define-color accent_gradient_inverse_1 #8B2266; @define-color accent_gradient_inverse_1 #6E1B50;
@define-color accent_gradient_inverse_2 #8B2266; @define-color accent_gradient_inverse_2 #6E1B50;
@define-color accent_gradient_inverse_3 #8B2266; @define-color accent_gradient_inverse_3 #6E1B50;
/* /*
* ── Secondary accent colour ────────────────────────────────────────── * ── Secondary accent colour ──────────────────────────────────────────
@@ -97,33 +97,33 @@
/* /*
* ── Background color, main interface background ────────────────────── * ── Background color, main interface background ──────────────────────
*/ */
@define-color bg #141414; @define-color bg #0A0A0F;
@define-color bg_rgba_07 rgba(20, 20, 20, 0.7); @define-color bg_rgba_07 rgba(10, 10, 15, 0.7);
@define-color bg_rgba_05 rgba(20, 20, 20, 0.5); @define-color bg_rgba_05 rgba(10, 10, 15, 0.5);
@define-color bg_rgba_03 rgba(20, 20, 20, 0.3); @define-color bg_rgba_03 rgba(10, 10, 15, 0.3);
@define-color bg_rgba_02 rgba(20, 20, 20, 0.2); @define-color bg_rgba_02 rgba(10, 10, 15, 0.2);
@define-color bg_rgba_015 rgba(20, 20, 20, 0.15); @define-color bg_rgba_015 rgba(10, 10, 15, 0.15);
@define-color bg_rgba_011 rgba(20, 20, 20, 0.11); @define-color bg_rgba_011 rgba(10, 10, 15, 0.11);
/* /*
* ── Accent background color ────────────────────────────────────────── * ── Accent background color ──────────────────────────────────────────
*/ */
@define-color bg_accent #1E1E1E; @define-color bg_accent #141419;
@define-color bg_accent_rgba_07 rgba(30, 30, 30, 0.7); @define-color bg_accent_rgba_07 rgba(20, 20, 25, 0.7);
@define-color bg_accent_rgba_06 rgba(30, 30, 30, 0.6); @define-color bg_accent_rgba_06 rgba(20, 20, 25, 0.6);
@define-color bg_accent_rgba_05 rgba(30, 30, 30, 0.5); @define-color bg_accent_rgba_05 rgba(20, 20, 25, 0.5);
@define-color bg_accent_rgba_04 rgba(30, 30, 30, 0.4); @define-color bg_accent_rgba_04 rgba(20, 20, 25, 0.4);
@define-color bg_accent_rgba_03 rgba(30, 30, 30, 0.3); @define-color bg_accent_rgba_03 rgba(20, 20, 25, 0.3);
@define-color bg_accent_rgba_02 rgba(30, 30, 30, 0.2); @define-color bg_accent_rgba_02 rgba(20, 20, 25, 0.2);
@define-color bg_accent_rgba_015 rgba(30, 30, 30, 0.15); @define-color bg_accent_rgba_015 rgba(20, 20, 25, 0.15);
@define-color bg_accent_rgba_01 rgba(30, 30, 30, 0.1); @define-color bg_accent_rgba_01 rgba(20, 20, 25, 0.1);
/* /*
* ── Tertiary background colour ─────────────────────────────────────── * ── Tertiary background colour ───────────────────────────────────────
*/ */
@define-color bg_tertiary #2D2D2D; @define-color bg_tertiary #000000;
@define-color bg_tertiary_rgba_05 rgba(45, 45, 45, 0.5); @define-color bg_tertiary_rgba_05 rgba(0, 0, 0, 0.5);
@define-color bg_tertiary_rgba_02 rgba(45, 45, 45, 0.2); @define-color bg_tertiary_rgba_02 rgba(0, 0, 0, 0.2);
/* /*
* ── Inactive background colour ─────────────────────────────────────── * ── Inactive background colour ───────────────────────────────────────
@@ -140,10 +140,10 @@
/* /*
* ── Shadow colours ─────────────────────────────────────────────────── * ── Shadow colours ───────────────────────────────────────────────────
*/ */
@define-color shadow #282828; @define-color shadow #000002;
@define-color shadow_rgba_07 rgba(40, 40, 40, 0.7); @define-color shadow_rgba_07 rgba(0, 0, 2, 0.7);
@define-color shadow_rgba_05 rgba(40, 40, 40, 0.5); @define-color shadow_rgba_05 rgba(0, 0, 2, 0.5);
@define-color shadow_rgba_03 rgba(40, 40, 40, 0.3); @define-color shadow_rgba_03 rgba(0, 0, 2, 0.3);
@define-color shadow_rgba_02 rgba(40, 40, 40, 0.2); @define-color shadow_rgba_02 rgba(0, 0, 2, 0.2);
@define-color shadow_rgba_015 rgba(40, 40, 40, 0.15); @define-color shadow_rgba_015 rgba(0, 0, 2, 0.15);
@define-color shadow_rgba_011 rgba(40, 40, 40, 0.11); @define-color shadow_rgba_011 rgba(0, 0, 2, 0.11);

141
install
View File

@@ -1,37 +1,142 @@
#!/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
# 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
# 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
# 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/active/dotfiles/
./setup
cd ~/projects/active/
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
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.
"

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

9
postinstall Executable file
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

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

View File

@@ -9,10 +9,6 @@
#██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██ #██████████████ █████ ███████████████████████████████████████████████████████████████████████████████████████████████████ ██
general {
grace = 15
}
# ┌ ┐ # ┌ ┐
# │ BACKGROUND │ # │ BACKGROUND │
# └ ┘ # └ ┘

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"

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;
} }

5
scripts/auto-renamer Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
node "$SCRIPT_DIR/util/auto-renamer/index.js" $@

View File

@@ -1,7 +1,7 @@
#!/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:\n' encpass
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)
@@ -17,13 +17,13 @@ disconnect() {
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!' echo 'Ok!'
read -sp $'Please type in your Encryption Password: ' encpass read -sp $'Please choose and enter your Encryption Password (will be required when launching): ' encpass
echo 'Ok!' echo 'Ok!'
read -sp $'Please type in your ETHZ WLAN Password: ' PASSWORD read -sp $'Please enter your ETHZ WLAN (= Radius) Password: ' PASSWORD
echo 'Ok!' echo 'Ok!'
read -sp $'Please type in your ETHZ OTP Secret: ' TOKEN read -sp $'Please enter your ETHZ OTP Secret: ' TOKEN
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
@@ -54,6 +54,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
scripts/laptop-docked Executable file
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"

13
scripts/restart-bar Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
echo "
=> Restarting ags
"
killall gjs
killall ags
sleep 4
ags run -d ~/projects/active/dotfiles/config/astal --gtk4 & disown
sleep 2
ags run -d ~/projects/active/dotfiles/config/ags/notifications & disown

6
scripts/setup-clang-format Executable file
View File

@@ -0,0 +1,6 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
cp "$SCRIPT_DIR/../config/lint/clang-format" ./.clang-format

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

5
scripts/update-open-webui Executable file
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

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 ) );
}
}

46
setup
View File

@@ -23,7 +23,7 @@ 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=""
@@ -39,7 +39,9 @@ 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,6 +49,8 @@ if [ $regen == "y" ]; then
exit 130 exit 130
fi fi
cd .. cd ..
else
read -p "Apply full config? (y/N) " restart
fi fi
echo "=> Moving configs to correct destinations" echo "=> Moving configs to correct destinations"
@@ -55,22 +59,18 @@ 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/
# 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
# 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 +79,38 @@ 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 ya pkg upgrade
if [[ "$restart" == "y" ]]; then
echo " 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
sudo cp -r ./system/greetd/config.toml /etc/greetd/
# if [[ "$platform" == "d" ]]; then
# else
# echo "Setting up autologin config for greetd"
# sudo cp -r ./system/greetd/config-autologin.toml /etc/greetd/config.toml
# fi
hyprctl reload hyprctl reload
# echo " ./scripts/restart-bar
# => Restarting bars, etc fi
# "
# killall gjs hyprctl reload
# sleep 1
# ags run -d ./config/astal --gtk4 & disown 2>&1 > /dev/null
# ags run -d ./config/ags/notifications/ & disown 2>&1 > /dev/null
echo " echo "

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

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
system/greetd/pam Normal file
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

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"