Com base na resposta do Brent Roman , implementei um script usando dbus-monitor
e depois substitui com gdbus
, que tem uma interface mais limpa e uma saída mais clara. O script é bastante longo, vou remover qualquer coisa não relacionada ao dbus, para ilustrar o ponto de executar um script no desbloqueio da tela.
Primeiro, um exemplo de saída da execução de gdbus
, bloqueando a tela e, em seguida, desbloqueando-a:
paulo@monk:~$ gdbus monitor --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1/session/c2
Monitoring signals on object /org/freedesktop/login1/session/c2 owned by org.freedesktop.login1
The name org.freedesktop.login1 is owned by :1.6
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <false>}, @as [])
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Lock ()
/org/freedesktop/login1/session/c2: org.freedesktop.login1.Session.Unlock ()
/org/freedesktop/login1/session/c2: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'Active': <true>}, @as [])
Então, o esqueleto do script:
OBJECT_PATH=/org/freedesktop/login1/session/$XDG_SESSION_ID
BUS_NAME=org.freedesktop.login1
UNLOCK="$OBJECT_PATH: $BUS_NAME.Session.Unlock ()"
GDBUS_MONITOR="gdbus monitor --system --dest $BUS_NAME --object-path $OBJECT_PATH"
PROGNAME=$(basename "$0")
LOGFILE=~/log/$PROGNAME.log
# ...
function log {
echo "$(date +'%F %T.%3N') [$$]" "$@"
}
# ...
function run_daemon {
exec &>>"$LOGFILE"
kill_running "$GDBUS_MONITOR"
local signal
while read -r signal; do
log "$signal"
if [[ $signal == "$UNLOCK" ]]; then
check_quodlibet
fi
done < <(eval "exec $GDBUS_MONITOR")
}
# ...
run_daemon
A função kill_running
verifica se há uma instância em execução e a mata. Se o script for iniciado automaticamente com cada login do lightdm, teremos potencialmente várias instâncias em execução, daí a necessidade de eliminar todas as instâncias atuais antes de iniciar.
A função check_quodlibet
reinicia quodlibet se o dispositivo USB montado (com minha coleção de músicas) tiver sido redefinido (acontece aleatoriamente após retomar da suspensão). Eu não achei que fosse relevante incluí-lo.
O exec
ao executar gdbus
não é estritamente necessário, mas evita ter um processo extra, já que o script se separará antes de executar gdbus
. Desta forma, haverá apenas 2 processos em execução: o próprio script e gdbus
.
Eu criei ~ / .config / autostart / quodr.desktop ( quodr é o nome do script) para que o script fosse iniciado em cada login do lightdm:
[Desktop Entry]
Version=1.0
Type=Application
Name=quodr
Exec=quodr
Comment=Check if quodlibet needs refresh
Icon=dialog-question-symbolic
Hidden=false
Como TODO para mim: pretendo investigar como iniciar o script como um serviço do usuário do systemd, ativado pelo D-Bus.
Essa pergunta com todas as respostas foi inestimável para eu alcançar essa solução. Esse problema estava incomodando há muito tempo, tentei muitas soluções, mas só consegui uma imagem mais clara do que era necessário depois de ler o que todos escreviam aqui. Obrigado a todos, e em particular ao Brent Roman .
Como último comentário, criei e instalei d-feet e bustle enquanto investigava isso, eles eram realmente úteis.
Estou executando o Xubuntu 17.10 .