{ osConfig, config, pkgs, lib, ... }: let inherit (lib.strings) removeSuffix; inherit (lib) mkIf mkEnableOption mkDefault mkForce getExe; inherit (config.lib.stylix) colors; inherit (config.stylix) cursor; inherit (osConfig.module.stylix) theme; inherit (osConfig.networking) hostId; cfg = config.desktop.niri; keyboard = if hostId == "eldrid" then "chromeos" else "platform"; xdgPics = config.xdg.userDirs.pictures; ifLaptop = mkIf (hostId != "c7f6c4a1"); # TODO: make terminal depent on thing outside a module terminal = getExe pkgs.ghostty; launcher = getExe pkgs.fuzzel; browser = "app.zen_browser.zen"; lockscreen = getExe pkgs.gtklock; in { options = { desktop.niri.enable = mkEnableOption "enable niri desktop"; }; config = mkIf cfg.enable { stylix.targets = { waybar.enable = false; wpaperd.enable = true; qt.enable = false; }; services = { copyq.enable = true; network-manager-applet.enable = true; playerctld.enable = true; swayosd = { enable = true; topMargin = 0.8; }; wpaperd.enable = true; gnome-keyring = { enable = true; components = ["secrets"]; }; gammastep = { enable = true; provider = "manual"; latitude = 49.6; longitude = 36.1; tray = true; temperature = { day = 6500; night = 3000; }; }; udiskie = { enable = true; automount = false; notify = true; tray = "auto"; }; swaync = { enable = true; settings = { cssPriority = "user"; image-visibility = "when-available"; keyboard-shortcut = true; relative-timestamps = true; timeout = 5; timeout-low = 5; timeout-critical = 0; script-fail-notify = true; transition-time = 200; # Layer settings layer-shell = true; layer = "overlay"; control-center-layer = "overlay"; # Notification settings positionX = "right"; positionY = "top"; notification-2fa-action = true; notification-inline-replies = false; notification-icon-size = 32; notification-body-image-height = 100; notification-body-image-width = 200; notification-window-width = 400; # Control center settings control-center-positionX = "right"; control-center-positionY = "top"; control-center-width = 500; control-center-exclusive-zone = true; fit-to-screen = true; hide-on-action = true; hide-on-clear = false; # Widget settings widgets = [ "title" "dnd" "notifications" "mpris" ]; widget-config = { title = { text = "Notifications"; clear-all-button = true; button-text = "Clear All"; }; dnd = { text = "Do Not Disturb"; }; mpris = { image-size = 96; image-radius = 12; blur = true; }; }; }; style = '' /*** Global ***/ progress, progressbar, trough { border-radius: 16px; } .app-icon, .image { -gtk-icon-effect: none; } .notification-action { border-radius: 12px; margin: 0.5rem; } .close-button { margin: 24px; padding: 0.2rem; border-radius: 16px; } /*** Notifications ***/ .notification-group.collapsed .notification-row:not(:last-child) .notification-action, .notification-group.collapsed .notification-row:not(:last-child) .notification-default-action { opacity: 0; } .trough { margin: 4px; border-radius: 7px; } .notification, .notification.low, .notification.normal, .notification.critical, .control-center { margin: 16px; border-radius: 7px; } .floating-notifications, .notification-content { border-radius: 7px; } .control-center-list { background: transparent; } /*** Widgets ***/ /* Title widget */ .widget-title { margin: 0.5rem; } .widget-title > label { font-weight: bold; } .widget-title > button { border-radius: 16px; padding: 0.5rem; } /* DND Widget */ .widget-dnd { margin: 0.5rem; } .widget-dnd > label { font-weight: bold; } .widget-dnd > switch { border-radius: 16px; } .widget-dnd > switch slider { border-radius: 16px; padding: 0.25rem; } /* Mpris widget */ .widget-mpris .widget-mpris-player { border-radius: 16px; margin: 0.5rem; padding: 0.5rem; } .widget-mpris .widget-mpris-player .widget-mpris-album-art { border-radius: 16px; } .widget-mpris .widget-mpris-player .widget-mpris-title { font-weight: bold; } .widget-mpris .widget-mpris-player .widget-mpris-subtitle { font-weight: normal; } .widget-mpris .widget-mpris-player > box > button { border: 1px solid transparent; border-radius: 16px; padding: 0.25rem; } ''; }; hypridle = { enable = true; settings = { general = { before_sleep_cmd = "loginctl lock-session"; lock_cmd = "pidof ${lockscreen} || ${lockscreen}"; # unlock_cmd = "loginctl unlock-session"; }; listener = [ { timeout = 600; on-timeout = "pidof ${lockscreen} || ${lockscreen}"; } { timeout = 601; on-timeout = getExe pkgs.niri + " msg action power-off-monitors"; } ]; }; }; }; programs.fuzzel = { enable = true; settings = { main = { terminal = terminal + " -e"; fields = "filename,name,generic,keywords,categories,exec"; dpi-aware = false; horizontal-pad = 12; vertical-pad = 12; show-actions = true; match-mode = "fuzzy"; icon-theme = config.dconf.settings."org/gnome/desktop/interface".icon-theme; }; border = mkDefault { width = 3; radius = 12; }; }; }; xdg.configFile = { niri = { target = "niri/config.kdl"; text = let arrows = { left = "Left"; down = "Down"; up = "Up"; right = "Right"; }; homerow-arrows = { left = "n"; down = "e"; up = "i"; right = "o"; }; letters = { first = "Q"; second = "W"; third = "F"; fourth = "P"; fifth = "B"; sixth = "J"; seventh = "L"; eighth = "U"; ninth = "Y"; }; numbers = { first = "1"; second = "2"; third = "3"; fourth = "4"; fifth = "5"; sixth = "6"; seventh = "7"; eighth = "8"; ninth = "9"; }; genArrowNavigation = keys: '' Mod+${keys.left} { focus-column-left; } Mod+${keys.down} { focus-window-or-workspace-down; } Mod+${keys.up} { focus-window-or-workspace-up; } Mod+${keys.right} { focus-column-right; } Mod+Ctrl+${keys.left} { move-column-left; } Mod+Ctrl+${keys.down} { move-window-down-or-to-workspace-down; } Mod+Ctrl+${keys.up} { move-window-up-or-to-workspace-up; } Mod+Ctrl+${keys.right} { move-column-right; } Mod+Shift+${keys.left} { focus-monitor-left; } Mod+Shift+${keys.down} { focus-monitor-down; } Mod+Shift+${keys.up} { focus-monitor-up; } Mod+Shift+${keys.right} { focus-monitor-right; } Mod+Shift+Ctrl+${keys.left} { move-column-to-monitor-left; } Mod+Shift+Ctrl+${keys.down} { move-column-to-monitor-down; } Mod+Shift+Ctrl+${keys.up} { move-column-to-monitor-up; } Mod+Shift+Ctrl+${keys.right} { move-column-to-monitor-right; } ''; genWorkspacesNavigation = keys: '' Mod+${keys.first} { focus-workspace 1; } Mod+${keys.second} { focus-workspace 2; } Mod+${keys.third} { focus-workspace 3; } Mod+${keys.fourth} { focus-workspace 4; } Mod+${keys.fifth} { focus-workspace 5; } Mod+${keys.sixth} { focus-workspace 6; } Mod+${keys.seventh} { focus-workspace 7; } Mod+${keys.eighth} { focus-workspace 8; } Mod+${keys.ninth} { focus-workspace 9; } Mod+Ctrl+Shift+${keys.first} { move-column-to-workspace 1; } Mod+Ctrl+Shift+${keys.second} { move-column-to-workspace 2; } Mod+Ctrl+Shift+${keys.third} { move-column-to-workspace 3; } Mod+Ctrl+Shift+${keys.fourth} { move-column-to-workspace 4; } Mod+Ctrl+Shift+${keys.fifth} { move-column-to-workspace 5; } Mod+Ctrl+Shift+${keys.sixth} { move-column-to-workspace 6; } Mod+Ctrl+Shift+${keys.seventh} { move-column-to-workspace 7; } Mod+Ctrl+Shift+${keys.eighth} { move-column-to-workspace 8; } Mod+Ctrl+Shift+${keys.ninth} { move-column-to-workspace 9; } ''; in '' environment { DISPLAY ":123" QT_QPA_PLATFORM "wayland" QT_QPA_PLATFORMTHEME "gtk3" GDK_BACKEND "wayland" MOZ_ENABLE_WAYLAND "1" MOZ_WEBRENDER "1" XDG_SESSION_TYPE "wayland" CLUTTER_BACKEND "wayland" SDL_VIDEODRIVER "wayland" } input { keyboard { xkb { layout "us,ua" ${ if hostId == "c7f6c4a1" then "// variant \"colemak_dh_ortho,\"" else "variant \"colemak_dh_ortho,\"" } } repeat-delay 200 repeat-rate 50 track-layout "global" } touchpad { // off tap // dwt // dwtp natural-scroll accel-speed 0.2 accel-profile "flat" // scroll-method "two-finger" // disabled-on-external-mouse } mouse { // off // natural-scroll accel-speed 0.0 accel-profile "flat" // scroll-method "no-scroll" } warp-mouse-to-focus // focus-follows-mouse } output "eDP-1" { // off scale 1.2 transform "normal" // position x=1920 y=0 } output "Samsung Electric Company S24R65x H4TMA03291" { position x=0 y=0 variable-refresh-rate } output "Philips Consumer Electronics Company 27M2N5500 UK02418033254" { mode "2560x1440@180.000" variable-refresh-rate position x=0 y=0 scale 1.33 } output "PNP(AOC) 27V2G5 0x0000026C" { position x=1920 y=0 mode "1920x1080@74.973" variable-refresh-rate } cursor { xcursor-theme "${cursor.name}" xcursor-size ${toString cursor.size} } layout { gaps 11 center-focused-column "never" // "on-overflow" preset-column-widths { proportion 0.33333 proportion 0.5 proportion 0.66667 } // default-column-width { proportion 0.9; } default-column-width {} tab-indicator { active-color "#${colors.base04}" inactive-color "#${colors.base03}" corner-radius 4 gap 6 gaps-between-tabs 3 length total-proportion=0.3 place-within-column position "left" width 8 } focus-ring { // off width 3 active-gradient from="#${colors.base0D}" to="#${colors.base0F}" angle=40 relative-to="workspace-view" inactive-color "#${colors.base03}" } struts { left 52 right 52 } } prefer-no-csd hotkey-overlay { skip-at-startup } window-rule { geometry-corner-radius 12 clip-to-geometry true } window-rule { match is-window-cast-target=true focus-ring { width 3 active-color "#${colors.base0F}" inactive-color "#${colors.base03}" } border { width 3 active-color "#${colors.base0F}" inactive-color "#${colors.base03}" } shadow { on color "#${colors.base0F}" inactive-color "#${colors.base03}" } } screenshot-path "${xdgPics}/screenshots/screenshot-%Y-%m-%d-%H-%M-%S.png" animations { slowdown 0.8 } window-rule { match title="Картинка в картинці" match title="Picture-in-Picture" open-floating true } window-rule { match app-id="org.wezfurlong.wezterm" default-column-width { proportion 1.0; } } window-rule { match app-id="re.sonny.Junction" open-floating true open-focused true } window-rule { match app-id="com.mitchellh.ghostty" draw-border-with-background false } window-rule { match app-id=r#"^org\.keepassxc\.KeePassXC$"# match app-id=r#"^org\.gnome\.World\.Secrets$"# match app-id=r#"^Bitwarden$"# match app-id="org.telegram.desktop" match app-id="org.signal.Signal" match app-id="WebCord" // block-out-from "screen-capture" block-out-from "screencast" } binds { Mod+Shift+Slash { show-hotkey-overlay; } Mod+Tab { focus-workspace-previous; } Mod+C { center-column; } Mod+M { maximize-column; } Mod+H { set-column-width "50%"; } Mod+T { switch-preset-column-width; } Mod+V { toggle-column-tabbed-display; } Mod+G { switch-focus-between-floating-and-tiling; } Mod+Ctrl+Comma { consume-or-expel-window-left; } Mod+Ctrl+Period { consume-or-expel-window-right; } Mod+Ctrl+Q { close-window; } Mod+Ctrl+M { fullscreen-window; } Mod+Ctrl+G { toggle-window-floating; } Mod+Minus { set-column-width "-10%"; } Mod+Equal { set-column-width "+10%"; } Mod+Comma { set-column-width "-10%"; } Mod+Period { set-column-width "+10%"; } Mod+Shift+Comma { set-window-height "-10%"; } Mod+Shift+Period { set-window-height "+10%"; } Mod+Shift+T { reset-window-height; } Mod+Escape { switch-layout "next"; } Mod+Return repeat=false { spawn "${terminal}"; } Mod+Space repeat=false { spawn "${launcher}"; } Mod+Ctrl+L repeat=false { spawn "${lockscreen}"; } Mod+Ctrl+B repeat=false { spawn "${browser}"; } Mod+Ctrl+V repeat=false { spawn "copyq" "toggle"; } Mod+Ctrl+Shift+BracketLeft { quit; } Mod+Ctrl+Shift+BracketRight { power-off-monitors; } Print { screenshot; } Ctrl+Print { screenshot-screen; } Shift+Print { screenshot-window; } // Caps_Lock { spawn "swayosd-client" "--caps-lock"; } // XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"; } // XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%-"; } // XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } // XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } XF86AudioRaiseVolume allow-when-locked=true { spawn "swayosd-client" "--output-volume" "raise"; } XF86AudioLowerVolume allow-when-locked=true { spawn "swayosd-client" "--output-volume" "lower"; } XF86AudioMute allow-when-locked=true { spawn "swayosd-client" "--output-volume" "mute-toggle"; } XF86AudioMicMute allow-when-locked=true { spawn "swayosd-client" "--input-volume" "mute-toggle"; } XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; } XF86AudioPause allow-when-locked=true { spawn "playerctl" "pause"; } XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; } XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; } XF86ScreenSaver allow-when-locked=true { spawn "${lockscreen}"; } XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+"; } XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-"; } Alt+XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+" "-d" "${keyboard}::kbd_backlight"; } Alt+XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-" "-d" "${keyboard}::kbd_backlight"; } XF86KbdBrightnessUp allow-when-locked=true { spawn "brightnessctl" "s" "5%+" "-d" "${keyboard}::kbd_backlight"; } XF86KbdBrightnessDown allow-when-locked=true { spawn "brightnessctl" "s" "5%-" "-d" "${keyboard}::kbd_backlight"; } Mod+Home { focus-column-first; } Mod+End { focus-column-last; } Mod+Ctrl+Home { move-column-to-first; } Mod+Ctrl+End { move-column-to-last; } Mod+Next { focus-workspace-down; } Mod+Prior { focus-workspace-up; } Mod+Ctrl+Next { move-column-to-workspace-down; } Mod+Ctrl+Prior { move-column-to-workspace-up; } Mod+Shift+Next { move-workspace-down; } Mod+Shift+Prior { move-workspace-up; } Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } Mod+WheelScrollRight { focus-column-right; } Mod+WheelScrollLeft { focus-column-left; } Mod+Ctrl+WheelScrollRight { move-column-right; } Mod+Ctrl+WheelScrollLeft { move-column-left; } Mod+Shift+WheelScrollDown { focus-column-right; } Mod+Shift+WheelScrollUp { focus-column-left; } Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } ${genArrowNavigation arrows} ${genArrowNavigation homerow-arrows} ${genWorkspacesNavigation letters} ${genWorkspacesNavigation numbers} } ''; }; }; programs.waybar = { enable = true; systemd = { enable = true; target = "graphical-session.target"; }; settings = { bar-0 = { # layer = "top"; position = "bottom"; height = 32; spacing = 4; margin-left = 63; margin-right = 63; reload_style_on_change = true; modules-left = [ "niri/language" "niri/workspaces" "wlr/taskbar" ]; modules-center = ["mpris"]; modules-right = [ "wireplumber" (ifLaptop "group/laptop") "tray" "privacy" (ifLaptop "power-profiles-daemon") "idle_inhibitor" "custom/notification" "clock" ]; "niri/workspaces" = { format = "{icon}"; format-icons = { "1" = "൧"; "2" = "൨"; "3" = "൩"; "4" = "൪"; "5" = "൫"; "6" = "൬"; "7" = "൭"; "8" = "൮"; "9" = "൯"; "10" = "൰"; general = "󰘧"; web = "󰖟"; chat = "󰻞"; code = "󰅩"; uni = "󱆀"; games = "󰺶"; system = "󰢻"; media = "󱜐"; tray = "󱊖"; }; }; "niri/language" = { format = "{}"; format-en = "🇺🇸"; format-uk = "🇺🇦"; }; "custom/separator" = { format = "󰝠"; interval = "once"; tooltip = false; }; "group/laptop" = { orientation = "inherit"; modules = [ "battery" "backlight" ]; }; "backlight" = { format = "{icon} {percent}%"; format-icons = ["" ""]; }; "idle_inhibitor" = { format = "{icon}"; format-icons = { activated = "󰅶"; deactivated = "󰾪"; }; }; "tray" = { icon-size = 16; spacing = 4; }; "clock" = { interval = 1; format = "{:%H:%M:%S}"; tooltip-format = "{:%d.%m.%Y}"; }; battery = { states = { good = 95; warning = 30; critical = 15; }; format = "{icon} {capacity}%"; format-full = "󱟢 {capacity}%"; format-charging = "󰂄 {capacity}%"; format-plugged = "󰚥 {capacity}%"; format-alt = "{icon} {time}"; format-icons = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"]; }; mpris = { format = "{player_icon} {dynamic}"; format-paused = "{status_icon} {dynamic}"; playing-len = 30; playing-paused = 30; player-icons = { default = "▶"; mpv = "🎵"; }; status-icons = {paused = "⏸";}; }; "upower" = { icon-size = 16; format = "{percentage}"; hide-if-empty = true; tooltip = true; tooltip-spacing = 20; }; "power-profiles-daemon" = { format = "{icon}"; tooltip-format = "Power profile: {profile}\nDriver: {driver}"; tooltip = true; format-icons = { default = "󱡮"; performance = "󱡮"; balanced = ""; power-saver = ""; }; }; "wireplumber" = { scroll-step = 3; format = "{icon} {volume}%"; format-muted = "󰖁"; format-icons = ["󰕿" "󰖀" "󰕾"]; on-click = getExe pkgs.pwvucontrol; on-click-right = "wpctl set-mute @DEFAULT_SINK@ toggle"; }; "custom/notification" = { tooltip = false; format = "{icon}"; format-icons = { notification = "󱅫"; none = "󰂚"; dnd-notification = "󰂛"; dnd-none = "󰂛"; }; return-type = "json"; exec-if = "which swaync-client"; exec = "swaync-client -swb"; on-click = "swaync-client -t -sw"; on-click-right = "swaync-client -d -sw"; escape = true; }; "privacy" = { icon-spacing = 2; icon-size = 16; transition-duration = 250; screenshare = { type = "screenshare"; tooltip = true; tooltip-icon-size = 24; }; audio-in = { type = "audio-in"; tooltip = true; tooltip-icon-size = 24; }; }; "wlr/taskbar" = { format = "{icon}"; icon-size = 16; icon-theme = "${config.dconf.settings."org/gnome/desktop/interface".icon-theme}"; tooltip-format = "{title}"; on-click = "activate"; }; }; }; style = '' @define-color base00 #${colors.base00}; @define-color base01 #${colors.base01}; @define-color base02 #${colors.base02}; @define-color base03 #${colors.base03}; @define-color base04 #${colors.base04}; @define-color base05 #${colors.base05}; @define-color base06 #${colors.base06}; @define-color base07 #${colors.base07}; @define-color base08 #${colors.base08}; @define-color base09 #${colors.base09}; @define-color base0A #${colors.base0A}; @define-color base0B #${colors.base0B}; @define-color base0C #${colors.base0C}; @define-color base0D #${colors.base0D}; @define-color base0E #${colors.base0E}; @define-color base0F #${colors.base0F}; * { font-family: ${config.stylix.fonts.sansSerif.name}, FontAwesome; font-weight: 500; font-size: 100%; } window#waybar { background-color: transparent; color: @base05; transition-property: background-color; transition-duration: 0.5s; } .modules-center { background-color: transparent; } .mpris.stopped { background-color: transparent; } .mpris.playing, .mpris.paused, .modules-left, .modules-right { border-top-left-radius: 12px; border-top-right-radius: 12px; border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; background-color: @base00; color: @base05; padding: 0 0.5em; } tooltip { background: @base01; border: 1px solid @base0E; } tooltip label { color: @base05; } button { box-shadow: inset 0 -3px transparent; border-radius: 16px; } button:hover { background: inherit; box-shadow: inset 0 -3px transparent; } #mode { background-color: rgba(0, 0, 0, 0.2); box-shadow: inset 0 -3px @base05; } #battery, #backlight, #workspaces, #taskbar, #language, #clock, #battery, #backlight, #wireplumber, #custom-separator { padding: 0 0.3em; } #privacy, #tray button, #privacy-item, #idle_inhibitor, #custom-notification, #power-profiles-daemon, #workspaces button { padding: 0 0.2em; } #taskbar button { padding: 0 0.1em; } #workspaces button.active { color: @base0D; } #taskbar button:hover { box-shadow: transparent; } #taskbar.empty, window#empty { background-color: transparent; } #battery.critical:not(.charging) { color: @base09; animation-name: blink; animation-duration: 0.5s; animation-timing-function: steps(12); animation-iteration-count: infinite; animation-direction: alternate; } #power-profiles-daemon.performance { color: @base0D; } #power-profiles-daemon.balanced { color: @base0B; } #power-profiles-daemon.power-saver { color: @base0A; } label:focus { background-color: #000000; } #tray > .passive { -gtk-icon-effect: dim; } #tray > .needs-attention { -gtk-icon-effect: highlight; background-color: @base08; } #privacy-item.screenshare { color: @base0C; } #privacy-item.audio-in { color: @base0E; } ''; }; home.packages = with pkgs; [ (ifLaptop brightnessctl) nautilus helvum loupe papers junction celluloid mission-center dconf libnotify playerctl wdisplays pwvucontrol wl-clipboard-rs libqalculate ]; gtk = { enable = true; iconTheme = { name = if config.stylix.polarity == "dark" then "Papirus-Dark" else "Papirus-Light"; package = if (removeSuffix "-light" theme) == "nord" then pkgs.papirus-nord else pkgs.papirus-icon-theme; }; }; qt = { enable = true; platformTheme.name = "gtk3"; }; dconf.settings = { "org/gnome/desktop/wm/preferences" = { button-layout = "icon:close"; }; "org/gnome/desktop/interface" = { icon-theme = config.gtk.iconTheme.name; }; }; xdg = { mime.enable = true; mimeApps = { enable = true; defaultApplications = let file_manager = ["org.gnome.Nautilus.desktop"]; image_viewer = ["org.gnome.Loupe.desktop"]; pdf_reader = ["org.gnome.Papers.desktop"]; video_player = ["io.github.celluloid_player.Celluloid.desktop"]; web_browser = ["re.sonny.Junction.desktop"]; in { "application/pdf" = pdf_reader; "image/jpeg" = image_viewer; "image/png" = image_viewer; "inode/directory" = file_manager; "text/html" = web_browser; "video/mp4" = video_player; "video/mpeg" = video_player; "video/x-matroska" = video_player; "video/x-mpeg" = video_player; "x-scheme-handler/about" = web_browser; "x-scheme-handler/http" = web_browser; "x-scheme-handler/https" = web_browser; "x-scheme-handler/unknown" = web_browser; }; }; }; systemd.user = { settings.Manager.DefaultEnvironment = { QT_QPA_PLATFORM = "wayland"; DISPLAY = ":123"; }; targets.tray.Unit.Description = "Home Manager System Tray"; # workaround for udiskie services = let mkGraphicalService = config: graphicalService // config; graphicalService = { Install.WantedBy = ["niri.service"]; Unit = { Requisite = ["graphical-session.target"]; PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; }; Service = { Restart = "on-failure"; TimeoutStopSec = 10; RestartSec = 1; }; }; in { udiskie = mkGraphicalService {}; waybar = mkGraphicalService {}; network-manager-applet = mkGraphicalService {}; copyq = mkGraphicalService { Service = graphicalService.Service // { Environment = mkForce "QT_QPA_PLATFORM=wayland"; }; }; xwayland-satellite = mkGraphicalService { Service = graphicalService.Service // { Type = "simple"; ExecStart = getExe pkgs.xwayland-satellite + " :123"; }; }; wpaperd = mkGraphicalService { Service = mkDefault graphicalService.Service; }; gnome-polkit-agent = mkGraphicalService { Service = graphicalService.Service // { Type = "simple"; ExecStart = pkgs.polkit_gnome + "/libexec/polkit-gnome-authentication-agent-1"; }; }; }; }; }; }