aboutsummaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
Diffstat (limited to 'home')
-rw-r--r--home/rices/schrottkatze/niri.nix33
-rw-r--r--home/rices/schrottkatze/niri/kdl/binds.kdl77
-rw-r--r--home/rices/schrottkatze/niri/kdl/input.kdl17
-rw-r--r--home/rices/schrottkatze/niri/kdl/overviews.kdl19
-rw-r--r--home/rices/schrottkatze/niri/kdl/privacy.kdl12
-rw-r--r--home/rices/schrottkatze/niri/kdl/quirks.kdl42
-rw-r--r--home/rices/schrottkatze/niri/kdl/screenshot.kdl6
-rw-r--r--home/rices/schrottkatze/niri/kdl/style.kdl84
-rw-r--r--home/rices/schrottkatze/niri/kdl/workspaces.kdl58
-rwxr-xr-xhome/rices/schrottkatze/niri/scripts/cpdate.sh20
-rw-r--r--home/rices/schrottkatze/niri/shaders/arc.frag131
-rw-r--r--home/rices/schrottkatze/niri/wallpaper.jpgbin0 -> 8827762 bytes
12 files changed, 499 insertions, 0 deletions
diff --git a/home/rices/schrottkatze/niri.nix b/home/rices/schrottkatze/niri.nix
new file mode 100644
index 0000000..a69685f
--- /dev/null
+++ b/home/rices/schrottkatze/niri.nix
@@ -0,0 +1,33 @@
+# this file must only be saved via autosave due to the formatter.
+# else it will be ugly
+{pkgs, lib, ...}: {
+ home.packages = with pkgs; [
+ zenity
+ xwayland-satellite
+ ];
+ home.file."config" =
+ let
+ kdlfiles =
+ builtins.readDir ./niri/kdl
+ |> lib.filterAttrs (key: value: value == "regular")
+ |> lib.mapAttrsToList (filename: _value: "include \"${./niri/kdl}/${filename}\"");
+ startups =
+ [
+ ["eww" "open-many" "topBar" "bottomBar"]
+ ["${pkgs.swaybg}/bin/swaybg" "-i" "${./niri/wallpaper.jpg}" "-m" "fill"]
+ ["touch" ".config/niri/live.kdl"]
+ ]
+ |> map (map (word: "\"${word}\""))
+ |> map (lib.concatStringsSep " ")
+ |> map (it: "spawn-at-startup ${it}");
+ other = [
+ "include \"live.kdl\""
+ "output \"eDP-1\" { scale 1.1; }"
+ "animations { window-open { duration-ms 3000; curve \"linear\"; custom-shader r\"\n${builtins.readFile ./niri/shaders/arc.frag}\";};}"
+ "binds {Mod+Shift+I { spawn \"${./niri/scripts/cpdate.sh}\"; }; }"
+ ];
+ in {
+ target = ".config/niri/config.kdl";
+ text = lib.concatLines (startups ++ kdlfiles ++ other);
+ };
+}
diff --git a/home/rices/schrottkatze/niri/kdl/binds.kdl b/home/rices/schrottkatze/niri/kdl/binds.kdl
new file mode 100644
index 0000000..611e231
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/binds.kdl
@@ -0,0 +1,77 @@
+binds {
+ // spawn terminal
+ Mod+Return repeat=false { spawn "kitty"; }
+ Mod+D repeat=false { spawn "fuzzel"; }
+ Mod+I repeat=false { spawn "bemoji" "-n"; }
+ Mod+M repeat=false { spawn "hyprpicker"; }
+ Mod+E repeat=false { spawn "kitty" "hx" "~/.config/niri/live.kdl"; }
+
+ Mod+Shift+E { quit; }
+ Mod+Shift+Q { close-window; }
+ Mod+Ctrl+Shift+P { power-off-monitors; }
+
+ Mod+Shift+Ctrl+Slash allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; }
+
+ Mod+Shift+Slash { show-hotkey-overlay; }
+
+ Mod+Shift+C { set-dynamic-cast-window; }
+ Mod+Ctrl+C { set-dynamic-cast-monitor; }
+ Mod+Shift+Ctrl+C { clear-dynamic-cast-target; }
+
+ // window/columns controls
+ Mod+H { focus-column-left; }
+ Mod+J { focus-window-down; }
+ Mod+K { focus-window-up; }
+ Mod+L { focus-column-right; }
+ Mod+Ctrl+H { move-column-left; }
+ Mod+Ctrl+J { move-window-down; }
+ Mod+Ctrl+K { move-window-up; }
+ Mod+Ctrl+L { move-column-right; }
+ Mod+R { switch-preset-column-width; }
+
+ Mod+G { toggle-overview; }
+
+ Mod+V { toggle-window-floating; }
+ Mod+Shift+V { switch-focus-between-floating-and-tiling; }
+
+ // monitor controls
+ Mod+Shift+H { focus-monitor-left; }
+ Mod+Shift+J { focus-monitor-down; }
+ Mod+Shift+K { focus-monitor-up; }
+ Mod+Shift+L { focus-monitor-right; }
+ Mod+Shift+Ctrl+H { move-column-to-monitor-left; }
+ Mod+Shift+Ctrl+J { move-column-to-monitor-down; }
+ Mod+Shift+Ctrl+K { move-column-to-monitor-up; }
+ Mod+Shift+Ctrl+L { move-column-to-monitor-right; }
+
+ // column editing stuffs
+ Mod+BracketLeft { consume-or-expel-window-left; }
+ Mod+BracketRight { consume-or-expel-window-right; }
+ Mod+C { center-column; }
+ Mod+Minus { set-column-width "-5%"; }
+ Mod+Equal { set-column-width "+5%"; }
+ Mod+Shift+Minus { set-window-height "-10%"; }
+ Mod+Shift+Equal { set-window-height "+10%"; }
+ Mod+Shift+W { toggle-column-tabbed-display; }
+
+ Mod+F { maximize-column; }
+ Alt+F { expand-column-to-available-width; }
+ Mod+Shift+F { maximize-window-to-edges; }
+ Mod+Ctrl+F { fullscreen-window; }
+
+ Mod+Shift+Ctrl+F { toggle-windowed-fullscreen; }
+
+ // media keys
+ XF86AudioLowerVolume \
+ allow-when-locked=true \
+ { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
+ XF86AudioMicMute \
+ allow-when-locked=true \
+ { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
+ XF86AudioMute \
+ allow-when-locked=true \
+ { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
+ XF86AudioRaiseVolume \
+ allow-when-locked=true \
+ { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
+}
diff --git a/home/rices/schrottkatze/niri/kdl/input.kdl b/home/rices/schrottkatze/niri/kdl/input.kdl
new file mode 100644
index 0000000..a8be309
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/input.kdl
@@ -0,0 +1,17 @@
+input {
+ keyboard {
+ xkb {
+ layout "us"
+ variant "altgr-intl"
+ }
+ repeat-delay 600
+ repeat-rate 25
+ track-layout "global"
+ }
+ touchpad {
+ dwt
+ dwtp
+ natural-scroll
+ }
+ mouse { accel-profile "flat"; }
+}
diff --git a/home/rices/schrottkatze/niri/kdl/overviews.kdl b/home/rices/schrottkatze/niri/kdl/overviews.kdl
new file mode 100644
index 0000000..5cb4443
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/overviews.kdl
@@ -0,0 +1,19 @@
+overview {
+ backdrop-color "110000"
+ zoom 0.381966
+ workspace-shadow {
+ offset x=0 y=10
+ softness 60
+ color "#7f00008f"
+ }
+}
+
+recent-windows {
+ debounce-ms 1500
+ open-delay-ms 300
+ highlight {
+ active-color "f69ecf"
+ padding 5
+ corner-radius 2.5
+ }
+}
diff --git a/home/rices/schrottkatze/niri/kdl/privacy.kdl b/home/rices/schrottkatze/niri/kdl/privacy.kdl
new file mode 100644
index 0000000..1190aeb
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/privacy.kdl
@@ -0,0 +1,12 @@
+layer-rule {
+ match namespace="notifications"
+ block-out-from "screen-capture"
+}
+
+window-rule {
+ match app-id="^signal|Element|org.gnome.Evolution$"
+ match title="^.*(Discord|Beispiel Screenshare block Bug|Bitwarden|Träwelling).*$"
+ exclude title="^.*((Schrottkatze|Statistics|Leaderboard) - Träwelling|chaos.social|Nekoverse|catgirl.cloud).*$"
+ exclude is-floating=true
+ block-out-from "screen-capture"
+}
diff --git a/home/rices/schrottkatze/niri/kdl/quirks.kdl b/home/rices/schrottkatze/niri/kdl/quirks.kdl
new file mode 100644
index 0000000..07fa886
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/quirks.kdl
@@ -0,0 +1,42 @@
+// handle steam grabbing focus 1000 times on startup
+window-rule {
+ match app-id="steam" title="Steam"
+ open-focused false
+}
+
+// position steam notifs correctly: https://github.com/YaLTeR/niri/wiki/Application-Issues
+window-rule {
+ match app-id="steam" title="^notificationtoasts_[\\d]+_desktop$"
+ open-focused false
+ border { off; }
+ shadow { off; }
+ baba-is-float false
+ default-floating-position relative-to="bottom-right" x=0 y=0
+}
+
+// fix guild wars
+window-rule {
+ match app-id="steam_app_1284210" title="Guild Wars 2"
+ match app-id="(steam_app_[0-9]+|[Mm]inecraft.*|gamescope)"
+ border { off; }
+ shadow { off; }
+}
+
+window-rule {
+ match app-id="chromium-browser"
+ geometry-corner-radius 6 6 1 1
+}
+
+window-rule {
+ match app-id="vesktop" is-floating=true
+ geometry-corner-radius 6
+}
+
+environment {
+ ELECTRON_OZONE_PLATFORM_HINT "auto"
+}
+
+window-rule {
+ match app-id="zenity"
+ geometry-corner-radius 16
+}
diff --git a/home/rices/schrottkatze/niri/kdl/screenshot.kdl b/home/rices/schrottkatze/niri/kdl/screenshot.kdl
new file mode 100644
index 0000000..f99e15c
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/screenshot.kdl
@@ -0,0 +1,6 @@
+screenshot-path "~/Pictures/screenshots/%Y-%m-%dT%H:%M:%S.png"
+binds {
+ Mod+Ctrl+S { screenshot-screen; }
+ Mod+Shift+S { screenshot-window; }
+ Mod+S { screenshot; }
+}
diff --git a/home/rices/schrottkatze/niri/kdl/style.kdl b/home/rices/schrottkatze/niri/kdl/style.kdl
new file mode 100644
index 0000000..fccf795
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/style.kdl
@@ -0,0 +1,84 @@
+prefer-no-csd
+
+cursor {
+ xcursor-theme "phinger-cursors-dark"
+ xcursor-size 32
+ hide-when-typing
+ hide-after-inactive-ms 10000
+}
+
+layout {
+ gaps 15
+ struts {
+ left 0
+ right 0
+ top 0
+ bottom 0
+ }
+ focus-ring { off; }
+ border {
+ on
+ width 3
+ active-gradient angle=135 from="#f69ecf" in="oklch shorter hue" relative-to="window" to="#5bcefa"
+ inactive-gradient angle=135 from="#f69ecf" in="oklch shorter hue" relative-to="window" to="#ff9a56"
+ }
+ tab-indicator {
+ hide-when-single-tab
+ gap 2
+ width 5
+ length total-proportion=0.500000
+ position "left"
+ gaps-between-tabs 0
+ corner-radius 3
+ active-color "#5bcefa"
+ inactive-color "#3c3836"
+ }
+ default-column-width
+ center-focused-column "never"
+}
+
+window-rule {
+ match is-floating=true
+ exclude app-id="steam_app_[0-9]+"
+ shadow {
+ on
+ offset x=0 y=0
+ softness 40
+ color "#bab9e5af"
+ inactive-color "#fa9d99af"
+ }
+}
+
+window-rule {
+ geometry-corner-radius 1
+ clip-to-geometry true
+}
+
+window-rule {
+ match is-window-cast-target=true
+ border {
+ on
+ active-gradient angle=135 \
+ from="#64de50" \
+ in="oklch shorter hue" \
+ relative-to="window" \
+ to="#5bcefa"
+ inactive-gradient angle=135 \
+ from="#64de50" \
+ in="oklch shorter hue" \
+ relative-to="window" \
+ to="#ff9a56"
+ }
+}
+
+layer-rule {
+ match namespace="launcher"
+ geometry-corner-radius 10
+ shadow {
+ on
+ offset x=0 y=0
+ softness 40
+ color "#bab9e5af"
+ }
+ baba-is-float true
+}
diff --git a/home/rices/schrottkatze/niri/kdl/workspaces.kdl b/home/rices/schrottkatze/niri/kdl/workspaces.kdl
new file mode 100644
index 0000000..ab89dec
--- /dev/null
+++ b/home/rices/schrottkatze/niri/kdl/workspaces.kdl
@@ -0,0 +1,58 @@
+// WS Social
+workspace "social"
+
+spawn-at-startup "signal-desktop"
+spawn-at-startup ".evolution-wrapped_"
+spawn-at-startup "vesktop"
+spawn-at-startup "deltachat"
+
+window-rule {
+ match app-id="^(signal|Element|org.gnome.Evolution|discord|steam|DeltaChat)$"
+ open-on-workspace "social"
+}
+
+// WS Browser
+workspace "browser"
+
+spawn-at-startup "firefox"
+spawn-at-startup "obsidian"
+
+window-rule {
+ match app-id="^firefox|Chromium-browser|obsidian$"
+ open-on-workspace "browser"
+}
+
+binds {
+ Mod+P { focus-workspace-up; }
+ Mod+N { focus-workspace-down; }
+ Mod+Ctrl+P { move-workspace-up; }
+ Mod+Ctrl+N { move-workspace-down; }
+ Mod+Shift+P { move-column-to-workspace-up; }
+ Mod+Shift+N { move-column-to-workspace-down; }
+
+ Mod+Q { focus-workspace "social"; }
+ Mod+W { focus-workspace "browser"; }
+ Mod+E { focus-workspace 3; }
+ Mod+Ctrl+Q { move-column-to-workspace "social"; }
+ Mod+Ctrl+W { move-column-to-workspace "browser"; }
+ Mod+Ctrl+E { move-column-to-workspace 3; }
+
+ Mod+1 { focus-workspace 4; }
+ Mod+2 { focus-workspace 5; }
+ Mod+3 { focus-workspace 6; }
+ Mod+4 { focus-workspace 7; }
+ Mod+5 { focus-workspace 8; }
+ Mod+6 { focus-workspace 9; }
+ Mod+7 { focus-workspace 10; }
+ Mod+8 { focus-workspace 11; }
+ Mod+9 { focus-workspace 12; }
+ Mod+Ctrl+1 { move-column-to-workspace 4; }
+ Mod+Ctrl+2 { move-column-to-workspace 5; }
+ Mod+Ctrl+3 { move-column-to-workspace 6; }
+ Mod+Ctrl+4 { move-column-to-workspace 7; }
+ Mod+Ctrl+5 { move-column-to-workspace 8; }
+ Mod+Ctrl+6 { move-column-to-workspace 9; }
+ Mod+Ctrl+7 { move-column-to-workspace 10; }
+ Mod+Ctrl+8 { move-column-to-workspace 11; }
+ Mod+Ctrl+9 { move-column-to-workspace 12; }
+}
diff --git a/home/rices/schrottkatze/niri/scripts/cpdate.sh b/home/rices/schrottkatze/niri/scripts/cpdate.sh
new file mode 100755
index 0000000..acc2994
--- /dev/null
+++ b/home/rices/schrottkatze/niri/scripts/cpdate.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env nu
+
+const FORMATS = [
+ "%F"
+ "%R"
+ "%d.%m.%Y"
+ "%d.%m"
+ "%T"
+ "%FT%H"
+ "%FT%R"
+ "%F %R"
+ "%F %T"
+];
+
+def main [] {
+ let date = date now;
+ let len = $FORMATS | length;
+
+ $FORMATS | each {|it| $date | format date $it } | to text | fuzzel -dl $len | str trim | wl-copy
+}
diff --git a/home/rices/schrottkatze/niri/shaders/arc.frag b/home/rices/schrottkatze/niri/shaders/arc.frag
new file mode 100644
index 0000000..301357c
--- /dev/null
+++ b/home/rices/schrottkatze/niri/shaders/arc.frag
@@ -0,0 +1,131 @@
+
+#define PI 3.14159
+
+#define TAU 6.28319
+
+#define WIDTH 3.
+#define RADIUS 1.
+
+#define WIPE_DURATION .2
+#define BORDER_LOOPS 3.
+#define FADE_ITS 2.
+
+vec4 gradi(float pos, vec4 bg, vec4 fg, float fac, float mask) {
+ if (mask < 0.2) {
+ return bg;
+ }
+
+ vec4 trans = vec4(0.);
+ vec4 purple = vec4(0.45, 0.13, 0.49, 1.0) * vec4(mask);
+ vec4 blue = vec4(0.25, 0.74, 0.81, 1.0) * vec4(mask);
+ vec4 white = vec4(mask);
+ float mult = 4. * fac;
+
+ if (pos <= 0.125) {
+ return mix(bg, purple, max(0., pos * mult));
+ } else if (pos <= 0.25) {
+ return mix(purple, blue, (pos * mult) - 1.);
+ } else if (pos <= 0.5) {
+ return mix(blue, white, (pos * mult) - 2.);
+ } else {
+ return fg;
+ }
+
+}
+
+// from niri source code: https://github.com/YaLTeR/niri/blob/f30db163b5748e8cf95c05aba77d0d3736f40543/src/render_helpers/shaders/border.frag#L211-L234
+float rounding_alpha(vec2 coords, vec2 size, vec4 corner_radius) {
+ vec2 center;
+ float radius;
+
+ if (coords.x < corner_radius.x && coords.y < corner_radius.x) {
+ radius = corner_radius.x;
+ center = vec2(radius, radius);
+ } else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) {
+ radius = corner_radius.y;
+ center = vec2(size.x - radius, radius);
+ } else if (size.x - corner_radius.z < coords.x && size.y - corner_radius.z < coords.y) {
+ radius = corner_radius.z;
+ center = vec2(size.x - radius, size.y - radius);
+ } else if (coords.x < corner_radius.w && size.y - corner_radius.w < coords.y) {
+ radius = corner_radius.w;
+ center = vec2(radius, size.y - radius);
+ } else {
+ return 1.0;//
+ }
+
+ float dist = distance(coords, center);
+ float half_px = 0.5;
+ return 1.0 - smoothstep(radius - half_px, radius + half_px, dist);
+}
+
+vec4 open_color(vec3 coords_geo, vec3 size_geo) {
+ vec4 bg1 = vec4(.1, .1, .18, 1.0);
+ vec4 bg2 = vec4(.09, .05, .11, 1.0);
+
+ vec3 coords_tex = niri_geo_to_tex * coords_geo;
+ vec4 color = texture2D(niri_tex, coords_tex.st);
+
+ float pi = radians(180.);
+
+ if (0.0 <= coords_geo.x && coords_geo.x <= 1.0
+ && 0.0 <= coords_geo.y && coords_geo.y <= 1.0)
+ {
+ float pos = (coords_tex.x - ((1. / WIPE_DURATION) * niri_clamped_progress) * 2.) + 1.;
+ vec2 coords = (coords_geo.xy - vec2(0.5, 0.5)) * size_geo.xy * 2.0;
+ vec2 coords_abs = coords_geo.xy * size_geo.xy;
+
+ float border_a = 1.;
+
+ border_a *= rounding_alpha(
+ coords_abs.xy,
+ size_geo.xy,
+ vec4(RADIUS + WIDTH)
+ );
+
+ vec4 bg = mix(bg1, bg2, length(coords_tex.xy - vec2(1., 0.))) * border_a;
+
+ color = gradi(pos, color, bg, 2.0, border_a);
+
+ float angle = (atan(coords.y, coords.x) + PI) / TAU;
+ float spinny_angle = mod((angle + niri_clamped_progress * BORDER_LOOPS), 1.0) / 2.;
+
+ vec2 border = WIDTH / size_geo.xy;
+
+ float temp = border_a;
+ float round_a = 1. - rounding_alpha(
+ coords_abs.xy - WIDTH,
+ size_geo.xy - WIDTH * 2.,
+ vec4(RADIUS)
+ );
+
+ if (coords_geo.x <= border.x || coords_geo.x >= (1. - border.x) ||
+ coords_geo.y <= border.y || coords_geo.y >= (1. - border.y)) {
+ border_a *= round_a;
+ }
+
+ float rest = 0.;
+ if (border_a + temp == 1.) {
+ rest = 1.;
+ }
+
+ border_a *= round_a;
+ border_a += rest;
+
+ vec4 grad = gradi(
+ spinny_angle,
+ vec4(.48, .37, .5, 1.),
+ vec4(1., 0., 0., 1.),
+ 2.0, // DO NOT TOUCH
+ border_a
+ );
+
+ if ((1. - niri_clamped_progress) < FADE_ITS / BORDER_LOOPS) {
+ border_a *= (1. - niri_clamped_progress) / (FADE_ITS / BORDER_LOOPS);
+ }
+ color = mix(color, grad, border_a);
+
+ }
+
+ return color;
+}
diff --git a/home/rices/schrottkatze/niri/wallpaper.jpg b/home/rices/schrottkatze/niri/wallpaper.jpg
new file mode 100644
index 0000000..5b31b96
--- /dev/null
+++ b/home/rices/schrottkatze/niri/wallpaper.jpg
Binary files differ