{ pkgs }: let # TODO/FIX: pkgs.sway-unwrapped is not the same sway derivation as the one running the desktop grim-wrapper = pkgs.writeShellScript "grim-wrapper" # bash '' OUTPUT_DIR="$(${pkgs.xdg-user-dirs}/bin/xdg-user-dir PICTURES)" DATE="$(${pkgs.coreutils}/bin/date +'%Y-%m-%d;%H:%M:%S;')"; WINDOW_LIST="$(${pkgs.sway-unwrapped}/bin/swaymsg -t get_tree | ${pkgs.jq}/bin/jq -r '.. | select(.pid? and .visible?) | "\(.rect.x+.window_rect.x),\(.rect.y+.window_rect.y) \(.window_rect.width)x\(.window_rect.height) \(.app_id):\(.name)"' | ${pkgs.coreutils}/bin/tr -d '"/;\\')"; case "''${1}" in selection) # split slurp selection result into jseon selectable screen area (for grim) and output name SELECTION_FORMAT='{ "area": "%x,%y %wx%h", "name": "%wx%h;%o;%l" }'; SELECTION="$(${pkgs.slurp}/bin/slurp -d -f "''${SELECTION_FORMAT}" <<< ''${WINDOW_LIST})"; SELECTION_AREA="$(${pkgs.jq}/bin/jq -r '.area' <<< "''${SELECTION}")"; SELECTION_NAME="$(${pkgs.jq}/bin/jq -r '.name' <<< "''${SELECTION}"| ${pkgs.coreutils}/bin/tr ' ' '_')"; OUTNAME="''${OUTPUT_DIR}/''${DATE}''${SELECTION_NAME}.png"; ${pkgs.grim}/bin/grim -g "''${SELECTION_AREA}" "''${OUTNAME}"; ;; clip) SELECTION="$(${pkgs.slurp}/bin/slurp -d <<< ''${WINDOW_LIST})"; ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy; ;; *) DISPLAY="$(${pkgs.sway-unwrapped}/bin/swaymsg -t get_outputs | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')"; DISPLAY_RES="$(${pkgs.sway-unwrapped}/bin/swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .current_mode | "\(.width)x\(.height)"')"; OUTNAME="''${OUTPUT_DIR}/''${DATE}''${DISPLAY_RES};''${DISPLAY};.png" ${pkgs.grim}/bin/grim -o "''${DISPLAY}" "''${OUTNAME}"; ;; esac; ''; in pkgs.writeText "config" '' include /etc/sway/config.d/* # Read `man 5 sway` for a complete reference. ### Variables # # Logo key. Use Mod1 for Alt. set $mod Mod4 workspace "HDMI" output HDMI1 workspace_auto_back_and_forth yes default_border pixel hide_edge_borders both # Home row direction keys, like vim set $left h set $down j set $up k set $right l # Your preferred terminal emulator set $term ${pkgs.alacritty}/bin/alacritty # Your preferred application launcher # Note: it's recommended that you pass the final command to sway set $menu ${pkgs.rofi-wayland}/bin/rofi -config /etc/rofi.rasi -show combi input type:keyboard xkb_layout de input type:keyboard xkb_numlock enabled input type:touchpad { tap enabled natural_scroll disabled dwt disabled } ### Output configuration # # Default wallpaper output * bg /persist/data/wallpaper.jpg fill #output eDP-1 scale 1.5 # # Example configuration: # # output HDMI-A-1 resolution 1920x1080 position 1920,0 # # You can get the names of your outputs by running: swaymsg -t get_outputs ### Idle configuration # # Example configuration: # # exec swayidle -w \ # timeout 300 'swaylock -f -c 000000' \ # timeout 600 'swaymsg "output * dpms off"' \ # resume 'swaymsg "output * dpms on"' \ # before-sleep 'swaylock -f -c 000000' # # This will lock your screen after 300 seconds of inactivity, then turn off # your displays after another 300 seconds, and turn your screens back on when # resumed. It will also lock your screen before your computer goes to sleep. ### Input configuration # You can get the names of your inputs by running: swaymsg -t get_inputs xkb_options grp:alt_shift_toggle# Read `man 5 sway-input` for more information about this section. ### Key bindings # # Basics: # # start a terminal bindsym $mod+Return exec $term bindsym $mod+o exec ${pkgs.pcmanfm}/bin/pcmanfm bindsym $mod+Alt+l exec loginctl lock-session && ${pkgs.swaylock}/bin/swaylock -c 000000 -kFe # kill focused window bindsym $mod+Shift+q kill # start your launcher bindsym $mod+d exec $menu bindsym XF86AudioPlay exec ${pkgs.playerctl}/bin/playerctl play bindsym XF86AudioPause exec ${pkgs.playerctl}/bin/playerctl pause bindsym XF86AudioNext exec ${pkgs.playerctl}/bin/playerctl next bindsym XF86AudioPrev exec ${pkgs.playerctl}/bin/playerctl previous bindsym $mod+Mod1+space exec ${pkgs.playerctl}/bin/playerctl play-pause bindsym $mod+Mod1+Left exec ${pkgs.playerctl}/bin/playerctl position 10- bindsym $mod+Mod1+Right exec ${pkgs.playerctl}/bin/playerctl position 10+ bindsym $mod+Mod1+Down exec ${pkgs.playerctl}/bin/playerctl next bindsym $mod+Mod1+Up exec ${pkgs.playerctl}/bin/playerctl previous bindsym $mod+b border toggle bindsym $mod+m bar mode toggle bindsym $mod+y move container to output left bindsym $mod+x move container to output right bindsym $mod+Shift+y move workspace to output left bindsym $mod+Shift+x move workspace to output right bindsym $mod+minus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%- bindsym $mod+plus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%+ bindsym $mod+Mod1+minus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%- bindsym $mod+Mod1+plus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%+ bindsym $mod+Shift+minus exec ${pkgs.acpilight}/bin/xbacklight -5 bindsym $mod+Shift+plus exec ${pkgs.acpilight}/bin/xbacklight +5 bindsym $mod+Ctrl+1 exec ${pkgs.acpilight}/bin/xbacklight -set 0 bindsym $mod+Ctrl+2 exec ${pkgs.acpilight}/bin/xbacklight -set 1 bindsym $mod+Ctrl+3 exec ${pkgs.acpilight}/bin/xbacklight -set 10 bindsym $mod+Ctrl+4 exec ${pkgs.acpilight}/bin/xbacklight -set 25 bindsym $mod+Ctrl+5 exec ${pkgs.acpilight}/bin/xbacklight -set 50 bindsym $mod+Ctrl+6 exec ${pkgs.acpilight}/bin/xbacklight -set 60 bindsym $mod+Ctrl+7 exec ${pkgs.acpilight}/bin/xbacklight -set 70 bindsym $mod+Ctrl+8 exec ${pkgs.acpilight}/bin/xbacklight -set 80 bindsym $mod+Ctrl+9 exec ${pkgs.acpilight}/bin/xbacklight -set 90 bindsym $mod+Ctrl+0 exec ${pkgs.acpilight}/bin/xbacklight -set 100 bindsym $mod+Shift+w sticky toggle # Screenshots bindsym $mod+Ctrl+s exec ${grim-wrapper} selection bindsym $mod+Ctrl+a exec ${grim-wrapper} bindsym $mod+Ctrl+y exec ${grim-wrapper} clip # Drag floating windows by holding down $mod and left mouse button. # Resize them with right mouse button + $mod. # Despite the name, also works for non-floating windows. # Change normal to inverse to use left mouse button for resizing and right # mouse button for dragging. floating_modifier $mod normal # reload the configuration file bindsym $mod+Shift+c reload # exit sway (logs you out of your Wayland session) bindsym $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' # # Moving around: # # Move your focus around bindsym $mod+$left focus left bindsym $mod+$down focus down bindsym $mod+$up focus up bindsym $mod+$right focus right # or use $mod+[up|down|left|right] bindsym $mod+Left focus left bindsym $mod+Down focus down bindsym $mod+Up focus up bindsym $mod+Right focus right # focus urgent bindsym $mod+g exec swaymsg "[urgent=latest] focus" # _move_ the focused window with the same, but add Shift bindsym $mod+Shift+$left move left bindsym $mod+Shift+$down move down bindsym $mod+Shift+$up move up bindsym $mod+Shift+$right move right # ditto, with arrow keys bindsym $mod+Shift+Left move left bindsym $mod+Shift+Down move down bindsym $mod+Shift+Up move up bindsym $mod+Shift+Right move right # # Workspaces: # # switch to workspace bindsym $mod+1 workspace 1 bindsym $mod+2 workspace 2 bindsym $mod+3 workspace 3 bindsym $mod+4 workspace 4 bindsym $mod+5 workspace 5 bindsym $mod+6 workspace 6 bindsym $mod+7 workspace 7 bindsym $mod+8 workspace 8 bindsym $mod+9 workspace 9 bindsym $mod+0 workspace 10 # move focused container to workspace bindsym $mod+Shift+1 move container to workspace 1 bindsym $mod+Shift+2 move container to workspace 2 bindsym $mod+Shift+3 move container to workspace 3 bindsym $mod+Shift+4 move container to workspace 4 bindsym $mod+Shift+5 move container to workspace 5 bindsym $mod+Shift+6 move container to workspace 6 bindsym $mod+Shift+7 move container to workspace 7 bindsym $mod+Shift+8 move container to workspace 8 bindsym $mod+Shift+9 move container to workspace 9 bindsym $mod+Shift+0 move container to workspace 10 bindsym $mod+c splith bindsym $mod+v splitv # Switch the current container between different layout styles bindsym $mod+s layout stacking bindsym $mod+w layout tabbed bindsym $mod+e layout toggle split # Make the current focus fullscreen bindsym $mod+f fullscreen # Toggle the current focus between tiling and floating mode bindsym $mod+Shift+space floating toggle # Swap focus between the tiling area and the floating area bindsym $mod+space focus mode_toggle # move focus to the parent container bindsym $mod+a focus parent # # Scratchpad: # # Sway has a "scratchpad", which is a bag of holding for windows. # You can send windows there and get them back later. # Move the currently focused window to the scratchpad bindsym $mod+p move scratchpad # Show the next scratchpad window or hide the focused scratchpad window. # If there are multiple scratchpad windows, this command cycles through them. bindsym $mod+Shift+p scratchpad show # # Resizing containers: # mode "resize" { # left will shrink the containers width # right will grow the containers width # up will shrink the containers height # down will grow the containers height bindsym $left resize shrink width 10px bindsym $down resize grow height 10px bindsym $up resize shrink height 10px bindsym $right resize grow width 10px # ditto, with arrow keys bindsym Left resize shrink width 10px bindsym Down resize grow height 10px bindsym Up resize shrink height 10px bindsym Right resize grow width 10px # return to default mode bindsym Return mode "default" bindsym Escape mode "default" } bindsym $mod+r mode "resize" # Define kanagawa colors set $base00 "1F1F28" set $base01 "2A2A37" set $base02 "223249" set $base03 "727169" set $base04 "C8C093" set $base05 "DCD7BA" set $base06 "938AA9" set $base07 "363646" set $base08 "C34043" set $base09 "FFA066" set $base0A "DCA561" set $base0B "98BB6C" set $base0C "7FB4CA" set $base0D "7E9CD8" set $base0E "957FB8" set $base0F "D27E99" client.focused $base05 $base0D $base00 $base0D $base0D client.focused_inactive $base01 $base01 $base05 $base03 $base01 client.unfocused $base01 $base00 $base05 $base01 $base01 client.urgent $base08 $base08 $base00 $base08 $base08 client.placeholder $base00 $base00 $base05 $base00 $base00 client.background $base07 # # Status Bar: # # Read `man 5 sway-bar` for more information about this section. bar { position top # When the status_command prints a new line to stdout, swaybar updates. # The default just shows the current date and time. #status_command while date +'%Y-%m-%d %l:%M:%S %p'; do sleep 1; done status_command ${pkgs.python3Packages.py3status}/bin/py3status -c /etc/i3/py3status colors { background $base00 separator $base01 statusline $base04 # State Border BG Text focused_workspace $base05 $base0D $base00 active_workspace $base05 $base03 $base00 inactive_workspace $base03 $base01 $base05 urgent_workspace $base08 $base08 $base00 binding_mode $base00 $base0A $base00 } } ''