sway: extract binds
This commit is contained in:
		
							parent
							
								
									5f0c129b63
								
							
						
					
					
						commit
						c82e25f0a4
					
				
					 4 changed files with 244 additions and 212 deletions
				
			
		| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
    new-packages
 | 
					    new-packages
 | 
				
			||||||
    patches
 | 
					    patches
 | 
				
			||||||
    variables
 | 
					    variables
 | 
				
			||||||
 | 
					    lib_extended
 | 
				
			||||||
  ];
 | 
					  ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  nur = inputs.nur.overlay;
 | 
					  nur = inputs.nur.overlay;
 | 
				
			||||||
| 
						 | 
					@ -83,4 +84,18 @@
 | 
				
			||||||
  variables = (final: prev: {
 | 
					  variables = (final: prev: {
 | 
				
			||||||
    uservars = import ../user/variables.nix;
 | 
					    uservars = import ../user/variables.nix;
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lib_extended = (final: prev: {
 | 
				
			||||||
 | 
					    lib = prev.lib // rec {
 | 
				
			||||||
 | 
					      # Utility funcion
 | 
				
			||||||
 | 
					      # Input: [{v1=1;} {v2=2;}]
 | 
				
			||||||
 | 
					      # Output: {v1=1;v2=2;}
 | 
				
			||||||
 | 
					      mergeAttrsSet = prev.lib.foldAttrs (n: _: n) { };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      # Easily translate imperative templating code
 | 
				
			||||||
 | 
					      # Input: [ 1 2 ] (num: { "v${num}" = num; })
 | 
				
			||||||
 | 
					      # Output: {v1=1;v2=2;}
 | 
				
			||||||
 | 
					      forEachMerge = list: func: mergeAttrsSet (prev.lib.forEach list func);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,40 +2,26 @@
 | 
				
			||||||
let
 | 
					let
 | 
				
			||||||
  inherit (pkgs.uservars) key accent font theme;
 | 
					  inherit (pkgs.uservars) key accent font theme;
 | 
				
			||||||
  inherit (theme) color;
 | 
					  inherit (theme) color;
 | 
				
			||||||
  _lock = pkgs.writeShellScriptBin "_lock" ''
 | 
					 | 
				
			||||||
    ${pkgs.swaylock}/bin/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 systemctl --user status swayidle > /dev/null; then
 | 
					 | 
				
			||||||
        systemctl --user stop swayidle.service
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        systemctl --user start swayidle.service
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
  '';
 | 
					 | 
				
			||||||
in
 | 
					in
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  imports = [ ./theme.nix ./mako.nix ./swaylock.nix ./swayidle.nix ];
 | 
					  imports = [
 | 
				
			||||||
 | 
					    ./kanshi.nix
 | 
				
			||||||
 | 
					    ./mako.nix
 | 
				
			||||||
 | 
					    ./sway-binds.nix
 | 
				
			||||||
 | 
					    ./swayidle.nix
 | 
				
			||||||
 | 
					    ./swaylock.nix
 | 
				
			||||||
 | 
					    ./theme.nix
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
  config = {
 | 
					  config = {
 | 
				
			||||||
    programs.mako.enable = true;
 | 
					    programs.mako.enable = true;
 | 
				
			||||||
    services.swayidle.enable = true;
 | 
					    services.swayidle.enable = true;
 | 
				
			||||||
 | 
					    services.kanshi.enable = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wayland.windowManager.sway =
 | 
					    wayland.windowManager.sway =
 | 
				
			||||||
      let
 | 
					      let
 | 
				
			||||||
        mod = "Mod4";
 | 
					        mod = "Mod4";
 | 
				
			||||||
        menu = "wlauncher";
 | 
					        # menu = "wlauncher";
 | 
				
			||||||
        terminal = "alacritty";
 | 
					        # terminal = "alacritty";
 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Utility funcion
 | 
					 | 
				
			||||||
        # Input: [{v1=1;} {v2=2;}]
 | 
					 | 
				
			||||||
        # Output: {v1=1;v2=2;}
 | 
					 | 
				
			||||||
        mergeAttrsSet = lib.foldAttrs (n: _: n) { };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        forEachMerge = list: func: mergeAttrsSet (lib.forEach list func);
 | 
					 | 
				
			||||||
      in
 | 
					      in
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        enable = true;
 | 
					        enable = true;
 | 
				
			||||||
| 
						 | 
					@ -191,166 +177,6 @@ in
 | 
				
			||||||
              { app_id = ".*[Hh]elvum.*"; }
 | 
					              { app_id = ".*[Hh]elvum.*"; }
 | 
				
			||||||
            ];
 | 
					            ];
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
          keybindings =
 | 
					 | 
				
			||||||
            let
 | 
					 | 
				
			||||||
              # mod+1 to swich to workspace 1
 | 
					 | 
				
			||||||
              # mod+shift+1 to move to workspace 1
 | 
					 | 
				
			||||||
              workspace_binds =
 | 
					 | 
				
			||||||
                let
 | 
					 | 
				
			||||||
                  workspaceBinds = map makeWorkspaceBinds (lib.range 1 10);
 | 
					 | 
				
			||||||
                  makeWorkspaceBinds = (i:
 | 
					 | 
				
			||||||
                    let
 | 
					 | 
				
			||||||
                      key = toString (lib.mod i 10);
 | 
					 | 
				
			||||||
                      workspaceNumber = toString i;
 | 
					 | 
				
			||||||
                    in
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                      "${mod}+${key}" = "workspace number ${workspaceNumber}";
 | 
					 | 
				
			||||||
                      "${mod}+Shift+${key}" =
 | 
					 | 
				
			||||||
                        "move container to workspace number ${workspaceNumber}";
 | 
					 | 
				
			||||||
                    });
 | 
					 | 
				
			||||||
                in
 | 
					 | 
				
			||||||
                mergeAttrsSet workspaceBinds;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
              prev_next_binds =
 | 
					 | 
				
			||||||
                let
 | 
					 | 
				
			||||||
                  maybe_window = key:
 | 
					 | 
				
			||||||
                    if (lib.strings.hasInfix "button" key) then
 | 
					 | 
				
			||||||
                      "--whole-window"
 | 
					 | 
				
			||||||
                    else
 | 
					 | 
				
			||||||
                      "";
 | 
					 | 
				
			||||||
                  makePrevNextBindFunction = (prev_or_next:
 | 
					 | 
				
			||||||
                    map (key: {
 | 
					 | 
				
			||||||
                      "${maybe_window key} ${mod}+${key}" =
 | 
					 | 
				
			||||||
                        "workspace ${prev_or_next}_on_output";
 | 
					 | 
				
			||||||
                    }));
 | 
					 | 
				
			||||||
                  prev_binds = makePrevNextBindFunction "prev" [
 | 
					 | 
				
			||||||
                    key.tabL
 | 
					 | 
				
			||||||
                    "bracketleft"
 | 
					 | 
				
			||||||
                    "Prior"
 | 
					 | 
				
			||||||
                    "button9"
 | 
					 | 
				
			||||||
                    "button4"
 | 
					 | 
				
			||||||
                    "Shift+Tab"
 | 
					 | 
				
			||||||
                  ];
 | 
					 | 
				
			||||||
                  next_binds = makePrevNextBindFunction "next" [
 | 
					 | 
				
			||||||
                    key.tabR
 | 
					 | 
				
			||||||
                    "bracketright"
 | 
					 | 
				
			||||||
                    "Next"
 | 
					 | 
				
			||||||
                    "button8"
 | 
					 | 
				
			||||||
                    "button5"
 | 
					 | 
				
			||||||
                    "Tab"
 | 
					 | 
				
			||||||
                  ];
 | 
					 | 
				
			||||||
                in
 | 
					 | 
				
			||||||
                mergeAttrsSet (prev_binds ++ next_binds);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
              # focus, move, resize, (focus and move output)
 | 
					 | 
				
			||||||
              # for every direction with both arrow keys and vim keys
 | 
					 | 
				
			||||||
              movement_binds =
 | 
					 | 
				
			||||||
                let
 | 
					 | 
				
			||||||
                  directions = [ "Left" "Up" "Right" "Down" ];
 | 
					 | 
				
			||||||
                  makeVimKeys = (k: key.${lib.toLower k});
 | 
					 | 
				
			||||||
                  makeArrowKeys = (k: k);
 | 
					 | 
				
			||||||
                  makeResizeCommand = direction:
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                      Left = "shrink width 20px";
 | 
					 | 
				
			||||||
                      Up = "shrink height 20px";
 | 
					 | 
				
			||||||
                      Right = "grow width 20px";
 | 
					 | 
				
			||||||
                      Down = "grow height 20px";
 | 
					 | 
				
			||||||
                    }.${direction};
 | 
					 | 
				
			||||||
                in
 | 
					 | 
				
			||||||
                forEachMerge [ makeVimKeys makeArrowKeys ] (prefixFun:
 | 
					 | 
				
			||||||
                  forEachMerge directions (direction:
 | 
					 | 
				
			||||||
                    let
 | 
					 | 
				
			||||||
                      resize_cmd = makeResizeCommand direction;
 | 
					 | 
				
			||||||
                      keyBind = prefixFun direction;
 | 
					 | 
				
			||||||
                    in
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                      #  Move focus
 | 
					 | 
				
			||||||
                      "${mod}+${keyBind}" = "focus ${direction}";
 | 
					 | 
				
			||||||
                      #  Move window
 | 
					 | 
				
			||||||
                      "${mod}+Shift+${keyBind}" = "move ${direction}";
 | 
					 | 
				
			||||||
                      #  Resize window
 | 
					 | 
				
			||||||
                      "${mod}+Control+${keyBind}" = "resize ${resize_cmd}";
 | 
					 | 
				
			||||||
                      #  focus output
 | 
					 | 
				
			||||||
                      "${mod}+mod1+${keyBind}" = "focus output ${direction}";
 | 
					 | 
				
			||||||
                      #  Move workspace to output
 | 
					 | 
				
			||||||
                      "${mod}+mod1+Shift+${keyBind}" =
 | 
					 | 
				
			||||||
                        "move workspace output ${direction}";
 | 
					 | 
				
			||||||
                    }));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
              parenting_binds = {
 | 
					 | 
				
			||||||
                "${mod}+equal" = "focus parent";
 | 
					 | 
				
			||||||
                "${mod}+minus" = "focus child";
 | 
					 | 
				
			||||||
                "${mod}+r" = "layout toggle split";
 | 
					 | 
				
			||||||
                "${mod}+t" = "layout toggle split tabbed stacking";
 | 
					 | 
				
			||||||
                "${mod}+b" = "splith";
 | 
					 | 
				
			||||||
                "${mod}+v" = "splitv";
 | 
					 | 
				
			||||||
                "${mod}+a" = "focus parent";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                ## TODO:
 | 
					 | 
				
			||||||
                # "${mod}+Shift+minus" = "move scratchpad";
 | 
					 | 
				
			||||||
                # "${mod}+minus" = "scratchpad show";
 | 
					 | 
				
			||||||
              };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
              audio_binds = {
 | 
					 | 
				
			||||||
                XF86AudioRaiseVolume = "exec volumesh -i 10";
 | 
					 | 
				
			||||||
                XF86AudioLowerVolume = "exec volumesh -d 10";
 | 
					 | 
				
			||||||
                XF86AudioMute = "exec volumesh -t";
 | 
					 | 
				
			||||||
                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";
 | 
					 | 
				
			||||||
              };
 | 
					 | 
				
			||||||
              screenshot_binds = {
 | 
					 | 
				
			||||||
                # Screens to file
 | 
					 | 
				
			||||||
                "Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh def";
 | 
					 | 
				
			||||||
                # Screen area to file
 | 
					 | 
				
			||||||
                "Shift+Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh area";
 | 
					 | 
				
			||||||
                # Screen area to clipboard
 | 
					 | 
				
			||||||
                "Control+Shift+Print" =
 | 
					 | 
				
			||||||
                  "exec ${pkgs.screenshotsh}/bin/screenshotsh area-clip";
 | 
					 | 
				
			||||||
                # Focused monitor to clipboard
 | 
					 | 
				
			||||||
                "Control+Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh clip";
 | 
					 | 
				
			||||||
              };
 | 
					 | 
				
			||||||
              other_binds = {
 | 
					 | 
				
			||||||
                "${mod}+p" = "exec ${pkgs.wpass}/bin/wpass";
 | 
					 | 
				
			||||||
                "${mod}+s" = "exec ${menu}";
 | 
					 | 
				
			||||||
                "${mod}+g" = "exec ${pkgs.demoji}/bin/demoji --lang pt --fallback --copy -- ${pkgs.wdmenu}/bin/wdmenu";
 | 
					 | 
				
			||||||
                "${mod}+c" = "exec ${pkgs.color_picker}/bin/color_picker";
 | 
					 | 
				
			||||||
                "${mod}+Return" = "exec ${terminal}";
 | 
					 | 
				
			||||||
                "${mod}+Ctrl+Return" = "exec thunar";
 | 
					 | 
				
			||||||
                "${mod}+Shift+s" = "exec grim - | swappy -f -";
 | 
					 | 
				
			||||||
                "${mod}+Ctrl+v" = "exec wl-paste | tesseract -l por - - | wl-copy";
 | 
					 | 
				
			||||||
                "${mod}+k" = "exec showkeys";
 | 
					 | 
				
			||||||
                "${mod}+x" = "kill";
 | 
					 | 
				
			||||||
                "${mod}+m" = "mode audio";
 | 
					 | 
				
			||||||
                "${mod}+escape" =
 | 
					 | 
				
			||||||
                  "mode passthrough;exec notify-send 'Passthrough on'";
 | 
					 | 
				
			||||||
                "${mod}+f" = "fullscreen toggle";
 | 
					 | 
				
			||||||
                "${mod}+Shift+space" = "floating toggle";
 | 
					 | 
				
			||||||
                "${mod}+space" = "focus mode_toggle";
 | 
					 | 
				
			||||||
                "${mod}+ctrl+space" = "sticky toggle";
 | 
					 | 
				
			||||||
                "${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'";
 | 
					 | 
				
			||||||
              };
 | 
					 | 
				
			||||||
            in
 | 
					 | 
				
			||||||
            mergeAttrsSet [
 | 
					 | 
				
			||||||
              other_binds
 | 
					 | 
				
			||||||
              workspace_binds
 | 
					 | 
				
			||||||
              prev_next_binds
 | 
					 | 
				
			||||||
              movement_binds
 | 
					 | 
				
			||||||
              audio_binds
 | 
					 | 
				
			||||||
              system_binds
 | 
					 | 
				
			||||||
              parenting_binds
 | 
					 | 
				
			||||||
              screenshot_binds
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
          terminal = pkgs.alacritty.executable;
 | 
					          terminal = pkgs.alacritty.executable;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        extraConfig = ''
 | 
					        extraConfig = ''
 | 
				
			||||||
| 
						 | 
					@ -363,33 +189,6 @@ in
 | 
				
			||||||
      enable = true;
 | 
					      enable = true;
 | 
				
			||||||
      provider = "geoclue2";
 | 
					      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" ];
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    home.packages = with pkgs; [
 | 
					    home.packages = with pkgs; [
 | 
				
			||||||
      sway
 | 
					      sway
 | 
				
			||||||
      swaybg
 | 
					      swaybg
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								user/sway/kanshi.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								user/sway/kanshi.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					{ config, pkgs, lib, ... }:
 | 
				
			||||||
 | 
					let
 | 
				
			||||||
 | 
					  inherit (pkgs.uservars) key accent font theme;
 | 
				
			||||||
 | 
					  inherit (theme) color;
 | 
				
			||||||
 | 
					in
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  services.kanshi = {
 | 
				
			||||||
 | 
					    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" ];
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										185
									
								
								user/sway/sway-binds.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								user/sway/sway-binds.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,185 @@
 | 
				
			||||||
 | 
					{ config, pkgs, ... }:
 | 
				
			||||||
 | 
					let
 | 
				
			||||||
 | 
					  inherit (pkgs.uservars) key accent font theme;
 | 
				
			||||||
 | 
					  inherit (theme) color;
 | 
				
			||||||
 | 
					  inherit (pkgs) lib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mod = "Mod4";
 | 
				
			||||||
 | 
					  menu = "wlauncher";
 | 
				
			||||||
 | 
					  terminal = "alacritty";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _lock = pkgs.writeShellScriptBin "_lock" ''
 | 
				
			||||||
 | 
					    ${pkgs.swaylock}/bin/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 systemctl --user status swayidle > /dev/null; then
 | 
				
			||||||
 | 
					        systemctl --user stop swayidle.service
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        systemctl --user start swayidle.service
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # mod+1 to swich to workspace 1
 | 
				
			||||||
 | 
					  # mod+shift+1 to move to workspace 1
 | 
				
			||||||
 | 
					  workspace_binds = lib.forEachMerge (lib.range 1 10) (i:
 | 
				
			||||||
 | 
					    let
 | 
				
			||||||
 | 
					      key = toString (lib.mod i 10);
 | 
				
			||||||
 | 
					      workspaceNumber = toString i;
 | 
				
			||||||
 | 
					    in
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "${mod}+${key}" = "workspace number ${workspaceNumber}";
 | 
				
			||||||
 | 
					      "${mod}+Shift+${key}" =
 | 
				
			||||||
 | 
					        "move container to workspace number ${workspaceNumber}";
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  prev_next_binds =
 | 
				
			||||||
 | 
					    let
 | 
				
			||||||
 | 
					      maybe_window = key:
 | 
				
			||||||
 | 
					        if (lib.strings.hasInfix "button" key) then
 | 
				
			||||||
 | 
					          "--whole-window"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          "";
 | 
				
			||||||
 | 
					      makePrevNextBindFunction = (prev_or_next:
 | 
				
			||||||
 | 
					        map (key: {
 | 
				
			||||||
 | 
					          "${maybe_window key} ${mod}+${key}" =
 | 
				
			||||||
 | 
					            "workspace ${prev_or_next}_on_output";
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					      prev_binds = makePrevNextBindFunction "prev" [
 | 
				
			||||||
 | 
					        key.tabL
 | 
				
			||||||
 | 
					        "bracketleft"
 | 
				
			||||||
 | 
					        "Prior"
 | 
				
			||||||
 | 
					        "button9"
 | 
				
			||||||
 | 
					        "button4"
 | 
				
			||||||
 | 
					        "Shift+Tab"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					      next_binds = makePrevNextBindFunction "next" [
 | 
				
			||||||
 | 
					        key.tabR
 | 
				
			||||||
 | 
					        "bracketright"
 | 
				
			||||||
 | 
					        "Next"
 | 
				
			||||||
 | 
					        "button8"
 | 
				
			||||||
 | 
					        "button5"
 | 
				
			||||||
 | 
					        "Tab"
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    in
 | 
				
			||||||
 | 
					    lib.mergeAttrsSet (prev_binds ++ next_binds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # focus, move, resize, (focus and move output)
 | 
				
			||||||
 | 
					  # for every direction with both arrow keys and vim keys
 | 
				
			||||||
 | 
					  movement_binds =
 | 
				
			||||||
 | 
					    let
 | 
				
			||||||
 | 
					      directions = [ "Left" "Up" "Right" "Down" ];
 | 
				
			||||||
 | 
					      makeVimKeys = (k: key.${lib.toLower k});
 | 
				
			||||||
 | 
					      makeArrowKeys = (k: k);
 | 
				
			||||||
 | 
					      makeResizeCommand = direction:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          Left = "shrink width 20px";
 | 
				
			||||||
 | 
					          Up = "shrink height 20px";
 | 
				
			||||||
 | 
					          Right = "grow width 20px";
 | 
				
			||||||
 | 
					          Down = "grow height 20px";
 | 
				
			||||||
 | 
					        }.${direction};
 | 
				
			||||||
 | 
					    in
 | 
				
			||||||
 | 
					    lib.forEachMerge [ makeVimKeys makeArrowKeys ] (prefixFun:
 | 
				
			||||||
 | 
					      lib.forEachMerge directions (direction:
 | 
				
			||||||
 | 
					        let
 | 
				
			||||||
 | 
					          resize_cmd = makeResizeCommand direction;
 | 
				
			||||||
 | 
					          keyBind = prefixFun direction;
 | 
				
			||||||
 | 
					        in
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          #  Move focus
 | 
				
			||||||
 | 
					          "${mod}+${keyBind}" = "focus ${direction}";
 | 
				
			||||||
 | 
					          #  Move window
 | 
				
			||||||
 | 
					          "${mod}+Shift+${keyBind}" = "move ${direction}";
 | 
				
			||||||
 | 
					          #  Resize window
 | 
				
			||||||
 | 
					          "${mod}+Control+${keyBind}" = "resize ${resize_cmd}";
 | 
				
			||||||
 | 
					          #  focus output
 | 
				
			||||||
 | 
					          "${mod}+mod1+${keyBind}" = "focus output ${direction}";
 | 
				
			||||||
 | 
					          #  Move workspace to output
 | 
				
			||||||
 | 
					          "${mod}+mod1+Shift+${keyBind}" =
 | 
				
			||||||
 | 
					            "move workspace output ${direction}";
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  parenting_binds = {
 | 
				
			||||||
 | 
					    "${mod}+equal" = "focus parent";
 | 
				
			||||||
 | 
					    "${mod}+minus" = "focus child";
 | 
				
			||||||
 | 
					    "${mod}+r" = "layout toggle split";
 | 
				
			||||||
 | 
					    "${mod}+t" = "layout toggle split tabbed stacking";
 | 
				
			||||||
 | 
					    "${mod}+b" = "splith";
 | 
				
			||||||
 | 
					    "${mod}+v" = "splitv";
 | 
				
			||||||
 | 
					    "${mod}+a" = "focus parent";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ## TODO:
 | 
				
			||||||
 | 
					    # "${mod}+Shift+minus" = "move scratchpad";
 | 
				
			||||||
 | 
					    # "${mod}+minus" = "scratchpad show";
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  audio_binds = {
 | 
				
			||||||
 | 
					    XF86AudioRaiseVolume = "exec volumesh -i 10";
 | 
				
			||||||
 | 
					    XF86AudioLowerVolume = "exec volumesh -d 10";
 | 
				
			||||||
 | 
					    XF86AudioMute = "exec volumesh -t";
 | 
				
			||||||
 | 
					    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";
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  screenshot_binds = {
 | 
				
			||||||
 | 
					    # Screens to file
 | 
				
			||||||
 | 
					    "Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh def";
 | 
				
			||||||
 | 
					    # Screen area to file
 | 
				
			||||||
 | 
					    "Shift+Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh area";
 | 
				
			||||||
 | 
					    # Screen area to clipboard
 | 
				
			||||||
 | 
					    "Control+Shift+Print" =
 | 
				
			||||||
 | 
					      "exec ${pkgs.screenshotsh}/bin/screenshotsh area-clip";
 | 
				
			||||||
 | 
					    # Focused monitor to clipboard
 | 
				
			||||||
 | 
					    "Control+Print" = "exec ${pkgs.screenshotsh}/bin/screenshotsh clip";
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  other_binds = {
 | 
				
			||||||
 | 
					    "${mod}+p" = "exec ${pkgs.wpass}/bin/wpass";
 | 
				
			||||||
 | 
					    "${mod}+s" = "exec ${menu}";
 | 
				
			||||||
 | 
					    "${mod}+g" = "exec ${pkgs.demoji}/bin/demoji --lang pt --fallback --copy -- ${pkgs.wdmenu}/bin/wdmenu";
 | 
				
			||||||
 | 
					    "${mod}+c" = "exec ${pkgs.color_picker}/bin/color_picker";
 | 
				
			||||||
 | 
					    "${mod}+Return" = "exec ${terminal}";
 | 
				
			||||||
 | 
					    "${mod}+Ctrl+Return" = "exec thunar";
 | 
				
			||||||
 | 
					    "${mod}+Shift+s" = "exec grim - | swappy -f -";
 | 
				
			||||||
 | 
					    "${mod}+Ctrl+v" = "exec wl-paste | tesseract -l por - - | wl-copy";
 | 
				
			||||||
 | 
					    "${mod}+k" = "exec showkeys";
 | 
				
			||||||
 | 
					    "${mod}+x" = "kill";
 | 
				
			||||||
 | 
					    "${mod}+m" = "mode audio";
 | 
				
			||||||
 | 
					    "${mod}+escape" =
 | 
				
			||||||
 | 
					      "mode passthrough;exec notify-send 'Passthrough on'";
 | 
				
			||||||
 | 
					    "${mod}+f" = "fullscreen toggle";
 | 
				
			||||||
 | 
					    "${mod}+Shift+space" = "floating toggle";
 | 
				
			||||||
 | 
					    "${mod}+space" = "focus mode_toggle";
 | 
				
			||||||
 | 
					    "${mod}+ctrl+space" = "sticky toggle";
 | 
				
			||||||
 | 
					    "${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'";
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					in
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  wayland.windowManager.sway.config.keybindings = lib.mergeAttrsSet [
 | 
				
			||||||
 | 
					    other_binds
 | 
				
			||||||
 | 
					    workspace_binds
 | 
				
			||||||
 | 
					    prev_next_binds
 | 
				
			||||||
 | 
					    movement_binds
 | 
				
			||||||
 | 
					    audio_binds
 | 
				
			||||||
 | 
					    system_binds
 | 
				
			||||||
 | 
					    parenting_binds
 | 
				
			||||||
 | 
					    screenshot_binds
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue