{ config, pkgs, lib, ... }: { home.packages = with pkgs; [ feh dmenu blueman wl-clipboard swaybg slurp copyq gnome-calculator grim swappy xarchiver (flameshot.override { enableWlrSupport = true; }) ]; services.blueman-applet.enable = true; services.gnome-keyring.enable = true; programs.wofi.enable = true; programs.waybar.enable = true; services.dunst = { enable = true; settings = { global = { width = 300; height = "(0, 300)"; origin = "top-right"; offset = "(10, 50)"; notification_limit = 20; tranasparency = 25; separator_geight = 3; padding = 8; horizontal_padding = 8; frame_width = 3; frame_color = "#4c7899"; font = "Monospace 8"; alignment = "left"; min_icon_size = 32; max_icon_size = 64; corner_radius = 15; corners = "all"; }; urgency_low = { background = "#222222"; foreground = "#888888"; timeout = 10; }; urgency_normal = { background = "#285577"; foreground = "#ffffff"; timeout = 10; override_pause_level = 30; }; urgency_critical = { background = "#891818"; foreground = "#ffffff"; frame_color = "#ab2828"; timeout = 0; override_pause_level = 60; }; ignore_flameshot_warning = { body = "grim's screenshot component is implemented based on wlroots, it may not be used in GNOME or similar desktop environments"; format = ""; }; }; }; home.pointerCursor = { enable = true; name = "Adwaita"; package = pkgs.adwaita-icon-theme; size = 16; sway.enable = true; x11.enable = true; gtk.enable = true; }; wayland.windowManager.sway = { enable = true; wrapperFeatures.gtk = true; extraOptions = [ "--unsupported-gpu" ]; extraSessionCommands = '' # Hardware cursors not yet working on wlroots export WLR_NO_HARDWARE_CURSORS=1 # Set wlroots renderer to Vulkan to avoid flickering # export WLR_RENDERER=vulkan # General wayland environment variables export XDG_SESSION_TYPE=wayland export QT_QPA_PLATFORM=wayland export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 # Firefox wayland environment variable export MOZ_ENABLE_WAYLAND=1 export MOZ_USE_XINPUT2=1 # OpenGL Variables export GBM_BACKEND=nvidia-drm export __GL_GSYNC_ALLOWED=0 export __GL_VRR_ALLOWED=0 export __GLX_VENDOR_LIBRARY_NAME=nvidia # Xwayland compatibility export XWAYLAND_NO_GLAMOR=1 ''; config = { defaultWorkspace = "workspace number 1"; menu = "wofi --show run"; terminal = "kitty"; modifier = "Mod4"; focus.followMouse = "no"; bars = [ { command = "${pkgs.waybar}/bin/waybar"; } ]; fonts = { names = [ "Fira Code" ]; size = 11.0; }; bindkeysToCode = true; keybindings = let modifier = config.wayland.windowManager.sway.config.modifier; homeDir = config.home.homeDirectory; in lib.mkOptionDefault { "${modifier}+z" = "exec ${homeDir}/.config/sway/idle.sh"; "${modifier}+Shift+s" = "sticky toggle"; "${modifier}+Shift+b" = "border toggle"; "${modifier}+g" = "exec ${homeDir}/.config/sway/random-bg.py onetime"; "${modifier}+n" = "exec pcmanfm"; "Print" = "exec flameshot gui --raw | wl-copy"; "Shift+Print" = "exec grim - | wl-copy"; "${modifier}+Print" = "exec flameshot gui --raw | feh --auto-zoom --scale-down -"; "${modifier}+c" = "exec copyq toggle"; "${modifier}+o" = "exec gnome-calculator"; "${modifier}+i" = "exec firefox"; "XF86AudioMute" = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle"; "XF86AudioLowerVolume" = "exec pactl set-sink-volume @DEFAULT_SINK@ -5%"; "XF86AudioRaiseVolume" = "exec pactl set-sink-volume @DEFAULT_SINK@ +5%"; "XF86AudioMicMute" = "exec pactl set-source-mute @DEFAULT_SOURCE@ toggle"; }; input = { "type:keyboard" = { xkb_layout = "us,ru"; xkb_options = "grp:alt_caps_toggle"; xkb_numlock = "enabled"; }; }; startup = [ { command = "${config.home.homeDirectory}/.config/sway/startup.sh"; } { command = "${config.home.homeDirectory}/.config/sway/idle.sh"; } ]; window.commands = let mk = command: criteria: { command = command; criteria = criteria; }; popup = mk "floating enable; border pixel 1; sticky enable; shadows enable"; float = mk "floating enable; border pixel 1; shadows enable"; no_title = mk "border pixel 1"; video = mk "inhibit_idle fullscreen; border none; max_render_time off"; important = mk "inhibit_idle open; floating enable; border pixel 1"; app_id = a: { app_id = a; }; title = a: { title = a; }; class = a: { class = a; }; window_type = a: { window_type = a; }; pcmanfm_title = a: { app_id = "pcmanfm"; title = a; }; in [ (no_title (app_id "kitty")) (popup (app_id "dunst")) (popup (app_id "com.github.hluk.copyq")) (popup (app_id "pavucontrol")) (popup (app_id "qtalarm")) (popup (app_id "blueman-manager")) (popup (class "feh")) (popup (title "Picture-in-Picture")) (popup (title "Picture in picture")) (float {window_role = "pop-up,task_dialog,About";}) (float (window_type "dialog")) (float (window_type "utility")) (float (window_type "toolbar")) (float (window_type "splash")) (float (window_type "menu")) (float (window_type "dropdown_menu")) (float (window_type "popup_menu")) (float (window_type "tooltip")) (float (window_type "notification")) (float (class "bRAC")) (float (app_id "org.gnome.clocks")) (float (app_id "org.gnome.Calculator")) (float (app_id "galculator")) (video (app_id "mpv")) (video (app_id "vlc")) (video (app_id "firefox")) (video (app_id "org.telegram.desktop")) (video {instance = "chromium";}) (video (class "firefox")) (video (class "Nightly")) (important { app_id = "xarchiver"; }) (important (pcmanfm_title "Confirm to replace files")) (important (pcmanfm_title "(?:Open|Save) (?:File|Folder|As)")) (important (pcmanfm_title "^(File|Folder)\s*Already Exists\s*—\s*")) (important (pcmanfm_title "Move files")) (important (pcmanfm_title "Copy Files")) (important (pcmanfm_title "Delete Files")) (important (pcmanfm_title "Removable medium is inserted")) ]; }; }; xdg.configFile."sway/idle.sh".source = ./idle.sh; xdg.configFile."sway/startup.sh".source = ./startup.sh; xdg.configFile."sway/random-bg.py".source = ./random-bg.py; xdg.configFile."sway/wallpapers" = { source = ./wallpapers; recursive = true; }; xdg.configFile."waybar" = { source = ./waybar; recursive = true; }; xdg.mimeApps.defaultApplications = { "inode/directory" = "pcmanfm.desktop"; }; }