Switch to wayland
Added a simple wayland configuration. Currently set up simple wayland configuration based on river window manager and waybar. Rivercarro is the layout manager, being the same in principle as rivertile, the default layout manager for river, only it comes with smart gaps (gaps turn off if there is only one window open) and monocle mode (give one window all space). Runs `keyd` in the background to replace the old `xcape` capslock switching (capslock is escape and if held control). Uses `swaybg` to set a wallpaper. Added powermenu and lockscreen scripts. Improved lockscreen script to detect and work for wayland. Moved old rofi mode 'powermenu' to more general powermenu script, which works with any rofi-like selector (dmenu, bemenu, wofi, etc.) Loses some of its design quality but since it was wonky anyway, and I rarely see the menu, we could repurpose its functionality for a more general powermenu concept. Currently hardcoded for `bemenu` but can be easily swapped and possibly even extended back to rofi. Fixed file upload link sharing to clipboard. Updated rofi-pass to pass-pick. Made rofi-pass universal and less integrated to rofi - that's also the reason for the name change. `pass-pick` works with rofi (default), bemenu or dmenu. In theory it should also work with any other picker that contains a stdin listing function similar to dmenu. It has been definitely tested both on rofi and bemenu. The best user experience still reigns on rofi, where available keys are displayed on the picker and the keys themselves make the most sense. But all functions can be reached from bemenu as well, though the key mappings are more arbitrary and can not be changed as in rofi. The autofilling tool works with both xdotool and ydotool, so should work both on X11 and on Wayland. Ydotool ideally requires its daemon to be running, otherwise some of the typing may get gut off. Otherwise no change should be necessary. Updated qutebrowser open_download for bemenu. Updated download opening script to work with both rofi and bemenu. Prefers original rofi implementation but works with both, and can be set to use a custom dmenu-like file picker as well. Add brightnessctl and removed custom audio / brightness scripts since they became unnecessary. Updated bootstrap script to include system files: With `keyd` taking its configuration from the `/etc` directory and not home, a second stow stage was necessary. These stow files are in a module called `system-packages` inside the top-level `bootstrap` stow package. They will not be installed by the default dotfile stow invocation but have been integrated as an extra step into the install script. Installing this module requires sudo privileges! Switched vifm überzug to sixel graphics rendering. überzug relies on X11 functionality to work, while sixel does not. Unfortunately, alacritty does not work with sixel graphics yet, only foot does (somewhat). Waybar currently runs the gruvbox dark soft color scheme. Added the old polybar archupdates script to waybar and extended it to output json format with additional metadata that waybar can read. Can still output the old plaintext format that polybar expects. Added a wireguard connection to waybar,shows if currently connected to either a wireguard or tun VPN service. If so, shows an icon in the waybar - that can be hovered over to show the full assigned IP address. Added an upcoming event display to waybar, a simple event indicator to show upcoming events on the calendar, on hovering over it the tooltip lists all upcoming events. Added `screenshot` script to take simple screenshots and rectangle region shots of the current output. Can be invoked through the river shortcut PrintScr: `PrintScr` - Fullscreen screenshot `Mod+PrintScr` - Region screenshot `Shift+PrintScr` - Fullscreen screenshot and file upload `Mod+Shift+PrintScr` - Region screenshot and file upload Extended `sharefile` to take paths through stdin and make use of `fd` if it is found on the system.
This commit is contained in:
parent
89d1402b3e
commit
6ac552d3d5
61 changed files with 1811 additions and 2032 deletions
242
wayland/.config/river/init
Executable file
242
wayland/.config/river/init
Executable file
|
|
@ -0,0 +1,242 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
mod="Mod4"
|
||||
modemod="Mod1"
|
||||
term=${TERMINAL:-foot}
|
||||
|
||||
## OPTIONS
|
||||
riverctl spawn "dbus-update-activation-environment SEATD_SOCK DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=river"
|
||||
riverctl focus-follows-cursor normal
|
||||
riverctl attach-mode bottom
|
||||
|
||||
# Set background and border color
|
||||
riverctl background-color 0x000000
|
||||
riverctl border-width 1
|
||||
riverctl border-color-focused 0xffffff
|
||||
riverctl border-color-unfocused 0x586e75
|
||||
# Set repeat rate
|
||||
riverctl set-repeat 75 300
|
||||
# Make certain views start floating
|
||||
riverctl float-filter-add app-id float
|
||||
# riverctl float-filter-add title "popup title with spaces"
|
||||
# # Set app-ids and titles of views which should use client side decorations
|
||||
# riverctl csd-filter-add app-id "gedit"
|
||||
riverctl csd-filter-add app-id "zathura"
|
||||
|
||||
## DEBUG
|
||||
# Reload river configuration
|
||||
riverctl map normal $mod+Shift F12 spawn "$HOME/.config/river/init"
|
||||
|
||||
## HOTKEYS
|
||||
# close focused view
|
||||
riverctl map normal $mod+Shift C close
|
||||
|
||||
# Open terminal
|
||||
riverctl map normal $mod Return spawn "$term"
|
||||
|
||||
# Open run menu
|
||||
riverctl map normal $mod Space spawn "bemenu-run"
|
||||
|
||||
# Toggle status bar
|
||||
riverctl map normal $mod F7 spawn "killall -SIGUSR1 waybar"
|
||||
|
||||
# Switch to lockscreen
|
||||
riverctl map normal $mod X spawn "lockscreen"
|
||||
|
||||
# Open logout script
|
||||
riverctl map normal $mod backspace spawn "powermenu"
|
||||
|
||||
# Open Bookmark search
|
||||
riverctl map normal None XF86Search spawn "qutedmenu"
|
||||
|
||||
# Open clipboard history
|
||||
riverctl map normal $mod+Shift Space spawn "clipman pick --tool=bemenu"
|
||||
|
||||
# Open floting calculator
|
||||
riverctl map normal $mod+Shift R spawn "$term --class float -e qalc"
|
||||
|
||||
# Desktop theming
|
||||
# shellcheck disable=SC2016
|
||||
riverctl map normal $mod F8 spawn 'styler set $(styler list themes | bemenu)'
|
||||
|
||||
# Password dropdown frontend
|
||||
riverctl map normal $mod+Shift P spawn "pass-pick"
|
||||
|
||||
# File upload
|
||||
riverctl map normal $mod+Shift U spawn "$term --class float -e sharefile | xargs notify-send"
|
||||
|
||||
# # Screenshot
|
||||
riverctl map normal None Print spawn "screenshot"
|
||||
riverctl map normal Shift Print spawn "screenshot | sharefile -"
|
||||
riverctl map normal $mod Print spawn "screenshot region"
|
||||
riverctl map normal $mod+Shift Print spawn "screenshot region | sharefile -"
|
||||
|
||||
# # Clear clipboard
|
||||
# riverctl map normal $mod BackSpace spawn 'wl-copy -c && printf ''|xclip -selection c'
|
||||
|
||||
# # PixelColor script
|
||||
# riverctl map normal "Mod1" C spawn 'bash ~/.config/bin/pixelcolor'
|
||||
|
||||
# MOVEMENT
|
||||
# focus the next/previous view in the layout stack
|
||||
riverctl map normal $mod J focus-view next
|
||||
riverctl map normal $mod K focus-view previous
|
||||
|
||||
# swap the focused view with the next/previous view in the layout stack
|
||||
riverctl map normal $mod+Shift J swap next
|
||||
riverctl map normal $mod+Shift K swap previous
|
||||
|
||||
# bump the focused view to the top of the layout stack
|
||||
riverctl map normal $mod+Shift Return zoom
|
||||
|
||||
# decrease/increase the main ratio of layout
|
||||
riverctl map normal $mod+Shift H send-layout-cmd rivercarro "main-ratio -0.05"
|
||||
riverctl map normal $mod+Shift L send-layout-cmd rivercarro "main-ratio +0.05"
|
||||
|
||||
# increment/decrement the main count of layout
|
||||
riverctl map normal $mod+Control H send-layout-cmd rivercarro "main-count +1"
|
||||
riverctl map normal $mod+Control L send-layout-cmd rivercarro "main-count -1"
|
||||
|
||||
# change layout orientation
|
||||
riverctl map normal $mod Up send-layout-cmd rivercarro "main-location top"
|
||||
riverctl map normal $mod Right send-layout-cmd rivercarro "main-location right"
|
||||
riverctl map normal $mod Down send-layout-cmd rivercarro "main-location bottom"
|
||||
riverctl map normal $mod Left send-layout-cmd rivercarro "main-location left"
|
||||
|
||||
# Mod+F to toggle fullscreen
|
||||
riverctl map normal $mod F toggle-fullscreen
|
||||
|
||||
# toggle float
|
||||
riverctl map normal $mod+Shift v toggle-float
|
||||
# Mod + Left Mouse Button to move views
|
||||
riverctl map-pointer normal $mod BTN_LEFT move-view
|
||||
# Mod + Right Mouse Button to resize views
|
||||
riverctl map-pointer normal $mod BTN_RIGHT resize-view
|
||||
|
||||
### Begin resize and moving mode, for floating windows
|
||||
riverctl declare-mode interact_float
|
||||
riverctl map normal $modemod R enter-mode interact_float
|
||||
riverctl map interact_float $modemod R enter-mode normal
|
||||
|
||||
# resize views on screen
|
||||
riverctl map interact_float $mod H resize horizontal -100
|
||||
riverctl map interact_float $mod J resize vertical 100
|
||||
riverctl map interact_float $mod K resize vertical -100
|
||||
riverctl map interact_float $mod L resize horizontal 100
|
||||
|
||||
# move views around screen
|
||||
riverctl map interact_float None H move left 100
|
||||
riverctl map interact_float None J move down 100
|
||||
riverctl map interact_float None K move up 100
|
||||
riverctl map interact_float None L move right 100
|
||||
|
||||
# snap views to screen edges
|
||||
riverctl map interact_float $mod+Shift H snap left
|
||||
riverctl map interact_float $mod+Shift J snap down
|
||||
riverctl map interact_float $mod+Shift K snap up
|
||||
riverctl map interact_float $mod+Shift L snap right
|
||||
### End resize and moving mode
|
||||
|
||||
# focus the next/previous output
|
||||
riverctl map normal $mod Period focus-output next
|
||||
riverctl map normal $mod Comma focus-output previous
|
||||
|
||||
# send the focused view to the next/previous output
|
||||
riverctl map normal $mod+Shift Period send-to-output next
|
||||
riverctl map normal $mod+Shift Comma send-to-output previous
|
||||
|
||||
# set up 10 tags (with '0' opening the 10th one)
|
||||
for i in $(seq 0 9); do
|
||||
tags=$((1 << (i - 1)))
|
||||
if [ "$i" -eq 0 ]; then tags=$((1 << 9)); fi
|
||||
|
||||
# Mod+[1-9] to focus tag [0-8]
|
||||
riverctl map normal $mod "$i" set-focused-tags $tags
|
||||
|
||||
# Mod+Shift+[1-9] to tag focused view with tag [0-8]
|
||||
riverctl map normal $mod+Shift "$i" set-view-tags $tags
|
||||
|
||||
# Mod+Ctrl+[1-9] to toggle focus of tag [0-8]
|
||||
riverctl map normal $mod+Control "$i" toggle-focused-tags $tags
|
||||
|
||||
# Mod+Shift+Ctrl+[1-9] to toggle tag [0-8] of focused view
|
||||
riverctl map normal $mod+Shift+Control "$i" toggle-view-tags $tags
|
||||
done
|
||||
|
||||
# focus all tags
|
||||
all_tags=$(((1 << 32) - 1))
|
||||
riverctl map normal $mod equal set-focused-tags $all_tags
|
||||
# tag focused view with all tags
|
||||
riverctl map normal $mod+Shift equal set-view-tags $all_tags
|
||||
|
||||
# Various media key mapping examples for both normal and locked mode which do
|
||||
# not have a modifier
|
||||
for mode in normal locked; do
|
||||
# Eject the optical drive
|
||||
riverctl map $mode None XF86Eject spawn 'eject -T'
|
||||
|
||||
riverctl map $mode None XF86AudioRaiseVolume spawn 'pactl set-sink-volume @DEFAULT_SINK@ +5%'
|
||||
riverctl map $mode None XF86AudioLowerVolume spawn 'pactl set-sink-volume @DEFAULT_SINK@ -5%'
|
||||
riverctl map $mode None XF86AudioMute spawn 'pactl set-sink-mute @DEFAULT_SINK@ toggle'
|
||||
|
||||
# Control MPRIS aware media players with playerctl (https://github.com/altdesktop/playerctl)
|
||||
riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
|
||||
riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause'
|
||||
riverctl map $mode None XF86AudioPrev spawn 'playerctl previous'
|
||||
riverctl map $mode None XF86AudioNext spawn 'playerctl next'
|
||||
|
||||
# You can control screen backlight brighness with light (https://github.com/haikarainen/light); but we prefer brightnessctl
|
||||
riverctl map $mode None XF86MonBrightnessUp spawn 'brightnessctl set 10%+'
|
||||
riverctl map $mode None XF86MonBrightnessDown spawn 'brightnessctl set 10%-'
|
||||
done
|
||||
|
||||
# The scratchpad will live on an unused tag. Which tags are used depends on your
|
||||
# config, but rivers default uses the first 9 tags.
|
||||
scratch_tag=$((1 << 20))
|
||||
# Toggle the scratchpad with Super+P
|
||||
riverctl map normal $mod grave toggle-focused-tags ${scratch_tag}
|
||||
# Send windows to the scratchpad with Super+Shift+P
|
||||
riverctl map normal $mod+Shift grave set-view-tags ${scratch_tag}
|
||||
# Set spawn tagmask to ensure new windows don't have the scratchpad tag unless
|
||||
# explicitly set.
|
||||
all_but_scratch_tag=$((((1 << 32) - 1) ^ scratch_tag))
|
||||
riverctl spawn-tagmask ${all_but_scratch_tag}
|
||||
|
||||
# set up scratch pad for todo and 'drop-down' terminal
|
||||
# call scratchpads to current workspace -- scratchpads started on i3 starting (see end of file)
|
||||
# bindsym $mod+t [class="scratchpad" title="dropdown-todo"] scratchpad show
|
||||
# bindsym $mod+Shift+Return [class="scratchpad" title="dropdown-terminal"] scratchpad show
|
||||
|
||||
## INPUT
|
||||
# device (touchscreen)
|
||||
# enable touch clicking for touchpads
|
||||
for pad in $(riverctl list-inputs | grep -i touchpad); do
|
||||
riverctl input "$pad" events enabled
|
||||
riverctl input "$pad" tap enabled
|
||||
done
|
||||
for pad in $(riverctl list-inputs | grep -i touchscreen); do
|
||||
riverctl input "$pad" events enabled
|
||||
riverctl input "$pad" tap enabled
|
||||
riverctl input "$pad" drag enabled
|
||||
riverctl input "$pad" pointer-accel 0.5
|
||||
done
|
||||
|
||||
setxkbmap -option "compose:menu"
|
||||
exec swaybg -i ~/pictures/wall.jpg -o '*' -m fill &
|
||||
# killall mako
|
||||
# mako &
|
||||
killall waybar
|
||||
exec waybar &
|
||||
|
||||
killall clipman
|
||||
exec wl-paste -t text --watch clipman store &
|
||||
# bash ~/.config/bin/gtktheme # setting our gtk variables
|
||||
# killall polkit-gnome-authentication-agent-1
|
||||
# /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &
|
||||
# Set and exec into the default layout generator, rivercarro.
|
||||
# River will send the process group of the init executable SIGTERM on exit.
|
||||
riverctl default-layout rivercarro &
|
||||
# start layouting engine
|
||||
killall rivercarro
|
||||
exec rivercarro -main-ratio 0.65 -view-padding 6 -outer-padding 6 &
|
||||
# brightnessctl set 100%
|
||||
3
wayland/.config/sh/env.d/compose-key.sh
Normal file
3
wayland/.config/sh/env.d/compose-key.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
export XKB_DEFAULT_OPTIONS='compose:menu'
|
||||
170
wayland/.config/waybar/config
Normal file
170
wayland/.config/waybar/config
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
{
|
||||
"layer": "top",
|
||||
"modules-left": ["river/tags"],
|
||||
"modules-center": ["clock", ],
|
||||
"modules-right": ["custom/events", "custom/media", "custom/wireguard", "custom/archupdates", "pulseaudio", "backlight", "network", "cpu", "memory", "temperature", "battery", "tray"],
|
||||
"custom/archupdates": {
|
||||
"format": "{} {icon}",
|
||||
"format-alt-click": "right",
|
||||
"format-icons": {
|
||||
"default": ""
|
||||
},
|
||||
"return-type": "json",
|
||||
"exec": "~/.config/waybar/modules/archupdates 5 json",
|
||||
"interval": 3600,
|
||||
"on-click": "alacritty --class float -e topgrade"
|
||||
},
|
||||
"backlight": {
|
||||
"device": "intel_backlight",
|
||||
"format": "{percent}% {icon}",
|
||||
"format-icons": ["滋", "", "", ""],
|
||||
"on-scroll-up": "brightnessctl set 1%+",
|
||||
"on-scroll-down": "brightnessctl set 1%-"
|
||||
},
|
||||
"battery": {
|
||||
"format": "{capacity}% {icon}",
|
||||
"format-alt":"{capacity}% ({time}) {icon}",
|
||||
"format-alt-click": "click-right",
|
||||
"format-icons": ["", "", "", "", ""],
|
||||
"interval": 60,
|
||||
"states": {
|
||||
"warning": 30,
|
||||
"critical": 15
|
||||
},
|
||||
},
|
||||
"clock": {
|
||||
"format-alt": "{:%a, %d. %b %H:%M}",
|
||||
"format-alt-click": "click-right",
|
||||
"on-click": "gsimplecal"
|
||||
},
|
||||
"cpu": {
|
||||
"interval": 10,
|
||||
"format": "{usage}% ",
|
||||
"max-length": 10,
|
||||
"states": {
|
||||
"warning": 50,
|
||||
"critical": 80
|
||||
},
|
||||
"on-click": "alacritty --class float -e top",
|
||||
"on-click-right": "alacritty --class float -e glances"
|
||||
},
|
||||
"custom/events": {
|
||||
"format": "{}",
|
||||
"interval": 300,
|
||||
"format-icons": {
|
||||
"default": ""
|
||||
},
|
||||
"exec": "~/.config/waybar/modules/khal.py 2>/dev/null",
|
||||
"exec-if": "command -v khal >/dev/null 2>&1",
|
||||
"return-type": "json"
|
||||
},
|
||||
"memory": {
|
||||
"interval": 30,
|
||||
"format": "{avail:0.1f}G ",
|
||||
"format-alt": "{used:0.1f}G/{total:0.1f}G ",
|
||||
"format-alt-click": "click-right",
|
||||
"max-length": 10
|
||||
},
|
||||
"mpd": {
|
||||
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}",
|
||||
"format-disconnected": "ﱙ",
|
||||
"format-stopped": "",
|
||||
"interval": 10,
|
||||
"consume-icons": {
|
||||
"on": " " // Icon shows only when "consume" is on
|
||||
},
|
||||
"random-icons": {
|
||||
"on": " "
|
||||
},
|
||||
"repeat-icons": {
|
||||
"on": " "
|
||||
},
|
||||
"single-icons": {
|
||||
"on": "1 "
|
||||
},
|
||||
"state-icons": {
|
||||
"paused": "",
|
||||
"playing": "",
|
||||
},
|
||||
"tooltip-format": "{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ",
|
||||
"tooltip-format-disconnected": "MPD (disconnected)"
|
||||
},
|
||||
"custom/media": {
|
||||
"format": "{icon}{}",
|
||||
"format-alt-click": "right",
|
||||
"return-type": "json",
|
||||
"format-icons": {
|
||||
"Playing": " ",
|
||||
"Paused": " ",
|
||||
},
|
||||
"escape": true,
|
||||
"max-length":70,
|
||||
"exec": "playerctl -a metadata --format '{\"text\": \"\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
||||
"exec-if": "command -v playerctl >/dev/null 2>&1",
|
||||
"on-click": "playerctl play-pause",
|
||||
"on-click-right": "playerctl stop",
|
||||
},
|
||||
"network": {
|
||||
"interface": "wlp58s0",
|
||||
"format": "{ifname}",
|
||||
"format-wifi": "{signalStrength}% ",
|
||||
"format-ethernet": "{ipaddr}/{cidr} ",
|
||||
"format-disconnected": "睊",
|
||||
"tooltip-format": "{ifname} via {gwaddr} ",
|
||||
"tooltip-format-wifi": "{essid}: {bandwidthDownBits}-{bandwidthUpBits} ({signalStrength}%) {ifname}",
|
||||
"tooltip-format-ethernet": "{ifname} ",
|
||||
"tooltip-format-disconnected": "Disconnected",
|
||||
"max-length": 50,
|
||||
"on-click": "alacritty --class float -e nmtui",
|
||||
// "on-click-right": "sudo rfkill toggle wlan"
|
||||
},
|
||||
"pulseaudio": {
|
||||
"format": "{volume}% {icon}",
|
||||
"format-bluetooth": "{volume}% {icon}",
|
||||
"format-muted": "",
|
||||
"format-icons": {
|
||||
"headphone": "",
|
||||
"hands-free": "",
|
||||
"headset": "",
|
||||
"phone": "",
|
||||
"portable": "",
|
||||
"car": "",
|
||||
"default": ["", ""]
|
||||
},
|
||||
"scroll-step": 1,
|
||||
"on-click": "alacritty --class float -e pulsemixer",
|
||||
"on-scroll-up": "pactl set-sink-volume @DEFAULT_SINK@ +1%",
|
||||
"on-scroll-down": "pactl set-sink-volume @DEFAULT_SINK@ -1%"
|
||||
},
|
||||
"river/tags": {
|
||||
"num-tags": 10,
|
||||
"tag-labels": [ "", "", "", "", "", "", "", "", "", "" ]
|
||||
},
|
||||
"temperature": {
|
||||
// "thermal-zone": 2,
|
||||
"hwmon-path": "/sys/class/hwmon/hwmon5/temp1_input",
|
||||
"critical-threshold": 80,
|
||||
// "format-critical": "{temperatureC}° ",
|
||||
"format": "{temperatureC}° ",
|
||||
"on-click": "alacritty --class float -e watch sensors"
|
||||
},
|
||||
"tray": {
|
||||
"icon-size": 21,
|
||||
"spacing": 10
|
||||
},
|
||||
"custom/weather": {
|
||||
"exec": "curl 'https://wttr.in/?format=%t'",
|
||||
"exec-if": "command -v curl >/dev/null 2>&1",
|
||||
"interval": 3600
|
||||
},
|
||||
"custom/wireguard": {
|
||||
"format-icons": {
|
||||
"default": "嬨"
|
||||
},
|
||||
"exec": "~/.config/waybar/modules/wireguard json",
|
||||
"exec-if": "command -v nmcli >/dev/null 2>&1",
|
||||
"return-type": "json",
|
||||
"signal": 6,
|
||||
"interval": 60,
|
||||
}
|
||||
}
|
||||
58
wayland/.config/waybar/modules/archupdates
Executable file
58
wayland/.config/waybar/modules/archupdates
Executable file
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Check for available archupdates and return their number.
|
||||
# Checks both repositories and aur,
|
||||
# returns empty string when 0 packages are available, so
|
||||
# that polybar simply displays nothing.
|
||||
# Can be used to generate json-like output for waybar.
|
||||
#
|
||||
# dependencies: yay, (pacman-contrib optional)
|
||||
# optional: jq
|
||||
#
|
||||
# Takes 2 arguments:
|
||||
# Takes an optional integer argument, which is the minimum
|
||||
# numer of package updates for an answer to be returned.
|
||||
min_upd=${1:-0}
|
||||
# Takes as second optional argument the output format
|
||||
# Valid value is "json", everything else returns plain-text.
|
||||
# json output requires jq.
|
||||
format=${2:-plain}
|
||||
|
||||
# prefer checkupdates since it allows checking w/o partial upgrade
|
||||
if command -v "checkupdates" >/dev/null; then
|
||||
updates_repo="$(checkupdates 2>&1)"
|
||||
fi
|
||||
|
||||
# fall back to yay, but be aware it will not find everything
|
||||
# if checkupdates finds nothing or returns an error
|
||||
if [ "$updates_repo" = "" ] || [ -z "${updates_repo##*==> ERROR: Cannot fetch updates*}" ]; then
|
||||
updates_repo="$(yay -Qun 2>/dev/null)"
|
||||
fi
|
||||
updates_repo=$(echo "$updates_repo" | wc -l)
|
||||
|
||||
updates_aur="$(yay -Qum 2>/dev/null | wc -l)"
|
||||
# updates_aur=$(cower -u 2> /dev/null | wc -l)
|
||||
# updates_aur=$(trizen -Su --aur --quiet | wc -l)
|
||||
# updates_aur=$(pikaur -Qua 2> /dev/null | wc -l)
|
||||
# updates_aur=$(rua upgrade --printonly 2> /dev/null | wc -l)
|
||||
|
||||
updates=$((updates_repo + updates_aur))
|
||||
|
||||
text="${updates}"
|
||||
alt="${updates_repo}|${updates_aur}"
|
||||
tooltip="Repositories: ${updates_repo} | AUR: ${updates_aur}"
|
||||
[ "$updates" -gt "$min_upd" ] && class="available" || class="empty"
|
||||
if [ "$format" = "json" ]; then
|
||||
printf "{\"text\": \"%s\", \"alt\": \"%s\", \"tooltip\": \"%s\", \"class\": \"%s\"}" \
|
||||
"$text" \
|
||||
"$alt" \
|
||||
"$tooltip" \
|
||||
"$class"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [ "$updates" -gt "$min_upd" ]; then
|
||||
echo "$updates"
|
||||
else
|
||||
echo ""
|
||||
fi
|
||||
35
wayland/.config/waybar/modules/khal.py
Executable file
35
wayland/.config/waybar/modules/khal.py
Executable file
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/env python
|
||||
# from https://gist.github.com/bjesus/178a9bd3453470d74803945dbbf9ed40
|
||||
# List upcoming khal events in simple json container fit for waybar
|
||||
|
||||
import subprocess
|
||||
import datetime
|
||||
import json
|
||||
from html import escape
|
||||
|
||||
data = {}
|
||||
|
||||
today = datetime.date.today().strftime("%Y-%m-%d")
|
||||
|
||||
next_week = (datetime.date.today() + datetime.timedelta(days=10)).strftime("%Y-%m-%d")
|
||||
|
||||
output = subprocess.check_output("khal list now " + next_week, shell=True)
|
||||
output = output.decode("utf-8")
|
||||
|
||||
lines = output.split("\n")
|
||||
new_lines = []
|
||||
for line in lines:
|
||||
clean_line = escape(line).split(" ::")[0]
|
||||
if len(clean_line) and not clean_line[0] in ["0", "1", "2"]:
|
||||
clean_line = "\n<b>" + clean_line + "</b>"
|
||||
new_lines.append(clean_line)
|
||||
output = "\n".join(new_lines).strip()
|
||||
|
||||
if today in output:
|
||||
data["text"] = " " + output.split("\n")[1]
|
||||
else:
|
||||
data["text"] = ""
|
||||
|
||||
data["tooltip"] = output
|
||||
|
||||
print(json.dumps(data))
|
||||
143
wayland/.config/waybar/modules/wireguard
Executable file
143
wayland/.config/waybar/modules/wireguard
Executable file
|
|
@ -0,0 +1,143 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# nmcli WireGuard abstraction layer for use with my waybar module and rofi custom menu script
|
||||
#
|
||||
# requires nmcli on your path
|
||||
# install to the same directory as wireguard-rofi.sh
|
||||
#
|
||||
# usage: ./wireguard.sh [menu|toggle NAME]
|
||||
# no argument: print current connections
|
||||
# json: print waybar-ready json output
|
||||
# menu: print all connections
|
||||
# toggle NAME: toggle connection NAME
|
||||
|
||||
if ! command -v nmcli >/dev/null 2>&1; then
|
||||
echo "err: nmcli not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
nargs=$#
|
||||
showmenu="no"
|
||||
dotoggle="no"
|
||||
printjson="no"
|
||||
if [[ $nargs == 1 ]]; then
|
||||
if [[ $1 == "menu" ]]; then
|
||||
showmenu="yes"
|
||||
elif [[ $1 == "json" ]]; then
|
||||
printjson="yes"
|
||||
fi
|
||||
elif [[ $nargs == 2 ]]; then
|
||||
if [[ $1 == "toggle" ]]; then
|
||||
dotoggle="yes"
|
||||
conn="$2"
|
||||
fi
|
||||
fi
|
||||
|
||||
nmclicmd="nmcli connection"
|
||||
wgconns="$nmclicmd show"
|
||||
wgactive="$wgconns --active"
|
||||
|
||||
connected=()
|
||||
available=()
|
||||
|
||||
function print_as_json() {
|
||||
text="嬨" # only prints a single icon when connected
|
||||
# text="${1}" # use this line to show all output in text
|
||||
alt="${1}"
|
||||
tooltip="${1}"
|
||||
[ -n "$1" ] && class="connected" || class="disconnected"
|
||||
printf "{\"text\": \"%s\", \"alt\": \"%s\", \"tooltip\": \"%s\", \"class\": \"%s\"}" \
|
||||
"$text" \
|
||||
"$alt" \
|
||||
"$tooltip" \
|
||||
"$class"
|
||||
}
|
||||
|
||||
function get_conns {
|
||||
while read -r name _ type device; do
|
||||
if [[ $type != "wireguard" && ($type != "tun" || $device != "proton0") ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ $device != "--" ]]; then
|
||||
while read -r key value; do
|
||||
if [[ $key != "ipv4.addresses:" ]]; then
|
||||
continue
|
||||
fi
|
||||
connected+=("$name: $value")
|
||||
done < <($wgconns "$name")
|
||||
else
|
||||
available+=("$name")
|
||||
fi
|
||||
done < <($1)
|
||||
}
|
||||
|
||||
function print_conns {
|
||||
local first="yes"
|
||||
local array_print="$1[@]"
|
||||
local array_print=("${!array_print}")
|
||||
if [[ $2 == "list" ]]; then
|
||||
for c in "${array_print[@]}"; do
|
||||
output="$1: $c"
|
||||
done
|
||||
else
|
||||
output=""
|
||||
for c in "${array_print[@]}"; do
|
||||
if [[ "$first" != "yes" ]]; then
|
||||
output+=" | "
|
||||
fi
|
||||
output+="$c"
|
||||
first="no"
|
||||
done
|
||||
fi
|
||||
if [[ "$printjson" == "yes" ]]; then
|
||||
print_as_json "$output"
|
||||
else
|
||||
echo "$output"
|
||||
fi
|
||||
}
|
||||
|
||||
function array_contains {
|
||||
local array_has="$1[@]"
|
||||
local array_has=("${!array_has}")
|
||||
local element="$2"
|
||||
for e in "${array_has[@]}"; do
|
||||
if [[ "$e" == *"$element"* ]]; then
|
||||
echo "yes"
|
||||
return
|
||||
fi
|
||||
done
|
||||
echo "no"
|
||||
}
|
||||
|
||||
if [[ $nargs == 0 ]]; then
|
||||
get_conns "$wgactive"
|
||||
print_conns connected
|
||||
|
||||
elif [[ $showmenu == "yes" ]]; then
|
||||
get_conns "$wgconns"
|
||||
print_conns connected "list"
|
||||
print_conns available "list"
|
||||
|
||||
elif [[ $printjson == "yes" ]]; then
|
||||
get_conns "$wgactive"
|
||||
print_conns connected
|
||||
|
||||
elif
|
||||
[[ $dotoggle == "yes" ]]
|
||||
then
|
||||
get_conns "$wgconns"
|
||||
|
||||
if [[ "$(array_contains connected "$conn")" == "yes" ]]; then
|
||||
$nmclicmd down "$conn"
|
||||
elif [[ "$(array_contains available "$conn")" == "yes" ]]; then
|
||||
$nmclicmd up "$conn"
|
||||
else
|
||||
echo "err: connection not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
else
|
||||
echo "err: wrong args"
|
||||
exit 1
|
||||
fi
|
||||
152
wayland/.config/waybar/style.css
Normal file
152
wayland/.config/waybar/style.css
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
/* @import "colorscheme.css"; */
|
||||
|
||||
* {
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
font-size: 15px;
|
||||
color: #d5c4a1;
|
||||
background-color: #32302f;
|
||||
border-bottom: 1px solid #3c3836;
|
||||
transition-property: background-color;
|
||||
transition-duration: .5s;
|
||||
}
|
||||
|
||||
window#waybar.hidden {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
#tags button {
|
||||
font-size:17px;
|
||||
font-weight:900;
|
||||
background-color: transparent;
|
||||
color: #665c54;
|
||||
margin: 0px;
|
||||
padding: 0px 5px;
|
||||
/* Use box-shadow instead of border so the text isn't offset */
|
||||
}
|
||||
/* /1* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect *1/ */
|
||||
#tags button:hover {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
/* box-shadow: inset 0 -1px #d5c4a1; */
|
||||
box-shadow: inset 0 0;
|
||||
}
|
||||
#tags button.occupied {
|
||||
font-weight: 400;
|
||||
color: #d5c4a1;
|
||||
}
|
||||
#tags button.focused {
|
||||
font-weight: 400;
|
||||
color: #83a598;
|
||||
}
|
||||
#tags button.urgent {
|
||||
color: #8ec07c;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#battery,
|
||||
#cpu,
|
||||
#memory,
|
||||
#disk,
|
||||
#temperature,
|
||||
#backlight,
|
||||
#network,
|
||||
#pulseaudio,
|
||||
#tray,
|
||||
#mode,
|
||||
#idle_inhibitor,
|
||||
#mpd,
|
||||
#custom-archupdates,
|
||||
#custom-wireguard,
|
||||
#custom-events,
|
||||
#custom-media {
|
||||
padding: 0 10px;
|
||||
margin: 0 5px;
|
||||
color: #d5c4a1;
|
||||
background-color: #3c3836;
|
||||
}
|
||||
|
||||
/* If workspaces is the leftmost module, omit left margin */
|
||||
.modules-left > widget:first-child > #tags {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* If workspaces is the rightmost module, omit right margin */
|
||||
.modules-right > widget:last-child > #tags {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#battery.charging, #battery.plugged {
|
||||
background-color: #504945;
|
||||
}
|
||||
|
||||
#battery.warning {
|
||||
background-color: #fe8019;
|
||||
color: #32302f;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
to {
|
||||
background-color: #fb4934;
|
||||
color: #32302f;
|
||||
}
|
||||
}
|
||||
|
||||
#battery.critical:not(.charging) {
|
||||
color: #d5c4a1;
|
||||
background-color: #32302f;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
animation-timing-function: linear;
|
||||
animation-iteration-count: infinite;
|
||||
animation-direction: alternate;
|
||||
}
|
||||
|
||||
#cpu.warning {
|
||||
color: #32302f;
|
||||
background-color: #fabd2f;
|
||||
}
|
||||
#cpu.critical {
|
||||
color: #d5c4a1;
|
||||
background-color: #fb4934;
|
||||
}
|
||||
|
||||
#custom-archupdates.empty {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#custom-wireguard.disconnected {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#temperature.critical {
|
||||
background-color: #fb4934;
|
||||
}
|
||||
|
||||
#tray > .passive {
|
||||
-gtk-icon-effect: dim;
|
||||
}
|
||||
|
||||
|
||||
#tray > .needs-attention {
|
||||
-gtk-icon-effect: highlight;
|
||||
}
|
||||
|
||||
#mpd.disconnected {
|
||||
background-color: transparent;
|
||||
color: transparent;
|
||||
font-size: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
48
wayland/.local/bin/screenshot
Executable file
48
wayland/.local/bin/screenshot
Executable file
|
|
@ -0,0 +1,48 @@
|
|||
#!/usr/bin/env sh
|
||||
# Take a screenshot on wayland
|
||||
# By default takes a screenshot of the whole desktop
|
||||
# If 'region' or 'area' command is passed in will allow selecting a region to screenshot.
|
||||
# Example: `screenshot region`
|
||||
|
||||
TIME="$(date +%Y-%m-%d-%H-%M-%S)"
|
||||
readonly TIME
|
||||
readonly TMPSCREENSHOTDIR="$HOME/.cache/screenshot"
|
||||
readonly TMPIMGPATH="$TMPSCREENSHOTDIR/img-$TIME.png"
|
||||
|
||||
FULLSCREEN=true
|
||||
|
||||
if [ "$1" = "area" ] || [ "$1" = "region" ]; then
|
||||
FULLSCREEN=false
|
||||
fi
|
||||
|
||||
main() {
|
||||
prepare_cache
|
||||
take_screenshot "$FULLSCREEN"
|
||||
if [ -n "$SCREENSHOT_POSTPROCESS" ]; then
|
||||
eval "$SCREENSHOT_POSTPROCESS"
|
||||
else
|
||||
postprocess
|
||||
fi
|
||||
}
|
||||
|
||||
prepare_cache() {
|
||||
if [ ! -d "$TMPSCREENSHOTDIR" ]; then
|
||||
mkdir -p "$TMPSCREENSHOTDIR"
|
||||
fi
|
||||
}
|
||||
|
||||
take_screenshot() {
|
||||
if $1; then
|
||||
grim "$TMPIMGPATH"
|
||||
else
|
||||
grim -g "$(slurp)" "$TMPIMGPATH"
|
||||
fi
|
||||
}
|
||||
|
||||
postprocess() {
|
||||
notify-send -i "$TMPIMGPATH" "Screenshot taken" "$TMPIMGPATH"
|
||||
echo "$TMPIMGPATH" | wl-copy
|
||||
echo "$TMPIMGPATH"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
110
wayland/README.md
Normal file
110
wayland/README.md
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
# wayland
|
||||
|
||||
Contains:
|
||||
[riverwm](https://github.com/riverwm/river)
|
||||
[waybar](https://github.com/Alexays/Waybar)
|
||||
|
||||
My first foray into wayland is based on river,
|
||||
a tiling window manager somewhat based on bspwm.
|
||||
|
||||
This is only a very work-in-progress README file.
|
||||
|
||||
Since wayland handles key presses and so on completely differently
|
||||
from X,
|
||||
I can't for example use sxhkd which is a shame.
|
||||
|
||||
## Missing
|
||||
|
||||
not set up:
|
||||
|
||||
* [x] lockscreen
|
||||
* [x] power menu -- rofi on X
|
||||
* [x] extensive run menu (clipboard, open windows) -- rofi on X
|
||||
* [x] clipboard manager
|
||||
* [x] pass frontend dropdown -- clipboard and xdotool
|
||||
* [ ] investigate [wtype](https://github.com/atx/wtype) over ydotool
|
||||
* [x] file uploading (works but without url clipboard)
|
||||
* [x] open_download (qutebrowser script)
|
||||
* [x] gap regulation
|
||||
* [x] brightnessctl
|
||||
* [x] waybar and various status modules
|
||||
* [ ] include waybar in styler settings
|
||||
* [x] pacman new packages in status
|
||||
* [x] personal keyboard layout (ae, oe, ue, ..)
|
||||
* [x] styler
|
||||
* still works as before, only less programs respect xresources settings
|
||||
* works even for foot, if I want to switch to it
|
||||
* [ ] need to set it up for waybar
|
||||
* [ ] dropdown terminal and dropdown todo
|
||||
* [ ] rofimoji emoji dropdown -- clipboard
|
||||
* [ ] show current mode
|
||||
* [-] hide cursor
|
||||
* [-] dropdown calculator -- rofi on X -- could use `qalc` directly
|
||||
* [-] modes: media, academia (worth?)
|
||||
* [-] picture in terminal, a-la ueberzug
|
||||
* ueberzug is X only
|
||||
* there is sixel rendering for foot, st, xterm, urxvt
|
||||
* alacritty does *not* support sixel rendering [yet](https://github.com/alacritty/alacritty/issues/910), see also [existing sixel implementation](https://github.com/betaboon/alacritty/tree/graphics).
|
||||
* We have sixel support enabled in vifm and foot. It is very wonky, however.
|
||||
|
||||
|
||||
### undecided
|
||||
|
||||
* [ ] polybar -> waybar / yambar
|
||||
* [ ] foot / alacritty
|
||||
|
||||
## River
|
||||
|
||||
River is set up to come close to my old i3 setup.
|
||||
Of course, some mappings are different
|
||||
(especially those for movement between windows),
|
||||
but overall the keys map to the old ones.
|
||||
|
||||
Since the window manager now also takes over the task of compositor
|
||||
and does not pass through all keys to all programs,
|
||||
it takes over the role of `sxhkd` as well and summons other programs.
|
||||
|
||||
I am not entirely sure how I feel about this bundling of tasks into one application,
|
||||
but so far it works.
|
||||
Since river is also, mimicking bspwm, using an executable file
|
||||
(any executable file)
|
||||
as its configuration file it is also reasonable that the setup can be tamed and refactored better than a single i3 configuration file.
|
||||
|
||||
## Waybar
|
||||
|
||||
Waybar replaces the old [polybar](https://gitlab.com/marty-oehme/dotfiles/-/tree/89d1402b3e711c4aa473386e47e84f3593e5ae56/polybar) setup.
|
||||
|
||||
It displays the first 10 tags on its left,
|
||||
with tags highlighted that are either occupied by windows or currently in focus.
|
||||
In the center it displays a clock which can be clicked to open a simple calendar.
|
||||
|
||||

|
||||
|
||||
To the right is where most of the info modules are:
|
||||
If there are upcoming events listed for the khal application, it will display a calendar module here.
|
||||
If music is playing through an mpris-compatible player, its status is shown here.
|
||||
If a connection through wireguard or over a vpn tunnel is established, it is shown here.
|
||||
Then, from left to right, audio, brightness, wifi, cpu, ram, temperature, and battery information are displayed.
|
||||
|
||||
Some displays have alternative display states, with for example the battery showing remaining time and ram information showing used and total available.
|
||||
|
||||
Clicking on:
|
||||
|
||||
* audio opens pulsemixer
|
||||
* network opens nmtui
|
||||
* cpu opens top (or glances on right-click)
|
||||
* temperature shows sensors
|
||||
|
||||
## keyd
|
||||
|
||||
keyd is set up within `/etc/` and not in the dotfiles themselves.
|
||||
If using the included `./install.sh` file, there is an option to also set up files outside the home directory, including keyd options.
|
||||
It is configured through `/etc/keyd/default.cfg`.
|
||||
Currently, it takes care of mapping `capslock` to both control and escape (depending on if its used alone or with other keys),
|
||||
as well as adding some German characters that I am otherwise missing on my en_US keyboard.
|
||||
Lastly, it allows easy clipboard pasting with the `insert` key.
|
||||
|
||||
## Swaybg
|
||||
|
||||
`swaybg` is used to set the wallpaper from the river configuration file.
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue