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?
¿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
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 :) –