2012-01-28 8 views
5

Estoy haciendo una pequeña aplicación que necesita saber cuánto tiempo ha estado inactivo el usuario, como en, sin usar un teclado o un mouse. Tanto XCB como Xlib prometen darme tiempo libre a través de sus respectivas extensiones de salvapantallas. Aquí es donde consigo el tiempo de inactividad con XCB:Con X11, ¿cómo puedo obtener el tiempo del usuario "alejado del teclado" mientras ignoro ciertos eventos?

#include <stdlib.h> 
#include <xcb/xcb.h> 
#include <xcb/screensaver.h> 

static xcb_connection_t * connection; 
static xcb_screen_t * screen; 

/** 
* Connects to the X server (via xcb) and gets the screen 
*/ 
void magic_begin() { 
    connection = xcb_connect (NULL, NULL); 
    screen = xcb_setup_roots_iterator (xcb_get_setup (connection)).data; 
} 

/** 
* Asks X for the time the user has been idle 
* @returns idle time in milliseconds 
*/ 
unsigned long magic_get_idle_time() { 
    xcb_screensaver_query_info_cookie_t cookie; 
    xcb_screensaver_query_info_reply_t *info; 

    cookie = xcb_screensaver_query_info (connection, screen->root); 
    info = xcb_screensaver_query_info_reply (connection, cookie, NULL); 

    uint32_t idle = info->ms_since_user_input; 
    free (info); 

    return idle; 
} 

Sin embargo, esto se comporta de manera muy diferente que no sea "ms_since_user_input", sugiere. Si estoy viendo un video (probado con Totem), el tiempo de inactividad se restablece a 0 en 30 segundos, sin excepción. Lo mismo ocurre con una serie de juegos, que causan esto incluso cuando están en pausa. Usando XLib, obtengo exactamente el mismo comportamiento.

Podría ser capaz de mejorar el código que usa el tiempo de inactividad, por lo que este comportamiento no es un problema, pero me gustaría deshacerme del problema por completo. Preferiría que solo obtuviera el tiempo transcurrido desde el último evento de entrada del usuario (y solo el último evento de entrada del usuario). No me importaría usar otras bibliotecas para llegar allí, siempre y cuando mi programa no genere mucho tráfico.

¿Tiene alguna idea de cómo se puede hacer esto?

+0

¿Para qué quiere el tiempo de inactividad? Si se trata de implementar AFK en algún cliente de IRC/IM, ¿sería mejor el tiempo de envío de información al cliente en cuestión? – ninjalj

+0

Es para (aún otra) aplicación "tomar un descanso". Se sienta en el fondo, viendo cuánto tiempo el usuario está usando activamente la computadora. De vez en cuando impone un descanso o un micro descanso. No necesita ser preciso, pero mi plan aquí es no ser molesto. Entonces, si alguien está mirando un video, me gustaría que se mantenga fuera del camino. No es el fin del mundo estar atento a algunos casos especiales y decirle a la IU que se tranquilice, pero sería bueno manejar esto con más gracia :) –

Respuesta

6

Lo que está viendo con tótem es que trata de evitar que el salvapantallas entre en acción. Lo hace mediante el envío de eventos clave a intervalos regulares.

Puede encontrar el código que hace que aquí: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

Y puesto que el protector de pantalla utiliza la misma extensión que está utilizando esto se traduce en el mostrador de golpear a cero.

+0

Ah, gracias por buscarlo. Entonces, parece que Totem alterna eventos clave Alt falsos. Tenía la esperanza de que hubiera algún evento especial para poder (en el peor de los casos) hacer que mi aplicación mirara por sí misma, pero eso dificulta las cosas. ¿Crees que la forma de Alt es una especie de convención? No estaría de más hacer caso omiso de eso. –

+2

Creo que la extensión 'XRecord' es algo que podría buscarse para hacer eso. Workrave lo usa para monitorear la inactividad en el sistema: http://workrave.svn.sourceforge.net/viewvc/workrave/workrave/trunk/backend/src/unix/X11InputMonitor.cc?revision=1676&view=markup –

+0

Eso se ve interesante. ¡Gracias, Rob! –

Cuestiones relacionadas