Você pode tentar usar loginctl list-sessions
para obter a lista de sessões e, em seguida, usar loginctl show-session -p Display -p Active <session ID>
em cada uma delas para obter o número de exibição do X11 associado à sessão ativa no momento.
Algo parecido com isto (no bash):
TARGET_DISPLAY=()
while read id uid user seat; do
while IFS='=' read property value; do
case "$property" in
Active)
if [[ "$value" != "yes" ]]; then continue; fi
;;
Display)
if [[ "$value" ]]; then
TARGET_DISPLAY+=( "$value" )
fi
# else the session isn't graphical
;;
esac
done < <(loginctl show-session -p Display -p Active "$id")
done < <(loginctl list-sessions --no-legend)
Aqui, o $TARGET_DISPLAY
é uma matriz, porque, hipoteticamente, pode haver mais de uma sessão ativa (em um sistema com várias sedes). Se isso não for possível em sua configuração, você poderá torná-la uma variável simples e adicionar uma instrução break 2
após a atribuição para sair de ambos os loops.
NO ENTANTO ...
... isso não funciona mais com o GDM, porque neste caso o servidor X é iniciado dentro da sessão (com privilégios de usuário) e /usr/bin/gdm-x-session
não comunica essas informações de volta a logind
(devido à falta de uma API para isso).
Em outros casos (quando o servidor X é iniciado pelo DM antes da criação da sessão), isso provavelmente funcionará. Não tenho conhecimento de nenhum outro método, desculpe.