{ user }: { lib, pkgs, config, ... }: with lib; let cfg = config.windowManager; in { options.windowManager = { hyprland = mkEnableOption "hyprland"; sway = mkEnableOption "sway"; }; config = mkIf (cfg.sway || cfg.hyprland) { services.greetd = { enable = true; settings = rec { hypr_session = { command = "Hyprland"; user = user; }; sway_session = { command = "sway"; user = user; }; default_session = if cfg.sway then sway_session else hypr_session; }; }; home-manager.users.${user}.imports = [{ wayland.windowManager.hyprland = mkIf cfg.hyprland { enable = true; systemdIntegration = true; # https://wiki.hyprland.org/Configuring/Variables/ extraConfig = '' ## global hyprland configuration env = GDK_BACKEND,wayland,x11 env = QT_QPA_PLATFORM,wayland;xcb env = SDL_VIDEODRIVER,wayland env = CLUTTER_BACKEND,wayland env = XDG_CURRENT_DESKTOP,Hyprland env = XDG_SESSION_TYPE,wayland env = XDG_SESSION_DESKTOP,Hyprland env = QT_AUTO_SCREEN_SCALE_FACTOR,1 env = QT_WAYLAND_DISABLE_WINDOWDECORATION,1 env = NIXOS_OZONE_WL,1 input { kb_layout = gb kb_options = caps:escape numlock_by_default = true touchpad { natural_scroll = yes scroll_factor = 0.5 } } bind = SUPER_SHIFT, X, killactive, bind = SUPER_SHIFT, E, exit, bind = SUPER, SLASH, focuswindow, brave-browser bind = SUPER, n, focuswindow, Logseq windowrule = float, title:wlogout bind = SUPER, h, movefocus,l bind = SUPER, l, movefocus,r bindm = SUPER, mouse:272, movewindow bindm = SUPER, mouse:273, resizewindow bind = SUPER, j, layoutmsg,cyclenext bind = SUPER, k, layoutmsg,cycleprev bind = SUPER, space, layoutmsg,swapwithmaster master bind = SUPER_SHIFT, k, layoutmsg, orientationtop bind = SUPER_SHIFT, h, layoutmsg, orientationleft bind = SUPER, F, fullscreen, bind = SUPER, V, togglefloating, bind = SUPER_SHIFT, V, togglegroup, bind = SUPER_SHIFT, space, changegroupactive,n bind = SUPER, Y, togglespecialworkspace bind = SUPER_SHIFT, Y, movetoworkspace, special bind = SUPER,1,workspace,1 bind = SUPER,2,workspace,2 bind = SUPER,3,workspace,3 bind = SUPER,4,workspace,4 bind = SUPER,5,workspace,5 bind = SUPER,6,workspace,6 bind = SUPER,7,workspace,7 bind = SUPER,8,workspace,8 bind = SUPER,9,workspace,9 bind = SUPER,0,workspace,10 bind = SUPER_SHIFT,1,movetoworkspace,1 bind = SUPER_SHIFT,2,movetoworkspace,2 bind = SUPER_SHIFT,3,movetoworkspace,3 bind = SUPER_SHIFT,4,movetoworkspace,4 bind = SUPER_SHIFT,5,movetoworkspace,5 bind = SUPER_SHIFT,6,movetoworkspace,6 bind = SUPER_SHIFT,7,movetoworkspace,7 bind = SUPER_SHIFT,8,movetoworkspace,8 bind = SUPER_SHIFT,9,movetoworkspace,9 bind = SUPER_SHIFT,0,movetoworkspace,10 gestures { workspace_swipe = yes } decoration { rounding = 5 drop_shadow = no } bezier = overshot, 0.05, 0.9, 0.1, 1.1 bezier = linear, 0.0, 0.0, 1.0, 1.0 animations { enabled = 1 animation = windows, 1, 1, default, popin animation = border, 1, 1, default animation = fade, 1, 1, default animation = workspaces, 1, 3, overshot animation = borderangle,1, 50, linear, loop } general { resize_on_border = yes layout = master col.active_border = rgb(FFFF00) rgb(00FFFF) rgb(FF00FF) border_size = 5 } master { mfact = 0.7 new_on_top = yes } misc { vrr = 2 } ''; }; programs.swaylock = { enable = true; package = pkgs.swaylock-effects; settings = { clock = true; screenshots = true; effect-scale = 0.5; effect-blur = "10x10"; grace = 5; }; }; services.swayidle.enable = true; services.swayidle.systemdTarget = "graphical-session.target"; services.swayidle.events = [ { event = "before-sleep"; command = "${pkgs.swaylock-effects}/bin/swaylock"; } { event = "lock"; command = "${pkgs.swaylock-effects}/bin/swaylock"; } ]; services.swayidle.timeouts = [ { timeout = 300; command = "${pkgs.swaylock-effects}/bin/swaylock -f"; } ]; services.mako = { enable = true; }; programs.waybar = { enable = true; settings = { mainBar = { layer = "top"; position = "top"; height = 36; modules-left = [ "hyprland/window" ]; modules-right = [ "mpris" "pulseaudio" "clock" "tray" "battery" ]; clock = { format = "πŸ“… {:%a %b-%d %I:%M %p}"; }; pulseaudio = { format-muted = "πŸ”‡ {volume}"; format = "{icon} {volume}"; format-icons.default = [ "πŸ”ˆ" "πŸ”‰" "πŸ”Š" ]; on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; }; mpris = { format = "{player_icon} {artist} - {title}"; format-paused = "{status_icon} {artist} - {title}"; player-icons = { default = "▢️"; mpd = "🎡"; }; status-icons = { paused = "⏸️"; }; }; battery = { format = "{icon} {capacity}%"; format-icons = [ "🀏" "πŸͺ«" "πŸ”‹" "πŸ”‹" ]; states = { warning = 30; critical = 15; }; }; }; }; systemd = { enable = true; target = "graphical-session.target"; }; }; }]; }; }