From 7a3f368aca3c251a9671f411898e7a39a434046e Mon Sep 17 00:00:00 2001 From: m3tam3re Date: Thu, 28 Aug 2025 20:28:10 +0200 Subject: [PATCH] + webapp launcher, hyprland config changes --- home/features/desktop/default.nix | 2 +- home/features/desktop/hyprland.nix | 399 +++++++++++++++-------------- home/features/desktop/waybar.nix | 285 --------------------- home/features/desktop/wayland.nix | 30 +++ home/m3tam3re/m3-ares.nix | 6 +- home/m3tam3re/m3-kratos.nix | 6 +- pkgs/default.nix | 1 + 7 files changed, 243 insertions(+), 486 deletions(-) delete mode 100644 home/features/desktop/waybar.nix create mode 100644 home/features/desktop/wayland.nix diff --git a/home/features/desktop/default.nix b/home/features/desktop/default.nix index cb802db..af10a2a 100644 --- a/home/features/desktop/default.nix +++ b/home/features/desktop/default.nix @@ -9,7 +9,7 @@ ./office.nix ./rofi.nix ./theme.nix - ./waybar.nix + ./wayland.nix ]; xdg = { diff --git a/home/features/desktop/hyprland.nix b/home/features/desktop/hyprland.nix index 124bd5d..15e17a2 100644 --- a/home/features/desktop/hyprland.nix +++ b/home/features/desktop/hyprland.nix @@ -1,199 +1,218 @@ { - wayland.windowManager.hyprland = { - settings = { - xwayland = { - force_zero_scaling = true; - }; + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.features.desktop.hyprland; +in { + options.features.desktop.hyprland.enable = + mkEnableOption "Hyprland related stuff"; - exec-once = [ - "hyprpanel" - "hyprpaper" - "hyprpaper-random" - "hypridle" - "wl-paste --type text --watch cliphist store" # Stores only text data - "wl-paste --type image --watch cliphist store" # Stores only image data "wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\"" - ]; - - env = [ - "XCURSOR_SIZE,32" - "HYPRCURSOR_THEME,Bibata-Modern-Ice" - "WLR_NO_HARDWARE_CURSORS,1" - "GTK_THEME,Dracula" - ]; - - input = { - kb_layout = "de,us"; - kb_variant = ""; - kb_model = ""; - kb_rules = ""; - kb_options = "ctrl:nocaps"; - follow_mouse = 1; - }; - - general = { - gaps_in = 5; - gaps_out = 5; - border_size = 1; - "col.active_border" = "rgba(9742b5ee) rgba(9742b5ee) 45deg"; - "col.inactive_border" = "rgba(595959aa)"; - layout = "dwindle"; - }; - - decoration = { - shadow = { - enabled = true; - range = 60; - render_power = 3; - color = "rgba(1E202966)"; - offset = "1 2"; - scale = 0.97; + config = mkIf cfg.enable { + wayland.windowManager.hyprland = { + settings = { + xwayland = { + force_zero_scaling = true; }; - rounding = 8; - blur = { - enabled = true; - size = 3; - passes = 3; - }; - active_opacity = 0.9; - inactive_opacity = 0.5; - }; - animations = { - enabled = true; - bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; - animation = [ - "windows, 1, 7, myBezier" - "windowsOut, 1, 7, default, popin 80%" - "border, 1, 10, default" - "borderangle, 1, 8, default" - "fade, 1, 7, default" - "workspaces, 1, 6, default" + exec-once = [ + "hyprpanel" + "hyprpaper" + "hyprpaper-random" + "hypridle" + "wl-paste --type text --watch cliphist store" # Stores only text data + "wl-paste --type image --watch cliphist store" # Stores only image data "wl-paste -p -t text --watch clipman store -P --histpath=\"~/.local/share/clipman-primary.json\"" + "xwaylandvideobridge" + ]; + + env = [ + "XCURSOR_SIZE,32" + "HYPRCURSOR_THEME,Bibata-Modern-Ice" + "WLR_NO_HARDWARE_CURSORS,1" + "GTK_THEME,Dracula" + ]; + + input = { + kb_layout = "de,us"; + kb_variant = ""; + kb_model = ""; + kb_rules = ""; + kb_options = "ctrl:nocaps"; + follow_mouse = 1; + }; + + general = { + gaps_in = 5; + gaps_out = 5; + border_size = 1; + "col.active_border" = "rgba(9742b5ee) rgba(9742b5ee) 45deg"; + "col.inactive_border" = "rgba(595959aa)"; + layout = "dwindle"; + }; + + decoration = { + shadow = { + enabled = true; + range = 60; + render_power = 3; + color = "rgba(1E202966)"; + offset = "1 2"; + scale = 0.97; + }; + rounding = 8; + blur = { + enabled = true; + size = 3; + passes = 3; + }; + active_opacity = 0.9; + inactive_opacity = 0.5; + }; + + animations = { + enabled = true; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + }; + + master = { + new_status = "master"; + }; + + gestures = { + workspace_swipe = false; + }; + + device = [ + { + name = "epic-mouse-v1"; + sensitivity = -0.5; + } + { + name = "zsa-technology-labs-moonlander-mark-i"; + kb_layout = "us"; + } + { + name = "keychron-keychron-k7"; + kb_layout = "us"; + } + ]; + windowrule = [ + "float, class:file_progress" + "float, class:confirm" + "float, class:dialog" + "float, class:download" + "float, class:notification" + "float, class:error" + "float, class:splash" + "float, class:confirmreset" + "float, title:Open File" + "float, title:branchdialog" + "float, class:pavucontrol-qt" + "float, class:pavucontrol" + "fullscreen, class:wlogout" + "float, title:wlogout" + "fullscreen, title:wlogout" + "float, class:mpv" + "idleinhibit focus, class:mpv" + "opacity 1.0 override, class:mpv" + "float, title:^(Media viewer)$" + "float, title:^(Volume Control)$" + "float, title:^(Picture-in-Picture)$" + "float,title:^(floating-pomodoro)$" + "size 250 50, title:^(floating-pomodoro)$" + "move 12 100%-150,title:^(floating-pomodoro)$" + "pin,title:^(floating-pomodoro)$" + "float, initialTitle:.*streamlabs.com.*" + "pin, initialTitle:.*streamlabs.com.*" + "size 800 400, initialTitle:.*streamlabs.com.*" + "move 100%-820 102, initialTitle:.*alert-box.*" + "move 100%-820 512, initialTitle:.*chat-box.*" + "opacity 0.5 override, initialTitle:.*streamlabs.com.*" + "idleinhibit focus, initialTitle:.*streamlabs.com.*" + "noanim, initialTitle:.*streamlabs.com.*" + "noborder, initialTitle:.*streamlabs.com.*" + "noshadow, initialTitle:.*streamlabs.com.*" + "noblur, initialTitle:.*streamlabs.com.*" + "opacity 0.0 override, class:^(xwaylandvideobridge)$" + "noanim, class:^(xwaylandvideobridge)$" + "noinitialfocus, class:^(xwaylandvideobridge)$" + "maxsize 1 1, class:^(xwaylandvideobridge)$" + "noblur, class:^(xwaylandvideobridge)$" + "nofocus, class:^(xwaylandvideobridge)$" + ]; + "$mainMod" = "SUPER"; + + bind = [ + "$mainMod, return, exec, nu -c zellij-ps" + # "$mainMod, t, exec, warp-terminal" + "$mainMod, t, exec, kitty -e nu -c 'nitch; exec nu'" + "$mainMod SHIFT, t, exec, launch-timer" + "$mainMod SHIFT, e, exec, kitty -e zellij_nvim" + "$mainMod, o, exec, hyprctl setprop activewindow opaque toggle" + "$mainMod, r, exec, hyprctl dispatch focuswindow \"initialtitle:.*alert-box.*\" && hyprctl dispatch moveactive exact 4300 102 && hyprctl dispatch focuswindow \"initialtitle:.*chat-box.*\" && hyprctl dispatch moveactive exact 4300 512" + "$mainMod, b, exec, thunar" + "$mainMod SHIFT, B, exec, vivaldi" + "$mainMod, Escape, exec, wlogout -p layer-shell" + "$mainMod, Space, togglefloating" + "$mainMod, q, killactive" + "$mainMod, M, exit" + "$mainMod, F, fullscreen" + "$mainMod SHIFT, V, togglefloating" + "$mainMod, D, exec, rofi -show" + "$mainMod, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy" + "$mainMod SHIFT, S, exec, bemoji" + "$mainMod, P, exec, rofi-pass" + "$mainMod SHIFT, P, pseudo" + "$mainMod, J, togglesplit" + "$mainMod, h, movefocus, l" + "$mainMod, l, movefocus, r" + "$mainMod, k, movefocus, u" + "$mainMod, j, movefocus, d" + "$mainMod, 1, workspace, 1" + + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" + "$mainMod, 0, workspace, 10" + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" + "$mainMod SHIFT, 0, movetoworkspace, 10" + "$mainMod, mouse_down, workspace, e+1" + "$mainMod, mouse_up, workspace, e-1" + ]; + + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" ]; }; - - dwindle = { - pseudotile = true; - preserve_split = true; - }; - - master = { - new_status = "master"; - }; - - gestures = { - workspace_swipe = false; - }; - - device = [ - { - name = "epic-mouse-v1"; - sensitivity = -0.5; - } - { - name = "zsa-technology-labs-moonlander-mark-i"; - kb_layout = "us"; - } - { - name = "keychron-keychron-k7"; - kb_layout = "us"; - } - ]; - windowrule = [ - "float, class:file_progress" - "float, class:confirm" - "float, class:dialog" - "float, class:download" - "float, class:notification" - "float, class:error" - "float, class:splash" - "float, class:confirmreset" - "float, title:Open File" - "float, title:branchdialog" - "float, class:pavucontrol-qt" - "float, class:pavucontrol" - "fullscreen, class:wlogout" - "float, title:wlogout" - "fullscreen, title:wlogout" - "float, class:mpv" - "idleinhibit focus, class:mpv" - "opacity 1.0 override, class:mpv" - "float, title:^(Media viewer)$" - "float, title:^(Volume Control)$" - "float, title:^(Picture-in-Picture)$" - "float,title:^(floating-pomodoro)$" - "size 250 50, title:^(floating-pomodoro)$" - "move 12 100%-150,title:^(floating-pomodoro)$" - "pin,title:^(floating-pomodoro)$" - "float, initialTitle:.*streamlabs.com.*" - "pin, initialTitle:.*streamlabs.com.*" - "size 800 400, initialTitle:.*streamlabs.com.*" - "move 100%-820 102, initialTitle:.*alert-box.*" - "move 100%-820 512, initialTitle:.*chat-box.*" - "opacity 0.5 override, initialTitle:.*streamlabs.com.*" - "idleinhibit focus, initialTitle:.*streamlabs.com.*" - "noanim, initialTitle:.*streamlabs.com.*" - "noborder, initialTitle:.*streamlabs.com.*" - "noshadow, initialTitle:.*streamlabs.com.*" - "noblur, initialTitle:.*streamlabs.com.*" - ]; - - "$mainMod" = "SUPER"; - - bind = [ - "$mainMod, return, exec, nu -c zellij-ps" - # "$mainMod, t, exec, warp-terminal" - "$mainMod, t, exec, kitty -e nu -c 'nitch; exec nu'" - "$mainMod SHIFT, t, exec, launch-timer" - "$mainMod SHIFT, e, exec, kitty -e zellij_nvim" - "$mainMod, o, exec, hyprctl setprop activewindow opaque toggle" - "$mainMod, r, exec, hyprctl dispatch focuswindow \"initialtitle:.*alert-box.*\" && hyprctl dispatch moveactive exact 4300 102 && hyprctl dispatch focuswindow \"initialtitle:.*chat-box.*\" && hyprctl dispatch moveactive exact 4300 512" - "$mainMod, b, exec, thunar" - "$mainMod SHIFT, B, exec, vivaldi" - "$mainMod, Escape, exec, wlogout -p layer-shell" - "$mainMod, Space, togglefloating" - "$mainMod, q, killactive" - "$mainMod, M, exit" - "$mainMod, F, fullscreen" - "$mainMod SHIFT, V, togglefloating" - "$mainMod, D, exec, rofi -show" - "$mainMod, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy" - "$mainMod SHIFT, S, exec, bemoji" - "$mainMod, P, exec, rofi-pass" - "$mainMod SHIFT, P, pseudo" - "$mainMod, J, togglesplit" - "$mainMod, h, movefocus, l" - "$mainMod, l, movefocus, r" - "$mainMod, k, movefocus, u" - "$mainMod, j, movefocus, d" - "$mainMod, 1, workspace, 1" - - "$mainMod, 2, workspace, 2" - "$mainMod, 3, workspace, 3" - "$mainMod, 4, workspace, 4" - "$mainMod, 5, workspace, 5" - "$mainMod, 6, workspace, 6" - "$mainMod, 7, workspace, 7" - "$mainMod, 8, workspace, 8" - "$mainMod, 9, workspace, 9" - "$mainMod, 0, workspace, 10" - "$mainMod SHIFT, 1, movetoworkspace, 1" - "$mainMod SHIFT, 2, movetoworkspace, 2" - "$mainMod SHIFT, 3, movetoworkspace, 3" - "$mainMod SHIFT, 4, movetoworkspace, 4" - "$mainMod SHIFT, 5, movetoworkspace, 5" - "$mainMod SHIFT, 6, movetoworkspace, 6" - "$mainMod SHIFT, 7, movetoworkspace, 7" - "$mainMod SHIFT, 8, movetoworkspace, 8" - "$mainMod SHIFT, 9, movetoworkspace, 9" - "$mainMod SHIFT, 0, movetoworkspace, 10" - "$mainMod, mouse_down, workspace, e+1" - "$mainMod, mouse_up, workspace, e-1" - ]; - - bindm = [ - "$mainMod, mouse:272, movewindow" - "$mainMod, mouse:273, resizewindow" - ]; }; }; } diff --git a/home/features/desktop/waybar.nix b/home/features/desktop/waybar.nix deleted file mode 100644 index 3c9b80c..0000000 --- a/home/features/desktop/waybar.nix +++ /dev/null @@ -1,285 +0,0 @@ -{ - config, - lib, - pkgs, - ... -}: -with lib; let - cfg = config.features.desktop.wayland; -in { - options.features.desktop.wayland.enable = mkEnableOption "wayland extra tools and config"; - - config = mkIf cfg.enable { - programs.waybar = { - enable = true; - style = '' - @define-color background-darker rgba(30, 31, 41, 230); - @define-color background #282a36; - @define-color selection #44475a; - @define-color foreground #f8f8f2; - @define-color comment #6272a4; - @define-color cyan #8be9fd; - @define-color green #50fa7b; - @define-color orange #ffb86c; - @define-color pink #ff79c6; - @define-color purple #bd93f9; - @define-color red #ff5555; - @define-color yellow #f1fa8c; - - * { - border: none; - border-radius: 0; - font-family: FiraCode Nerd Font; - font-weight: bold; - font-size: 14px; - min-height: 0; - } - - window#waybar { - background: rgba(21, 18, 27, 0); - color: #cdd6f4; - } - - tooltip { - background: #1e1e2e; - border-radius: 10px; - border-width: 2px; - border-style: solid; - border-color: #11111b; - } - - #workspaces button { - padding: 5px; - color: #313244; - margin-right: 5px; - } - - #workspaces button.active { - color: #11111b; - background: #a6e3a1; - border-radius: 10px; - } - - #workspaces button.focused { - color: #a6adc8; - background: #eba0ac; - border-radius: 10px; - } - - #workspaces button.urgent { - color: #11111b; - background: #a6e3a1; - border-radius: 10px; - } - - #workspaces button:hover { - background: #11111b; - color: #cdd6f4; - border-radius: 10px; - } - - #custom-language, - #custom-updates, - #custom-caffeine, - #custom-weather, - #window, - #clock, - #battery, - #pulseaudio, - #network, - #workspaces, - #tray, - #backlight { - background: #1e1e2e; - padding: 0px 10px; - margin: 3px 0px; - margin-top: 10px; - border: 1px solid #181825; - } - - #tray { - border-radius: 10px; - margin-right: 10px; - } - - #workspaces { - background: #1e1e2e; - border-radius: 10px; - margin-left: 10px; - padding-right: 0px; - padding-left: 5px; - } - - #custom-caffeine { - color: #89dceb; - border-radius: 10px 0px 0px 10px; - border-right: 0px; - margin-left: 10px; - } - - #custom-language { - color: #f38ba8; - border-left: 0px; - border-right: 0px; - } - - #custom-updates { - color: #f5c2e7; - border-left: 0px; - border-right: 0px; - } - - #window { - border-radius: 10px; - margin-left: 60px; - margin-right: 60px; - } - - #clock { - color: #fab387; - border-radius: 10px 0px 0px 10px; - margin-left: 0px; - border-right: 0px; - } - - #network { - color: #f9e2af; - border-left: 0px; - border-right: 0px; - } - - #pulseaudio { - color: #89b4fa; - border-left: 0px; - border-right: 0px; - } - - #pulseaudio.microphone { - color: #cba6f7; - border-left: 0px; - border-right: 0px; - } - - #battery { - color: #a6e3a1; - border-radius: 0 10px 10px 0; - margin-right: 10px; - border-left: 0px; - } - - #custom-weather { - border-radius: 0px 10px 10px 0px; - border-right: 0px; - margin-left: 0px; - } - ''; - settings = { - mainbar = { - layer = "top"; - position = "top"; - mod = "dock"; - exclusive = true; - passthrough = false; - gtk-layer-shell = true; - height = 0; - modules-left = ["clock" "custom/weather" "hyprland/workspaces"]; - modules-center = ["hyprland/window"]; - modules-right = [ - "tray" - "custom/language" - "battery" - "backlight" - "pulseaudio" - "pulseaudio#microphone" - ]; - - "hyprland/window" = { - format = "👉 {}"; - seperate-outputs = true; - }; - "hyprland/workspaces" = { - disable-scroll = true; - all-outputs = true; - on-click = "activate"; - format = " {name} {icon} "; - on-scroll-up = "hyprctl dispatch workspace e+1"; - on-scroll-down = "hyprctl dispatch workspace e-1"; - format-icons = { - "1" = ""; - "2" = ""; - "3" = ""; - "4" = ""; - "5" = ""; - "6" = ""; - "7" = ""; - }; - persistent_workspaces = { - "1" = []; - "2" = []; - "3" = []; - "4" = []; - }; - }; - "custom/weather" = { - format = "{}°C"; - tooltip = true; - interval = 3600; - exec = "wttrbar --location Pockau-Lengefeld"; - return-type = "json"; - }; - tray = { - icon-size = 13; - spacing = 10; - }; - clock = { - format = " {:%R  %d/%m}"; - tooltip-format = "{:%Y %B}\n{calendar}"; - }; - pulseaudio = { - format = "{icon} {volume}%"; - tooltip = false; - format-muted = " Muted"; - on-click = "pamixer -t"; - on-scroll-up = "pamixer -i 5"; - on-scroll-down = "pamixer -d 5"; - scroll-step = 5; - format-icons = { - headphone = ""; - hands-free = ""; - headset = ""; - phone = ""; - portable = ""; - car = ""; - default = ["" "" ""]; - }; - }; - "pulseaudio#microphone" = { - format = "{format_source}"; - format-source = " {volume}%"; - format-source-muted = " Muted"; - on-click = "pamixer --default-source -t"; - on-scroll-up = "pamixer --default-source -i 5"; - on-scroll-down = "pamixer --default-source -d 5"; - scroll-step = 5; - }; - }; - }; - }; - - home.packages = with pkgs; [ - grim - hyprcursor - hyprlock - hyprpaper - qt6.qtwayland - slurp - waypipe - wl-clipboard - wf-recorder - wl-mirror - wlogout - wtype - ydotool - ]; - }; -} diff --git a/home/features/desktop/wayland.nix b/home/features/desktop/wayland.nix new file mode 100644 index 0000000..e53502a --- /dev/null +++ b/home/features/desktop/wayland.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.features.desktop.wayland; +in { + options.features.desktop.wayland.enable = mkEnableOption "wayland extra tools and config"; + + config = mkIf cfg.enable { + home.packages = with pkgs; [ + grim + kdePackages.xwaylandvideobridge + hyprcursor + hyprlock + hyprpaper + qt6.qtwayland + slurp + waypipe + wl-clipboard + wf-recorder + wl-mirror + wlogout + wtype + ydotool + ]; + }; +} diff --git a/home/m3tam3re/m3-ares.nix b/home/m3tam3re/m3-ares.nix index 0137490..eb7f48c 100644 --- a/home/m3tam3re/m3-ares.nix +++ b/home/m3tam3re/m3-ares.nix @@ -16,11 +16,7 @@ in { #./services/librechat.nix ]; - options.features.desktop.hyprland.enable = - mkEnableOption "enable Hyprland"; - config = mkMerge [ - # Base configuration { xdg = { # TODO: better structure @@ -69,7 +65,7 @@ in { }; } - (mkIf cfg.enable { + (mkIf config.features.desktop.hyprland.enable { wayland.windowManager.hyprland = { enable = true; settings = { diff --git a/home/m3tam3re/m3-kratos.nix b/home/m3tam3re/m3-kratos.nix index 71d33b6..4af6d4c 100644 --- a/home/m3tam3re/m3-kratos.nix +++ b/home/m3tam3re/m3-kratos.nix @@ -15,11 +15,7 @@ in { ../features/desktop ]; - options.features.desktop.hyprland.enable = - mkEnableOption "enable Hyprland"; - config = mkMerge [ - # Base configuration { xdg = { # TODO: better structure @@ -67,7 +63,7 @@ in { }; } - (mkIf cfg.enable { + (mkIf config.features.desktop.hyprland.enable { wayland.windowManager.hyprland = { enable = true; settings = { diff --git a/pkgs/default.nix b/pkgs/default.nix index 0ce81b7..47684f1 100644 --- a/pkgs/default.nix +++ b/pkgs/default.nix @@ -1,6 +1,7 @@ {pkgs, ...}: { # Define your custom packages here hyprpaper-random = pkgs.callPackage ./hyprpaper-random {}; + launch-webapp = pkgs.callPackage ./launch-webapp/default.nix {}; msty = pkgs.callPackage ./msty {}; msty-sidecar = pkgs.callPackage ./msty-sidecar {}; zellij-ps = pkgs.callPackage ./zellij-ps {};