diff --git a/sway/config b/sway/config new file mode 100644 index 0000000..8577fb0 --- /dev/null +++ b/sway/config @@ -0,0 +1,253 @@ +# +# Variables: +# +# Logo key. Use Mod1 for Alt. +set $mod Mod1 +# Home row direction keys, like vim +set $left h +set $down j +set $up k +set $right l + +# lock screen +bindsym Mod4+l exec swaylock -l -f -e -F -i "/usr/share/backgrounds/sway/universe.jpg" -s stretch + +# nyxt browser +bindsym $mod+Shift+b exec nyxt + +# 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 wofi --show drun -I + +# Wob configuration +set $WOBSOCK $XDG_RUNTIME_DIR/wob.sock +exec rm -f $WOBSOCK && mkfifo $WOBSOCK && tail -f $WOBSOCK | wob +exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK + +gaps inner 2 +gaps outer 2 + +# +# Colors +# +client.background # 434c5e n/a +client.focused #434c5e #434c5e #eceff4 #434c5e #434c5e +client.focused_inactive #3b4252 #3b4252 #eceff4 #3b4252 #3b4252 +client.unfocused #3b4252 #3b4252 #eceff4 #3b4252 #3b4252 +client.urgent #434c5e #434c5e #eceff4 #434c5e #434c5e + +### Output configuration +# +# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) +output * bg /usr/share/backgrounds/sway/universe.jpg stretch + +### Idle configuration +# +# Example configuration: +# +# exec swayidle -w \ +# timeout 600 '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 +input * { + xkb_layout it +} + +input "type:mouse" { + accel_profile adaptive + pointer_accel 1.0 +} + +input "type:touchpad" { + tap enabled + tap_button_map lrm +} + +# +# Key bindings: +# +# Start a terminal +bindsym $mod+Return exec $term + +# Kill focused window +bindsym $mod+Shift+q kill + +# Start your launcher +bindsym $mod+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 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 + +# 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. +# +# 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 F11 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+d focus mode_toggle + +# Move focus to the parent container +bindsym $mod+a focus parent + +# bindsym XF86MonBrightnessDown exec brightnessctl set 5%- +# bindsym XF86MonBrightnessUp exec brightnessctl set 5%+ +bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%- | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $WOBSOCK +bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+ | sed -En 's/.*\(([0-9]+)%\).*/\1/p' > $WOBSOCK + +# bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% +# bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% +bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% && pactl get-sink-volume @DEFAULT_SINK@ | head -n 1 | awk '{print substr($5, 1, length($5)-1)}' > $WOBSOCK +bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% && pactl get-sink-volume @DEFAULT_SINK@ | head -n 1 | awk '{print substr($5, 1, length($5)-1)}' > $WOBSOCK +bindsym --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle +bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle + +# +# 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" + +mode "screenshot" { + bindsym Mod4+p exec grimshot copy active + bindsym $mod+s+a exec grimshot save area + bindsym $mod+c+a exec grimshot copy area + # bindsym Mod4+Mod1+p exec grimshot save output + bindsym $mod+s+w exec grimshot save window + bindsym $mod+c+w exec grimshot copy window + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} + +bindsym Print mode "screenshot" + + +# +# Status Bar: +# +bar { + swaybar_command waybar +} + +include /etc/sway/config.d/* +include ./config.d/* diff --git a/waybar/config.jsonc b/waybar/config.jsonc new file mode 100644 index 0000000..799b277 --- /dev/null +++ b/waybar/config.jsonc @@ -0,0 +1,132 @@ +{ + "layer": "bottom", + "position": "bottom", + "margin": "5 5 5 5", + "modules-left": ["sway/workspaces", "sway/mode", "custom/pacman"], + "modules-center": ["clock", "idle_inhibitor"], + "modules-right": [ + "pulseaudio", + "backlight", + "battery", + "bluetooth", + "network" + ], + + "sway/workspaces": { + "disable-scroll": true, + "format": "{name}" + }, + + "custom/pacman": { + "format": "{} ", + "interval": 3600, + "exec": "checkupdates | wc -l", + "exec-if": "[[ $(checkupdates | wc -l) != 0 ]]", + "signal": 8, + "tooltip": false + }, + + "sway/mode": { + "format": "{}" + }, + + "clock": { + "timezone": "Europe/Rome", + "format": "{:%H:%M}", + "format-alt": "{:%Y-%m-%d}", + "tooltip-format": "{calendar}", + "calendar": { + "mode": "year", + "mode-mon-col": 3, + "weeks-pos": "right", + "on-scroll": 1, + "on-click-right": "mode", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + }, + "actions": { + "on-click-right": "mode", + "on-click-forward": "tz_up", + "on-click-backward": "tz_down", + "on-scroll-up": "shift_up", + "on-scroll-down": "shift_down" + } + }, + + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + + "pulseaudio": { + "reverse-scrolling": 1, + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{icon} {volume}% {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", + "min-length": 13 + }, + + "backlight": { + "device": "intel_backlight", + "format": "{percent}% {icon}", + "format-icons": ["", "", "", "", "", "", ""], + "min-length": 7 + }, + + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + "format-icons": ["", "", "", "", "", "", "", "", "", ""], + "on-update": "$HOME/.config/waybar/scripts/check_battery.sh" + }, + + "bluetooth": { + "format": " {status}", + "format-connected": " {device_alias}", + "format-connected-battery": " {device_alias} {device_battery_percentage}%", + "tooltip-format": "{controller_alias}\t{controller_address}\n\n{num_connections} connected", + "tooltip-format-connected": "{controller_alias}\t{controller_address}\n\n{num_connections} connected\n\n{device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", + "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}%", + "on-click": "blueman-manager" + }, + + "network": { + "format": "{ifname}", + "format-wifi": "{essid} ", + "format-ethernet": "{ipaddr}/{cidr} 󰊗", + "tooltip-format": "{ifname} via {gwaddr} 󰊗", + "tooltip-format-wifi": "{essid} ", + "tooltip-format-ethernet": "{ifname} ", + "tooltip-format-disconnected": "Disconnected", + "max-length": 50, + "on-click": "alacritty -e 'nmtui'" + } +} diff --git a/waybar/scripts/check_battery.sh b/waybar/scripts/check_battery.sh new file mode 100755 index 0000000..6222418 --- /dev/null +++ b/waybar/scripts/check_battery.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +bat=/sys/class/power_supply/BAT1 +CRIT=${1:-15} + +FILE=~/.config/waybar/scripts/notified + +stat=$(cat $bat/status) +perc=$(cat $bat/capacity) + +if [[ $perc -le $CRIT ]] && [[ $stat == "Discharging" ]]; then + if [[ ! -f "$FILE" ]]; then + notify-send --urgency=critical --icon=dialog-warning "Battery Low" "Current charge: $perc%" + touch $FILE + fi +elif [[ -f "$FILE" ]]; then + rm $FILE +fi \ No newline at end of file diff --git a/waybar/style.css b/waybar/style.css new file mode 100644 index 0000000..32e137b --- /dev/null +++ b/waybar/style.css @@ -0,0 +1,161 @@ +* { + border: none; + border-radius: 0; + /* `otf-font-awesome` is required to be installed for icons */ + font-family: Liberation Mono; + min-height: 20px; +} + +window#waybar { + background: transparent; +} + +window#waybar.hidden { + opacity: 0.2; +} + +#workspaces { + border-radius: 10px; + transition: none; + background: #383c4a; + margin-right: 8px; +} + +#workspaces button { + transition: none; + color: #7c818c; + background: transparent; + padding: 5px; + font-size: 18px; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +#workspaces button:hover { + transition: none; + box-shadow: inherit; + text-shadow: inherit; + border-radius: inherit; + color: #383c4a; + background: #7c818c; +} + +#workspaces button.focused { + color: white; +} + +#custom-pacman, +#mode, +#clock, +#idle_inhibitor, +#battery, +#pulseaudio, +#bluetooth, +#network, +#backlight { + padding-left: 8px; + padding-right: 8px; + border-radius: 10px; + background: #383c4a; +} + +#custom-pacman { + transition: none; + color: #ffffff; +} + +#bluetooth { + margin-right: 8px; +} + +#bluetooth.connected, #bluetooth.on { + background-color: #26a65b; +} + +#bluetooth.disabled, #bluetooth.off { + background-color: #f53c3c; +} + +#mode { + transition: none; + color: #ffffff; +} + +#clock { + transition: none; + color: #ffffff; + margin-right: 8px; +} + +#idle_inhibitor { + transition: none; + color: #ffffff; +} + +#idle_inhibitor.activated { + background-color: #26a65b; +} + +#pulseaudio { + margin-right: 8px; + transition: none; + color: #ffffff; +} + +#pulseaudio.muted, +#pulseaudio.source-muted { + background-color: #90b1b1; + color: #2a5c45; +} + +#backlight { + margin-right: 8px; + transition: none; + color: #ffffff; +} + +#battery { + margin-right: 8px; + transition: none; + color: #ffffff; +} + +#battery.charging { + color: #ffffff; + background-color: #26a65b; +} + +#battery.warning:not(.charging) { + background-color: #ffbe61; + color: black; +} + +#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; +} + +#network { + transition: none; + color: #ffffff; + background: #383c4a; +} + +#network.wifi, #network.ethener { + background-color: #26a65b; +} + +#network.disabled, #network.disconnected { + background-color: #f53c3c; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +}