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
+
+ };
+
+ };
+}