209 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, pkgs, ... }:
 | 
						|
let
 | 
						|
  inherit (config.my)
 | 
						|
    key
 | 
						|
    accent
 | 
						|
    font
 | 
						|
    theme
 | 
						|
    ;
 | 
						|
  inherit (theme) color;
 | 
						|
  inherit (pkgs) lib;
 | 
						|
 | 
						|
  mod = "Mod4";
 | 
						|
  menu = "wlauncher";
 | 
						|
  terminal = "alacritty";
 | 
						|
 | 
						|
  _lock = pkgs.writeShellScriptBin "_lock" ''
 | 
						|
    pkill caffeinated || true
 | 
						|
    ${pkgs.sway}/bin/swaymsg mode default
 | 
						|
    ${pkgs.swaylock}/bin/swaylock -f
 | 
						|
  '';
 | 
						|
  _suspend = pkgs.writeShellScriptBin "_suspend" ''
 | 
						|
    ${pkgs.sway}/bin/swaymsg mode default
 | 
						|
    pkill caffeinated || true
 | 
						|
    systemctl suspend
 | 
						|
  '';
 | 
						|
 | 
						|
  # 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 window to output
 | 
						|
            "${mod}+mod1+Control+${keyBind}" = "move window output ${direction}; 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";
 | 
						|
 | 
						|
    "${mod}+Shift+z" = "move scratchpad";
 | 
						|
    "${mod}+z" = "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 pkill caffeinated || exec caffeinated";
 | 
						|
  };
 | 
						|
 | 
						|
  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";
 | 
						|
  };
 | 
						|
 | 
						|
  screen_binds = {
 | 
						|
    "XF86MonBrightnessDown" = "exec brightnessctl --min-value=1 set 5%-";
 | 
						|
    "XF86MonBrightnessUp" = "exec brightnessctl --min-value=1 set 5%+";
 | 
						|
    "${mod}+l" = "exec ${lib.getExe _lock}";
 | 
						|
  };
 | 
						|
 | 
						|
  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 ${pkgs.screenshotsh}/bin/screenshotsh edit";
 | 
						|
    "${mod}+Ctrl+v" = "exec wl-paste | tesseract -l por - - | wl-copy";
 | 
						|
    "${mod}+k" = "exec showkeys";
 | 
						|
    "${mod}+Alt+x" = "exec pkill wl-crosshair || exec wl-crosshair";
 | 
						|
    "${mod}+x" = "kill";
 | 
						|
    "${mod}+m" = "mode audio";
 | 
						|
    "${mod}+escape" = "mode passthrough;exec notify-send 'Passthrough on'";
 | 
						|
    "${mod}+ctrl+k" = "exec swaymsg input type:pointer events disabled";
 | 
						|
    "${mod}+ctrl+shift+k" = "exec swaymsg input type:pointer events enabled";
 | 
						|
    "${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'";
 | 
						|
 | 
						|
    # https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/1731
 | 
						|
    "${mod}+Ctrl+Shift+Alt+l" = "exec xdg-open https://www.linkedin.com";
 | 
						|
  };
 | 
						|
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
 | 
						|
    screen_binds
 | 
						|
  ];
 | 
						|
}
 |