Use o D-Bus para obter os sinais ativados / desativados do lockscreen. O nome do serviço de proteção de tela varia de sistema para sistema. Em geral, o KDE usa org.freedesktop.ScreenSaver
e o Gnome usa org.gnome.ScreenSaver
. Não se pode confiar nisso, por exemplo, porque o Mint usa org.cinnamon.ScreenSaver
.
Comandos úteis
Estes assumem que sua proteção de tela é org.freedesktop.ScreenSaver
e seu serviço DBus é org.freedesktop.DBus
. Você pode precisar ajustar isso para outros sistemas. Use as informações a seguir para descobrir o que seu sistema usa:
-
Para obter uma lista dos serviços dbus disponíveis em sua sessão atual, use:
dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
Adicione
|grep screensaver
ao final se quiser apenas os serviços de proteção de tela disponíveis. -
Para obter uma lista dos comandos suportados pelo seu serviço de proteção de tela, use:
qdbus org.freedesktop.ScreenSaver /ScreenSaver
-
Para invocar um comando, use:
dbus-send --session --dest=org.freedesktop.ScreenSaver --type=method_call --print-reply --reply-timeout=20000 /org/freedesktop/ScreenSaver org.freedesktop.ScreenSaver.SetActive boolean:true
Em que
SetActive
foi listado na lista de comandos suportados e recebe um valor booleano. -
Para monitorar um serviço:
dbus-monitor --session "type='signal',interface='org.freedesktop.ScreenSaver'"
Automação
Agora que você entende como seu sistema funciona, você pode usar um script python para registrar essa atividade em um arquivo:
#!/usr/bin/env python
from datetime import datetime
import os
import pwd
import subprocess
import time
LOG_FILE = os.path.expanduser('~/hours_log.csv')
cmd = subprocess.Popen(["dbus-monitor \"type='signal',interface="
"'org.freedesktop.ScreenSaver'\""], shell=True,
stdout=subprocess.PIPE)
running = 0
while 1:
time.sleep(0.1)
if running:
output = cmd.stdout.readline()
status = 'unlocked' if 'true' in output else 'locked'
new_line = "{time} {user} {status} the screen\n".format(
time=datetime.now().ctime(),
user=pwd.getpwuid(os.getuid())[0],
status=status
)
with open(LOG_FILE, 'a') as f:
f.write(new_line)
running = 0
line = cmd.stdout.readline()
if "ActiveChange" in line and 'org.freedesktop.ScreenSaver' in line:
running = 1
[Fonte: registro-bloqueio de tela-eventos ]