С X11, как я могу получить время пользователя "вдали от клавиатуры", игнорируя определенные события?
Я делаю небольшое приложение, которое должно знать, как долго пользователь простаивает - например, без использования клавиатуры или мыши. И XCB, и Xlib обещают дать мне время простоя через соответствующие расширения заставки. Вот где я получаю простой с XCB:
#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;
}
Однако, это ведет себя совсем не так, как предполагает ms_since_user_input. Если я смотрю видео (протестировано с Totem), время простоя сбрасывается до 0 в течение 30 секунд без исключения. То же самое происходит со многими играми, которые вызывают это, даже когда они приостановлены! Используя XLib, я получаю точно такое же поведение.
Я мог бы улучшить код, который использует время простоя, чтобы такое поведение не было такой большой проблемой, но я бы действительно хотел полностью избавиться от этой проблемы. Я бы предпочел, чтобы у меня было только время с момента последнего события пользовательского ввода (и только последнее событие пользовательского ввода). Я не возражаю против использования некоторых других библиотек, если моя программа не генерирует много трафика.
У вас есть идеи, как это можно сделать?
1 ответ
То, что вы видите с тотемом, это то, что он пытается избежать появления скринсейвера. Он делает это, посылая событие ключа через регулярные интервалы.
Вы можете найти код, который делает это здесь: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318
А поскольку экранная заставка использует то же расширение, что и вы, это приводит к тому, что ваш счетчик достигает нуля.