diff --git a/roles/sway/files/sway.config b/roles/sway/files/sway.config new file mode 100644 index 0000000..29483b4 --- /dev/null +++ b/roles/sway/files/sway.config @@ -0,0 +1,307 @@ +# efault config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l +# Your preferred terminal emulator +set $term alacritty +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +#set $menu dmenu_path | dmenu | xargs swaymsg exec -- +set $bemenu bemenu -i -l 15 -m all --tf=#2e9ef4 --hf=#2e9ef4 +set $menu j4-dmenu-desktop --dmenu="$bemenu" --term='alacritty' | xargs swaymsg exec -- + +font pango:Segoe UI Regular 10 + +### Output configuration +# +# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) +#output * bg [enter a path here and uncomment] fill +# +# +# 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 + +#output * adaptive_sync on + +### 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 +# +# Example configuration: +# +# input "2:14:SynPS/2_Synaptics_TouchPad" { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# You can get the names of your inputs by running: swaymsg -t get_inputs +# Read `man 5 sway-input` for more information about this section. + + input * { + xkb_layout "pl" + } + + # NV4x ADL touchpad + input "10248:257:FTCS1000:00_2808:0101_Touchpad" { + dwt enabled + tap enabled + natural_scroll enabled + middle_emulation enabled + scroll_factor 0.5 + pointer_accel 0.0 + } + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+d exec $menu + bindsym Alt+Space exec $menu + + # 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 Scripts/sway/dmenu-sway-exit.sh -m "$bemenu" +# +# 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 + + # 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 number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. + bindsym $mod+bracketleft workspace prev + bindsym $mod+bracketright workspace next + bindsym $mod+braceleft move container to workspace prev + bindsym $mod+braceright move container to workspace next + bindsym $mod+Ctrl+Left move workspace to output left + bindsym $mod+Ctrl+Right move workspace to output right + bindsym $mod+Ctrl+Up move workspace to output up + bindsym $mod+Ctrl+Down move workspace to output downbindgesture + # Touchpad gestures + bindgesture swipe:3:right workspace prev + bindgesture swipe:3:left workspace next +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b 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+Shift+minus 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+minus 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" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + + swaybar_command waybar + +} + +#################################### +## User config ## +#################################### + +smart_borders on +default_border pixel 2 + +# Multimedia keys +bindsym XF86MonBrightnessDown exec brightnessctl set 4%- --exponent=2 && light -G | cut -d'.' -f1 > $SWAYSOCK.wob +bindsym XF86MonBrightnessUp exec brightnessctl set 4%+ --exponent=2 && light -G | cut -d'.' -f1 > $SWAYSOCK.wob +bindsym XF86AudioRaiseVolume exec pamixer -ui 5 && pamixer --get-volume > $SWAYSOCK.wob +bindsym XF86AudioLowerVolume exec pamixer -ud 5 && pamixer --get-volume > $SWAYSOCK.wob +bindsym XF86AudioMute exec pamixer --toggle-mute && ( pamixer --get-mute && echo 0 > $SWAYSOCK.wob ) || pamixer --get-volume > $SWAYSOCK.wob +bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle +bindsym XF86AudioPlay exec playerctl play-pause +bindsym XF86AudioNext exec playerctl next +bindsym XF86AudioPrev exec playerctl previous + +# Screenshots +bindsym Print exec grimshot copy output +bindsym Ctrl+Print exec grimshot copy area +bindsym $mod+Print exec grimshot copy active +bindsym Shift+Print exec grimshot save output +bindsym Shift+Ctrl+Print exec grimshot save area +bindsym Shift+$mod+Print exec grimshot save active + +# Lid switching, lid close needs a special handler in case we're docked +bindswitch --reload --locked lid:off output eDP-1 enable +bindswitch --reload --locked lid:on exec sway_lid_handler.sh + +# Screen locking +bindsym $mod+End exec swaylock -f -c 000000 + +# Special keys +bindsym XF86Display exec wdisplays +bindsym XF86NotificationCenter exec playerctl play-pause +bindsym XF86PickupPhone exec playerctl previous +bindsym XF86HangupPhone exec playerctl next + +exec dex -a -s ~/.config/autostart/ + +exec_always sway_lid_handler.sh +#exec_always "killall wlsunset; wlsunset -t 5200 -l 54.4 -L 18.6" +exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 +exec nm-applet --indicator +exec blueman-applet +exec mako +exec mkfifo $SWAYSOCK.wob && tail -f $SWAYSOCK.wob | wob --background-color=#00000080 -a bottom -M 100 + +exec swayidle -w \ + lock 'swaylock -f -c 000000' \ + timeout 300 'swaylock -f -c 000000' \ + timeout 600 'swaymsg "output * dpms off"' \ + resume 'swaymsg "output * dpms on"' \ + before-sleep 'playerctl -a pause; swaymsg output eDP-1 enable; swaylock -f -c 000000' \ + after-resume 'sway_lid_handler.sh' + +for_window [app_id="blueman-manager"] floating enable +for_window [app_id="Alacritty"] max_render_time 1 +for_window [class="^.*"] inhibit_idle fullscreen +for_window [app_id="^.*"] inhibit_idle fullscreen + +include /etc/sway/config.d/* diff --git a/roles/sway/files/sway_lid_handler.sh b/roles/sway/files/sway_lid_handler.sh new file mode 100755 index 0000000..7b6f247 --- /dev/null +++ b/roles/sway/files/sway_lid_handler.sh @@ -0,0 +1,11 @@ +#!/bin/bash +#sleep 1 +state=$(awk 'NF>1{print $NF}' /proc/acpi/button/lid/LID/state) +n=$(swaymsg -t get_outputs -p | grep -c "Output") + +if [[ $state = "closed" && $n -gt "1" ]] +then + swaymsg output eDP-1 disable +else + swaymsg output eDP-1 enable +fi diff --git a/roles/sway/files/waybar.config b/roles/sway/files/waybar.config new file mode 100644 index 0000000..1852f0f --- /dev/null +++ b/roles/sway/files/waybar.config @@ -0,0 +1,147 @@ +{ + // "layer": "top", // Waybar at top layer + // "position": "bottom", // Waybar position (top|bottom|left|right) + "height": 30, // Waybar height (to be removed for auto height) + // "width": 1280, // Waybar width + // Choose the order of the modules + "modules-left": ["sway/workspaces", "sway/mode"], + "modules-center": [], + "modules-right": ["custom/media", "idle_inhibitor", "pulseaudio", "battery", "tray", "clock"], + // Modules configuration + // "sway/workspaces": { + // "disable-scroll": true, + // "all-outputs": true, + // "format": "{name}: {icon}", + // "format-icons": { + // "1": "", + // "2": "", + // "3": "", + // "4": "", + // "5": "", + // "urgent": "", + // "focused": "", + // "default": "" + // } + // }, + "sway/mode": { + "format": "{}" + }, + "mpd": { + "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ ", + "format-disconnected": "Disconnected ", + "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ", + "unknown-tag": "N/A", + "interval": 2, + "consume-icons": { + "on": " " + }, + "random-icons": { + "off": " ", + "on": " " + }, + "repeat-icons": { + "on": " " + }, + "single-icons": { + "on": "1 " + }, + "state-icons": { + "paused": "", + "playing": "" + }, + "tooltip-format": "MPD (connected)", + "tooltip-format-disconnected": "MPD (disconnected)" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "tray": { + // "icon-size": 21, + "spacing": 10 + }, + "clock": { + // "timezone": "America/New_York", + "format": "{:%H:%M}", + "tooltip-format": "{:%Y %B }\n{calendar}", + //"format-alt": "{:%A %Y-%m-%d}" + "format-alt": "{:%a, %b %d %H:%M}", + }, + "cpu": { + "format": "{usage}% ", + "tooltip": false + }, + "memory": { + "format": "{}% " + }, + "temperature": { + // "thermal-zone": 2, + "hwmon-path-abs": "/sys/bus/pci/devices/0000:00:18.3/hwmon", + "input-filename": "temp2_input", + "critical-threshold": 80, + // "format-critical": "{temperatureC}°C {icon}", + "format": "{temperatureC}°C {icon}", + "format-icons": ["", "", ""] + }, + "backlight": { + // "device": "acpi_video1", + "format": "{percent}% {icon}", + "format-icons": ["", ""] + }, + "battery": { + "states": { + // "good": 95, + //"warning": 30, + //"critical": 15 + }, + "format": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""] + }, + "battery#bat2": { + "bat": "BAT2" + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "format-linked": "(No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol" + }, + "custom/media": { + "interval": 5, + "format": "{icon} {}", + "format-icons": { + "default": "" + }, + "exec": "playerctl -p spotify metadata --format '{{artist}} - {{title}}' | sed 's/&/&/g'", + "exec-if": "[ `playerctl -p spotify status` = 'Playing' ]" + } +} diff --git a/roles/sway/files/waybar.style.css b/roles/sway/files/waybar.style.css new file mode 100644 index 0000000..8c0d0c6 --- /dev/null +++ b/roles/sway/files/waybar.style.css @@ -0,0 +1,204 @@ +* { + border: none; + border-radius: 0; + /* `otf-font-awesome` is required to be installed for icons */ + font-family: Segoe UI, Roboto, Helvetica, Arial, sans-serif; + font-size: 10pt; + min-height: 0; +} + +window#waybar { + background-color: rgba(43, 48, 59, 0.5); + border-bottom: 3px solid rgba(100, 114, 125, 0.5); + color: #ffffff; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +/* +window#waybar.empty { + background-color: transparent; +} +window#waybar.solo { + background-color: #FFFFFF; +} +*/ + +window#waybar.termite { + background-color: #3F3F3F; +} + +window#waybar.chromium { + background-color: #000000; + border: none; +} + +#workspaces button { + padding: 0 6px; + background-color: transparent; + color: #ffffff; + border-bottom: 3px solid transparent; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +#workspaces button:hover { + background: rgba(0, 0, 0, 0.2); + box-shadow: inherit; + border-bottom: 3px solid #ffffff; +} + +#workspaces button.focused { + background-color: #64727D; + border-bottom: 3px solid #ffffff; +} + +#workspaces button.urgent { + background-color: #eb4d4b; +} + +#mode { + background-color: #64727D; + border-bottom: 3px solid #ffffff; +} + +#clock, +#battery, +#cpu, +#memory, +#temperature, +#backlight, +#network, +#pulseaudio, +#custom-media, +#tray, +#mode, +#idle_inhibitor, +#mpd { + padding: 0 10px; + margin: 0 4px; + color: #ffffff; +} + +/* +#clock { + background-color: #64727D; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging { + color: #ffffff; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +#battery.critical:not(.charging) { + background-color: #f53c3c; + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +label:focus { + background-color: #000000; +} + +#cpu { + background-color: #2ecc71; + color: #000000; +} + +#memory { + background-color: #9b59b6; +} + +#backlight { + background-color: #90b1b1; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} + +#pulseaudio { + background-color: #f1c40f; + color: #000000; +} + +#pulseaudio.muted { + background-color: #90b1b1; + color: #2a5c45; +} + +#custom-media { + background-color: #66cc99; + color: #2a5c45; + min-width: 100px; +} + +#custom-media.custom-spotify { + background-color: #66cc99; +} + +#custom-media.custom-vlc { + background-color: #ffa000; +} + +#temperature { + background-color: #f0932b; +} + +#temperature.critical { + background-color: #eb4d4b; +} + +#tray { + background-color: #2980b9; +} + +#idle_inhibitor { + background-color: #2d3436; +} + +#idle_inhibitor.activated { + background-color: #ecf0f1; + color: #2d3436; +} + +#mpd { + background-color: #66cc99; + color: #2a5c45; +} + +#mpd.disconnected { + background-color: #f53c3c; +} + +#mpd.stopped { + background-color: #90b1b1; +} + +#mpd.paused { + background-color: #51a37a; +} +*/ diff --git a/roles/sway/tasks/main.yml b/roles/sway/tasks/main.yml new file mode 100644 index 0000000..2630dd6 --- /dev/null +++ b/roles/sway/tasks/main.yml @@ -0,0 +1,64 @@ +--- +- name: Install Sway and friends + become: true + dnf: + name: + - sway # Window manager / Wayland compositor + - swayidle # Idle daemon + - swaylock # Lock screen + - swaybg # Wallpaper setting tool + - sway-systemd # SystemD integration glue + - waybar # Top bar + - bemenu # Application launcher, scriptable menu + - j4-dmenu-desktop # App launcher generator for bemenu + - kanshi # Dynamic monitor configuration daemon + - mako # Notification daemon + - alacritty # Terminal emulator + - xdg-desktop-portal # Screen sharing / file picking service + - xdg-desktop-portal-wlr # For screen sharing in wlroots based compositors + - xdg-desktop-portal-gtk # For file pickers in Flatpak apps + - wdisplays # Graphical monitor configuration tool + - grimshot # Screenshot tool + - dex # Autostart manager + - wob # Overlay bar, for volume and brightness + - network-manager-applet # Network manager applet + - blueman # Bluetooth manager + - playerctl # Media hotkeys, pause on suspend handling + - brightnessctl # Internal display brightness control + - pavucontrol # Audio control panel + - light # Brightness status for wob + state: latest + +- name: Ensure sway config directory exists + file: + path: "{{ home_dir }}/.config/sway" + state: directory + +- name: Install default sway config from template + copy: + src: "files/sway.config" + dest: "{{ home_dir }}/.config/sway/config" + mode: '0644' + +- name: Ensure waybar config directory exists + file: + path: "{{ home_dir }}/.config/waybar" + state: directory + +- name: Install waybar config from template + copy: + src: "files/waybar.config" + dest: "{{ home_dir }}/.config/waybar/config" + mode: '0644' + +- name: Install waybar style from template + copy: + src: "files/waybar.style.css" + dest: "{{ home_dir }}/.config/waybar/style.css" + mode: '0644' + +- name: Install lid handler script + copy: + src: "files/sway_lid_handler.sh" + dest: "{{ home_dir }}/.local/bin/sway_lid_handler.sh" + mode: '0755'