我正在使用一个应用程序 (VMWare Workstation),它会劫持我键盘上的媒体键,所以我想使用另一个输入设备 (Elgato Stream Deck) 来发送通用媒体命令,如“调高音量”或“暂停”。我能够使用 stream deck 发送 shell 命令,如 ,只要我在 gnome shell 中,这就可以正常工作,但如果我在 VM 中,VMWare 仍然会劫持这些消息。另一方面,使用或xdotool key XF86AudioLowerVolume
等工具的低级命令可以正常工作。那么,什么相当于命令?wmctrl
dbus-send
dbus-send
xdotool key XF86Audio*
我可以用来dbus-monitor
查看按下媒体键时的事件,例如:
signal time=1599582032.226007 sender=:1.66 -> destination=:1.96 serial=18241 path=/org/gnome/Shell; interface=org.gnome.Shell; member=AcceleratorActivated
uint32 140
array [
dict entry(
string "device-id"
variant uint32 12
)
dict entry(
string "timestamp"
variant uint32 504924437
)
dict entry(
string "action-mode"
variant uint32 1
)
dict entry(
string "device-node"
variant string "/dev/input/event7"
)
]
调高音量。我该如何将其转化为dbus-send
消息?
我很久以前就发现了这个问题,但它似乎已经过时了。至少,它在我的系统(Ubuntu 20.04)上不起作用:https://stackoverflow.com/questions/2830858/controlling-gnome-volume-using-dbus
答案1
pulsemixer
最终完成了我需要的工作。pactl
可以设置音量,但不会报告 OSD 显示的级别。此脚本可提高/降低音量或切换静音,并显示相应的 OSD:
#!/usr/bin/env bash
# must be set correctly for pactl to connect
uid=$(id -u)
export XDG_RUNTIME_DIR=/run/user/$uid
case "$1" in
up )
pulsemixer --change-volume +5 --max-volume 100
;;
down )
pulsemixer --change-volume -5
;;
mute )
pulsemixer --toggle-mute
;;
esac
# get active levels
sink=$(pulsemixer --list-sinks | grep -e "Default$" | cut -d',' -f2 | cut -c8-)
vol=$(pulsemixer --get-volume | cut -d' ' -f1)
mute=$(pulsemixer --get-mute)
# set osd icon
if [ $mute -eq 1 ]; then
icon="audio-volume-muted"
elif [ $vol -lt 33 ]; then
icon="audio-volume-low"
elif [ $vol -lt 66 ]; then
icon="audio-volume-medium"
else
icon="audio-volume-high"
fi
# format as decimal
if [ $vol -eq 100 ]; then
vol="1.0"
else
vol="0.$vol"
fi
gdbus call --session --dest 'org.gnome.Shell' --object-path '/org/gnome/Shell' --method 'org.gnome.Shell.ShowOSD' "{'icon': <'$icon'>, 'label': <'$sink'>, 'level': <$vol>}"