Obtendo o tempo ocioso em uma sessão do X
Recentemente me deparei com uma pergunta no VOL a respeito do tempo ocioso em uma sessão em modo gráfico. A ideia era que estando o usuário sem realizar qualquer atividade na frente do PC depois de um determinado tempo, fosse deslogado automaticamente. Em modo texto, é possível fazer isso através da variável TMOUT, mas isso não funciona em modo gráfico. Em modo gráfico seria necessário obter o tempo ocioso de um usuário que estivesse usando KDE, GNOME, etc, verificar se esse tempo era maior ou igual a um tempo limite e caso fosse, executar um script que desconecta o usuário. A parte de desconectar o usuário não é difícil, mas obter o tempo ocioso do usuário se fez mais complicado. A saída do comando w tinha informações para as sessões em modo texto, mas nada de uma sessão do X. Pensei em obter esse tempo também via D-Bus, perguntando ao gnome-screensaver (no caso de um usuário estiver usando o GNOME ou XFCE), mas notei que o método GetIdleTime, não estava mais disponível.
Dessa maneira, decidi escrever um humilde programa em C usando a Xlib para obter essa informação e então aproveitá-la em um script. Não sou um expert com essa biblioteca, mas o procedimento era bem simples. O programa xidle, como chamei, retorna o tempo ocioso de uma sessão do X em segundos. Segue abaixo o programa, bem como uma explicação nos comentários sobre como compilar ele:
/*---------------------------------------------------------------------
* Imprime o tempo de inatividade de uma sessão do X em segundos.
*
* Obs: Compile esse programa com o comando:
* $ gcc -o xidle xidle.c -lX11 -lXss
*
* Depois mova-o para um diretório no seu PATH (um bom local
* seria o diretório /usr/local/bin)
*
* No Fedora, é necessário instalar o pacote 'libXScrnSaver-devel'
* e 'libX11-devel' para poder seguir com a compilação.
*
* Autor: Elder Marco <eldermarco@gmail.com>
* Data : 13/09/2010
* Última modificação: 07/11/2010
*---------------------------------------------------------------------*/
#include <X11/extensions/scrnsaver.h>
#include <X11/Xlib.h>
#include <X11/Xlibint.h>
#include <stdio.h>
int main() {
XScreenSaverInfo *info;
Display *display;
info = XScreenSaverAllocInfo();
display = XOpenDisplay(NULL);
XScreenSaverQueryInfo(display,
DefaultRootWindow(display),
info);
printf("%.0f s\n", (float)info->idle/1000);
Xfree(info);
XCloseDisplay(display);
return 0;
}
Considerando que você moveu o programa compilado para algum diretório no seu PATH, basta fazer:
cut -f 1 -d' ' <(xidle)
para obter esse tempo.
Obviamente, se você executar o programa xidle a partir do terminal, ele sempre vai retornar 0s, já que você acabou de dar um ENTER… mas se quer testar, você pode usar o comando sleep para esperar um tempo e depois executar o xidle (só não toque no teclado e nem mexa no mouse enquanto isso!). Veja:
$ sleep 11 && xidle 11 s $ sleep 11 && cut -f 1 -d ' ' <(xidle) 11
E pra finalizar, depois que terminei esse programa, encontrei um outro que embora não retorne o tempo ocioso — até onde pude ver –, ele executa um script depois de um tempo de ociosidade do usuário. Procure por xautolock no Google.

Muito interessante, Elder!
Já estás programando em C, muito bom!
Eu pretendo, algum dia, programar em C, também!
Ainda vai continuar?
Vai criar o script que desligue o sistema depois de um tempo de ociosidade?
Pois é rapaz! Aprendi a programar em C em 2004. Foi numa disciplina obrigatória para alunos da Física. Mas costumo escrever mais é programas simples que resolvem problemas em Geofísica e afins.
Quanto ao script, fica com exercício. =]