Light Locker - Executar script no bloqueio / desbloqueio do ecrã

5

Gostaria de executar um script se a sessão do XFCE estiver bloqueada e desbloqueada. Existe uma maneira que eu possa interceptar isso e executar determinadas ações quando a área de trabalho está bloqueada ou desbloqueada?

Eu encontrei as seguintes soluções:

para o Gnome - Executar o script no bloqueio / desbloqueio da tela

para xscreensaver - Como faço para executar um script no desbloqueio?

Mas estou usando light-locker e não há proteção de tela. Eu estava tentando monitorar o DBUS, mas não parece que o light-locker emite nenhum sinal.

Uma opção seria modificar xflock4 , mas isso ajudaria apenas no bloqueio de tela.

Existe alguma maneira de light-locker ?

    
por jnovacho 14.05.2015 / 10:40

3 respostas

5

A resposta anterior me ajudou a escrever esse fragmento do script bash que lida com os eventos de bloqueio e desbloqueio da sessão atual. Eu o uso para suspender processos do navegador quando a sessão é bloqueada e para reativá-los quando eles são desbloqueados. Testado sob o Debian unstable (Xfce 4.12) Aproveite!

session=/org/freedesktop/login1/session/$XDG_SESSION_ID
iface=org.freedesktop.login1.Session
dbus-monitor --system "type=signal,path=$session,interface=$iface" 2>/dev/null |
 while read signal stamp sender arrow dest rest; do
  case "$rest" in
    *Lock)
      echo   LOCKED at $stamp
      pause $@
;;
    *Unlock)
      echo UNLOCKED at $stamp
      resume $@
;;  #unknown Session signal received
    *)
#      echo $signal $stamp $sender $arrow $dest $rest
  esac
done
    
por 22.01.2017 / 20:16
3

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 .

    
por 23.04.2018 / 16:24
0

O seguinte executa date sempre que você bloqueia ou desbloqueia por um armário de luz. No entanto, não sei como saber se está bloqueando ou desbloqueando.

dbus-monitor --system "type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1/seat/seat0',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" | grep --line-buffered "ActiveSession" | while read line; do date; done

Referência: comentário do relatório de bug do Launchpad

    
por 13.05.2016 / 21:09