{
  global = { config, pkgs, lib, mods, ... }:
  {
    programs.wshowkeys.enable = true;
    programs.sway.enable = true;
    services.dbus.packages = with pkgs; [ dconf ];
    xdg.portal = {
      enable = true;
      extraPortals = with pkgs; [
        xdg-desktop-portal-wlr
        xdg-desktop-portal-gtk
      ];
    };
  };
  home = { config, pkgs, lib, mods, ... }:
  {
    xdg.configFile."sway/config".onChange = lib.mkForce "";

    home.sessionVariables = {
      MOZ_ENABLE_WAYLAND = "1";
      MOZ_USE_XINPUT2 = "1";
      SDL_VIDEODRIVER = "wayland";
      QT_QPA_PLATFORM = "wayland";
      QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
      _JAVA_AWT_WM_NONREPARETING = "1";
      XDG_SESSION_TYPE = "wayland";
      XDG_CURRENT_DESKTOP = "sway";
    };

    programs.waybar.enable = true;
    home.file.".config/waybar" = { source = ./waybar; recursive = true; };

    services.swayidle =
      let lockwall = pkgs.runCommand "lock_wall.jpg" {} ''
          ${pkgs.ffmpeg}/bin/ffmpeg -i ${./wall.jpg} -filter_complex 'gblur=sigma=3' $out -y
        '';
      in {
      enable = true;
      timeouts = [
        {
          timeout = 300;
          command = ''${pkgs.systemd}/bin/loginctl lock-session && ${pkgs.sway}/bin/swaymsg "output * dpms off"'';
          resumeCommand = ''${pkgs.sway}/bin/swaymsg "output * dpms on"'';
        }
      ];
      events = [
        { event = "before-sleep"; command = "${pkgs.systemd}/bin/loginctl lock-session"; }
        { event = "lock"; command = "${pkgs.swaylock}/bin/swaylock -f -i ${lockwall}"; }
      ];
    };

    wayland.windowManager.sway = {
      enable = true;
      xwayland = true;
      wrapperFeatures = {
        base = false;
        gtk = false;
      };
      extraConfig = ''workspace 1'';
      config =
        let menuCmd = "${pkgs.wofi}/bin/wofi --show drun -i | xargs swaymsg exec --";
            exitMd = ''Exit Mode:| (l)Log out | (r)Reboot | (p)Poweroff'';
            weechatCmd = pkgs.writeShellScript "weechat.sh" ''
              nix-shell -p python3 python311Packages.dbus-python python311Packages.notify2 --run 'python ${./weenotify.py} -s' > /dev/null &
              while true; do
                ssh -R 5431:localhost:5431 weecat@watcher.kat -t screen -xaA -S weechat
                sleep 1
              done
            '';
        in rec {
        window.border = 1;
        gaps.smartBorders = "on";
        modifier = "Mod4";
        terminal = "alacritty";
        input."type:keyboard".xkb_layout = "fr";
        startup = [
          { command = "${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ on"; }

          { command = "discord"; }
          { command = "thunderbird"; }
          { command = "mattermost-desktop"; }
          { command = "signal-desktop --"; }
          { command = ''sh -c "sleep 2 && exec keepassxc"''; }
          { command = "alacritty --class weechat --title weechat --command ${pkgs.bash}/bin/bash -c ${weechatCmd}"; }
        ];
        assigns = {
          "1" = [{ app_id="firefox"; }];
          "9" = [{ app_id="thunderbird"; }];
          "10" = [
            { class="Mattermost"; }
            { class="Signal"; }
            { class="discord"; }
            { app_id="weechat"; }
          ];
        };
        bars = [{
          command = "waybar";
          mode = "hide";
        }];
        output."*".bg = "${./wall.jpg} fill";
        seat."*"."hide_cursor" = "5000";
        focus.wrapping = "yes";
        window.titlebar = false;
        colors =
          let black = "#000000";
              dark = "#111111";
              adark = "#111111BB";
              aadark = "#11111177";
              highl = "#222222";
              gray = "#777777";
              white = "#FFFFFF";
              color = "#FFBB00";
              urgent = "#FF0000";
          in {
          focused = {border = adark; background = adark; text = white; indicator = color; childBorder = color; };
          unfocused = {border = aadark; background = aadark; text = gray; indicator = dark; childBorder = dark; };
          focusedInactive = {border = adark; background = adark; text = gray; indicator = dark; childBorder = dark; };
          urgent = {border = urgent; background = urgent; text = white; indicator = urgent; childBorder = urgent; };
        };
        modes = {
          "display" = {
            "Left" = "output - transform 90";
            "Down" = "output - transform normal";
            "Up" = "output - transform 180";
            "Right" = "output - transform 270";

            "Shift+Left" = "output - transform flipped-90";
            "Shift+Down" = "output - transform flipped";
            "Shift+Up" = "output - transform flipped-180";
            "Shift+Right" = "output - transform flipped-270";

            "Escape" = ''mode default"'';
          };

          "resize" = {
            "Left" = "resize shrink width 10px";
            "Down" = "resize grow height 10px";
            "Up" = "resize shrink height 10px";
            "Right" = "resize grow width 10px";

            "Escape" = ''mode default"'';
          };

          "${exitMd}" = {
            "l" = "exec swaymsg exit";
            "r" = "exec systemctl reboot";
            "p" = "exec systemctl poweroff";
            "Escape" = ''mode default"'';
          };
        };
        keybindings = {
          "${modifier}+Return" = "exec ${terminal}";
          "${modifier}+q" = "kill";
          "${modifier}+d" = "exec ${menuCmd}";
          "${modifier}+Shift+f" = "exec firefox";
          "${modifier}+Shift+c" = "reload";
          "${modifier}+p" = ''exec ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp -d)" - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png'';
          "Print" = "exec ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png";

          "${modifier}+x" = ''mode "display"'';
          "${modifier}+r" = ''mode "resize"'';

          "${modifier}+Shift+e" = ''mode "${exitMd}"'';
          "${modifier}+l" = "exec ${pkgs.systemd}/bin/loginctl lock-session";
          "Ctrl+Shift+l" = ''exec ${pkgs.grim}/bin/grim /tmp/t_lock.png && ${pkgs.swaylock}/bin/swaylock -f -i /tmp/t_lock.png'';

          "${modifier}+Left" = "focus left";
          "${modifier}+Down" = "focus down";
          "${modifier}+Up" = "focus up";
          "${modifier}+Right" = "focus right";
          "${modifier}+ampersand" =  "workspace 1";
          "${modifier}+eacute" =     "workspace 2";
          "${modifier}+quotedbl" =   "workspace 3";
          "${modifier}+apostrophe" = "workspace 4";
          "${modifier}+parenleft" =  "workspace 5";
          "${modifier}+minus" =      "workspace 6";
          "${modifier}+egrave" =     "workspace 7";
          "${modifier}+underscore" = "workspace 8";
          "${modifier}+ccedilla" =   "workspace 9";
          "${modifier}+agrave" =     "workspace 10";

          "${modifier}+Shift+Left" = "move left";
          "${modifier}+Shift+Down" = "move down";
          "${modifier}+Shift+Up" = "move up";
          "${modifier}+Shift+Right" = "move right";
          "${modifier}+Shift+ampersand" =  "move container to workspace 1";
          "${modifier}+Shift+eacute" =     "move container to workspace 2";
          "${modifier}+Shift+quotedbl" =   "move container to workspace 3";
          "${modifier}+Shift+apostrophe" = "move container to workspace 4";
          "${modifier}+Shift+parenleft" =  "move container to workspace 5";
          "${modifier}+Shift+minus" =      "move container to workspace 6";
          "${modifier}+Shift+egrave" =     "move container to workspace 7";
          "${modifier}+Shift+underscore" = "move container to workspace 8";
          "${modifier}+Shift+ccedilla" =   "move container to workspace 9";
          "${modifier}+Shift+agrave" =     "move container to workspace 10";

          "${modifier}+b" = "splith";
          "${modifier}+v" = "splitv";
          "${modifier}+Shift+s" = "layout stacking";
          "${modifier}+w" = "layout tabbed";
          "${modifier}+s" = "layout toggle split";

          "${modifier}+f" = "fullscreen";
          "${modifier}+Shift+space" = "floating toggle";
          "${modifier}+space" = "focus mode toggle";
          "${modifier}+z" = "focus parent";
          "${modifier}+Shift+z" = "focus child";
          "${modifier}+Shift+F1" = "move scratchpad";
          "${modifier}+F1" = "scratchpad show";

          "XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%";
          "XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%";
          "XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle";
          "XF86AudioMicMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-source-mute @DEFAULT_SOURCE@ toggle";
          "XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set 5%-";
          "XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set +5%";
        };
      };
    };
  };
}
