new file: alacritty/alacritty.yml
new file: bspwm/bspwmrc new file: neofetch/config.conf new file: nvim/init.vim new file: polybar/config new file: polybar/launch.sh new file: polybar/scripts/bat_toggle.sh new file: polybar/scripts/brightnessctl.sh new file: polybar/scripts/bt-status.sh new file: polybar/scripts/coins.svg new file: polybar/scripts/openvpn-status.sh new file: polybar/scripts/pcrypto.py new file: polybar/scripts/pulseaudio-control.bash new file: polybar/scripts/spotify_status.py new file: polybar/scripts/xbps-updates.sh new file: polybar/scripts/xbps-updates.sh.bkp
This commit is contained in:
177
polybar/config
Normal file
177
polybar/config
Normal file
@ -0,0 +1,177 @@
|
||||
[colors]
|
||||
;background = ${xrdb:color0:#222}
|
||||
background =
|
||||
background-alt = #444
|
||||
;foreground = ${xrdb:color7:#222}
|
||||
foreground = #dfdfdf
|
||||
foreground-alt = #555
|
||||
primary = #ffb52a
|
||||
secondary = #e60053
|
||||
alert = #bd2c40
|
||||
|
||||
[bar/top]
|
||||
width = 1900
|
||||
height = 30
|
||||
|
||||
#background = #df1D1F21
|
||||
background = #ee0c181d
|
||||
foreground = #ccffffff
|
||||
|
||||
border-color = #00000000
|
||||
|
||||
offset-y = 10
|
||||
offset-x = 10
|
||||
|
||||
padding-left = 0
|
||||
padding-right = 1
|
||||
|
||||
spacing = 1
|
||||
module-margin = 1
|
||||
|
||||
font-0 = RobotoMono:size=10;1
|
||||
font-1 = coins:style=Regular;1
|
||||
font-2 = FontAwesome;1
|
||||
font-3 = MaterialIcons;1
|
||||
|
||||
modules-left = bspwm
|
||||
modules-right = xbps-updates pulseaudio-control brightnessctl bt-status wireless-network wired-network battery date
|
||||
;modules-center = bspwm
|
||||
fixed-center = true
|
||||
|
||||
[module/bt-status]
|
||||
type = custom/script
|
||||
exec = ~/.config/polybar/scripts/bt-status.sh
|
||||
click-left = blueman-manager
|
||||
format-prefix = " "
|
||||
|
||||
[module/xbps-updates]
|
||||
type = custom/script
|
||||
exec = ~/.config/polybar/scripts/xbps-updates.sh
|
||||
interval = 60
|
||||
label-foreground = ${colors.foreground}
|
||||
|
||||
[module/pulseaudio-control]
|
||||
type = custom/script
|
||||
tail = true
|
||||
label-foreground = ${colors.foreground}
|
||||
|
||||
exec = ~/.config/polybar/scripts/pulseaudio-control.bash --icons-volume " , " --icon-muted " " --sink-nicknames-from "alsa.card_name" --sink-nickname "usb-Topping_D30-00.analog-stereo: D30" --sink-nickname "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor: Speakers" listen
|
||||
click-right = exec pavucontrol &
|
||||
click-left = ~/.config/polybar/scripts/pulseaudio-control.bash togmute
|
||||
click-middle = ~/.config/polybar/scripts/pulseaudio-control.bash --sink-blacklist "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" next-sink
|
||||
scroll-up = ~/.config/polybar/scripts/pulseaudio-control.bash --volume-max 130 up
|
||||
scroll-down = ~/.config/polybar/scripts/pulseaudio-control.bash --volume-max 130 down
|
||||
|
||||
[module/brightnessctl]
|
||||
type = custom/script
|
||||
exec = ~/.config/polybar/scripts/brightnessctl.sh
|
||||
|
||||
scroll-up = exec brightnessctl set +5%
|
||||
scroll-down = exec brightnessctl set 5%-
|
||||
interval = 1
|
||||
|
||||
format-prefix = " "
|
||||
label = %output%
|
||||
label-foreground = ${colors.foreground}
|
||||
|
||||
[module/xwindow]
|
||||
type = internal/xwindow
|
||||
|
||||
[module/crypto]
|
||||
type = custom/script
|
||||
interval = 60
|
||||
exec = ~/.config/polybar/scripts/pcrypto.py --base USD --coins btc eth ada --apikey coinranking667e22ef80713a74e538696d841e19ade62f38679290e928
|
||||
|
||||
[module/battery]
|
||||
type = internal/battery
|
||||
battery = BAT1
|
||||
adapter = ACAD
|
||||
full-at = 98
|
||||
|
||||
click-left = ~/.config/polybar/scripts/bat_toggle.sh
|
||||
format-charging = <label-charging>
|
||||
format-discharging = <ramp-capacity><label-discharging>
|
||||
format-full = <ramp-capacity><label-full>
|
||||
|
||||
format-charging-foreground = #90C2E7
|
||||
|
||||
ramp-capacity-0 =
|
||||
ramp-capacity-0-foreground = #DB5461
|
||||
ramp-capacity-1 =
|
||||
ramp-capacity-1-foreground = #E9C46A
|
||||
ramp-capacity-2 =
|
||||
ramp-capacity-2-foreground = #E9C46A
|
||||
ramp-capacity-3 =
|
||||
ramp-capacity-3-foreground = #169873
|
||||
ramp-capacity-4 =
|
||||
ramp-capacity-4-foreground = #169873
|
||||
|
||||
bar-capacity-width = 10
|
||||
bar-capacity-format = %{+u}%{+o}%fill%%empty%%{-u}%{-o}
|
||||
bar-capacity-fill = █
|
||||
bar-capacity-fill-foreground = #ddffffff
|
||||
bar-capacity-fill-font = 3
|
||||
bar-capacity-empty = █
|
||||
bar-capacity-empty-font = 3
|
||||
bar-capacity-empty-foreground = #44ffffff
|
||||
|
||||
[module/bspwm]
|
||||
type = internal/bspwm
|
||||
|
||||
label-focused = ""
|
||||
label-focused-background= ${colors.foreground-alt}
|
||||
label-focused-padding = 1
|
||||
|
||||
label-occupied = ""
|
||||
label-occupied-padding = 1
|
||||
|
||||
label-urgent = ""
|
||||
label-urgent-background = ${colors.alert}
|
||||
label-urgent-padding = 1
|
||||
|
||||
label-empty = ""
|
||||
label-empty-foreground = ${colors.foreground-alt}
|
||||
label-empty-padding = 1
|
||||
|
||||
[module/date]
|
||||
type = internal/date
|
||||
date = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[module/wireless-network]
|
||||
type = internal/network
|
||||
interface = wlp8s0
|
||||
interval = 5.0
|
||||
ping-interval = 10
|
||||
|
||||
format-connected = <ramp-signal>
|
||||
label-disconnected =
|
||||
label-disconnected-foreground = #66
|
||||
|
||||
ramp-signal-0 =
|
||||
ramp-signal-1 =
|
||||
ramp-signal-2 =
|
||||
ramp-signal-3 =
|
||||
ramp-signal-4 =
|
||||
|
||||
animation-packetloss-0 =
|
||||
animation-packetloss-0-foreground = #ffa64c
|
||||
animation-packetloss-1 =
|
||||
animation-packetloss-1-foreground = ${bar/top.foreground}
|
||||
animation-packetloss-framerate = 500
|
||||
|
||||
[module/volume]
|
||||
type = internal/volume
|
||||
speaker-mixer = Speaker
|
||||
headphone-mixer = Headphone
|
||||
headphone-id = 9
|
||||
|
||||
format-volume = <ramp-volume> <label-volume>
|
||||
label-muted = muted
|
||||
label-muted-foreground = #66
|
||||
|
||||
ramp-volume-0 =
|
||||
ramp-volume-1 =
|
||||
ramp-volume-2 =
|
||||
ramp-volume-3 =
|
||||
|
||||
; vim:ft=dosini
|
11
polybar/launch.sh
Executable file
11
polybar/launch.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Terminate already running bar instances
|
||||
pkill polybar
|
||||
# If all your bars have ipc enabled, you can also use
|
||||
# polybar-msg cmd quit
|
||||
|
||||
# Launch Polybar, using default config location ~/.config/polybar/config
|
||||
polybar top | tee -a /tmp/polybar.log & disown
|
||||
|
||||
echo "Polybar launched..."
|
9
polybar/scripts/bat_toggle.sh
Executable file
9
polybar/scripts/bat_toggle.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
updates=$(xbps-install -Mun 2> /dev/null | wc -l)
|
||||
|
||||
if [ -n "$updates" ] && [ "$updates" -gt 0 ]; then
|
||||
echo " $updates"
|
||||
else
|
||||
echo ""
|
||||
fi
|
3
polybar/scripts/brightnessctl.sh
Executable file
3
polybar/scripts/brightnessctl.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
echo "$(brightnessctl | grep -o "(.*" | tr -d "()")"
|
||||
|
3
polybar/scripts/bt-status.sh
Executable file
3
polybar/scripts/bt-status.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo bluetoothctl paired-devices | wc -l
|
304
polybar/scripts/coins.svg
Normal file
304
polybar/scripts/coins.svg
Normal file
@ -0,0 +1,304 @@
|
||||
e900:1st
|
||||
e901:ada
|
||||
e902:adc
|
||||
e903:adx
|
||||
e904:aeon
|
||||
e905:amp
|
||||
e906:anc
|
||||
e907:ant
|
||||
e908:arch
|
||||
e909:ardr
|
||||
e90a:aur
|
||||
e90b:banx
|
||||
e90c:bat
|
||||
e90d:bay
|
||||
e90e:bc
|
||||
e90f:bch
|
||||
e910:bcn
|
||||
e911:bft
|
||||
e912:bnb
|
||||
e913:bnt
|
||||
e914:brk
|
||||
e915:brx
|
||||
e916:bsd
|
||||
e917:bta
|
||||
e918:btc
|
||||
e919:btcd
|
||||
e91a:btg
|
||||
e91b:btm
|
||||
e91c:bts
|
||||
e91d:clam
|
||||
e91e:clo
|
||||
e91f:cloak
|
||||
e920:cvc
|
||||
e921:dao
|
||||
e922:dash
|
||||
e923:dcr
|
||||
e924:dct
|
||||
e925:dent
|
||||
e926:dgb
|
||||
e927:dgd
|
||||
e928:dgx
|
||||
e929:dmd
|
||||
e92a:dnt
|
||||
e92b:doge
|
||||
e92c:edg
|
||||
e92d:emc
|
||||
e92e:eos
|
||||
e92f:erc
|
||||
e930:etc
|
||||
e931:eth
|
||||
e932:exp
|
||||
e933:fc2
|
||||
e934:fcn
|
||||
e935:fct
|
||||
e936:flo
|
||||
e937:frk
|
||||
e938:ftc
|
||||
e939:fun
|
||||
e93a:game
|
||||
e93b:gbg
|
||||
e93c:gbyte
|
||||
e93d:gdc
|
||||
e93e:gemz
|
||||
e93f:gld
|
||||
e940:gno
|
||||
e941:gnt
|
||||
e942:golos
|
||||
e943:grc
|
||||
e944:grs
|
||||
e945:gup
|
||||
e946:awc
|
||||
e947:hmq
|
||||
e948:icn
|
||||
e949:ifc
|
||||
e94a:incnt
|
||||
e94b:ioc
|
||||
e94c:cnd
|
||||
e94d:ixt
|
||||
e94e:jbs
|
||||
e94f:kmd
|
||||
e950:kore
|
||||
e951:lbc
|
||||
e952:ldoge
|
||||
e953:lsk
|
||||
e954:ltc
|
||||
e955:lun
|
||||
e956:maid
|
||||
e957:mco
|
||||
e958:mint
|
||||
e959:mln
|
||||
e95a:mona
|
||||
e95b:mrc
|
||||
e95c:msc
|
||||
e95d:msp
|
||||
e95e:mtl
|
||||
e95f:mtr
|
||||
e960:mue
|
||||
e961:nano
|
||||
e962:nav
|
||||
e963:nbt
|
||||
e964:neo
|
||||
e965:neos
|
||||
e966:neu
|
||||
e967:nlg
|
||||
e968:nmc
|
||||
e969:note
|
||||
e96a:nvc
|
||||
e96b:nxt
|
||||
e96c:oax
|
||||
e96d:ok
|
||||
e96e:omg
|
||||
e96f:omni
|
||||
e970:opal
|
||||
e971:part
|
||||
e972:pay
|
||||
e973:piggy
|
||||
e974:pink
|
||||
e975:pivx
|
||||
e976:plbt
|
||||
e977:plr
|
||||
e978:plu
|
||||
e979:pot
|
||||
e97a:ppc
|
||||
e97b:ptoy
|
||||
e97c:qcn
|
||||
e97d:qrk
|
||||
e97e:qtum
|
||||
e97f:rads
|
||||
e980:rbies
|
||||
e981:rbt
|
||||
e982:rby
|
||||
e983:rdd
|
||||
e984:rep
|
||||
e985:rise
|
||||
e986:rlc
|
||||
e987:salt
|
||||
e988:sar
|
||||
e989:scot
|
||||
e98a:sdc
|
||||
e98b:sia
|
||||
e98c:sjcx
|
||||
e98d:slg
|
||||
e98e:sls
|
||||
e98f:sngls
|
||||
e990:snrg
|
||||
e991:snt
|
||||
e992:start
|
||||
e993:steem
|
||||
e994:storj
|
||||
e995:str
|
||||
e996:strat
|
||||
e997:swift
|
||||
e998:swt
|
||||
e999:sync
|
||||
e99a:sys
|
||||
e99b:time
|
||||
e99c:tkn
|
||||
e99d:trig
|
||||
e99e:trst
|
||||
e99f:trx
|
||||
e9a0:tx
|
||||
e9a1:ubq
|
||||
e9a2:unity
|
||||
e9a3:usdt
|
||||
e9a4:ven
|
||||
e9a5:vior
|
||||
e9a6:vnl
|
||||
e9a7:vpn
|
||||
e9a8:vrc
|
||||
e9a9:vtc
|
||||
e9aa:waves
|
||||
e9ab:wings
|
||||
e9ac:xai
|
||||
e9ad:xaur
|
||||
e9ae:xbs
|
||||
e9af:xcp
|
||||
e9b0:xdn
|
||||
e9b1:xem
|
||||
e9b2:xmr
|
||||
e9b3:xpm
|
||||
e9b4:xrp
|
||||
e9b5:xtz
|
||||
e9b7:xzc
|
||||
e9b8:ybc
|
||||
e9b9:zec
|
||||
e9ba:zeit
|
||||
e9bb:zrx
|
||||
e9bc:stx
|
||||
e9bd:sbtc
|
||||
e9be:rcn
|
||||
e9bf:nmr
|
||||
e9c0:zil
|
||||
e9c1:vib
|
||||
e9c2:xnn
|
||||
e9c3:viu
|
||||
e9c4:veri
|
||||
e9c5:sc
|
||||
e9c6:rhoc
|
||||
e9c7:kcs
|
||||
e9c8:icx
|
||||
e9c9:ark
|
||||
e9ca:ae
|
||||
e9cb:tip
|
||||
e9cc:crpt
|
||||
e9cd:via
|
||||
e9ce:myst
|
||||
e9cf:miota
|
||||
e9d0:adt
|
||||
e9d1:eng
|
||||
e9d2:cfi
|
||||
e9d3:dsh
|
||||
e9d4:xlm
|
||||
e9d5:fsbt
|
||||
e9d6:atl
|
||||
e9d7:ath
|
||||
e9d8:arn
|
||||
e9d9:arc
|
||||
e9da:apt
|
||||
e9db:aidoc
|
||||
e9dc:amis
|
||||
e9dd:adst
|
||||
e9de:300
|
||||
e9df:ngc
|
||||
e9e0:srn
|
||||
e9e1:wax
|
||||
e9e2:dcn
|
||||
e9e3:powr
|
||||
e9e4:dkk
|
||||
e9e5:gbp
|
||||
e9e6:eur
|
||||
e9e7:usd
|
||||
e9e8:ukg
|
||||
e9e9:lrc
|
||||
e9ea:brd
|
||||
e9eb:mana
|
||||
e9ec:mer
|
||||
e9ed:tix
|
||||
e9ee:xel
|
||||
e9ef:zen
|
||||
e9f0:btcp
|
||||
e9f1:ebst
|
||||
e9f2:elf
|
||||
e9f3:hsr
|
||||
e9f4:iost
|
||||
e9f5:loom
|
||||
e9f6:mkr
|
||||
e9f7:nas
|
||||
e9f8:now
|
||||
e9f9:snm
|
||||
e9fa:synx
|
||||
e9fb:wan
|
||||
e9fd:ely
|
||||
e9fe:ela
|
||||
e9ff:smart
|
||||
ea00:aion
|
||||
ea01:tusd
|
||||
ea02:usdc
|
||||
ea03:vet
|
||||
ea04:pax
|
||||
ea05:joys
|
||||
ea06:bchsv
|
||||
ea07:bsv
|
||||
ea08:bth
|
||||
ea09:trezor
|
||||
ea0a:ledger
|
||||
ea0b:r
|
||||
ea0c:npxs
|
||||
ea0d:dai
|
||||
ea0e:link
|
||||
ea0f:hot
|
||||
ea10:gusd
|
||||
ea11:eurs
|
||||
ea12:vtho
|
||||
ea13:kin
|
||||
ea14:ont
|
||||
ea15:atom
|
||||
ea16:ankr
|
||||
ea17:erd
|
||||
ea18:ftm
|
||||
ea19:lto
|
||||
ea1a:und
|
||||
ea1b:vera
|
||||
ea1c:yec
|
||||
ea1d:aya
|
||||
ea1e:ethplo
|
||||
ea1f:iotx
|
||||
ea20:enj
|
||||
ea21:rvn
|
||||
ea22:xns
|
||||
ea23:pyn
|
||||
ea24:ncash
|
||||
ea25:loki
|
||||
ea26:knc
|
||||
ea27:job
|
||||
ea28:chz
|
||||
ea29:btu
|
||||
ea2a:apis
|
||||
ea2b:gas
|
||||
ea2c:busd
|
||||
ea2d:iq
|
||||
ea2e:lst
|
||||
ea2f:ong
|
||||
ea30:nut
|
||||
ea31:eosdt
|
4
polybar/scripts/openvpn-status.sh
Normal file
4
polybar/scripts/openvpn-status.sh
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
printf "VPN: " && (pgrep -a openvpn$ | head -n 1 | awk '{print $NF }' | cut -d '.' -f 1 && echo down) | head -n 1
|
63
polybar/scripts/pcrypto.py
Executable file
63
polybar/scripts/pcrypto.py
Executable file
@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import requests
|
||||
import argparse
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
|
||||
parser = argparse.ArgumentParser(description="Display currencies on polybar")
|
||||
parser.add_argument("--coins", type=str,
|
||||
nargs="+", help="Select coins to display")
|
||||
parser.add_argument("--base", type=str,
|
||||
nargs="?", default="USD", help="Currency base to convert against")
|
||||
parser.add_argument("--decimals", type=int,
|
||||
nargs="?", default=2, help="How many decimals to show")
|
||||
parser.add_argument("--display", type=str,
|
||||
nargs="?", default="price", choices=["price", "percentage", "both"], help="Display mode")
|
||||
parser.add_argument("--apikey", type=str,
|
||||
nargs="?",default=None, help="Visit https://developers.coinranking.com/create-account to make an account and generate a free API key.")
|
||||
|
||||
args = parser.parse_args()
|
||||
home = os.path.expanduser("~/")
|
||||
|
||||
unicode_dict = {}
|
||||
with open(f"{home}.config/polybar/scripts/coins.svg", "r", encoding="utf-8") as icons:
|
||||
for line in icons:
|
||||
unicode, coin = line.strip().split(":")
|
||||
unicode_dict[unicode] = coin
|
||||
|
||||
if not (args.coins and args.apikey):
|
||||
parser.print_help()
|
||||
parser.exit()
|
||||
|
||||
coin_args_list = map(lambda x: f'symbols[]={x}', args.coins)
|
||||
coin_args_str = "&".join(coin_args_list)
|
||||
|
||||
get_base = requests.get(
|
||||
f"https://api.coinranking.com/v2/reference-currencies?search={args.base}",
|
||||
headers={'x-access-token': args.apikey}).json()["data"]
|
||||
|
||||
get_base = get_base['currencies'][0]
|
||||
|
||||
get_coin = requests.get(
|
||||
f"https://api.coinranking.com/v2/coins?{coin_args_str}&referenceCurrencyUuid={get_base['uuid']}",
|
||||
headers={'x-access-token': args.apikey}).json()['data']
|
||||
|
||||
for n in range(len(args.coins)):
|
||||
coin = get_coin['coins'][n]
|
||||
price_float = round(float(coin['price']), args.decimals)
|
||||
delta = coin['change']
|
||||
|
||||
for _unicode, _coin in unicode_dict.items():
|
||||
if _coin == coin['symbol'].lower():
|
||||
icon = chr(int(_unicode, 16)) if len(_unicode) > 1 else _unicode
|
||||
|
||||
current_price = get_base['sign'] + str(price_float)
|
||||
|
||||
if args.display == "price":
|
||||
sys.stdout.write(f" {icon} {current_price} ")
|
||||
elif args.display == "percentage":
|
||||
sys.stdout.write(f" {icon} {delta:+}% ")
|
||||
elif args.display == "both":
|
||||
sys.stdout.write(f" {icon} {current_price} | {delta:+}% ")
|
515
polybar/scripts/pulseaudio-control.bash
Executable file
515
polybar/scripts/pulseaudio-control.bash
Executable file
@ -0,0 +1,515 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##################################################################
|
||||
# Polybar Pulseaudio Control #
|
||||
# https://github.com/marioortizmanero/polybar-pulseaudio-control #
|
||||
##################################################################
|
||||
|
||||
# Defaults for configurable values, expected to be set by command-line arguments
|
||||
AUTOSYNC="no"
|
||||
COLOR_MUTED="%{F#6b6b6b}"
|
||||
ICON_MUTED=
|
||||
ICON_SINK=
|
||||
NOTIFICATIONS="no"
|
||||
OSD="no"
|
||||
SINK_NICKNAMES_PROP=
|
||||
VOLUME_STEP=2
|
||||
VOLUME_MAX=130
|
||||
# shellcheck disable=SC2016
|
||||
FORMAT='$VOL_ICON ${VOL_LEVEL}% $ICON_SINK $SINK_NICKNAME'
|
||||
declare -A SINK_NICKNAMES
|
||||
declare -a ICONS_VOLUME
|
||||
declare -a SINK_BLACKLIST
|
||||
|
||||
# Environment & global constants for the script
|
||||
export LANG=en_US # Some calls depend on English outputs of pactl
|
||||
END_COLOR="%{F-}" # For Polybar colors
|
||||
|
||||
|
||||
# Saves the currently default sink into a variable named `curSink`. It will
|
||||
# return an error code when pulseaudio isn't running.
|
||||
function getCurSink() {
|
||||
if ! pactl info &>/dev/null; then return 1; fi
|
||||
local curSinkName
|
||||
|
||||
curSinkName=$(pactl info | awk '/Default Sink: / {print $3}')
|
||||
curSink=$(pactl list sinks | grep -B 4 -E "Name: $curSinkName\$" | sed -nE 's/^Sink #([0-9]+)$/\1/p')
|
||||
}
|
||||
|
||||
|
||||
# Saves the sink passed by parameter's volume into a variable named `VOL_LEVEL`.
|
||||
function getCurVol() {
|
||||
VOL_LEVEL=$(pactl list sinks | grep -A 15 -E "^Sink #$1\$" | grep 'Volume:' | grep -E -v 'Base Volume:' | awk -F : '{print $3; exit}' | grep -o -P '.{0,3}%' | sed 's/.$//' | tr -d ' ')
|
||||
}
|
||||
|
||||
|
||||
# Saves the name of the sink passed by parameter into a variable named
|
||||
# `sinkName`.
|
||||
function getSinkName() {
|
||||
sinkName=$(pactl list sinks short | awk -v sink="$1" '{ if ($1 == sink) {print $2} }')
|
||||
portName=$(pactl list sinks | grep -e 'Sink #' -e 'Active Port: ' | sed -n "/^Sink #$1\$/,+1p" | awk '/Active Port: / {print $3}')
|
||||
}
|
||||
|
||||
|
||||
# Saves the name to be displayed for the sink passed by parameter into a
|
||||
# variable called `SINK_NICKNAME`.
|
||||
# If a mapping for the sink name exists, that is used. Otherwise, the string
|
||||
# "Sink #<index>" is used.
|
||||
function getNickname() {
|
||||
getSinkName "$1"
|
||||
unset SINK_NICKNAME
|
||||
|
||||
if [ -n "$sinkName" ] && [ -n "$portName" ] && [ -n "${SINK_NICKNAMES[$sinkName/$portName]}" ]; then
|
||||
SINK_NICKNAME="${SINK_NICKNAMES[$sinkName/$portName]}"
|
||||
elif [ -n "$sinkName" ] && [ -n "${SINK_NICKNAMES[$sinkName]}" ]; then
|
||||
SINK_NICKNAME="${SINK_NICKNAMES[$sinkName]}"
|
||||
elif [ -n "$sinkName" ] && [ -n "$SINK_NICKNAMES_PROP" ]; then
|
||||
getNicknameFromProp "$SINK_NICKNAMES_PROP" "$sinkName"
|
||||
# Cache that result for next time
|
||||
SINK_NICKNAMES["$sinkName"]="$SINK_NICKNAME"
|
||||
fi
|
||||
|
||||
if [ -z "$SINK_NICKNAME" ]; then
|
||||
SINK_NICKNAME="Sink #$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# Gets sink nickname based on a given property.
|
||||
function getNicknameFromProp() {
|
||||
local nickname_prop="$1"
|
||||
local for_name="$2"
|
||||
|
||||
SINK_NICKNAME=
|
||||
while read -r property value; do
|
||||
case "$property" in
|
||||
Name:)
|
||||
sink_name="$value"
|
||||
unset sink_desc
|
||||
;;
|
||||
"$nickname_prop")
|
||||
if [ "$sink_name" != "$for_name" ]; then
|
||||
continue
|
||||
fi
|
||||
SINK_NICKNAME="${value:3:-1}"
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done < <(pactl list sinks)
|
||||
}
|
||||
|
||||
# Saves the status of the sink passed by parameter into a variable named
|
||||
# `isMuted`.
|
||||
function getIsMuted() {
|
||||
isMuted=$(pactl list sinks | grep -E "^Sink #$1\$" -A 15 | awk '/Mute: / {print $2}')
|
||||
}
|
||||
|
||||
|
||||
# Saves all the sink inputs of the sink passed by parameter into a string
|
||||
# named `sinkInputs`.
|
||||
function getSinkInputs() {
|
||||
sinkInputs=$(pactl list sink-inputs | grep -B 4 "Sink: $1" | sed -nE 's/^Sink Input #([0-9]+)$/\1/p')
|
||||
}
|
||||
|
||||
|
||||
function volUp() {
|
||||
# Obtaining the current volume from pulseaudio into $VOL_LEVEL.
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
getCurVol "$curSink"
|
||||
local maxLimit=$((VOLUME_MAX - VOLUME_STEP))
|
||||
|
||||
# Checking the volume upper bounds sothat if VOLUME_MAX was 100% and the
|
||||
# increase percentage was 3%, a 99% volume would top at 100% instead
|
||||
# of 102%. If the volume is above the maximum limit, nothing is done.
|
||||
if [ "$VOL_LEVEL" -le "$VOLUME_MAX" ] && [ "$VOL_LEVEL" -ge "$maxLimit" ]; then
|
||||
pactl set-sink-volume "$curSink" "$VOLUME_MAX%"
|
||||
elif [ "$VOL_LEVEL" -lt "$maxLimit" ]; then
|
||||
pactl set-sink-volume "$curSink" "+$VOLUME_STEP%"
|
||||
fi
|
||||
|
||||
if [ $OSD = "yes" ]; then showOSD "$curSink"; fi
|
||||
if [ $AUTOSYNC = "yes" ]; then volSync; fi
|
||||
}
|
||||
|
||||
|
||||
function volDown() {
|
||||
# Pactl already handles the volume lower bounds so that negative values
|
||||
# are ignored.
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
pactl set-sink-volume "$curSink" "-$VOLUME_STEP%"
|
||||
|
||||
if [ $OSD = "yes" ]; then showOSD "$curSink"; fi
|
||||
if [ $AUTOSYNC = "yes" ]; then volSync; fi
|
||||
}
|
||||
|
||||
|
||||
function volSync() {
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
getSinkInputs "$curSink"
|
||||
getCurVol "$curSink"
|
||||
|
||||
# Every output found in the active sink has their volume set to the
|
||||
# current one. This will only be called if $AUTOSYNC is `yes`.
|
||||
for each in $sinkInputs; do
|
||||
pactl set-sink-input-volume "$each" "$VOL_LEVEL%"
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
function volMute() {
|
||||
# Switch to mute/unmute the volume with pactl.
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
if [ "$1" = "toggle" ]; then
|
||||
getIsMuted "$curSink"
|
||||
if [ "$isMuted" = "yes" ]; then
|
||||
pactl set-sink-mute "$curSink" "no"
|
||||
else
|
||||
pactl set-sink-mute "$curSink" "yes"
|
||||
fi
|
||||
elif [ "$1" = "mute" ]; then
|
||||
pactl set-sink-mute "$curSink" "yes"
|
||||
elif [ "$1" = "unmute" ]; then
|
||||
pactl set-sink-mute "$curSink" "no"
|
||||
fi
|
||||
|
||||
if [ $OSD = "yes" ]; then showOSD "$curSink"; fi
|
||||
}
|
||||
|
||||
|
||||
function nextSink() {
|
||||
# The final sinks list, removing the blacklisted ones from the list of
|
||||
# currently available sinks.
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Obtaining a tuple of sink indexes after removing the blacklisted devices
|
||||
# with their name.
|
||||
sinks=()
|
||||
local i=0
|
||||
while read -r line; do
|
||||
index=$(echo "$line" | cut -f1)
|
||||
name=$(echo "$line" | cut -f2)
|
||||
|
||||
# If it's in the blacklist, continue the main loop. Otherwise, add
|
||||
# it to the list.
|
||||
for sink in "${SINK_BLACKLIST[@]}"; do
|
||||
if [ "$sink" = "$name" ]; then
|
||||
continue 2
|
||||
fi
|
||||
done
|
||||
|
||||
sinks[$i]="$index"
|
||||
i=$((i + 1))
|
||||
done < <(pactl list short sinks | sort -n)
|
||||
|
||||
# If the resulting list is empty, nothing is done
|
||||
if [ ${#sinks[@]} -eq 0 ]; then return; fi
|
||||
|
||||
# If the current sink is greater or equal than last one, pick the first
|
||||
# sink in the list. Otherwise just pick the next sink avaliable.
|
||||
local newSink
|
||||
if [ "$curSink" -ge "${sinks[-1]}" ]; then
|
||||
newSink=${sinks[0]}
|
||||
else
|
||||
for sink in "${sinks[@]}"; do
|
||||
if [ "$curSink" -lt "$sink" ]; then
|
||||
newSink=$sink
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# The new sink is set
|
||||
pactl set-default-sink "$newSink"
|
||||
|
||||
# Move all audio threads to new sink
|
||||
local inputs
|
||||
inputs="$(pactl list short sink-inputs | cut -f 1)"
|
||||
for i in $inputs; do
|
||||
pactl move-sink-input "$i" "$newSink"
|
||||
done
|
||||
|
||||
if [ $NOTIFICATIONS = "yes" ]; then
|
||||
getNickname "$newSink"
|
||||
|
||||
if command -v dunstify &>/dev/null; then
|
||||
notify="dunstify --replace 201839192"
|
||||
else
|
||||
notify="notify-send"
|
||||
fi
|
||||
$notify "PulseAudio" "Changed output to $SINK_NICKNAME" --icon=audio-headphones-symbolic &
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# This function assumes that PulseAudio is already running. It only supports
|
||||
# KDE OSDs for now. It will show a system message with the status of the
|
||||
# sink passed by parameter, or the currently active one by default.
|
||||
function showOSD() {
|
||||
if [ -z "$1" ]; then
|
||||
curSink="$1"
|
||||
else
|
||||
getCurSink
|
||||
fi
|
||||
getCurVol "$curSink"
|
||||
getIsMuted "$curSink"
|
||||
qdbus org.kde.kded /modules/kosd showVolume "$VOL_LEVEL" "$isMuted"
|
||||
}
|
||||
|
||||
|
||||
function listen() {
|
||||
local firstRun=0
|
||||
|
||||
# Listen for changes and immediately create new output for the bar.
|
||||
# This is faster than having the script on an interval.
|
||||
pactl subscribe 2>/dev/null | {
|
||||
while true; do
|
||||
{
|
||||
# If this is the first time just continue and print the current
|
||||
# state. Otherwise wait for events. This is to prevent the
|
||||
# module being empty until an event occurs.
|
||||
if [ $firstRun -eq 0 ]; then
|
||||
firstRun=1
|
||||
else
|
||||
read -r event || break
|
||||
# Avoid double events
|
||||
if ! echo "$event" | grep -e "on card" -e "on sink" -e "on server"; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
} &>/dev/null
|
||||
output
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function output() {
|
||||
if ! getCurSink; then
|
||||
echo "PulseAudio not running"
|
||||
return 1
|
||||
fi
|
||||
getCurVol "$curSink"
|
||||
getIsMuted "$curSink"
|
||||
|
||||
# Fixed volume icons over max volume
|
||||
local iconsLen=${#ICONS_VOLUME[@]}
|
||||
if [ "$iconsLen" -ne 0 ]; then
|
||||
local volSplit=$((VOLUME_MAX / iconsLen))
|
||||
for i in $(seq 1 "$iconsLen"); do
|
||||
if [ $((i * volSplit)) -ge "$VOL_LEVEL" ]; then
|
||||
VOL_ICON="${ICONS_VOLUME[$((i-1))]}"
|
||||
break
|
||||
fi
|
||||
done
|
||||
else
|
||||
VOL_ICON=""
|
||||
fi
|
||||
|
||||
getNickname "$curSink"
|
||||
|
||||
# Showing the formatted message
|
||||
if [ "$isMuted" = "yes" ]; then
|
||||
# shellcheck disable=SC2034
|
||||
VOL_ICON=$ICON_MUTED
|
||||
echo "${COLOR_MUTED}$(eval echo "$FORMAT")${END_COLOR}"
|
||||
else
|
||||
eval echo "$FORMAT"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function usage() {
|
||||
echo "\
|
||||
Usage: $0 [OPTION...] ACTION
|
||||
Options:
|
||||
--autosync | --no-autosync
|
||||
Whether to maintain same volume for all programs.
|
||||
Default: $AUTOSYNC
|
||||
--color-muted <rrggbb>
|
||||
Color in which to format when muted.
|
||||
Default: ${COLOR_MUTED:4:-1}
|
||||
--notifications | --no-notifications
|
||||
Whether to show notifications when changing sinks.
|
||||
Default: $NOTIFICATIONS
|
||||
--osd | --no-osd
|
||||
Whether to display KDE's OSD message.
|
||||
Default: $OSD
|
||||
--icon-muted <icon>
|
||||
Icon to use when muted.
|
||||
Default: none
|
||||
--icon-sink <icon>
|
||||
Icon to use for sink.
|
||||
Default: none
|
||||
--format <string>
|
||||
Use a format string to control the output.
|
||||
Available variables:
|
||||
* \$VOL_ICON
|
||||
* \$VOL_LEVEL
|
||||
* \$ICON_SINK
|
||||
* \$SINK_NICKNAME
|
||||
Default: $FORMAT
|
||||
--icons-volume <icon>[,<icon>...]
|
||||
Icons for volume, from lower to higher.
|
||||
Default: none
|
||||
--volume-max <int>
|
||||
Maximum volume to which to allow increasing.
|
||||
Default: $VOLUME_MAX
|
||||
--volume-step <int>
|
||||
Step size when inc/decrementing volume.
|
||||
Default: $VOLUME_STEP
|
||||
--sink-blacklist <name>[,<name>...]
|
||||
Sinks to ignore when switching.
|
||||
Default: none
|
||||
--sink-nicknames-from <prop>
|
||||
pactl property to use for sink names, unless overriden by
|
||||
--sink-nickname. Its possible values are listed under the 'Properties'
|
||||
key in the output of \`pactl list sinks\`
|
||||
Default: none
|
||||
--sink-nickname <name>:<nick>
|
||||
Nickname to assign to given sink name, taking priority over
|
||||
--sink-nicknames-from. May be given multiple times, and 'name' is
|
||||
exactly as listed in the output of \`pactl list sinks short | cut -f2\`.
|
||||
Note that you can also specify a port name for the sink with
|
||||
\`<name>/<port>\`.
|
||||
Default: none
|
||||
Actions:
|
||||
help display this message and exit
|
||||
output print the PulseAudio status once
|
||||
listen listen for changes in PulseAudio to automatically update
|
||||
this script's output
|
||||
up, down increase or decrease the default sink's volume
|
||||
mute, unmute mute or unmute the default sink's audio
|
||||
togmute switch between muted and unmuted
|
||||
next-sink switch to the next available sink
|
||||
sync synchronize all the output streams volume to be the same as
|
||||
the current sink's volume
|
||||
Author:
|
||||
Mario Ortiz Manero
|
||||
More info on GitHub:
|
||||
https://github.com/marioortizmanero/polybar-pulseaudio-control"
|
||||
}
|
||||
|
||||
while [[ "$1" = --* ]]; do
|
||||
unset arg
|
||||
unset val
|
||||
if [[ "$1" = *=* ]]; then
|
||||
arg="${1//=*/}"
|
||||
val="${1//*=/}"
|
||||
shift
|
||||
else
|
||||
arg="$1"
|
||||
# Support space-separated values, but also value-less flags
|
||||
if [[ "$2" != --* ]]; then
|
||||
val="$2"
|
||||
shift
|
||||
fi
|
||||
shift
|
||||
fi
|
||||
|
||||
case "$arg" in
|
||||
--autosync)
|
||||
AUTOSYNC=yes
|
||||
;;
|
||||
--no-autosync)
|
||||
AUTOSYNC=no
|
||||
;;
|
||||
--color-muted|--colour-muted)
|
||||
COLOR_MUTED="%{F#$val}"
|
||||
;;
|
||||
--notifications)
|
||||
NOTIFICATIONS=yes
|
||||
;;
|
||||
--no-notifications)
|
||||
NOTIFICATIONS=no
|
||||
;;
|
||||
--osd)
|
||||
OSD=yes
|
||||
;;
|
||||
--no-osd)
|
||||
OSD=no
|
||||
;;
|
||||
--icon-muted)
|
||||
ICON_MUTED="$val"
|
||||
;;
|
||||
--icon-sink)
|
||||
# shellcheck disable=SC2034
|
||||
ICON_SINK="$val"
|
||||
;;
|
||||
--icons-volume)
|
||||
IFS=, read -r -a ICONS_VOLUME <<< "${val//[[:space:]]/}"
|
||||
;;
|
||||
--volume-max)
|
||||
VOLUME_MAX="$val"
|
||||
;;
|
||||
--volume-step)
|
||||
VOLUME_STEP="$val"
|
||||
;;
|
||||
--sink-blacklist)
|
||||
IFS=, read -r -a SINK_BLACKLIST <<< "${val//[[:space:]]/}"
|
||||
;;
|
||||
--sink-nicknames-from)
|
||||
SINK_NICKNAMES_PROP="$val"
|
||||
;;
|
||||
--sink-nickname)
|
||||
SINK_NICKNAMES["${val//:*/}"]="${val//*:}"
|
||||
;;
|
||||
--format)
|
||||
FORMAT="$val"
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognised option: $arg" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
case "$1" in
|
||||
up)
|
||||
volUp
|
||||
;;
|
||||
down)
|
||||
volDown
|
||||
;;
|
||||
togmute)
|
||||
volMute toggle
|
||||
;;
|
||||
mute)
|
||||
volMute mute
|
||||
;;
|
||||
unmute)
|
||||
volMute unmute
|
||||
;;
|
||||
sync)
|
||||
volSync
|
||||
;;
|
||||
listen)
|
||||
listen
|
||||
;;
|
||||
next-sink)
|
||||
nextSink
|
||||
;;
|
||||
output)
|
||||
output
|
||||
;;
|
||||
help)
|
||||
usage
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognised action: $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
141
polybar/scripts/spotify_status.py
Normal file
141
polybar/scripts/spotify_status.py
Normal file
@ -0,0 +1,141 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import dbus
|
||||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
'-t',
|
||||
'--trunclen',
|
||||
type=int,
|
||||
metavar='trunclen'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-f',
|
||||
'--format',
|
||||
type=str,
|
||||
metavar='custom format',
|
||||
dest='custom_format'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-p',
|
||||
'--playpause',
|
||||
type=str,
|
||||
metavar='play-pause indicator',
|
||||
dest='play_pause'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--font',
|
||||
type=str,
|
||||
metavar='the index of the font to use for the main label',
|
||||
dest='font'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--playpause-font',
|
||||
type=str,
|
||||
metavar='the index of the font to use to display the playpause indicator',
|
||||
dest='play_pause_font'
|
||||
)
|
||||
parser.add_argument(
|
||||
'-q',
|
||||
'--quiet',
|
||||
action='store_true',
|
||||
help="if set, don't show any output when the current song is paused",
|
||||
dest='quiet',
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
|
||||
def fix_string(string):
|
||||
# corrects encoding for the python version used
|
||||
if sys.version_info.major == 3:
|
||||
return string
|
||||
else:
|
||||
return string.encode('utf-8')
|
||||
|
||||
|
||||
def truncate(name, trunclen):
|
||||
if len(name) > trunclen:
|
||||
name = name[:trunclen]
|
||||
name += '...'
|
||||
if ('(' in name) and (')' not in name):
|
||||
name += ')'
|
||||
return name
|
||||
|
||||
|
||||
|
||||
# Default parameters
|
||||
output = fix_string(u'{play_pause} {artist}: {song}')
|
||||
trunclen = 35
|
||||
play_pause = fix_string(u'\u25B6,\u23F8') # first character is play, second is paused
|
||||
|
||||
label_with_font = '%{{T{font}}}{label}%{{T-}}'
|
||||
font = args.font
|
||||
play_pause_font = args.play_pause_font
|
||||
|
||||
quiet = args.quiet
|
||||
|
||||
# parameters can be overwritten by args
|
||||
if args.trunclen is not None:
|
||||
trunclen = args.trunclen
|
||||
if args.custom_format is not None:
|
||||
output = args.custom_format
|
||||
if args.play_pause is not None:
|
||||
play_pause = args.play_pause
|
||||
|
||||
try:
|
||||
session_bus = dbus.SessionBus()
|
||||
spotify_bus = session_bus.get_object(
|
||||
'org.mpris.MediaPlayer2.spotify',
|
||||
'/org/mpris/MediaPlayer2'
|
||||
)
|
||||
|
||||
spotify_properties = dbus.Interface(
|
||||
spotify_bus,
|
||||
'org.freedesktop.DBus.Properties'
|
||||
)
|
||||
|
||||
metadata = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'Metadata')
|
||||
status = spotify_properties.Get('org.mpris.MediaPlayer2.Player', 'PlaybackStatus')
|
||||
|
||||
# Handle play/pause label
|
||||
|
||||
play_pause = play_pause.split(',')
|
||||
|
||||
if status == 'Playing':
|
||||
play_pause = play_pause[0]
|
||||
elif status == 'Paused':
|
||||
play_pause = play_pause[1]
|
||||
else:
|
||||
play_pause = str()
|
||||
|
||||
if play_pause_font:
|
||||
play_pause = label_with_font.format(font=play_pause_font, label=play_pause)
|
||||
|
||||
# Handle main label
|
||||
|
||||
artist = fix_string(metadata['xesam:artist'][0]) if metadata['xesam:artist'] else ''
|
||||
song = fix_string(metadata['xesam:title']) if metadata['xesam:title'] else ''
|
||||
album = fix_string(metadata['xesam:album']) if metadata['xesam:album'] else ''
|
||||
|
||||
if (quiet and status == 'Paused') or (not artist and not song and not album):
|
||||
print('')
|
||||
else:
|
||||
if font:
|
||||
artist = label_with_font.format(font=font, label=artist)
|
||||
song = label_with_font.format(font=font, label=song)
|
||||
album = label_with_font.format(font=font, label=album)
|
||||
|
||||
# Add 4 to trunclen to account for status symbol, spaces, and other padding characters
|
||||
print(truncate(output.format(artist=artist,
|
||||
song=song,
|
||||
play_pause=play_pause,
|
||||
album=album), trunclen + 4))
|
||||
|
||||
except Exception as e:
|
||||
if isinstance(e, dbus.exceptions.DBusException):
|
||||
print('')
|
||||
else:
|
||||
print(e)
|
9
polybar/scripts/xbps-updates.sh
Executable file
9
polybar/scripts/xbps-updates.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
updates=$(xbps-install -Mun 2> /dev/null | wc -l)
|
||||
|
||||
if [ -n "$updates" ] && [ "$updates" -gt 0 ]; then
|
||||
echo " $updates"
|
||||
else
|
||||
echo ""
|
||||
fi
|
11
polybar/scripts/xbps-updates.sh.bkp
Executable file
11
polybar/scripts/xbps-updates.sh.bkp
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
|
||||
updates=$(xbps-install -Mun 2> /dev/null | wc -l)
|
||||
|
||||
if [ -n "$updates" ] && [ "$updates" -eq 1 ]; then
|
||||
echo "$updates XBPS update available"
|
||||
elif [ -n "$updates" ] && [ "$updates" -gt 1 ]; then
|
||||
echo "$updates XBPS updates available"
|
||||
else
|
||||
echo ""
|
||||
fi
|
Reference in New Issue
Block a user