Switch panel to Rodrigo's script
This commit is contained in:
parent
9066c338de
commit
76d6d80ec0
6 changed files with 184 additions and 119 deletions
|
|
@ -1,12 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
prefix=$1
|
||||
suffix=$2
|
||||
|
||||
while [ true ]; do
|
||||
echo -n "$prefix"
|
||||
echo -n $(acpi --battery | cut -d, -f2 | tr -d ' ')
|
||||
echo -n "$suffix"
|
||||
echo
|
||||
sleep 1s
|
||||
done
|
||||
11
panel/clock
11
panel/clock
|
|
@ -1,11 +0,0 @@
|
|||
#/bin/sh
|
||||
|
||||
prefix=$1
|
||||
format=$2
|
||||
|
||||
while [ true ]; do
|
||||
echo -n "$prefix"
|
||||
echo -n $(date "$format")
|
||||
echo
|
||||
sleep 1s
|
||||
done
|
||||
|
|
@ -9,13 +9,10 @@ fi
|
|||
|
||||
trap 'trap - TERM; kill 0' INT TERM QUIT EXIT
|
||||
|
||||
[ -e "$PANEL_FIFO" ] && rm "$PANEL_FIFO"
|
||||
mkfifo "$PANEL_FIFO"
|
||||
|
||||
bspc config bottom_padding $PANEL_HEIGHT
|
||||
|
||||
source panel_colors
|
||||
|
||||
panel_bar | lemonbar -g x$PANEL_HEIGHT -f "$PANEL_FONT_FAMILY" -F "$COLOR_FOREGROUND" -B "$COLOR_BACKGROUND" -b &
|
||||
$PANEL_CONFIG_DIR/panel_bar.py | lemonbar -g x$PANEL_HEIGHT -f "$PANEL_FONT_FAMILY" -F "$COLOR_FOREGROUND" -B "$COLOR_BACKGROUND" -b &
|
||||
|
||||
wait
|
||||
|
|
|
|||
|
|
@ -1,76 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Example panel for LemonBoy's bar
|
||||
|
||||
PATH=$PATH:"$PANEL_CONFIG_DIR"
|
||||
|
||||
source panel_colors
|
||||
|
||||
num_mon=$(bspc query -M | wc -l)
|
||||
|
||||
divider=' | '
|
||||
|
||||
while sleep 1; do
|
||||
# bspwm internal state
|
||||
wm_info=""
|
||||
IFS=':'
|
||||
read -r -a wm_data <<< "$(bspc control --get-status)"
|
||||
for item in "${wm_data[@]}"; do
|
||||
name=${item#?}
|
||||
case $item in
|
||||
M*)
|
||||
# active monitor
|
||||
if [ $num_mon -gt 1 ] ; then
|
||||
wm_info="$wm_info %{F$COLOR_ACTIVE_MONITOR_FG}%{B$COLOR_ACTIVE_MONITOR_BG} ${name} %{B-}%{F-} "
|
||||
fi
|
||||
;;
|
||||
m*)
|
||||
# inactive monitor
|
||||
if [ $num_mon -gt 1 ] ; then
|
||||
wm_info="$wm_info %{F$COLOR_INACTIVE_MONITOR_FG}%{B$COLOR_INACTIVE_MONITOR_BG} ${name} %{B-}%{F-} "
|
||||
fi
|
||||
;;
|
||||
O*)
|
||||
# focused occupied desktop
|
||||
wm_info="${wm_info}%{F$COLOR_FOCUSED_OCCUPIED_FG}%{B$COLOR_FOCUSED_OCCUPIED_BG}%{U$COLOR_FOREGROUND}%{+u} ${name} %{-u}%{B-}%{F-}"
|
||||
;;
|
||||
F*)
|
||||
# focused free desktop
|
||||
wm_info="${wm_info}%{F$COLOR_FOCUSED_FREE_FG}%{B$COLOR_FOCUSED_FREE_BG}%{U$COLOR_FOREGROUND}%{+u} ${name} %{-u}%{B-}%{F-}"
|
||||
;;
|
||||
U*)
|
||||
# focused urgent desktop
|
||||
wm_info="${wm_info}%{F$COLOR_FOCUSED_URGENT_FG}%{B$COLOR_FOCUSED_URGENT_BG}%{U$COLOR_FOREGROUND}%{+u} ${name} %{-u}%{B-}%{F-}"
|
||||
;;
|
||||
o*)
|
||||
# occupied desktop
|
||||
wm_info="${wm_info}%{F$COLOR_OCCUPIED_FG}%{B$COLOR_OCCUPIED_BG} ${name} %{B-}%{F-}"
|
||||
;;
|
||||
f*)
|
||||
# free desktop
|
||||
# wm_info="${wm_info}%{F$COLOR_FREE_FG}%{B$COLOR_FREE_BG} ${name} %{B-}%{F-}"
|
||||
;;
|
||||
u*)
|
||||
# urgent desktop
|
||||
wm_info="${wm_info}%{F$COLOR_URGENT_FG}%{B$COLOR_URGENT_BG} ${name} %{B-}%{F-}"
|
||||
;;
|
||||
L*)
|
||||
# layout
|
||||
# wm_info="$wm_info %{F$COLOR_LAYOUT_FG}%{B$COLOR_LAYOUT_BG} ${name} %{B-}%{F-}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
pa_status=$(pulseaudio-ctl full-status)
|
||||
volume=$(echo $pa_status | cut -d' ' -f1)
|
||||
muted=$(echo $pa_status | cut -d' ' -f2 | sed -e 's/yes/-/' -e 's/no/%%/')
|
||||
|
||||
battery=$(acpi --battery | cut -d, -f2 | tr -d ' ')'%'
|
||||
clock=$(date '+%a %d %b %H:%M:%S')
|
||||
|
||||
battery_info="%{F$COLOR_STATUS_FG}%{B$COLOR_STATUS_BG} ${battery} %{B-}%{F-}"
|
||||
volume_info="%{F$COLOR_STATUS_FG}%{B$COLOR_STATUS_BG} ${volume}${muted} %{B-}%{F-}"
|
||||
clock_info="%{F$COLOR_STATUS_FG}%{B$COLOR_STATUS_BG} ${clock} %{B-}%{F-}"
|
||||
|
||||
printf "%s\n" "%{l}${wm_info}%{c}${title}%{r}${battery_info}${divider}${volume_info}${divider}${clock_info}"
|
||||
done
|
||||
183
panel/panel_bar.py
Executable file
183
panel/panel_bar.py
Executable file
|
|
@ -0,0 +1,183 @@
|
|||
#!/usr/bin/python3 -u
|
||||
import subprocess
|
||||
import os
|
||||
import select
|
||||
import sys
|
||||
import fcntl
|
||||
import time
|
||||
import datetime
|
||||
import socket
|
||||
|
||||
PERIOD = 1
|
||||
# Lemonbar seems to struggle if you update too fast
|
||||
MIN_UPDATE_INTERVAL = 0.01
|
||||
PATH = os.path.dirname(os.path.realpath(__file__))
|
||||
COLOR_ACTIVE_MONITOR_FG = '#FF34322E'
|
||||
COLOR_ACTIVE_MONITOR_BG = '#FF58C5F1'
|
||||
COLOR_INACTIVE_MONITOR_FG = '#FF58C5F1'
|
||||
COLOR_INACTIVE_MONITOR_BG = '#FF34322E'
|
||||
COLOR_FOCUSED_OCCUPIED_FG = '#FFF6F9FF'
|
||||
COLOR_FOCUSED_OCCUPIED_BG = '#FF5C5955'
|
||||
COLOR_FOCUSED_FREE_FG = '#FFF6F9FF'
|
||||
COLOR_FOCUSED_FREE_BG = '#FF6D561C'
|
||||
COLOR_FOCUSED_URGENT_FG = '#FF34322E'
|
||||
COLOR_FOCUSED_URGENT_BG = '#FFF9A299'
|
||||
COLOR_OCCUPIED_FG = '#FFA3A6AB'
|
||||
COLOR_OCCUPIED_BG = '#FF34322E'
|
||||
COLOR_FREE_FG = '#FF6F7277'
|
||||
COLOR_FREE_BG = '#FF34322E'
|
||||
COLOR_URGENT_FG = '#FFF9A299'
|
||||
COLOR_URGENT_BG = '#FF34322E'
|
||||
COLOR_LAYOUT_FG = '#FFA3A6AB'
|
||||
COLOR_LAYOUT_BG = '#FF34322E'
|
||||
COLOR_STATUS_FG = '#FFA3A6AB'
|
||||
COLOR_STATUS_BG = '#FF34322E'
|
||||
DIVIDER = ' | '
|
||||
|
||||
|
||||
def color_string(string, fg=COLOR_STATUS_FG, bg=COLOR_STATUS_BG):
|
||||
return "%%{F%s}%%{B%s} %s %%{B-}%%{F-}" % (fg, bg, string)
|
||||
|
||||
|
||||
def status_update(data):
|
||||
colors = {
|
||||
'M': None, # (COLOR_ACTIVE_MONITOR_FG, COLOR_ACTIVE_MONITOR_BG),
|
||||
'm': (COLOR_INACTIVE_MONITOR_FG, COLOR_INACTIVE_MONITOR_BG),
|
||||
'O': (COLOR_FOCUSED_OCCUPIED_FG, COLOR_FOCUSED_OCCUPIED_BG),
|
||||
'F': (COLOR_FOCUSED_FREE_FG, COLOR_FOCUSED_FREE_BG),
|
||||
'U': (COLOR_FOCUSED_URGENT_FG, COLOR_FOCUSED_URGENT_BG),
|
||||
'o': (COLOR_OCCUPIED_FG, COLOR_OCCUPIED_BG),
|
||||
'f': None, # (COLOR_FREE_FG, COLOR_FREE_BG),
|
||||
'u': (COLOR_URGENT_FG, COLOR_URGENT_BG),
|
||||
'L': None, # (COLOR_LAYOUT_FG, COLOR_LAYOUT_BG),
|
||||
}
|
||||
data = data.decode('utf-8')
|
||||
assert data[0] == 'W'
|
||||
data = data[1:-1]
|
||||
data = data.split(':')
|
||||
wm_info = ""
|
||||
for item in data:
|
||||
if len(item) == 0:
|
||||
continue
|
||||
color = colors[item[0]]
|
||||
if color is not None:
|
||||
name = item[1:]
|
||||
wm_info += color_string(name, *color)
|
||||
return 'status', wm_info
|
||||
|
||||
|
||||
def clock_update(_):
|
||||
clock = time.strftime("%a %d %b %H:%M:%S")
|
||||
return 'clock', color_string(clock)
|
||||
|
||||
|
||||
def volume_update(_):
|
||||
info = subprocess.check_output(['pulseaudio-ctl', 'full-status'])
|
||||
info = info[:-1].decode('utf-8')
|
||||
volume, muted, _ = info.split(' ')
|
||||
volume = int(volume)
|
||||
muted = "-" if muted == "yes" else "%%"
|
||||
return 'volume', color_string("Vol: %d%s" % (volume, muted))
|
||||
|
||||
def wifi_update(_):
|
||||
info = subprocess.check_output(['netctl-auto', 'current'])
|
||||
info = info[:-1].decode('utf-8')
|
||||
if info:
|
||||
interface, network = info.split('-', 1)
|
||||
else:
|
||||
interface, network = 'wlp2s0', '-'
|
||||
return 'wifi', color_string('{}: {}'.format(interface, network))
|
||||
|
||||
|
||||
def battery_update(_):
|
||||
info = subprocess.check_output(['acpi', '--battery'])
|
||||
info = info[:-1].decode('utf-8')
|
||||
_, status = info.split(': ')
|
||||
state, charge, *_ = status.split(', ')
|
||||
state = state
|
||||
charge = int(charge[:-1])
|
||||
return 'battery', color_string("%s %d%%%%" % (state, charge))
|
||||
|
||||
|
||||
def make_string(status, clock, volume, battery, wifi):
|
||||
print("%%{1}%s%%{c}%%{r}%s%s%s%s%s%s%s" %
|
||||
(status, wifi, DIVIDER, battery, DIVIDER, volume, DIVIDER, clock))
|
||||
|
||||
|
||||
def open_socket(address):
|
||||
try:
|
||||
os.unlink(address)
|
||||
except OSError:
|
||||
if os.path.exists(address):
|
||||
raise
|
||||
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
sock.bind(address)
|
||||
sock.listen(1)
|
||||
return sock
|
||||
|
||||
|
||||
def main(argv):
|
||||
state_strings = {
|
||||
'status': "",
|
||||
'battery': battery_update(None)[1],
|
||||
'volume': volume_update(None)[1],
|
||||
'clock': clock_update(None)[1],
|
||||
}
|
||||
# These processes trigger when events happen.
|
||||
bspc_control = subprocess.Popen(["bspc", "control", "--subscribe"],
|
||||
stdout=subprocess.PIPE)
|
||||
listening = [bspc_control]
|
||||
# Make stdout nonblocking.
|
||||
# Sometimes select says there's output, but read fails.
|
||||
# This makes it possible to handle those cases graciously.
|
||||
for l in listening:
|
||||
fd = l.stdout.fileno()
|
||||
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
|
||||
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
|
||||
read_list = [l.stdout for l in listening]
|
||||
|
||||
# These sockets trigger when events happen
|
||||
socks = []
|
||||
read_list.extend(socks)
|
||||
|
||||
previous_update = 0
|
||||
now = datetime.datetime.now()
|
||||
timeout = PERIOD-(now.second % PERIOD)
|
||||
file_to_fns = {
|
||||
bspc_control.stdout: status_update,
|
||||
# volume_sock: volume_update,
|
||||
}
|
||||
while True:
|
||||
to_read, _, _ = select.select(read_list, [], [], timeout)
|
||||
for r in to_read:
|
||||
if r in socks:
|
||||
connection, _ = r.accept()
|
||||
data = connection.recv(1024)
|
||||
connection.close()
|
||||
else:
|
||||
try:
|
||||
data = r.readline()
|
||||
except OSError:
|
||||
# Some weird cases might get you here
|
||||
continue
|
||||
if (data == b''):
|
||||
print("One of our scripts died?", file=sys.stderr)
|
||||
return 1
|
||||
state_type, result = file_to_fns[r](data)
|
||||
state_strings[state_type] = result
|
||||
|
||||
state_strings['wifi'] = wifi_update(None)[1]
|
||||
state_strings['clock'] = clock_update(None)[1]
|
||||
state_strings['volume'] = volume_update(None)[1]
|
||||
state_strings['battery'] = battery_update(None)[1]
|
||||
if time.time() - previous_update < MIN_UPDATE_INTERVAL:
|
||||
timeout = MIN_UPDATE_INTERVAL - (time.time()-previous_update)
|
||||
else:
|
||||
make_string(**state_strings)
|
||||
previous_update = time.time()
|
||||
now = datetime.datetime.now()
|
||||
period_timeout = PERIOD-(now.second % PERIOD)
|
||||
timeout = max(period_timeout, MIN_UPDATE_INTERVAL)
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv))
|
||||
16
panel/volume
16
panel/volume
|
|
@ -1,16 +0,0 @@
|
|||
#/bin/sh
|
||||
|
||||
prefix=$1
|
||||
suffix=$2
|
||||
|
||||
while [ true ]; do
|
||||
echo -n "$prefix"
|
||||
volume=$(
|
||||
pulseaudio-ctl | grep 'Volume level' | cut -d: -f2 | tr -d ' ' \
|
||||
| sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
|
||||
)
|
||||
echo -n $volume
|
||||
echo -n "$suffix"
|
||||
echo
|
||||
sleep 1
|
||||
done
|
||||
Loading…
Add table
Add a link
Reference in a new issue