From 9d850b5a0992b210262a5408c9fde957ef5e9eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Eug=C3=AAnio?= Date: Fri, 5 Aug 2022 11:20:13 -0300 Subject: [PATCH] Extract Sway config --- bmenu.nix | 84 ++++++++++ flake.nix | 9 +- user/home.nix | 423 +------------------------------------------------- user/sway.nix | 343 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 434 insertions(+), 425 deletions(-) create mode 100644 bmenu.nix create mode 100644 user/sway.nix diff --git a/bmenu.nix b/bmenu.nix new file mode 100644 index 0000000..d0aea09 --- /dev/null +++ b/bmenu.nix @@ -0,0 +1,84 @@ +{ config, pkgs, lib, ... }: +let + inherit (import ./user/variables.nix) key theme color accent font; +in pkgs.writeScriptBin "bmenu" '' + #!${pkgs.fish}/bin/fish + + # wrapper around bemenu + # bmenu * - use as dmenu, -p for custom prompt (man bemenu) + # bmenu run - select from .desktop files and run it + # bmenu start - internal option + + set swaymsg ${pkgs.sway}/bin/swaymsg + set swaymsg ${pkgs.sway}/bin/swaymsg + + if test "$argv[1]" = "run" + test -n "$argv[2]" && set t "$argv[2]" || set t "terminal" + + test -n "$i3SOCK" && set wrapper 'i3-msg exec --' + test -n "$SWAYSOCK" && set wrapper 'swaymsg exec --' + + exec ${pkgs.j4-dmenu-desktop}/bin/j4-dmenu-desktop \ + --dmenu="bmenu start -p Iniciar:" \ + --term "$t" \ + --wrapper="$wrapper" \ + --no-generic + end + + if test -n "$SWAYSOCK" + swaymsg -t get_tree | + ${pkgs.jq}/bin/jq -je '..|select(.focused? and .fullscreen_mode? == 1)|""' && + ${pkgs.sway}/bin/swaymsg -q fullscreen off && + set fullscreen + + ${pkgs.sway}/bin/swaymsg -t get_outputs | + ${pkgs.jq}/bin/jq -r 'map(.focused)|reverse|index(true)' | + read focused_output + + test -n "$focused_output" + and set focused_output "-m $focused_output" + end + + function clean_exit + set -q fullscreen + and swaymsg -q fullscreen on & + end + + trap clean_exit EXIT + + # t title + # f filter + # n normal + # h highlighted + # s selected + # sc scrollbar + + set fn "${font.mono} ${toString font.size.small}" + + set tb "${color.bg}${theme.opacityHex}" + set tf "${accent.color}" + + set fb "${color.bg}${theme.opacityHex}" + set ff "${color.txt}" + + set nb "${color.bg}${theme.opacityHex}" + set nf "${color.txt}" + set hb "${accent.color}" + set hf "${accent.fg}" + + ${pkgs.dhist}/bin/dhist wrap -- ${pkgs.bemenu}/bin/bemenu \ + $focused_output\ + --ignorecase\ + --bottom\ + --no-overlap\ + --list 20\ + --prefix '>'\ + --fn "$fn"\ + --tb "$tb" --tf "$tf" \ + --fb "$fb" --ff "$ff" \ + --nb "$nb" --nf "$nf" \ + --hb "$hb" --hf "$hf" \ + $argv + + # vim: ft=fish +'' diff --git a/flake.nix b/flake.nix index b30ade9..1b47c9f 100644 --- a/flake.nix +++ b/flake.nix @@ -6,11 +6,11 @@ home-manager.url = "github:nix-community/home-manager/release-22.05"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; nur.url = "github:nix-community/NUR"; - + # my stuff dhist.url = "github:lelgenio/dhist"; }; - outputs = { nixpkgs, nixpkgs-unstable, home-manager, nur, dhist, ... }: + outputs = { nixpkgs, nixpkgs-unstable, home-manager, nur, dhist, ... } : let system = "x86_64-linux"; pkgs = import nixpkgs { @@ -29,11 +29,12 @@ common_modules = [ ./system/configuration.nix # nur.nixosModules.nur - ({ config, pkgs, ... }: { - nixpkgs.overlays = [ + ({ config, pkgs, ... } : { + nixpkgs.overlays = [ overlay-unstable nur.overlay (_: _: { dhist = dhist.packages.${system}.dhist; + bmenu = import ./bmenu.nix { inherit config pkgs lib; }; }) ]; }) diff --git a/user/home.nix b/user/home.nix index 7fb1e3d..7d3f21f 100644 --- a/user/home.nix +++ b/user/home.nix @@ -7,123 +7,14 @@ let (pkgs.orchis-theme.override { tweaks = [ "compact" "solid" ]; }); nerdfonts_fira_hack = (pkgs.nerdfonts.override { fonts = [ "FiraCode" "Hack" ]; }); - pulse_sink = pkgs.writeShellScriptBin "pulse_sink" '' - #!/bin/sh - output=$(printf "HDMI\nHeadphones" | ${bmenu}/bin/bmenu -b) - vol=$(${pkgs.pamixer}/bin/pamixer --get-volume) - case "$output" in - HDMI) - pactl set-default-sink alsa_output.pci-0000_07_00.1.hdmi-stereo-extra1 - ;; - Headphones) - pactl set-default-sink alsa_output.pci-0000_09_00.4.analog-stereo - ;; - esac - ${pkgs.pamixer}/bin/pamixer --set-volume "$vol" - ''; - bmenu = pkgs.writeScriptBin "bmenu" '' - #!${pkgs.fish}/bin/fish - - # wrapper around bemenu - # bmenu * - use as dmenu, -p for custom prompt (man bemenu) - # bmenu run - select from .desktop files and run it - # bmenu start - internal option - - set swaymsg ${pkgs.sway}/bin/swaymsg - set swaymsg ${pkgs.sway}/bin/swaymsg - - if test "$argv[1]" = "run" - test -n "$argv[2]" && set t "$argv[2]" || set t "terminal" - - test -n "$i3SOCK" && set wrapper 'i3-msg exec --' - test -n "$SWAYSOCK" && set wrapper 'swaymsg exec --' - - exec ${pkgs.j4-dmenu-desktop}/bin/j4-dmenu-desktop \ - --dmenu="bmenu start -p Iniciar:" \ - --term "$t" \ - --wrapper="$wrapper" \ - --no-generic - end - - if test -n "$SWAYSOCK" - swaymsg -t get_tree | - ${pkgs.jq}/bin/jq -je '..|select(.focused? and .fullscreen_mode? == 1)|""' && - ${pkgs.sway}/bin/swaymsg -q fullscreen off && - set fullscreen - - ${pkgs.sway}/bin/swaymsg -t get_outputs | - ${pkgs.jq}/bin/jq -r 'map(.focused)|reverse|index(true)' | - read focused_output - - test -n "$focused_output" - and set focused_output "-m $focused_output" - end - - function clean_exit - set -q fullscreen - and swaymsg -q fullscreen on & - end - - trap clean_exit EXIT - - # t title - # f filter - # n normal - # h highlighted - # s selected - # sc scrollbar - - set fn "${font.mono} ${toString font.size.small}" - - set tb "${color.bg}${theme.opacityHex}" - set tf "${accent.color}" - - set fb "${color.bg}${theme.opacityHex}" - set ff "${color.txt}" - - set nb "${color.bg}${theme.opacityHex}" - set nf "${color.txt}" - set hb "${accent.color}" - set hf "${accent.fg}" - - ${pkgs.dhist}/bin/dhist wrap -- ${pkgs.bemenu}/bin/bemenu \ - $focused_output\ - --ignorecase\ - --bottom\ - --no-overlap\ - --list 20\ - --prefix '>'\ - --fn "$fn"\ - --tb "$tb" --tf "$tf" \ - --fb "$fb" --ff "$ff" \ - --nb "$nb" --nf "$nf" \ - --hb "$hb" --hf "$hf" \ - $argv - - # vim: ft=fish - ''; volumesh = pkgs.writeShellScriptBin "volumesh" (builtins.readFile ./scripts/volumesh); - _lock = pkgs.writeShellScriptBin "_lock" '' - swaylock -f - systemctl --user start swayidle.service - ''; - _suspend = pkgs.writeShellScriptBin "_suspend" '' - ${_lock}/bin/_lock - systemctl suspend - ''; - _sway_idle_toggle = pkgs.writeShellScriptBin "_sway_idle_toggle" '' - if pidof swayidle > /dev/null; then - systemctl --user stop swayidle.service - else - systemctl --user start swayidle.service - fi - ''; in { imports = [ ./waybar.nix ./helix.nix ./kakoune.nix + ./sway.nix ]; # Home Manager needs a bit of information about you and the # paths it should manage. @@ -162,7 +53,7 @@ in { imagemagick mpv mpc-cli - pulse_sink + # pulse_sink #games lutris steam @@ -225,7 +116,6 @@ in { enableFishIntegration = true; }; home.file = { - # ".config/sway/config".source = ./sway; ".config/fish/conf.d/prompt.fish".source = ./fish_prompt.fish; ".local/share/backgrounds".source = ./backgrounds; }; @@ -389,315 +279,6 @@ in { }; }; programs.command-not-found.enable = true; - # home.file = { - # ".config/sway/config".source = ./sway; - # }; - wayland.windowManager.sway = { - enable = true; - config = { - bars = [ ]; - window.titlebar = false; - gaps = { - smartGaps = true; - smartBorders = "on"; - inner = 5; - }; - colors = let - acc = accent.color; - fg_acc = accent.fg; - fg_color = color.txt; - bg_color = color.bg_dark; - alert = "#000000"; - client = border: background: text: indicator: childBorder: { - inherit border background text indicator childBorder; - }; - in { - focused = client acc acc fg_acc acc acc; - focusedInactive = client bg_color bg_color fg_color bg_color bg_color; - unfocused = client bg_color bg_color fg_color bg_color bg_color; - urgent = client alert alert fg_color alert alert; - }; - output = { "*" = { bg = "${theme.background} fill"; }; }; - input."type:touchpad" = { - # Disable While Typing - dwt = "disabled"; - natural_scroll = "enabled"; - tap = "enabled"; - }; - input."*" = { - xkb_layout = "us(colemak),br"; - xkb_options = "lv3:lsgt_switch,grp:shifts_toggle"; - xkb_numlock = "enabled"; - repeat_rate = "30"; - repeat_delay = "200"; - }; - assigns = { - "10" = [ - { app_id = ".*[Tt]elegram.*"; } - { class = ".*[Tt]elegram.*"; } - { class = "Jitsi Meet"; } - { class = "discord"; } - { title = "Discord"; } - { class = "WebCord"; } - ]; - }; - modes = let return_mode = lib.mapAttrs (k: v: "${v}; mode default"); - in { - audio = { - ${key.tabL} = "volumes decrease"; - } // return_mode { - "space" = "exec mpc toggle"; - "escape" = ""; - "s" = "exec ${pulse_sink}/bin/pulse_sink"; - }; - }; - floating.modifier = "Mod4"; - keybindings = let - mod = "Mod4"; - menu = "bmenu run"; - terminal = "alacritty"; - workspace_binds = { - "${mod}+1" = "workspace number 1"; - "${mod}+2" = "workspace number 2"; - "${mod}+3" = "workspace number 3"; - "${mod}+4" = "workspace number 4"; - "${mod}+5" = "workspace number 5"; - "${mod}+6" = "workspace number 6"; - "${mod}+7" = "workspace number 7"; - "${mod}+8" = "workspace number 8"; - "${mod}+9" = "workspace number 9"; - "${mod}+0" = "workspace number 10"; - "${mod}+Shift+1" = "move container to workspace number 1"; - "${mod}+Shift+2" = "move container to workspace number 2"; - "${mod}+Shift+3" = "move container to workspace number 3"; - "${mod}+Shift+4" = "move container to workspace number 4"; - "${mod}+Shift+5" = "move container to workspace number 5"; - "${mod}+Shift+6" = "move container to workspace number 6"; - "${mod}+Shift+7" = "move container to workspace number 7"; - "${mod}+Shift+8" = "move container to workspace number 8"; - "${mod}+Shift+9" = "move container to workspace number 9"; - "${mod}+Shift+0" = "move container to workspace number 10"; - }; - prev_next_binds = let - join_dict_arr = builtins.foldl' (a: v: a // v) { }; - maybe_window = key: - if (lib.strings.hasInfix "button" key) then - "--whole-window" - else - ""; - prev_binds = map (key: { - "${maybe_window key} ${mod}+${key}" = "workspace prev_on_output"; - }) [ key.tabL "bracketleft" "Prior" "button9" "button4" ]; - next_binds = map (key: { - "${maybe_window key} ${mod}+${key}" = "workspace next_on_output"; - }) [ key.tabR "bracketright" "Next" "button8" "button5" ]; - in join_dict_arr (prev_binds ++ next_binds); - movement_binds = { - "${mod}+${key.left}" = "focus left"; - "${mod}+${key.down}" = "focus down"; - "${mod}+${key.up}" = "focus up"; - "${mod}+${key.right}" = "focus right"; - "${mod}+Left" = "focus left"; - "${mod}+Down" = "focus down"; - "${mod}+Up" = "focus up"; - "${mod}+Right" = "focus right"; - "${mod}+Shift+${key.left}" = "move left"; - "${mod}+Shift+${key.down}" = "move down"; - "${mod}+Shift+${key.up}" = "move up"; - "${mod}+Shift+${key.right}" = "move right"; - "${mod}+Shift+Left" = "move left"; - "${mod}+Shift+Down" = "move down"; - "${mod}+Shift+Up" = "move up"; - "${mod}+Shift+Right" = "move right"; - "${mod}+Control+${key.left}" = "resize shrink width"; - "${mod}+Control+${key.down}" = "resize grow height"; - "${mod}+Control+${key.up}" = "resize shrink height"; - "${mod}+Control+${key.right}" = "resize grow width"; - "${mod}+Control+Left" = "resize shrink width"; - "${mod}+Control+Down" = "resize grow height"; - "${mod}+Control+Up" = "resize shrink height"; - "${mod}+Control+Right" = "resize grow width"; - "${mod}+mod1+${key.left}" = "focus output left"; - "${mod}+mod1+${key.down}" = "focus output down"; - "${mod}+mod1+${key.up}" = "focus output up"; - "${mod}+mod1+${key.right}" = "focus output right"; - "${mod}+mod1+Left" = "focus output left"; - "${mod}+mod1+Down" = "focus output down"; - "${mod}+mod1+Up" = "focus output up"; - "${mod}+mod1+Right" = "focus output right"; - "${mod}+mod1+Shift+${key.left}" = "move workspace output left"; - "${mod}+mod1+Shift+${key.down}" = "move workspace output down"; - "${mod}+mod1+Shift+${key.up}" = "move workspace output up"; - "${mod}+mod1+Shift+${key.right}" = "move workspace output right"; - "${mod}+mod1+Shift+Left" = "move workspace output left"; - "${mod}+mod1+Shift+Down" = "move workspace output down"; - "${mod}+mod1+Shift+Up" = "move workspace output up"; - "${mod}+mod1+Shift+Right" = "move workspace output right"; - }; - audio_binds = { - XF86AudioRaiseVolume = - "exec pactl set-sink-volume @DEFAULT_SINK@ +10%"; - XF86AudioLowerVolume = - "exec pactl set-sink-volume @DEFAULT_SINK@ -10%"; - XF86AudioMute = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle"; - XF86AudioMicMute = - "exec pactl set-source-mute @DEFAULT_SOURCE@ toggle"; - # Control media - XF86AudioPlay = "exec playerctl play-pause"; - XF86AudioPause = "exec playerctl play-pause"; - XF86AudioNext = "exec playerctl next"; - XF86AudioPrev = "exec playerctl previous"; - }; - system_binds = { - "--locked Ctrl+${mod}+z" = "exec ${_suspend}/bin/_suspend"; - "${mod}+Alt+c" = "exec ${_sway_idle_toggle}/bin/_sway_idle_toggle"; - }; - in { - "${mod}+Return" = "exec ${terminal}"; - "${mod}+Ctrl+Return" = "exec thunar"; - "${mod}+x" = "kill"; - "${mod}+s" = "exec ${menu}"; - "${mod}+m" = "mode audio"; - "${mod}+b" = "splith"; - "${mod}+v" = "splitv"; - "${mod}+f" = "fullscreen toggle"; - "${mod}+a" = "focus parent"; - # "${mod}+s" = "layout stacking"; - "${mod}+w" = "layout tabbed"; - # "${mod}+e" = "layout toggle split"; - "${mod}+Shift+space" = "floating toggle"; - "${mod}+space" = "focus mode_toggle"; - "${mod}+Shift+minus" = "move scratchpad"; - "${mod}+minus" = "scratchpad show"; - "${mod}+Shift+c" = "reload"; - # "${mod}+Shift+e" = - # "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; - "${mod}+r" = "mode resize"; - } // workspace_binds // prev_next_binds // movement_binds // audio_binds - // system_binds - # // map (key: "$mod+${key} workspace prev_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] - # // map (key: "$mod+${key} workspace next_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] - ; - terminal = pkgs.alacritty.executable; - }; - }; - services.swayidle = { - enable = true; - timeouts = [ - { - timeout = 360; - command = "swaylock -f"; - } - { - timeout = 1800; - command = '' - mpc status | grep "^[playing]" > /dev/null || swaymsg "output * dpms off"''; - resumeCommand = ''swaymsg "output * dpms on"''; - } - ]; - events = [{ - event = "before-sleep"; - command = "swaylock -f"; - }]; - }; - xdg.configFile."swaylock/config".text = '' - image=${theme.background} - font=${font.interface} - font-size=${toString font.size.medium} - indicator-thickness=20 - color=${color.bg} - inside-color=#FFFFFF00 - bs-hl-color=${color.normal.red} - ring-color=${color.normal.green} - key-hl-color=${accent.color} - # divisor lines - separator-color=#aabbcc00 - line-color=#aabbcc00 - line-clear-color=#aabbcc00 - line-caps-lock-color=#aabbcc00 - line-ver-color=#aabbcc00 - line-wrong-color=#aabbcc00 - ''; - services.gammastep = { - enable = true; - provider = "geoclue2"; - }; - services.kanshi = { - enable = true; - profiles = { - sedetary = { - outputs = [ - { - criteria = "eDP-1"; - status = "disable"; - position = "1920,312"; - } - { - criteria = "HDMI-A-1"; - position = "0,0"; - } - ]; - exec = [ "xrdb .Xresources" ]; - }; - nomad = { - outputs = [{ - criteria = "eDP-1"; - status = "enable"; - position = "1920,312"; - }]; - exec = [ "xrdb .Xresources" ]; - }; - }; - }; - programs.mako = { - enable = true; - borderSize = 2; - padding = "5"; - margin = "15"; - layer = "overlay"; - - backgroundColor = color.bg; - borderColor = accent.color; - progressColor = "over ${accent.color}88"; - - defaultTimeout = 10000; - # # {{@@ header() @@}} - # # text - # font={{@@ font.interface @@}} {{@@ font.size.small @@}} - # text-color={{@@ color.txt @@}} - - # # colors - # background-color={{@@ color.bg @@}}{{@@ opacity | clamp_to_hex @@}} - # border-color={{@@ accent_color @@}} - # progress-color=over {{@@ accent_color @@}}88 - - # # decoration - # border-size=2 - # padding=5 - # margin=15 - - # # features - # icons=1 - # markup=1 - # actions=1 - # default-timeout=10000 - - # # position - # layer=overlay - - # [app-name=volumesh] - # default-timeout=5000 - # group-by=app-name - # format=%s\n%b - - # [app-name=dotdrop] - # default-timeout=5000 - # group-by=app-name - # format=%s\n%b - - # # vim: ft=ini - - }; home.activation = { install_flatpaks = lib.hm.dag.entryAfter [ "writeBoundary" ] '' $DRY_RUN_CMD flatpak $VERBOSE_ARG remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo diff --git a/user/sway.nix b/user/sway.nix new file mode 100644 index 0000000..42f7a0c --- /dev/null +++ b/user/sway.nix @@ -0,0 +1,343 @@ +{ config, pkgs, lib, ... }: +let + inherit (import ./variables.nix) key theme color accent font; + pulse_sink = pkgs.writeShellScriptBin "pulse_sink" '' + #!/bin/sh + output=$(printf "HDMI\nHeadphones" | ${pkgs.bmenu}/bin/bmenu -b) + vol=$(${pkgs.pamixer}/bin/pamixer --get-volume) + case "$output" in + HDMI) + pactl set-default-sink alsa_output.pci-0000_07_00.1.hdmi-stereo-extra1 + ;; + Headphones) + pactl set-default-sink alsa_output.pci-0000_09_00.4.analog-stereo + ;; + esac + ${pkgs.pamixer}/bin/pamixer --set-volume "$vol" + ''; + _lock = pkgs.writeShellScriptBin "_lock" '' + swaylock -f + systemctl --user start swayidle.service + ''; + _suspend = pkgs.writeShellScriptBin "_suspend" '' + ${_lock}/bin/_lock + systemctl suspend + ''; + _sway_idle_toggle = pkgs.writeShellScriptBin "_sway_idle_toggle" '' + if pidof swayidle > /dev/null; then + systemctl --user stop swayidle.service + else + systemctl --user start swayidle.service + fi + ''; +in { + config = { + wayland.windowManager.sway = { + enable = true; + config = { + bars = [ ]; + window.titlebar = false; + gaps = { + smartGaps = true; + smartBorders = "on"; + inner = 5; + }; + colors = let + acc = accent.color; + fg_acc = accent.fg; + fg_color = color.txt; + bg_color = color.bg_dark; + alert = "#000000"; + client = border: background: text: indicator: childBorder: { + inherit border background text indicator childBorder; + }; + in { + focused = client acc acc fg_acc acc acc; + focusedInactive = client bg_color bg_color fg_color bg_color bg_color; + unfocused = client bg_color bg_color fg_color bg_color bg_color; + urgent = client alert alert fg_color alert alert; + }; + output = { "*" = { bg = "${theme.background} fill"; }; }; + input."type:touchpad" = { + # Disable While Typing + dwt = "disabled"; + natural_scroll = "enabled"; + tap = "enabled"; + }; + input."*" = { + xkb_layout = "us(colemak),br"; + xkb_options = "lv3:lsgt_switch,grp:shifts_toggle"; + xkb_numlock = "enabled"; + repeat_rate = "30"; + repeat_delay = "200"; + }; + assigns = { + "10" = [ + { app_id = ".*[Tt]elegram.*"; } + { class = ".*[Tt]elegram.*"; } + { class = "Jitsi Meet"; } + { class = "discord"; } + { title = "Discord"; } + { class = "WebCord"; } + ]; + }; + modes = let return_mode = lib.mapAttrs (k: v: "${v}; mode default"); + in { + audio = { + ${key.tabL} = "volumes decrease"; + } // return_mode { + "space" = "exec mpc toggle"; + "escape" = ""; + "s" = "exec ${pulse_sink}/bin/pulse_sink"; + }; + }; + floating.modifier = "Mod4"; + keybindings = let + mod = "Mod4"; + menu = "${pkgs.bmenu}/bin/bmenu run"; + terminal = "alacritty"; + workspace_binds = { + "${mod}+1" = "workspace number 1"; + "${mod}+2" = "workspace number 2"; + "${mod}+3" = "workspace number 3"; + "${mod}+4" = "workspace number 4"; + "${mod}+5" = "workspace number 5"; + "${mod}+6" = "workspace number 6"; + "${mod}+7" = "workspace number 7"; + "${mod}+8" = "workspace number 8"; + "${mod}+9" = "workspace number 9"; + "${mod}+0" = "workspace number 10"; + "${mod}+Shift+1" = "move container to workspace number 1"; + "${mod}+Shift+2" = "move container to workspace number 2"; + "${mod}+Shift+3" = "move container to workspace number 3"; + "${mod}+Shift+4" = "move container to workspace number 4"; + "${mod}+Shift+5" = "move container to workspace number 5"; + "${mod}+Shift+6" = "move container to workspace number 6"; + "${mod}+Shift+7" = "move container to workspace number 7"; + "${mod}+Shift+8" = "move container to workspace number 8"; + "${mod}+Shift+9" = "move container to workspace number 9"; + "${mod}+Shift+0" = "move container to workspace number 10"; + }; + prev_next_binds = let + join_dict_arr = builtins.foldl' (a: v: a // v) { }; + maybe_window = key: + if (lib.strings.hasInfix "button" key) then + "--whole-window" + else + ""; + prev_binds = map (key: { + "${maybe_window key} ${mod}+${key}" = "workspace prev_on_output"; + }) [ key.tabL "bracketleft" "Prior" "button9" "button4" ]; + next_binds = map (key: { + "${maybe_window key} ${mod}+${key}" = "workspace next_on_output"; + }) [ key.tabR "bracketright" "Next" "button8" "button5" ]; + in join_dict_arr (prev_binds ++ next_binds); + movement_binds = { + "${mod}+${key.left}" = "focus left"; + "${mod}+${key.down}" = "focus down"; + "${mod}+${key.up}" = "focus up"; + "${mod}+${key.right}" = "focus right"; + "${mod}+Left" = "focus left"; + "${mod}+Down" = "focus down"; + "${mod}+Up" = "focus up"; + "${mod}+Right" = "focus right"; + "${mod}+Shift+${key.left}" = "move left"; + "${mod}+Shift+${key.down}" = "move down"; + "${mod}+Shift+${key.up}" = "move up"; + "${mod}+Shift+${key.right}" = "move right"; + "${mod}+Shift+Left" = "move left"; + "${mod}+Shift+Down" = "move down"; + "${mod}+Shift+Up" = "move up"; + "${mod}+Shift+Right" = "move right"; + "${mod}+Control+${key.left}" = "resize shrink width"; + "${mod}+Control+${key.down}" = "resize grow height"; + "${mod}+Control+${key.up}" = "resize shrink height"; + "${mod}+Control+${key.right}" = "resize grow width"; + "${mod}+Control+Left" = "resize shrink width"; + "${mod}+Control+Down" = "resize grow height"; + "${mod}+Control+Up" = "resize shrink height"; + "${mod}+Control+Right" = "resize grow width"; + "${mod}+mod1+${key.left}" = "focus output left"; + "${mod}+mod1+${key.down}" = "focus output down"; + "${mod}+mod1+${key.up}" = "focus output up"; + "${mod}+mod1+${key.right}" = "focus output right"; + "${mod}+mod1+Left" = "focus output left"; + "${mod}+mod1+Down" = "focus output down"; + "${mod}+mod1+Up" = "focus output up"; + "${mod}+mod1+Right" = "focus output right"; + "${mod}+mod1+Shift+${key.left}" = "move workspace output left"; + "${mod}+mod1+Shift+${key.down}" = "move workspace output down"; + "${mod}+mod1+Shift+${key.up}" = "move workspace output up"; + "${mod}+mod1+Shift+${key.right}" = "move workspace output right"; + "${mod}+mod1+Shift+Left" = "move workspace output left"; + "${mod}+mod1+Shift+Down" = "move workspace output down"; + "${mod}+mod1+Shift+Up" = "move workspace output up"; + "${mod}+mod1+Shift+Right" = "move workspace output right"; + }; + audio_binds = { + XF86AudioRaiseVolume = + "exec pactl set-sink-volume @DEFAULT_SINK@ +10%"; + XF86AudioLowerVolume = + "exec pactl set-sink-volume @DEFAULT_SINK@ -10%"; + XF86AudioMute = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle"; + XF86AudioMicMute = + "exec pactl set-source-mute @DEFAULT_SOURCE@ toggle"; + # Control media + XF86AudioPlay = "exec playerctl play-pause"; + XF86AudioPause = "exec playerctl play-pause"; + XF86AudioNext = "exec playerctl next"; + XF86AudioPrev = "exec playerctl previous"; + }; + system_binds = { + "--locked Ctrl+${mod}+z" = "exec ${_suspend}/bin/_suspend"; + "${mod}+Alt+c" = "exec ${_sway_idle_toggle}/bin/_sway_idle_toggle"; + }; + in { + "${mod}+Return" = "exec ${terminal}"; + "${mod}+Ctrl+Return" = "exec thunar"; + "${mod}+x" = "kill"; + "${mod}+s" = "exec ${menu}"; + "${mod}+m" = "mode audio"; + "${mod}+b" = "splith"; + "${mod}+v" = "splitv"; + "${mod}+f" = "fullscreen toggle"; + "${mod}+a" = "focus parent"; + # "${mod}+s" = "layout stacking"; + "${mod}+w" = "layout tabbed"; + # "${mod}+e" = "layout toggle split"; + "${mod}+Shift+space" = "floating toggle"; + "${mod}+space" = "focus mode_toggle"; + "${mod}+Shift+minus" = "move scratchpad"; + "${mod}+minus" = "scratchpad show"; + "${mod}+Shift+c" = "reload"; + # "${mod}+Shift+e" = + # "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; + "${mod}+r" = "mode resize"; + } // workspace_binds // prev_next_binds // movement_binds // audio_binds + // system_binds + # // map (key: "$mod+${key} workspace prev_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] + # // map (key: "$mod+${key} workspace next_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] + ; + terminal = pkgs.alacritty.executable; + }; + }; + services.swayidle = { + enable = true; + timeouts = [ + { + timeout = 360; + command = "swaylock -f"; + } + { + timeout = 1800; + command = '' + mpc status | grep "^[playing]" > /dev/null || swaymsg "output * dpms off"''; + resumeCommand = ''swaymsg "output * dpms on"''; + } + ]; + events = [{ + event = "before-sleep"; + command = "swaylock -f"; + }]; + }; + xdg.configFile."swaylock/config".text = '' + image=${theme.background} + font=${font.interface} + font-size=${toString font.size.medium} + indicator-thickness=20 + color=${color.bg} + inside-color=#FFFFFF00 + bs-hl-color=${color.normal.red} + ring-color=${color.normal.green} + key-hl-color=${accent.color} + # divisor lines + separator-color=#aabbcc00 + line-color=#aabbcc00 + line-clear-color=#aabbcc00 + line-caps-lock-color=#aabbcc00 + line-ver-color=#aabbcc00 + line-wrong-color=#aabbcc00 + ''; + services.gammastep = { + enable = true; + provider = "geoclue2"; + }; + services.kanshi = { + enable = true; + profiles = { + sedetary = { + outputs = [ + { + criteria = "eDP-1"; + status = "disable"; + position = "1920,312"; + } + { + criteria = "HDMI-A-1"; + position = "0,0"; + } + ]; + exec = [ "xrdb .Xresources" ]; + }; + nomad = { + outputs = [{ + criteria = "eDP-1"; + status = "enable"; + position = "1920,312"; + }]; + exec = [ "xrdb .Xresources" ]; + }; + }; + }; + programs.mako = { + enable = true; + borderSize = 2; + padding = "5"; + margin = "15"; + layer = "overlay"; + + backgroundColor = color.bg; + borderColor = accent.color; + progressColor = "over ${accent.color}88"; + + defaultTimeout = 10000; + # # {{@@ header() @@}} + # # text + # font={{@@ font.interface @@}} {{@@ font.size.small @@}} + # text-color={{@@ color.txt @@}} + + # # colors + # background-color={{@@ color.bg @@}}{{@@ opacity | clamp_to_hex @@}} + # border-color={{@@ accent_color @@}} + # progress-color=over {{@@ accent_color @@}}88 + + # # decoration + # border-size=2 + # padding=5 + # margin=15 + + # # features + # icons=1 + # markup=1 + # actions=1 + # default-timeout=10000 + + # # position + # layer=overlay + + # [app-name=volumesh] + # default-timeout=5000 + # group-by=app-name + # format=%s\n%b + + # [app-name=dotdrop] + # default-timeout=5000 + # group-by=app-name + # format=%s\n%b + + # # vim: ft=ini + + }; + + }; +}