parent
4dd0e8f947
commit
e8a9befa8b
8 changed files with 322 additions and 9 deletions
@ -0,0 +1,48 @@ |
|||||||
|
#!/bin/zsh |
||||||
|
# stub out cower -s |
||||||
|
|
||||||
|
echo -e '\033[31mCower is broken. Use auracle instead\033[0m' |
||||||
|
|
||||||
|
usage() { |
||||||
|
echo "$0 -s <term>" |
||||||
|
echo "cower [-s] stub for muscle memory" |
||||||
|
exit $1 |
||||||
|
} |
||||||
|
|
||||||
|
MODE= |
||||||
|
ARGS=() |
||||||
|
|
||||||
|
next= |
||||||
|
for a in "$@"; do |
||||||
|
if [ -z "$next" ]; then |
||||||
|
case "$a" in |
||||||
|
-s|--search) |
||||||
|
MODE=search |
||||||
|
next=args |
||||||
|
;; |
||||||
|
-u|--updates) |
||||||
|
MODE=outdated |
||||||
|
next=args |
||||||
|
;; |
||||||
|
-h|--help) |
||||||
|
usage 0 |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Unknown option $a" |
||||||
|
usage 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
elif [ "$next" = args ]; then |
||||||
|
ARGS+=("$a") |
||||||
|
else |
||||||
|
case "$next" in |
||||||
|
esac |
||||||
|
next= |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
if [ -n "$MODE" ]; then |
||||||
|
echo -e "$ \033[32mauracle $MODE $ARGS[*]\033[0m" |
||||||
|
exec auracle $MODE "$ARGS[@]" |
||||||
|
fi |
||||||
|
|
@ -0,0 +1,200 @@ |
|||||||
|
#!/bin/bash -eu |
||||||
|
|
||||||
|
# --------------------------------------------------------- |
||||||
|
# Lazy Variables |
||||||
|
__save() { |
||||||
|
local name=$1 |
||||||
|
shift |
||||||
|
declare -g $name="$*" |
||||||
|
} |
||||||
|
|
||||||
|
require() { |
||||||
|
for name in $@; do |
||||||
|
if [ -z "${!name+x}" ]; then |
||||||
|
get_$name "__save $name" "require_for $name" |
||||||
|
fi |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
shopt -s expand_aliases |
||||||
|
alias greq='$2 ' |
||||||
|
alias gsave='$1 ' |
||||||
|
|
||||||
|
typeset -gA require_depends=() |
||||||
|
|
||||||
|
invalidate() { |
||||||
|
for name in $@; do |
||||||
|
unset -v $name |
||||||
|
if [ -n "${require_depends[$name]:-""}" ]; then |
||||||
|
local tmp="${require_depends[$name]}" |
||||||
|
unset -v require_depends[$name] |
||||||
|
invalidate $tmp |
||||||
|
fi |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
require_for() { |
||||||
|
local self_name=$1 |
||||||
|
shift |
||||||
|
require $@ |
||||||
|
for name in $@; do |
||||||
|
require_depends[$name]="${require_depends[$name]-""} $self_name" |
||||||
|
done |
||||||
|
} |
||||||
|
|
||||||
|
# --------------------------------------------------------- |
||||||
|
# Lazy variables |
||||||
|
get_ponymix_prog() { |
||||||
|
gsave $(which ponymix 2>/dev/null) |
||||||
|
} |
||||||
|
|
||||||
|
get_pacmd_prog() { |
||||||
|
# May be unavailable if only pulse clients installed |
||||||
|
gsave $(which pacmd 2>/dev/null) |
||||||
|
} |
||||||
|
|
||||||
|
get_default_sink() { |
||||||
|
gsave $(pactl info | grep 'Default Sink' | cut -d: -f2) |
||||||
|
} |
||||||
|
|
||||||
|
# There doesn't seem to be a better way to get a sink volume right now |
||||||
|
get_pacmd_dump() { |
||||||
|
greq pacmd_prog |
||||||
|
[ -n "$pacmd_prog" ] || { echo "ERROR: \$pacmd_dump requires available pacmd which is part of the pulseaudio server package"; exit 44; } |
||||||
|
gsave "$(pacmd dump)" |
||||||
|
} |
||||||
|
|
||||||
|
get_pacmd_default_sink_config() { |
||||||
|
greq pacmd_dump default_sink |
||||||
|
gsave "$(echo "$pacmd_dump" | grep "$default_sink")" |
||||||
|
} |
||||||
|
|
||||||
|
get_pacmd_default_volume() { |
||||||
|
greq pacmd_default_sink_config |
||||||
|
gsave $[$(echo "$pacmd_default_sink_config" | grep "set-sink-volume" | cut -d' ' -f3)] |
||||||
|
} |
||||||
|
|
||||||
|
get_default_volume_percent() { |
||||||
|
greq ponymix_prog |
||||||
|
if [ -n "$ponymix_prog" ]; then |
||||||
|
gsave $($ponymix_prog get-volume) |
||||||
|
else |
||||||
|
greq pacmd_default_volume |
||||||
|
gsave $[(100*$pacmd_default_volume+32768)/65535] |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
get_default_mute() { |
||||||
|
greq ponymix_prog |
||||||
|
if [ -n "$ponymix_prog" ]; then |
||||||
|
$ponymix_prog is-muted && gsave yes || gsave no |
||||||
|
else |
||||||
|
greq pacmd_default_sink_config |
||||||
|
gsave $(echo "$pacmd_default_sink_config" | grep "set-sink-mute" | cut -d' ' -f3) |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# --------------------------------------------------------- |
||||||
|
# Operations |
||||||
|
do_vol() { |
||||||
|
# Set default sink volume |
||||||
|
require default_sink |
||||||
|
local offset |
||||||
|
case "$1" in |
||||||
|
m|mute) |
||||||
|
pactl set-sink-mute $default_sink true |
||||||
|
;; |
||||||
|
u|unmute) |
||||||
|
pactl set-sink-mute $default_sink false |
||||||
|
;; |
||||||
|
t|toggle|toggle-mute) |
||||||
|
pactl set-sink-mute $default_sink toggle |
||||||
|
;; |
||||||
|
\+) : ${offset:=+5%};& |
||||||
|
\-) : ${offset:=-5%};& |
||||||
|
*) : ${offset:=$1} |
||||||
|
pactl set-sink-mute $default_sink false |
||||||
|
pactl set-sink-volume $default_sink $offset |
||||||
|
;; |
||||||
|
esac |
||||||
|
invalidate pacmd_dump default_volume_percent default_mute |
||||||
|
} |
||||||
|
|
||||||
|
do_notify() { |
||||||
|
# Notification |
||||||
|
if which dunstify >/dev/null 2>&1 && [ -n "`pgrep --ns $$ -u $(id -u) dunst`" ]; then |
||||||
|
require default_sink default_volume_percent default_mute |
||||||
|
dunst_id=6533319 |
||||||
|
if [ $default_mute = yes ]; then |
||||||
|
icon=audio-volume-muted |
||||||
|
text="Volume muted" |
||||||
|
else |
||||||
|
text="Volume $default_volume_percent%" |
||||||
|
if [ $default_volume_percent -lt 35 ]; then |
||||||
|
icon=audio-volume-low |
||||||
|
elif [ $default_volume_percent -lt 75 ]; then |
||||||
|
icon=audio-volume-medium |
||||||
|
else |
||||||
|
icon=audio-volume-high |
||||||
|
fi |
||||||
|
fi |
||||||
|
if echo $default_sink | grep -q bluez; then |
||||||
|
text="Bluetooth $text" |
||||||
|
fi |
||||||
|
bar_size=20 |
||||||
|
filled=$[(($bar_size * $default_volume_percent) + (100 / (2 * $bar_size)))/100] |
||||||
|
bar= |
||||||
|
if [ $filled -gt 0 ]; then |
||||||
|
bar="`printf %.s● $(seq $filled)`" |
||||||
|
fi |
||||||
|
if [ $filled -lt $bar_size ]; then |
||||||
|
bar="$bar`printf %.s○ $(seq $[$bar_size-$filled])`" |
||||||
|
fi |
||||||
|
dunstify -a "PA Volume" -u low -i $icon -r $dunst_id "$text" "$bar" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
do_print() { |
||||||
|
require default_sink default_volume_percent default_mute |
||||||
|
[ $default_mute = yes ] && muted=muted || muted=unmuted |
||||||
|
echo "$default_sink $default_volume_percent% $muted" |
||||||
|
} |
||||||
|
|
||||||
|
# --------------------------------------------------------- |
||||||
|
# Main |
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do |
||||||
|
verb=$1; shift |
||||||
|
|
||||||
|
case $verb in |
||||||
|
v|vol|volume) |
||||||
|
do_vol "$1"; shift |
||||||
|
do_notify |
||||||
|
do_print |
||||||
|
;; |
||||||
|
set-volume) |
||||||
|
do_vol "$1"; shift |
||||||
|
;; |
||||||
|
n|notify) |
||||||
|
do_notify |
||||||
|
;; |
||||||
|
p|print) |
||||||
|
do_print |
||||||
|
;; |
||||||
|
get-default-sink) |
||||||
|
require default_sink |
||||||
|
echo $default_sink |
||||||
|
;; |
||||||
|
*) |
||||||
|
echo "Available verbs:" |
||||||
|
echo " set-volume <[+-]n%|mute|unmute|toggle> Change default sink volume" |
||||||
|
echo " notify Display a notification with current default sink volume" |
||||||
|
echo " print Print the default sink and it's volume" |
||||||
|
echo " volume <see set-volume> Short for \"set-volume <...> notify print\"" |
||||||
|
echo " get-default-sink Print default sink name" |
||||||
|
echo |
||||||
|
echo " verbs can be chained by separating them with space. Note that some have additional arguments" |
||||||
|
exit 1 |
||||||
|
;; |
||||||
|
esac |
||||||
|
done |
@ -0,0 +1,47 @@ |
|||||||
|
#!/bin/bash -eu |
||||||
|
# Make a directory with content case-insensitive using chattr +F |
||||||
|
|
||||||
|
NEWFLAGS="+F" |
||||||
|
|
||||||
|
usage() { |
||||||
|
echo "Usage: $1 [-c] <directory>" |
||||||
|
echo |
||||||
|
echo " Make an existing directory case-folding (chattr +F)" |
||||||
|
echo |
||||||
|
echo "Options:" |
||||||
|
echo " -c Clear the case-folding flag instead of setting it" |
||||||
|
exit $2 |
||||||
|
} |
||||||
|
|
||||||
|
while getopts hc opt; do |
||||||
|
case "$opt" in |
||||||
|
h) usage "$0" 0;; |
||||||
|
c) NEWFLAGS="-F";; |
||||||
|
?) usage "$0" 255;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
shift $((OPTIND - 1)) |
||||||
|
|
||||||
|
if [ ! -d "$1" ]; then |
||||||
|
echo -e "\e[31m'$1' is not a directory\e[0m" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# Make sure it doesn't end in / |
||||||
|
d="${1%/}" |
||||||
|
|
||||||
|
set -x |
||||||
|
# Create new directory with appropriate attributes |
||||||
|
mkdir "$d.$$" |
||||||
|
chattr $NEWFLAGS "$d.$$" |
||||||
|
# Need to re-create the whole subtree, so the flag propagates |
||||||
|
# Try to save space by making a recursive hardlink copy |
||||||
|
cp -Tldr "$d" "$d.$$" |
||||||
|
# Just to be on the safe side, fail if there are any files with a single reference left |
||||||
|
find "$d" -type f,l -links +1 -delete |
||||||
|
find "$d" -type d -empty -delete |
||||||
|
[ ! -d "$d" ] |
||||||
|
# Rename to old name |
||||||
|
mv "$d.$$" "$d" |
||||||
|
|
Loading…
Reference in new issue